Rockchip Buildroot 集成编译 ROS2 说明
:::info 文档信息
文档标识:RK-SM-YF-912 · 发布版本:V1.0.0 · 发布日期:2021-09-09 · 页数:8 · 语言:中文
原始文档:Rockchip_Instruction_Linux_ROS2_CN.pdf
:::
章节大纲
- Rockchip Buildroot 集成编译 ROS2 说明(P1)
- 使用Docker编译所需的文件及说明(P4)
- Buildroot rootfs编译ROS2的依赖包(P4)
- 准备Linux(Ubuntu) PC机的依赖环境(P5)
- 网络需求(P5)
- 使用Docker编译ROS2(P5)
- 修改ROS2编译选项(可选)(P6)
- 单独编译某个ROS2 package 及应用程序(P7)
- 打包rootfs并运行ROS2(P7)
- 参考索引(P8)
在线预览
若预览无法显示,请直接下载 PDF 后用本地阅读器打开。
1. 使用Docker编译所需的文件及说明
如下文件是Docker编译ROS2所需要的,他们位于Linux SDK的 buildroot/package/rockchip/ros2 目录下。
| 1 tree -L 1 buildroot/package/rockchip/ros2 2 . 3 ├── build ros2.sh # 主要的编译脚本 _ 4 ├── mixins # 编译环境参数,只设置了aarch64, arm未配置 5 ├── rosdep.Dockerfile # Docker image基础包配置文件 6 └── sysroot.Dockerfile # ROS2编译的Docker image配置文件,包含依赖环境及源码下 载 7 | |
|---|---|
| 1 2 3 4 5 6 7 | tree -L 1 buildroot/package/rockchip/ros2 . ├── build ros2.sh # 主要的编译脚本 _ ├── mixins # 编译环境参数,只设置了aarch64, arm未配置 ├── rosdep.Dockerfile # Docker image基础包配置文件 └── sysroot.Dockerfile # ROS2编译的Docker image配置文件,包含依赖环境及源码下 载 |
2. Buildroot rootfs编译ROS2的依赖包
Buildroot 应该更新到包含ros2_dep.config的版本,例如:
| 1 cd buildroot 2 git log --oneline -4 3 50d87c26e7 configs: rockchip: add ros2 build dependencies 4 397ee958e8 package/python-packaging: new package with version 20.9 5 e9dae80ec5 package/python-six: bump to version 1.15.0 6 8aa73ca79c package/python-pyparsing: bump to version 2.4.7 7 | |
|---|---|
| 1 2 3 4 5 6 7 | cd buildroot git log --oneline -4 50d87c26e7 configs: rockchip: add ros2 build dependencies 397ee958e8 package/python-packaging: new package with version 20.9 e9dae80ec5 package/python-six: bump to version 1.15.0 8aa73ca79c package/python-pyparsing: bump to version 2.4.7 |
| ros2 |
中,通过引用ros2_dep.config添加依赖关系。示例如下:
| 1 git diff 2 --- a/configs/rockchip rk356x robot defconfig _ _ _ 3 +++ b/configs/rockchip rk356x robot defconfig _ _ _ 4 @@ -10,6 +10,7 @@ 5 #include "wifi.config" 6 #include "debug.config" 7 #include "bt.config" 8 +#include "ros2 dep.config" _ 9 BR2 TARGET GENERIC HOSTNAME="rk356x robot" _ _ _ _ 10 BR2 TARGET GENERIC ISSUE="Welcome to RK356X Buildroot For Robot" _ _ _ 11 BR2 ROOTFS OVERLAY:="board/rockchip/common/robot/base _ _ board/rockchip/common/wifi" 12 | |
|---|---|
| 1 2 3 4 5 6 7 8 9 10 11 12 | git diff --- a/configs/rockchip rk356x robot defconfig _ _ _ +++ b/configs/rockchip rk356x robot defconfig _ _ _ @@ -10,6 +10,7 @@ #include "wifi.config" #include "debug.config" #include "bt.config" +#include "ros2 dep.config" _ BR2 TARGET GENERIC HOSTNAME="rk356x robot" _ _ _ _ BR2 TARGET GENERIC ISSUE="Welcome to RK356X Buildroot For Robot" _ _ _ BR2 ROOTFS OVERLAY:="board/rockchip/common/robot/base _ _ board/rockchip/common/wifi" |
| 完整编 |
3. 准备Linux(Ubuntu) PC机的依赖环境
ROS2文档[1][2]显示,它提供了Docker镜像用以交叉编译arm/aarch64,比如Dockerfile_ubuntu_arm64_prebuilt[2]。但目标系统仅支持ubuntu 18.04(bionic),与RK Linux SDK中的rootfs相差较多。借鉴Dockerfile_ubuntu_arm64_prebuilt,我们提供另一Dockerfile以适配RK Linux SDK用于交叉编译ROS2。RK Linux SDK使用了较新的gcc版本,比如rk356x使用了gcc9.3,交叉工具链的个别包会依赖于较新版本的GLIBC,比如GLIBC_2.29。因此在选择Docker镜像时,提供的Docker镜像是基于ubuntu 20.04(focal)。
Ubuntu PC机上安装docker程序:
| 1 sudo apt install docker.io 2 sudo usermod -aG docker $USER 3 newgrp docker # 登录docker用户组 4 | |
|---|---|
| 1 2 3 4 | sudo apt install docker.io sudo usermod -aG docker $USER newgrp docker # 登录docker用户组 |
(可选)修改/etc/docker/daemon.conf镜像源,根据所在网络情况,比如改成阿里、腾讯等:
1 cat /etc/docker/daemon.json 2 {"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"]} 3 4 sudo systemctl daemon-reload 5 sudo systemctl restart docker 6 | |
|---|---|
| 1 2 3 4 5 6 | cat /etc/docker/daemon.json {"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"]} sudo systemctl daemon-reload sudo systemctl restart docker |
3.1 网络需求
ROS2源码大部分从github下载,需要有较稳定的github访问的网络。建议最好能有VPN,否则整个下载及编译可能很难完成。
4. 使用Docker编译ROS2
选择Docker镜像时,以下2点会便于ROS2的编译:
使得Buildroot的交叉工具链版本与Ubuntu 相匹配Docker中的python版本与Buildroot sdk中保持一致,比如都是3.8
下载原始的Ubuntu Docker镜像rosdep:
docker build -t rosdep -f rosdep.Dockerfile ./ # "./"不要少拷贝了,表示当前目录
如果上述docker build执行失败,提示网络出错、connection reset by peer等,可尝试换一个网络、设置DNS为8.8.8.8,关闭防火墙,甚至尝试下手机5G网络。
基于rosdep,添加ROS2编译的环境并且下载ROS2源码:
docker build --build-arg BASE_IMAGE=rosdep \
--build-arg ROS_VERSION=ros2 \
--build-arg ROS_DISTRO=foxy \
-t ros_sysroot -f sysroot.Dockerfile ./
说明:
ROS_VERSION只能是ros2 ROS_DISTRO表示具体的版本[3],其中已验证foxy及galactic BASE_IMAGE参数rosdep表示基础的Ubuntu 镜像名称
Docker Image(sys_rootfs)在创建时已经指定了Entrypoint为 build_ros2.sh ,可直接执行编译如下:
| 1 2 3 4 5 6 7 8 9 10 11 | OUTPUT=/data/linux-sdk/rk3566/buildroot/output/rockchip rk356x robot _ _ docker run --rm -it \ --mount type=bind,source=${OUTPUT},target=/buildroot \ ros sysroot _ # 编译成功后,应有类似提示: ... Summary: 276 packages finished [15min 37s] ... build ros quit & cleanup |
|---|---|
| 说明: |
编译过程主要定义在build_ros2.sh命令中/data/linux-sdk/rk3566/buildroot/output/rockchip_rk356x_robot请替换成相应SDK的路径编译生成的目标文件位于${OUTPUT}/target/opt/ros目录下
如build_ros2.sh未提示错误即成功编译。其中,还有部分包在Buildroot SDK环境中,无法编译、执行的,比如:
rviz,依赖于X11/desktop。如果你需要这个功能,直接使用Ubuntu arm镜像,而不是Buildroot turtlesim,依赖于QT5,在部分产品上(如扫地机类),Buildroot未编译QT5如果想要取消某个包的编译,在src对应的路径下,创建一个COLCON_IGNORE即可。比如 touch
src/ros/ros_tutorials/turtlesim/COLCON_IGNORE
4.1 修改ROS2编译选项(可选)
如果需要修改编译ROS2选项,例如取消部分应用包编译、增加demo程序、排查错误等,在 docker run命令中使用 --entrypoint bash 选项进入命令行,然后执行 ./build_ros2.sh 编译脚本。
| 1 OUTPUT=/data/linux-sdk/rk3566/buildroot/output/rockchip rk356x robot _ _ 2 docker run --rm -it --entrypoint /bin/bash \ 3 --mount type=bind,source=${OUTPUT},target=/buildroot \ 4 ros sysroot _ 5 6 # 现在已经进入Docker 7 root@97eacf55d026:/opt/ros/foxy# ls 8 build ros2.sh ros2.repos src _ 9 10 root@97eacf55d026:/opt/ros/foxy# ./build ros2.sh _ 11 | |
|---|---|
| 1 2 3 4 5 6 7 8 9 10 11 | OUTPUT=/data/linux-sdk/rk3566/buildroot/output/rockchip rk356x robot _ _ docker run --rm -it --entrypoint /bin/bash \ --mount type=bind,source=${OUTPUT},target=/buildroot \ ros sysroot _ # 现在已经进入Docker root@97eacf55d026:/opt/ros/foxy# ls build ros2.sh ros2.repos src _ root@97eacf55d026:/opt/ros/foxy# ./build ros2.sh _ |
| 4.2 |
使用colcon build的参数 --packages-select <pacage_name> 可单独编译包,详情可参
考 ./build_ros2.sh 脚本。
编译您自己的应用程序,可自行写cmake,使用buildroot的交叉工具链,引用相应的头文件、动态链接库即可。如您对ROS2的ament比较熟悉,也可在ament的基础上写cmake。ROS2源码中已经包含了许多demo程序,请先参考。
5. 打包rootfs并运行ROS2
在上述ROS2完整编译结束后,进入到buildroot sdk,重新打包rootfs即可。ROS2安装在/opt/ros目录下。
前面Docker默认用户是root,因此将ROS2安装的文件属性也会是root,但不影响打包rootfs.img。
| 1 cd /data/linux-sdk/rk3566 2 ./build.sh rootfs # 重新打包rootfs.img 3 | |
|---|---|
| 1 2 3 | cd /data/linux-sdk/rk3566 ./build.sh rootfs # 重新打包rootfs.img |
烧录rootfs.img后,进入rk3566板端,执行Hello World Demo:
| 1 # cd /opt/ros/ 2 # export COLCON CURRENT PREFIX=/opt/ros _ _ 3 # source ./local setup.sh _ 4 # ros2 pkg list 5 # ros2 pkg executables 6 7 # ros2 run demo nodes cpp listener & _ _ 8 # ros2 run demo nodes cpp talker _ _ 9 [INFO] [1501839280.834017748] [talker]: Publishing: 'Hello World: 1' 10 [INFO] [1501839280.839280957] [listener]: I heard: [Hello World: 1] 11 [INFO] [1501839281.831636015] [talker]: Publishing: 'Hello World: 2' 12 [INFO] [1501839281.835092640] [listener]: I heard: [Hello World: 2] 13 [INFO] [1501839282.831618532] [talker]: Publishing: 'Hello World: 3' 14 [INFO] [1501839282.835336782] [listener]: I heard: [Hello World: 3] 15 16 # ros2 run demo nodes py listener & _ _ 17 # ros2 run demo nodes py talker _ _ | |
|---|---|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # cd /opt/ros/ # export COLCON CURRENT PREFIX=/opt/ros _ _ # source ./local setup.sh _ # ros2 pkg list # ros2 pkg executables # ros2 run demo nodes cpp listener & _ _ # ros2 run demo nodes cpp talker _ _ [INFO] [1501839280.834017748] [talker]: Publishing: 'Hello World: 1' [INFO] [1501839280.839280957] [listener]: I heard: [Hello World: 1] [INFO] [1501839281.831636015] [talker]: Publishing: 'Hello World: 2' [INFO] [1501839281.835092640] [listener]: I heard: [Hello World: 2] [INFO] [1501839282.831618532] [talker]: Publishing: 'Hello World: 3' [INFO] [1501839282.835336782] [listener]: I heard: [Hello World: 3] # ros2 run demo nodes py listener & _ _ # ros2 run demo nodes py talker _ _ |
6. 参考索引
https://docs.ros.org/en/foxy/Guides/Cross-compilation.html2.https://github.com/ros-tooling/cross_compile.git3.https://docs.ros.org/en/foxy/Releases.html