ros2 交叉编译

是否提供ROS2功能包交叉编译的docker镜像?

参考手册:5.1.3 源码安装 | RDK DOC

docker-compose.yml

version: ‘3.8’ # 指定docker-compose版本,兼容主流Docker环境

services:
rdk_tros:

image: pc_tros:v1.0.5
container_name: rdk_tros
stdin_open: true # 等价于手动命令的 -i 参数(保持标准输入打开)
tty: true # 等价于手动命令的 -t 参数(分配伪终端)
volumes:

  • ./app:/ros2_ws/app
  • ./demo:/ros2_ws/demo
    restart: “no” # 容器退出后不自动重启(符合–rm的临时使用场景)

我用了上面的文件运行docker,报错,请问如何解决?

Error response from daemon: client version 1.43 is too old. Minimum supported API version is 1.44, please upgrade your client to a newer version

你好!这个报错 client version 1.43 is too old 主要是因为你本地环境的 Docker 客户端版本过低,无法满足镜像或 Docker Daemon 要求的最底层 API 版本(1.44)。

5.1.3 源码安装 | RDK DOC

我看这个教程有些迷糊。。。讲的是在x86平台编辑出能在RDK x5平台上运行的ros2包吗?在x86平台上运行docker,在docker里编译ros2包?

你好 理解正确,此为直接在个人PC交叉编译TROS功能包的教程

