硬核上车!RK3576基于Ubuntu部署ROS机器人系统详细攻略(上)
创始人
2025-07-12 12:41:31

本文适用于瑞芯微RK3562、RK3566、RK3568、RK3576、RK3588等Arm64位SoC,适配开发ROS2系统。各型号触觉智能均有配套核心板及开发板,实现了百分百全国产。

ROS2的具体版本

  • 版本说明

Rockchip Linux SDK基于Buildroot系统构建, 并持续在更新升级工具链、软件包到较新的版本。 因此最新的SDK在编译ROS2时,可能会遇到一些小的错误,建议将版本固定。ROS2发行版本号如下(下载链接可通过截图转文字获取):

已经编译通过的RK Linux SDK版本:

Docker编译

  • 补丁、Docker 镜像、源码下载

https://console.zbox.filez.com/l/iJBMWZ

tree

├── docker-focal-python38

│ └── rosdep.Dockerfile # 制作Docker Image的Dockerfile

├── docker-jammy-python310

│ └── rosdep.Dockerfile # 制作Docker Image的Dockerfile

├── focal-ros2-build.tar.gz # 根据Dockerfile制作好的Docker Image

├── jammy-ros2-build.tar.gz # 根据Dockerfile制作好的Docker Image

├── linux-sdk-patches

│ └── buildroot # RK Linux SDK不同发布版本有可能会缺少的补丁

│ ├── 0001-package-add-libasio.patch

│ └── 0002-configs-rockchip-add-ros2-build-dependencies.patch

├── MD5SUM.txt # 各压缩包的MD5SUM检验码

├── ros2-build-scripts.tar.gz # 编译脚本及补丁

└── ros2-sources.tar.gz # ROS2及其部分依赖库的源码包

在RK Linux SDK的Buildroot目录中,检查是否存在ros2_dep.config文件

ls buildroot/configs/rockchip/ros2_dep.config

buildroot/configs/rockchip/ros2_dep.config

# 如该ros2_dep.config中缺少:LTTNG_TOOLS,手动加上(ROS2 iron有依赖)

tail -f buildroot/configs/rockchip/ros2_dep.config

# Required by ros2-iron tracetools; With LTTNG foxy/galactic/humble will build

tracetools too.

BR2_PACKAGE_LTTNG_TOOLS=y

BR2_PACKAGE_LTTNG_LIBUST=y

如不存在该文件,则需要在Buildroot目录中打上如下2个补丁

0001-package-add-libasio.patch

0002-configs-rockchip-add-ros2-build-dependencies.patch

检查lttng-tools(2.12.3)、lttng-libust(2.12.3)、liburcu(0.13.0)是否满足版本要求。

编译ROS2的依赖包

RK Linux SDK 中的Buildroot工程里,ros2_dep.config提供了编译、运行ROS2所需要的依赖包,需要添加并编译到rootfs。

例如,将ros2_dep.config添加到rockchip_rk356x_robot_defconfig中:

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"

完整编译rootfs后,进入下一步。

准备Linux 编译环境

Ubuntu PC机上安装docker程序:

sudo apt install docker.io

sudo usermod -aG docker $USER

newgrp docker # 登录到docker用户组

  • 导入Docker Image

首先检查RK Linux SDK 编译出来的Python版本,例如:

./buildroot/output/rockchip_rk3562_robot/host/bin/python --version Python 3.10.5

根据Python版本号,匹配对应的Docker Image 镜像:

选择jammy-ros2-build,导入并进入到Docker Container:

gunzip jammy-ros2-build.tar.gz

docker image load -i jammy-ros2-build.tar

docker run -it --mount type=bind,source=/home/zsq/29/linux-sdk/buildroot/output/rockchip_rk3562_robot/,target=/buildroot jammy-ros2-build

其中source=需要修改成相应的Linux SDK 编译的output目录的绝对路径

进入Container后, 默认用户是builder,密码默认是: rockchip

  • 拷贝编译脚本及源码包

通过docker container cp命令,拷贝所需文件:

# 首先查找已登录的container ID

docker container ls

CONTAINER ID IMAGE COMMAND CREATED STATUS

PORTS NAMES

c519d9d668f9 jammy-ros2-build "/bin/bash" 15 minutes ago Up 15 minutes

pedantic_feynman

docker container cp ros2-sources.tar.gz c519d9d668f9:/tmp/

docker container cp ros2-sources.tar.gz c519d9d668f9:/tmp/

在Container 中,将其解压:

builder@c519d9d668f9:/opt/ros$ ls /tmp/

ros2-build-scripts.tar.gz ros2-sources.tar.gz

builder@c519d9d668f9:/opt/ros$ tar zxf /tmp/ros2-build-scripts.tar.gz -C /

builder@c519d9d668f9:/opt/ros$ tar zxf /tmp/ros2-sources.tar.gz -C /

builder@c519d9d668f9:/opt/ros$ ls

cross-compile foxy galactic humble iron

  • 修改脚本中的Python版本号

检查/opt/ros/cross-compile/cross-compile.mixin及build_ros2.sh, 将其中的Python版本号修改成RK LinuxSDK对应的版本号,例如:310修改成38,其中310表示Python3.10版本,以此类推~3.10修改成3.8。

  • (可选)使用Docker编译ROS2

如果想要从头开始制作Docker Image,可使用RK提供的

