ROS2 for OpenHarmony 二进制使用方法
Note
未来,本部分将集成进 OpenHarmony EDU 系统镜像,不再需要用户手动下载/编译。届时本文档将移除相关内容。
如果用户对下面一系列的产物如何从源码编译感兴趣,请参见 Q & A:如何从源码为 OpenHarmony 构建 xxx ?;
如果您不想从头编译 ROS2,我们提供了已构建二进制文件,方便用户直接下载使用。
-
准备 OpenHarmony EDU 系统。我们提供已构建的 OpenHarmony EDU OS:
Subjects 百度网盘 交大云盘 贝启 3588 开发板镜像(AArch64) oh5.1 bq3588 build,提取码:kaq4 oh5.1 bq3588 build,提取码:m7fp DAYU 200 开发板镜像(AArch64) oh5.1 dayu200 build,提取码:s15y oh5.1 dayu200 build,提取码:tt7x OH EDU 镜像(x86_64) ohedu5.1 build,提取码:hq43 ohedu5.1 build,提取码:vffs 包含了
aarch64和x86_64,并且两个网盘渠道文件相同,选择日期最新的就行,下同。 -
下载已编译好的为 OpenHarmony 准备的 ROS2 系统依赖包:
- 百度网盘 - ohos-sysdeps-xxx.tar.gz,提取码:sb3y;
- 交大云盘 - ohos-sysdeps-xxx.tar.gz,提取码:dch8;
-
下载已编译好的为 OpenHarmony EDU 准备的 ROS2 Humble 发行版(包含 base、navigation2、SLAM 工具、moveit2 等):
- 百度网盘 - ohos-humble-build-xxx.tar.gz,提取码:5tuy;
- 交大云盘 - ohos-humble-build-xxx.tar.gz,提取码:w5kz;
-
将 ROS2 Humble 发行版
ohos-humble-build-xxx.tar.gz和 系统依赖ohos-sysdeps-xxx.tar.gz)上传到 OpenHarmony EDU 设备上的/data目录下,执行下面的指令:cd /data tar -zxpvf ohos-humble-build-xxx.tar.gz # 替换成您的下载/构建的文件名 tar -zxpvf ohos-sysdeps-18-xxx.tar.gz # 替换成您的下载/构建的文件名 # 注意:由于 OpenHarmony shell 能力有问题,您必须在 ros2ohos.env 相同目录下执行,不能改变这个文件或者您的 shell 的位置 source ./ros2ohos.env # 解压出来的 ROS2 环境文件
现在,您的 ROS2 环境已经设置完成,可以使用 ros2 命令启动 ROS2 应用了!看一下目前的话题吧:
ros2 topic list
那么我们如何使用 colcon build 来构建我们自己自定义的 ROS2 应用/项目呢?
不幸的是,由于 OpenHarmony 自身原因,暂时不支持原生编译工具链。意味着 native 的 ROS2 包或者项目需要交叉编译到 OH 平台,没法在 OH 设备上直接用 colcon build。
交叉编译 ROS2 自定义项目请参见 用户自定义 ROS2 包/项目编译和使用。
Q & A:如何从源码为 OpenHarmony 构建 xxx ?
1. 如何从源码构建上述的 OpenHarmony EDU?
Warning
注意这里 OpenHarmony EDU 发行版更改了 musl libc 的被注释的符号。
如果您希望从源码编译 OpenHarmony EDU,您需要按照下面的教程来修改 OpenHarmony EDU 源码中的 musl libc 再清空缓存并重新编译 OHOS,以及相应的 SDK。
修改 musl libc 后的 OHOS 系统镜像编译方法:
- 修改 OH 源码根目录下的
third_party/musl/libc.map.txt文件,解除mq_开头的相关函数的注释,删除out目录及缓存。重新编译 OHOS 即可得到能运行 ROS2 DDS 的 OpenHarmony 镜像;
如果还想获得修改后的原版 SDK,则需要额外修改 2 个地方:
-
修改 OH 源码根目录下的
interface/sdk_c/third_party/musl/ndk_script/adapter/libc.ndk.json,增加函数:
-
用下面的内容完全覆盖掉
interface/sdk_c/third_party/musl/ndk_musl_include/mqueue.h:#ifndef _MQUEUE_H #define _MQUEUE_H #ifdef __cplusplus extern "C" { #endif #include <features.h> #include <sys/types.h> #define __NEED_size_t #define __NEED_ssize_t #define __NEED_pthread_attr_t #define __NEED_time_t #define __NEED_struct_timespec #include <bits/alltypes.h> typedef int mqd_t; struct mq_attr { long mq_flags, mq_maxmsg, mq_msgsize, mq_curmsgs, __unused1[4]; }; struct sigevent; int mq_close(mqd_t); int mq_getattr(mqd_t, struct mq_attr *); int mq_notify(mqd_t, const struct sigevent *); mqd_t mq_open(const char *, int, ...); ssize_t mq_receive(mqd_t, char *, size_t, unsigned *); int mq_send(mqd_t, const char *, size_t, unsigned); int mq_setattr(mqd_t, const struct mq_attr *__restrict, struct mq_attr *__restrict); ssize_t mq_timedreceive(mqd_t, char *__restrict, size_t, unsigned *__restrict, const struct timespec *__restrict); int mq_timedsend(mqd_t, const char *, size_t, unsigned, const struct timespec *); int mq_unlink(const char *); #if _REDIR_TIME64 __REDIR(mq_timedreceive, __mq_timedreceive_time64); __REDIR(mq_timedsend, __mq_timedsend_time64); #endif #ifdef __cplusplus } #endif #endif -
./build.sh --product-name ohos-sdk直接编译,去out/sdk/packages/ohos-sdk/获得修改后的 sdk;
2. 如何从源码构建 ROS2 所需的系统依赖?
使用 ohloha 包管理器 + OpenHarmony EDU SDK。
OpenHarmony EDU SDK 需要您从第一个问题 “如何从源码构建上述的 OpenHarmony EDU?” 编译得到。
ohloha 编译系统依赖方法:
首先准备好 Go 环境,这里下载:Go 官网,确保你的机器能执行:go --version。然后执行下面内容:
# clone 仓库
git clone --recurse-submodules https://gitcode.com/openharmony-robot/tools_ohloha.git
cd tools_ohloha
# 准备好宿主机的编译所需条件
cat ./ohloha_pkgs/DEPS
# 你需要安装这些依赖。如果你直接想装,那么 source 执行就 OK:
# source ./ohloha_pkgs/DEPS
# 编译 ohloha 并加入环境变量
make
export PATH=$PWD/build/bin:$PATH
# 开始编译
OHOS_SDK=<OH-EDU的SDK位置> OHOS_CPU=<aarch64或x86_64或arm> ./scripts/build_all_and_install2sdk.sh
# 最终会在当前目录得到 ohos-sysdeps(系统依赖)和 ohos-sdk(用来构建 ROS2 的 sdk)的压缩包
注意您需要预留 > 50 GB 的空间。
3. 如何从源码构建 ROS2 Humble?
完成上面前两个问题后,参见 编译环境 ROS2 + Navigation2 + SLAM + Moveit2 + Misc。
4. 如何从源码构建自己的 ROS2 包或者 ROS2 项目?
完成上面前三个问题后,参见 用户自定义 ROS2 包/项目编译和使用。