RDK X5交叉编译

需要在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?

  • :white_check_mark: 支持。用户态程序兼容性良好,除非你修改了内核驱动

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/

相关资源

建议

  1. 先走通官方流程:严格按照文档编译一次官方示例
  2. 验证版本:在板端执行 apt list | grep tros 确认版本
  3. 再开发自己的包:编译成功后再添加自己的功能包

如果遇到具体编译报错,欢迎把错误日志贴到社区,方便定位问题。

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 程序” 的问题。
  • 工作流
    1. X86 主机启动 Docker。
    2. 在 Docker 内编译你的 ROS2 代码。
    3. 生成 ARM64 架构的可执行文件。
    4. 将文件拷贝到 RDK X5 的 /opt/tros 直接运行。
  • 优点:环境隔离、配置简单、编译速度快、不污染主机系统。
  • 局限不能用来编译内核、驱动模块或修改系统底层文件。

2. x5-rdk-gen (系统镜像生成工具)

这是一个系统构建工具,用于制造或修改 RDK X5 的操作系统本身

  • 做什么:从源码编译 U-Boot、Linux Kernel、根文件系统 (Rootfs),并打包成可烧录的镜像。
  • 解决什么:解决 “我想修改 RDK X5 的内核配置”、“我想添加一个系统级的驱动”、“我想定制一个精简的 OS 镜像” 的问题。
  • 工作流
    1. 在 X86 主机 (通常需 WSL 或 Ubuntu) 配置复杂的构建环境。
    2. 拉取内核、U-Boot、Yocto/Buildroot 配置。
    3. 执行 ./pack_image.sh (这一步常调用 QEMU 模拟 ARM 环境进行部分编译)。
    4. 生成完整的 sdcard.img
    5. 将镜像烧录到 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 环境执行脚本时。原因包括:

  1. WSL2 内核兼容性问题:WSL2 对 QEMU 某些指令支持不完善。
  2. 内存不足:系统构建非常消耗内存,建议 WSL2 内存分配至少 8GB+。
  3. 环境变量污染:主机环境与构建脚本冲突。

建议:如果你不是必须修改内核或系统底层,请避开 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 节点 (感知/规划/控制) :white_check_mark: 交叉编译 Docker
修改/编译第三方库 (OpenCV, PCL) :white_check_mark: 交叉编译 Docker
修改内核驱动 (CAN, MIPI, GPIO) :warning: x5-rdk-gen
定制系统镜像 (删减软件包) :warning: x5-rdk-gen
只是想跑通 Demo :white_check_mark: 交叉编译 Docker

官方文档参考

按照 @Marcelo6151 的建议,参考 TROS 手册第一章节:


总结建议

  • 90% 应用开发者:只需要 交叉编译 Docker 镜像
  • 10% 系统/驱动开发者:才需要 x5-rdk-gen

既然你的目标是进行 RDK X5 应用开发 (ROS2/TROS),请继续使用 Docker 方案,效率会高得多。只有遇到 Docker 无法解决的底层需求(如开发内核模块),再考虑 x5-rdk-gen

有问题欢迎继续交流!