需要在X86平台上的进行RDK X5应用的交叉编译,请问官方是否有提供包含TogetheROS的docker,我看https://archive.d-robotics.cc/TogetheROS/cross_compile_docker/这里有交叉编译的docker,通过该镜像编译出现的程序是否可以在RDKOS V3.5.0上运行,因为里面的镜像版本我看是24-Apr-2024比较旧的
你好 @lettersony,关于 RDK X5 在 X86 平台交叉编译的问题,结合社区现有资源给你明确答复:
结论
是的,官方提供交叉编译 Docker 镜像,你看到的 pc_tros_ubuntu22.04_v1.0.0.tar.gz 就是用于 RDK X5 的交叉编译环境。
关键问题解答
1. 镜像版本兼容性
| 项目 | 说明 |
|---|---|
| 镜像发布日期 | 24-Apr-2024 |
| 适用系统 | RDKOS V3.x 系列(包括 V3.5.0) |
| ROS2 版本 | Humble(Ubuntu 22.04) |
| 架构 | X86 主机 → ARM64 目标 |
镜像虽然发布于 2024 年 4 月,但编译的程序可以在 RDKOS V3.5.0 上运行。因为:
- 交叉编译依赖的是板端 sysroot(系统库),而非内核版本
- RDKOS V3.x 系列保持 ABI 兼容
- 只要不修改内核驱动,用户态程序兼容性良好
2. 官方交叉编译步骤
# === 在 X86 主机上执行 ===
# 1. 下载镜像(约 2.5GB)
wget http://archive.d-robotics.cc/TogetheROS/cross_compile_docker/pc_tros_ubuntu22.04_v1.0.0.tar.gz
# 2. 加载镜像
sudo docker load --input pc_tros_ubuntu22.04_v1.0.0.tar.gz
# 3. 查看镜像 ID
sudo docker images | grep pc_tros
# 4. 创建工作目录
mkdir -p ~/rdk_cross_compile/cc_ws/tros_ws/src
# 5. 启动容器并挂载目录
sudo docker run -it --rm \
--entrypoint="/bin/bash" \
-v ~/rdk_cross_compile:/work \
<IMAGE_ID> # 替换为实际 IMAGE ID
# === 在 Docker 容器内执行 ===
# 6. 获取配置文件
cd /work/cc_ws/tros_ws
git clone https://github.com/D-Robotics/robot_dev_config.git -b develop
cd robot_dev_config
# 7. 切换到稳定版本(关键!)
git tag --list
git reset --hard tros_2.3.2 # 使用稳定 tag
# 8. 拉取源码
cd ..
vcs-import src < ./robot_dev_config/ros2_release.repos
# 9. 交叉编译 X5 版本
bash ./robot_dev_config/build.sh -p X5
3. 版本匹配建议
| RDKOS 版本 | 推荐 TROS 版本 | 备注 |
|---|---|---|
| V3.0.x - V3.5.x | tros_2.3.2 |
稳定版本,社区验证最多 |
| V3.5.0+ | 查看板端 apt list tros-* |
确认板端已安装的 TROS 版本 |
检查板端 TROS 版本:
# 在 RDK X5 上执行
apt list | grep tros
cat /etc/version
4. 常见问题
Q1: 镜像版本旧,是否支持 V3.5.0?
支持。用户态程序兼容性良好,除非你修改了内核驱动
Q2: 下载太慢怎么办?
# 使用 aria2 断点续传
sudo apt install aria2
aria2c -x 16 -s 16 -k 1M \
http://archive.d-robotics.cc/TogetheROS/cross_compile_docker/pc_tros_ubuntu22.04_v1.0.0.tar.gz
Q3: 编译自己的功能包?
- 将你的 package 放在
cc_ws/tros_ws/src/目录下 - 使用同样的
build.sh -p X5编译 - 生成的
install/目录拷贝到板端/opt/tros/
相关资源
建议
- 先走通官方流程:严格按照文档编译一次官方示例
- 验证版本:在板端执行
apt list | grep tros确认版本 - 再开发自己的包:编译成功后再添加自己的功能包
如果遇到具体编译报错,欢迎把错误日志贴到社区,方便定位问题。
x5-rdk-gen这个库也是开发环境搭建及编译说明,和官方提供交叉编译 Docker 镜像有什么不同
你好 @lettersony,这是一个非常好的问题!很多开发者容易混淆这两个工具。简单来说:它们服务于完全不同的开发阶段和目的。
核心区别总结
| 特性 | 交叉编译 Docker 镜像 | x5-rdk-gen |
|---|---|---|
| 主要用途 | 应用层开发 (ROS2/TROS 功能包) | 系统层开发 (定制 OS 镜像、内核、驱动) |
| 编译目标 | 用户态可执行文件 (.so, 节点) |
系统镜像 (Image, rootfs, sdcard.img) |
| 适用人群 | 算法工程师、应用开发者 | 系统工程师、驱动开发者、OS 定制者 |
| 依赖环境 | 轻量级 Docker 容器 | 复杂的 Yocto/Buildroot 环境,需 QEMU |
| 典型场景 | 写一个 ROS2 节点控制电机 | 修改内核驱动、添加系统级服务、定制文件系统 |
| 输出结果 | install/ 目录 (可拷贝到板端运行) |
可烧录的 SD 卡镜像或更新包 |
1. 交叉编译 Docker 镜像 (pc_tros_ubuntu22.04_v1.0.0)
这是你当前需要的工具,用于快速开发上层应用。
- 做什么:提供一个包含交叉编译器 (
aarch64-linux-gnu-gcc) 和板端系统库 (sysroot) 的环境。 - 解决什么:解决 “在 X86 电脑上编译出能在 ARM64 板子上跑的 ROS2 程序” 的问题。
- 工作流:
- X86 主机启动 Docker。
- 在 Docker 内编译你的 ROS2 代码。
- 生成 ARM64 架构的可执行文件。
- 将文件拷贝到 RDK X5 的
/opt/tros直接运行。
- 优点:环境隔离、配置简单、编译速度快、不污染主机系统。
- 局限:不能用来编译内核、驱动模块或修改系统底层文件。
2. x5-rdk-gen (系统镜像生成工具)
这是一个系统构建工具,用于制造或修改 RDK X5 的操作系统本身。
- 做什么:从源码编译 U-Boot、Linux Kernel、根文件系统 (Rootfs),并打包成可烧录的镜像。
- 解决什么:解决 “我想修改 RDK X5 的内核配置”、“我想添加一个系统级的驱动”、“我想定制一个精简的 OS 镜像” 的问题。
- 工作流:
- 在 X86 主机 (通常需 WSL 或 Ubuntu) 配置复杂的构建环境。
- 拉取内核、U-Boot、Yocto/Buildroot 配置。
- 执行
./pack_image.sh(这一步常调用 QEMU 模拟 ARM 环境进行部分编译)。 - 生成完整的
sdcard.img。 - 将镜像烧录到 SD 卡,重启开发板生效。
- 优点:可以深度定制系统底层。
- 局限:
- 极其耗时:编译一次内核可能需要数小时。
- 环境复杂:依赖特定版本的编译工具链,容易报错 (如你看到的
qemu: uncaught target signal 11)。 - 开发效率低:修改一行驱动代码 → 重新编译镜像 → 烧录 → 重启板子,周期很长。
场景对号入座:你应该用哪个?
| 你的需求 | 推荐工具 | 原因 |
|---|---|---|
| 开发 ROS2 节点 (感知/规划/控制) | 交叉编译 Docker | 秒级编译,无需重启板子,直接运行调试。 |
| 修改/编译第三方库 (如 OpenCV, PCL) | 交叉编译 Docker | 只需编译库文件,部署到板端指定路径。 |
| 修改内核驱动 (如 CAN, MIPI, GPIO) | x5-rdk-gen | 必须重新编译内核模块或内核本身。 |
| 定制系统镜像 (删减软件包、修改默认配置) | x5-rdk-gen | 需要修改根文件系统并重新打包镜像。 |
| 板子启动不了,想修复系统 | x5-rdk-gen | 需要重新构建并烧录完整镜像。 |
| 只是想跑通一个 Demo | 交叉编译 Docker | 官方镜像已包含所需环境,最快上手。 |
关于你提到的 qemu: uncaught target signal 11
这是使用 x5-rdk-gen 时的典型报错,通常发生在 pack_image.sh 调用 QEMU 模拟 ARM 环境执行脚本时。原因包括:
- WSL2 内核兼容性问题:WSL2 对 QEMU 某些指令支持不完善。
- 内存不足:系统构建非常消耗内存,建议 WSL2 内存分配至少 8GB+。
- 环境变量污染:主机环境与构建脚本冲突。
建议:如果你不是必须修改内核或系统底层,请避开 x5-rdk-gen,直接使用 交叉编译 Docker 进行应用开发,效率会高得多。
总结建议
- 90% 的应用开发者:只需要 交叉编译 Docker 镜像。
- 10% 的系统/驱动开发者:才需要折腾 x5-rdk-gen。
既然你的目标是进行 RDK X5 应用开发 (ROS2/TROS),请继续使用 Docker 方案。如果遇到 Docker 无法解决的底层需求 (如开发内核模块),再考虑介入 x5-rdk-gen。
参考TROS手册第一章节,环境安装即可
你好 @lettersony,这是一个非常好的问题!结合 @Marcelo6151 的建议和社区现有资源,给你详细解释两者的区别:
核心区别总结
| 特性 | 交叉编译 Docker 镜像 | x5-rdk-gen |
|---|---|---|
| 主要用途 | 应用层开发 (ROS2/TROS 功能包) | 系统层开发 (定制 OS 镜像、内核、驱动) |
| 编译目标 | 用户态可执行文件 (.so, 节点) |
系统镜像 (Image, rootfs, sdcard.img) |
| 适用人群 | 算法工程师、应用开发者 | 系统工程师、驱动开发者、OS 定制者 |
| 典型场景 | 写一个 ROS2 节点控制电机 | 修改内核驱动、添加系统级服务 |
| 输出结果 | install/ 目录 (可拷贝到板端运行) |
可烧录的 SD 卡镜像 |
1. 交叉编译 Docker 镜像(推荐用于应用开发)
这是你当前需要的工具,用于快速开发上层应用。
- 镜像文件:
pc_tros_ubuntu22.04_v1.0.0.tar.gz - 做什么:提供交叉编译器 + 板端系统库 (
sysroot) - 工作流:
# X86 主机启动 Docker → 编译 ROS2 代码 → 生成 ARM64 可执行文件 → 拷贝到板端运行 - 优点:环境隔离、配置简单、编译速度快、不污染主机
- 局限:不能编译内核、驱动模块
2. x5-rdk-gen(系统构建工具)
用于制造或修改 RDK X5 的操作系统本身。
- 仓库:GitHub - D-Robotics/x5-rdk-gen: Tools used to create the RDK OS images for RDK X5 · GitHub
- 做什么:从源码编译 U-Boot、Linux Kernel、根文件系统,打包成可烧录镜像
- 工作流:
# 配置构建环境 → 拉取内核/U-Boot 源码 → 执行 ./pack_image.sh → 生成 sdcard.img → 烧录重启 - 优点:可以深度定制系统底层
- 局限:
- 编译耗时(数小时)
- 环境复杂,易报错(如
qemu: uncaught target signal 11) - 开发周期长(修改→编译→烧录→重启)
场景对号入座
| 你的需求 | 推荐工具 |
|---|---|
| 开发 ROS2 节点 (感知/规划/控制) | |
| 修改/编译第三方库 (OpenCV, PCL) | |
| 修改内核驱动 (CAN, MIPI, GPIO) | |
| 定制系统镜像 (删减软件包) | |
| 只是想跑通 Demo |
官方文档参考
按照 @Marcelo6151 的建议,参考 TROS 手册第一章节:
5.1.3 源码安装 | RDK DOC - 交叉编译 Docker 使用指南
RDK X5 算法工具链 - 系统层开发参考
总结建议
- 90% 应用开发者:只需要 交叉编译 Docker 镜像
- 10% 系统/驱动开发者:才需要 x5-rdk-gen
既然你的目标是进行 RDK X5 应用开发 (ROS2/TROS),请继续使用 Docker 方案,效率会高得多。只有遇到 Docker 无法解决的底层需求(如开发内核模块),再考虑 x5-rdk-gen。
有问题欢迎继续交流!