root@2e44231c3010:/ros2_ws/cc_ws# bash ./robot_dev_config/build.sh -p X5
PACKAGE_SELECTION is empty and reset with RAW_OPTIONS
PACKAGE_SELECTION:
rm: missing operand
Try ‘rm --help’ for more information.
rm: missing operand
Try ‘rm --help’ for more information.
build platform X5
./robot_dev_config/build.sh: line 133: /opt/ros/humble/setup.bash: No such file or directory
build X5
[INFO] Running pre_function
[INFO] Creating symlinks…
Linked /usr/include/pcl-1.12 → /ros2_ws/cc_ws/../sysroot_docker/usr/include/pcl-1.12
Linked /usr/include/eigen3 → /ros2_ws/cc_ws/../sysroot_docker/usr/include/eigen3
Linked /usr/include/ni → /ros2_ws/cc_ws/../sysroot_docker/usr/include/ni
Linked /usr/include/openni2 → /ros2_ws/cc_ws/../sysroot_docker/usr/include/openni2
Linked /usr/include/uuid → /ros2_ws/cc_ws/../sysroot_docker/usr/include/uuid
Linked /usr/include/aarch64-linux-gnu/qt5 → /ros2_ws/cc_ws/../sysroot_docker/usr/include/aarch64-linux-gnu/qt5
Linked /usr/include/opencv4 → /ros2_ws/cc_ws/../sysroot_docker/usr/include/opencv4
Linked /usr/include/suitesparse → /ros2_ws/cc_ws/../sysroot_docker/usr/include/suitesparse
Linked /usr/lib/aarch64-linux-gnu/qt5 → /ros2_ws/cc_ws/../sysroot_docker/usr/lib/aarch64-linux-gnu/qt5
Linked /usr/lib/libOpenNI.so → /ros2_ws/cc_ws/../sysroot_docker/usr/lib/libOpenNI.so
Linked /usr/lib/aarch64-linux-gnu/libcxsparse.so → /ros2_ws/cc_ws/../sysroot_docker/usr/lib/aarch64-linux-gnu/libcxsparse.so
Linked /usr/lib/aarch64-linux-gnu/libcholmod.so → /ros2_ws/cc_ws/../sysroot_docker/usr/lib/aarch64-linux-gnu/libcholmod.so
Linked /usr/lib/aarch64-linux-gnu/libamd.so → /ros2_ws/cc_ws/../sysroot_docker/usr/lib/aarch64-linux-gnu/libamd.so
Linked /usr/lib/aarch64-linux-gnu/libcolamd.so → /ros2_ws/cc_ws/../sysroot_docker/usr/lib/aarch64-linux-gnu/libcolamd.so
Linked /usr/lib/aarch64-linux-gnu/libcamd.so → /ros2_ws/cc_ws/../sysroot_docker/usr/lib/aarch64-linux-gnu/libcamd.so
Linked /usr/lib/aarch64-linux-gnu/libccolamd.so → /ros2_ws/cc_ws/../sysroot_docker/usr/lib/aarch64-linux-gnu/libccolamd.so
Linked /usr/lib/aarch64-linux-gnu/libpcl_common.so → /ros2_ws/cc_ws/../sysroot_docker/usr/lib/aarch64-linux-gnu/libpcl_common.so
Linked /usr/lib/aarch64-linux-gnu/libOpenNI2.so → /ros2_ws/cc_ws/../sysroot_docker/usr/lib/aarch64-linux-gnu/libOpenNI2.so
Linked /usr/lib/aarch64-linux-gnu/libblas.so → /ros2_ws/cc_ws/../sysroot_docker/usr/lib/aarch64-linux-gnu/libblas.so
Linked /usr/lib/aarch64-linux-gnu/liblapack.so → /ros2_ws/cc_ws/../sysroot_docker/usr/lib/aarch64-linux-gnu/liblapack.so
Linked /usr/lib/aarch64-linux-gnu/libyaml-cpp.so.0.7.0 → /ros2_ws/cc_ws/../sysroot_docker/usr/lib/aarch64-linux-gnu/libyaml-cpp.so.0.7.0
Linked /usr/lib/aarch64-linux-gnu/libdraco.a → /ros2_ws/cc_ws/../sysroot_docker/usr/lib/aarch64-linux-gnu/libdraco.a
Linked /usr/lib/aarch64-linux-gnu/libdraco.so.4.0.0 → /ros2_ws/cc_ws/../sysroot_docker/usr/lib/aarch64-linux-gnu/libdraco.so.4.0.0
Linked /usr/lib/aarch64-linux-gnu/libz.so → /ros2_ws/cc_ws/../sysroot_docker/usr/lib/aarch64-linux-gnu/libz.so
Linked /usr/lib/aarch64-linux-gnu/libz.so.1.2.11 → /ros2_ws/cc_ws/../sysroot_docker/usr/lib/aarch64-linux-gnu/libz.so.1.2.11
Linked /usr/lib/aarch64-linux-gnu/librt.a → /ros2_ws/cc_ws/../sysroot_docker/usr/lib/aarch64-linux-gnu/librt.a
Linked /usr/lib/aarch64-linux-gnu/libtinyxml.so → /ros2_ws/cc_ws/../sysroot_docker/usr/lib/aarch64-linux-gnu/libtinyxml.so
Linked /usr/lib/aarch64-linux-gnu/libtinyxml.so.2.6.2 → /ros2_ws/cc_ws/../sysroot_docker/usr/lib/aarch64-linux-gnu/libtinyxml.so.2.6.2
touch: cannot touch ‘./src/rtabmap_ros/rtabmap_demos/COLCON_IGNORE’: No such file or directory
touch: cannot touch ‘./src/rtabmap_ros/rtabmap_examples/COLCON_IGNORE’: No such file or directory
touch: cannot touch ‘./src/rtabmap_ros/rtabmap_launch/COLCON_IGNORE’: No such file or directory
touch: cannot touch ‘./src/rtabmap_ros/rtabmap_python/COLCON_IGNORE’: No such file or directory
touch: cannot touch ‘./src/rtabmap_ros/rtabmap_ros/COLCON_IGNORE’: No such file or directory
touch: cannot touch ‘./src/rtabmap_ros/rtabmap_rviz_plugins/COLCON_IGNORE’: No such file or directory
touch: cannot touch ‘./src/rtabmap_ros/rtabmap_viz/COLCON_IGNORE’: No such file or directory

  • warnning: source file /ros2_ws/cc_ws/../sysroot_docker/usr/ros/humble/bin/rtabmap-res_tool not exist
  • warnning: source file /ros2_ws/cc_ws/../sysroot_docker/usr/ros/humble/bin/rtabmap-res_tool-0.3.0 not exist
  • warnning: source file /ros2_ws/cc_ws/../sysroot_docker/usr/ros/humble/lib/x86_64-linux-gnu/librtabmap_utilite.so.0.22 not exist
    [INFO] End pre_function
    Starting >>> ai_msgs
    Starting >>> hbm_img_msgs
    Starting >>> dnn_node
    Starting >>> img_msgs
    Starting >>> hobot_mot
    Starting >>> hobot_cv
    Starting >>> audio_msg
    Starting >>> clip_msgs
    Starting >>> base
    Starting >>> hobot_tts
    Starting >>> recorder_node
    Starting >>> trigger_node
    Starting >>> tros_perception_fusion_msgs
    Starting >>> dstereo_occnet
    Starting >>> hobot_shm
    Starting >>> hobot_stereonet
    — stderr: img_msgs
    CMake Error at CMakeLists.txt:36 (find_package):
    By not providing “Findament_cmake.cmake” in CMAKE_MODULE_PATH this project
    has asked CMake to find a package configuration file provided by
    “ament_cmake”, but CMake did not find one.