rosdep.Dockerfile:

docker build -t jammy-ros2-build -f rosdep.Dockerfile ./ # "./"不要少拷贝了,表示当前目录

  • (可选)下载源码

如需要自己下载其它版本的源码,进入docker后,可使用vcs-import:

cd /opt/ros/foxy

mkdir src

vcs-import -w 10 --retry 10 --skip-existing --recursive src < ros2-release-foxy-

20230620/ros2.repos

编译ROS2

再次确认RK Linux SDK、已经有加上ros2 dep.config,并且rootfs完整编译通过,并且所选Docker Image与RK Linux SDK编译出来的Python是匹配的。

选择所需ROS2版本,并依次执行以下命令:

ls /opt/ros

cross-compile foxy galactic humble iron

cd /opt/ros/iron

./prepare-source.sh

./build-ros2.sh

# 编译成功后,应有类似提示:

Summary: 317 packages finished [15min 37s]

build ros quit & cleanup

说明:

编译生成的目标文件位于/buildroot/target/opt/ros目录。

编译中间过程存放在/buildroot/build/ros目录。

如build_ros2.sh未提示错误即成功编译。其中,还有部分包在Buildroot SDK环境中,无法编译、执行的,比如:

rviz,依赖于X11/desktop。如果你需要这个功能,直接使用Ubuntu arm镜像,而不是Buildroot。

turtlesim,依赖于UI显示。

如果想要取消某个包的编译,在src对应的路径下,创建一个COLCON_IGNORE即可。比如

touchsrc/ros/ros_tutorials/turtlesim/COLCON_IGNORE

  • TRY_RUN需要手动执行并记录结果

fastrtps TRY_RUN提示:

--- stderr: fastrtps

CMake Error: TRY_RUN() invoked in cross-compiling mode, please set the following

cache variables appropriately:

SM_RUN_RESULT (advanced)

SM_RUN_RESULT__TRYRUN_OUTPUT (advanced)

For details see /buildroot/build/ros/fastrtps/TryRunResults.cmake

需要按照说明,将应用程序放到板端执行,并按说明填写结果。例如:

root@rk3562-buildroot:/# /tmp/cmTC_4f573-SM_RUN_RESULT

PTHREAD_RWLOCK_PREFER_READER_NP

# 根据上述执行结果,在docker中填入结果:

cat /buildroot/build/ros/fastrtps/TryRunResults.cmake

set( SM_RUN_RESULT

"0"

CACHE STRING "PTHREAD_RWLOCK_PREFER_READER_NP" FORCE)

set( SM_RUN_RESULT__TRYRUN_OUTPUT

"0"

CACHE STRING "PTHREAD_RWLOCK_PREFER_READER_NP" FORCE)

rosbag2_cpp TRY_RUN提示:

--- stderr: rosbag2_cpp

CMake Error: TRY_RUN() invoked in cross-compiling mode, please set the following

cache variables appropriately:

HAVE_SANITIZERS_EXITCODE (advanced)

HAVE_SANITIZERS_EXITCODE__TRYRUN_OUTPUT (advanced)

For details see /buildroot/build/ros/rosbag2_cpp/TryRunResults.cmake

同上, 需要按照说明,将应用程序放到板端执行,并按说明填写结果。例如:

set( HAVE_SANITIZERS_EXITCODE

"127"

CACHE STRING "error while loading shared libraries: liblsan.so.0: cannot

open shared object file: No such file or directory" FORCE)

set( HAVE_SANITIZERS_EXITCODE__TRYRUN_OUTPUT

"127"

CACHE STRING "error while loading shared libraries: liblsan.so.0: cannot

open shared object file: No such file or directory" FORCE)

  • 单独编译某个ROS2 package 及应用程序

使用colcon build的参数 --packages-select 可单独编译包,可参考 colcon build --help 。

在上述ROS2完整编译结束后,进入到buildroot sdk,重新打包rootfs即可。ROS2安装在/opt/ros目录下。

cd /data/linux-sdk/rk3562

./build.sh rootfs # 重新打包rootfs.img

烧录rootfs.img后,进入rk3562板端,执行Hello World Demo:

# cd /opt/ros/

# export COLCON_CURRENT_PREFIX=/opt/ros

# export ROS_HOME=/userdata/

# 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

好了,今天触觉智能分享就到这里,关注触觉智能,下集为您带来常见编译报错的解决方法。

END

相关内容

热门资讯

实测讲解“打两圈麻将真的有挂吗... 有 亲,根据资深记者爆料打两圈麻将是可以开挂的,确实有挂(咨询软件无需打...
实测推荐“樱花牛牛究竟有挂吗”... 您好:樱花牛牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9752949】很多玩家在这款游戏...
玩家分享攻略“玄龙炸金花开挂器... 您好:玄龙炸金花这款游戏可以开挂,确实是有挂的,需要了解加客服微信【4282891】很多玩家在这款游...
玩家必看“牛牛房卡微信链接房卡... 【要素一】(KK)微信链接各大厅/房卡介绍微/83404491牛牛房卡微信链接是一款非常火爆的游戏应...
实测推荐“奔驰宝马是不是有挂”... 实测推荐“奔驰宝马是不是有挂”(详细开挂教程)亲,奔驰宝马这个游戏其实有挂的,确实是有挂的,需要了解...