ROS2 for OpenHarmony 二进制使用方法

Note

未来,本部分将集成进 OpenHarmony EDU 系统镜像,不再需要用户手动下载/编译。届时本文档将移除相关内容。

如果用户对下面一系列的产物如何从源码编译感兴趣,请参见 Q & A:如何从源码为 OpenHarmony 构建 xxx ?

如果您不想从头编译 ROS2,我们提供了已构建二进制文件,方便用户直接下载使用。

  1. 准备 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

    包含了 aarch64x86_64,并且两个网盘渠道文件相同,选择日期最新的就行,下同。

  2. 下载已编译好的为 OpenHarmony 准备的 ROS2 系统依赖包:

  3. 下载已编译好的为 OpenHarmony EDU 准备的 ROS2 Humble 发行版(包含 base、navigation2、SLAM 工具、moveit2 等):

  4. 将 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 个地方:

  1. 修改 OH 源码根目录下的 interface/sdk_c/third_party/musl/ndk_script/adapter/libc.ndk.json,增加函数:

  2. 用下面的内容完全覆盖掉 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
    
  3. ./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 包/项目编译和使用