Could not find a package configuration file provided by “ament_cmake” with
any of the following names:

ament_cmakeConfig.cmake
ament_cmake-config.cmake

Add the installation prefix of “ament_cmake” to CMAKE_PREFIX_PATH or set
“ament_cmake_DIR” to a directory containing one of the above files. If
“ament_cmake” provides a separate development package or SDK, be sure it
has been installed.


Failed <<< img_msgs [2.08s, exited with code 1]
Aborted <<< ai_msgs [2.17s]
Aborted <<< dnn_node [2.13s]
Aborted <<< clip_msgs [2.03s]
Aborted <<< hobot_cv [2.07s]
Aborted <<< audio_msg [2.04s]
Aborted <<< base [2.02s]
Aborted <<< tros_perception_fusion_msgs [1.92s]
Aborted <<< hbm_img_msgs [2.14s]
Aborted <<< hobot_shm [1.89s]
Aborted <<< dstereo_occnet [1.91s]
Aborted <<< hobot_mot [2.09s]
Aborted <<< recorder_node [1.97s]
Aborted <<< hobot_stereonet [1.90s]
Aborted <<< trigger_node [1.99s]
Aborted <<< hobot_tts [2.04s]

Summary: 0 packages finished [3.12s]
1 package failed: img_msgs
15 packages aborted: ai_msgs audio_msg base clip_msgs dnn_node dstereo_occnet hbm_img_msgs hobot_cv hobot_mot hobot_shm hobot_stereonet hobot_tts recorder_node trigger_node tros_perception_fusion_msgs
16 packages had stderr output: ai_msgs audio_msg base clip_msgs dnn_node dstereo_occnet hbm_img_msgs hobot_cv hobot_mot hobot_shm hobot_stereonet hobot_tts img_msgs recorder_node trigger_node tros_perception_fusion_msgs
46 packages not processed
[ERROR] colcon build failed
[INFO] Running post_function
[INFO] End post_function

执行教程第三步交叉编译,报错

另外:

我执行完第二步“获取tros.b源码”,sysroot_docker目录结构和教程不一样。

root@2e44231c3010:/ros2_ws/sysroot_docker# ls
CHANGELOG.md README.md etc lib usr usr_rdkultra usr_s100 usr_x3 usr_x5 usr_x86 v1.3

我没执行“## 使用 git reset --hard [tag号] 命令指定发布版本。详细说明参考本页面 编译指定版本tros.b 内容”这个步骤,有影响吗?

你好,拉错版本了

X5 为 Ubuntu22.04 ROS2版本为Humble

好的。我重新下载了docker镜像。又有新问题了。执行vcs-import src < ./robot_dev_config/ros2_release.repos时,出现一大堆EEEEEEEEEEEEEEEEE。。这个是网络不通的问题吧?有国内解决办法吗?

拉取github这部分内容就比较通用了,即配置linux系统代理,可以直接网络上搜索通用内容

基础的开发也不需要交叉编译,直接在板端开发即可

交叉编译有教程吗?在哪个路径下创建自己的package,如何执行交叉编译?

交叉编译只是在X86提供 开发X5可直接使用的环境,后面我理解都是正常ROS开发

可以参考 https://docs.ros.org/en/foxy/index.html

我理解不是这样。交叉编译是使用了x86的交叉编译工具,而包所需要的依赖需要arm64的库,如果直接编译,默认使用的x86的库,所以关键问题就是如何指定编译所需要的依赖使用arm64版本的库?

您好,您提到的关于“依赖库架构不匹配(x86 vs arm64)”确实是交叉编译中最关键的问题。这正是我们提供专用 Docker 环境和配套构建脚本的原因,文档中其实已经包含了解决方案。

具体来说,在按照文档步骤启动 Docker 并挂载目录后,编译环境通过以下两点解决了依赖问题:

  1. Sysroot 环境:我们的工程目录(如 sysroot_docker)中包含了目标平台(ARM64)所需的系统库和依赖库,而非使用宿主机的 x86 库。

  2. 工具链配置:构建脚本调用的 CMake 工具链文件(aarch64_toolchainfile.cmake)已经配置好了 CMAKE_FIND_ROOT_PATH。这意味着编译器在查找依赖时,会被强制指向上述的 ARM64 sysroot 路径,而不会去链接系统默认的 x86 库。

所以,只要严格按照文档在 Docker 环境中执行 build.sh,这些依赖查找路径的问题都会自动处理,无需手动指定。