ros2在X86平台使用ros的docker交叉编译

我使用的RDK X5开发板,需要使用ros2系统进行开发,现在X86的wsl系统中已经从官方安装了ros2系统,开发板已经通过apt方式安装了TogetherROS.bot系统,但是我现在需要在X86中进行交叉编译出可以在RDK X5arm64架构的平台上直接运行的可执行文件,编译过程中缺少板端库,我看社区相关帖子显示可以通过源码安装X86的togetherros的docker镜像,在docker中使用交叉表编译工具进行编译,请问这个docker是直接按照源码安装就行吗,这样安装的只是docker还是整个TogetherROS.bot系统,影不影响我的ros2的使用,有没有具体的使用文档说明呢

针对你的问题,我结合社区现有文档和帖子给你一个清晰的解答:

结论

是的,直接按照官方文档安装 Docker 镜像即可。这个 Docker 镜像是专门用于交叉编译的开发环境,不是完整的 TogetherROS.bot 系统,不会影响你现有的 ROS2 使用

关键点说明

1. Docker 镜像的作用

  • 仅包含交叉编译工具链:镜像内包含了 X86 主机编译 ARM64 目标程序所需的编译器、sysroot(板端库)、CMake 工具链文件等
  • 不包含完整 TROS 运行时:镜像不是用来运行 TROS 的,只是用来编译能在 RDK X5 上运行的程序
  • 隔离环境:在 Docker 内编译,与你 WSL 中已安装的 ROS2 完全隔离,互不影响

2. 核心原理

交叉编译的关键在于解决依赖库架构不匹配问题:

  • Sysroot 环境:Docker 内的 sysroot_docker 目录包含了 RDK X5(ARM64)的系统库和依赖库
  • 工具链配置aarch64_toolchainfile.cmake 文件配置了 CMAKE_SYSROOT,强制编译器查找 ARM64 库而非 X86 库

3. 操作步骤(简化版)

# === 在 X86 主机上执行 ===

# 1. 下载并加载 Docker 镜像(Humble 版本对应 X5)
wget http://archive.d-robotics.cc/TogetheROS/cross_compile_docker/pc_tros_ubuntu22.04_v1.0.0.tar.gz
sudo docker load --input pc_tros_ubuntu22.04_v1.0.0.tar.gz

# 2. 查看镜像 ID
sudo docker images | grep pc_tros

# 3. 创建工作目录
mkdir -p ~/cc_ws/tros_ws/src

# 4. 启动 Docker 并挂载目录(替换 IMAGE_ID 为上一步查到的 ID)
sudo docker run -it --rm \
  --entrypoint="/bin/bash" \
  -v ~/cc_ws:/cc_ws \
  <IMAGE_ID>

# === 在 Docker 容器内执行 ===

# 5. 获取配置文件
cd /cc_ws/tros_ws
git clone https://github.com/D-Robotics/robot_dev_config.git -b develop
cd robot_dev_config

# 6. 切换到稳定版本(重要!避免编译报错)
git tag --list  # 查看可用版本,如 tros_2.3.2
git reset --hard tros_2.3.2

# 7. 拉取源码
cd ..
vcs-import src < ./robot_dev_config/ros2_release.repos

# 8. 交叉编译 X5 版本
bash ./robot_dev_config/build.sh -p X5

4. 你的 ROS2 环境不受影响

  • Docker 内的 ROS2 仅用于编译时依赖查找
  • 你 WSL 中的 ROS2 保持不变,可继续用于其他开发
  • 编译生成的可执行文件(在 install 目录)拷贝到 RDK X5 即可运行

注意事项

  1. 版本匹配

    • RDK X5 使用 Ubuntu 22.04 + ROS2 Humble
    • 必须下载 pc_tros_ubuntu22.04_v1.0.0.tar.gz(不是 Foxy 版本)
  2. 代码版本

    • 必须使用 git reset --hard 切换到稳定 tag(如 tros_2.3.2
    • 直接用 develop 分支会编译报错(社区已有案例)
  3. 网络问题

    • vcs-import 拉取 GitHub 仓库可能需要配置代理
    • 可参考社区帖子配置 Git 代理
  4. 编译自己的功能包

    • tros_ws/src 下创建你的 package
    • 使用同样的 build.sh -p X5 编译即可

相关资源

建议

如果你是第一次使用,建议:

  1. 先严格按照文档走通一次完整流程
  2. 编译成功后,再尝试添加自己的功能包
  3. 遇到报错优先检查:Docker 镜像版本、代码 tag 版本、网络代理

有问题可以在社区继续提问,建议把你的编译报错日志贴出来方便定位。

所以该怎么安装X86的ros的docker进行交叉编译呢

X86 交叉编译 Docker 安装步骤(RDK X5 专用)

直接按下面步骤操作即可,不会影响你现有的 ROS2 环境


第一步:下载并加载 Docker 镜像

# 1. 创建工作目录
mkdir -p ~/rdk_cross_compile
cd ~/rdk_cross_compile

# 2. 下载 X5 专用的交叉编译镜像(Humble 版本)
wget http://archive.d-robotics.cc/TogetheROS/cross_compile_docker/pc_tros_ubuntu22.04_v1.0.0.tar.gz

# 3. 加载镜像到 Docker
sudo docker load --input pc_tros_ubuntu22.04_v1.0.0.tar.gz

# 4. 确认镜像已加载
sudo docker images | grep pc_tros
# 记下 IMAGE ID(如 4cbdb9d61e19)

第二步:启动 Docker 容器

# 启动容器并挂载工作目录
sudo docker run -it --rm \
  --entrypoint="/bin/bash" \
  -v ~/rdk_cross_compile:/work \
  <IMAGE_ID>  # 替换为上一步查到的 IMAGE ID

第三步:在 Docker 内获取源码

# 1. 进入工作目录
cd /work
mkdir -p cc_ws/tros_ws/src
cd cc_ws/tros_ws

# 2. 克隆配置文件仓库
git clone https://github.com/D-Robotics/robot_dev_config.git -b develop
cd robot_dev_config

# 3. 切换到稳定版本(关键!避免编译报错)
git tag --list  # 查看可用版本
git reset --hard tros_2.3.2  # 或最新稳定 tag

# 4. 拉取 TROS 源码
cd ..
vcs-import src < ./robot_dev_config/ros2_release.repos

:warning: 网络问题:如果 vcs-import 失败(显示 EEEEE),需要配置 Git 代理:

git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890

第四步:交叉编译

# 编译 X5 版本
bash ./robot_dev_config/build.sh -p X5

# 编译完成后,可执行文件在 /work/cc_ws/tros_ws/install 目录

第五步:部署到板端

# 在宿主机上执行,将编译结果拷贝到 RDK X5
scp -r ~/rdk_cross_compile/cc_ws/tros_ws/install root@<板端IP>:/opt/tros

常见问题

问题 解决方案
client version too old 升级 Docker:sudo apt update && sudo apt install docker.io
vcs-import 失败 配置 Git 代理或换网络环境
编译报错 ament_cmake not found 检查是否 source 了 ROS2 环境,或代码版本不对
编译报错 file in wrong format 确认使用了 -p X5 参数,且代码 tag 版本匹配

验证是否成功

编译成功后,install 目录下的可执行文件应该是 ARM64 架构

file install/<your_package>/lib/<your_package>/*
# 应显示:ELF 64-bit LSB executable, ARM aarch64

官方文档参考


按这个流程走,有问题把具体报错信息贴出来,方便定位。

有没有国内源可以下载这个docker呢

目前官方没有提供专门的国内 CDN 镜像源archive.d-robotics.cc 是官方统一的资源服务器。不过针对国内下载慢或失败的问题,有以下几种解决方案:

解决方案

方案一:使用代理/加速器(推荐)

如果你能配置网络代理,这是最直接的方式:

# 配置 wget 使用代理
wget --proxy=on \
  http://archive.d-robotics.cc/TogetheROS/cross_compile_docker/pc_tros_ubuntu22.04_v1.0.0.tar.gz

# 或者配置环境变量
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
wget http://archive.d-robotics.cc/TogetheROS/cross_compile_docker/pc_tros_ubuntu22.04_v1.0.0.tar.gz

方案二:使用下载工具断点续传

使用 aria2caxel 等多线程下载工具,提高下载成功率:

# 安装 aria2
sudo apt update && sudo apt install aria2

# 使用 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

# 如果中断,再次执行相同命令会自动续传

方案三:手动下载后传输

如果 WSL 内下载困难,可以:

  1. 在 Windows 主机下载

    • 使用浏览器或 IDM 等下载工具下载
    • URL: http://archive.d-robotics.cc/TogetheROS/cross_compile_docker/pc_tros_ubuntu22.04_v1.0.0.tar.gz
  2. 复制到 WSL

    # Windows 文件在 WSL 中的路径
    cp /mnt/c/Users/你的用户名/Downloads/pc_tros_ubuntu22.04_v1.0.0.tar.gz ~/rdk_cross_compile/
    
  3. 在 WSL 中加载镜像

    cd ~/rdk_cross_compile
    sudo docker load --input pc_tros_ubuntu22.04_v1.0.0.tar.gz
    

方案四:检查官方是否有更新镜像

镜像文件较大(约 2-3GB),下载前确认版本:

# 文件大小约 2.5GB 左右
ls -lh pc_tros_ubuntu22.04_v1.0.0.tar.gz

下载验证

下载完成后验证文件完整性:

# 检查文件大小(应该约 2.5GB)
ls -lh pc_tros_ubuntu22.04_v1.0.0.tar.gz

# 加载镜像
sudo docker load --input pc_tros_ubuntu22.04_v1.0.0.tar.gz

# 确认加载成功
sudo docker images | grep pc_tros

注意事项

  1. 文件大小:镜像文件约 2.5GB,确保磁盘空间充足
  2. 下载时间:根据网络情况,可能需要较长时间
  3. 断点续传:强烈建议使用 aria2c 或支持断点续传的工具
  4. WSL2 网络:WSL2 的网络有时不稳定,建议在 Windows 主机下载后复制进去

如果仍然下载失败

可以在社区发帖求助,看是否有其他开发者分享了镜像文件(注意版权):


建议优先尝试方案二(aria2c)或方案三(Windows 下载后复制),这两种方式在国内网络环境下成功率最高。

有没有国内源可以下载这个docker呢

  • http://archive.d-robotics.cc/TogetheROS/cross_compile_docker/pc_tros_ubuntu22.04_v1.0.0.tar.gz

我使用这个链接先下载到windows中,然后传到wsl中,检查大小只有679MB,正常吗,目录下还出现一个pc_tros_ubuntu22.04_v1.0.0.tar.gz:Zone.ldentifier的文件是什么

问题分析

1. 文件大小异常 :warning:

679MB 不正常! 根据社区开发者反馈,该镜像文件应该约 2.5GB 左右。你的文件明显下载不完整。

2. Zone.Identifier 文件

这是 Windows 的安全标记文件,表示该文件来自互联网(非本地创建)。可以安全删除,不影响使用:

# 删除该文件
rm pc_tros_ubuntu22.04_v1.0.0.tar.gz:Zone.Identifier
# 或在 Windows 中右键文件 → 属性 → 勾选"解除锁定"

解决方案

方案一:使用 aria2c 重新下载(推荐)

在 WSL 中使用 aria2c 支持断点续传,避免下载中断:

# 1. 安装 aria2
sudo apt update && sudo apt install aria2

# 2. 删除不完整的文件
rm pc_tros_ubuntu22.04_v1.0.0.tar.gz*

# 3. 使用 aria2c 下载(16 线程,支持断点续传)
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

# 4. 如果中断,再次执行相同命令会自动续传

方案二:在 Windows 使用下载工具

使用 IDM迅雷浏览器下载管理器

  1. 复制下载链接:

    http://archive.d-robotics.cc/TogetheROS/cross_compile_docker/pc_tros_ubuntu22.04_v1.0.0.tar.gz
    
  2. 粘贴到下载工具中下载

  3. 下载完成后检查文件大小(应约 2.5GB)

  4. 复制到 WSL:

    # 假设文件在 Windows 下载目录
    cp /mnt/c/Users/你的用户名/Downloads/pc_tros_ubuntu22.04_v1.0.0.tar.gz ~/rdk_cross_compile/
    

方案三:检查是否有备用链接

搜索社区是否有开发者分享过备用下载源:

问题分析

1. 文件大小不正常 :cross_mark:

679MB 明显偏小,完整的 pc_tros_ubuntu22.04_v1.0.0.tar.gz 镜像文件应该约 2.5GB 左右。

这说明:

  • 下载未完成(网络中断)
  • 或者浏览器/下载工具解析错误(可能下载成了网页而非文件)
  • 或者服务器返回了错误响应

2. .Zone.Identifier 文件是什么?

这是 Windows 的安全标记文件,表示该文件是从互联网下载的:

pc_tros_ubuntu22.04_v1.0.0.tar.gz:Zone.Identifier
  • 作用:Windows 标记文件来源,运行时会提示"此文件来自其他计算机"
  • 处理:可以安全删除,不影响使用
  • 删除方法
    # 在 WSL 中
    rm pc_tros_ubuntu22.04_v1.0.0.tar.gz:Zone.Identifier
    
    # 或在 Windows 中右键文件 → 属性 → 勾选"解除锁定"
    

解决方案

方案一:重新下载(推荐用 aria2)

# 在 WSL 中安装 aria2
sudo apt update && sudo apt install aria2

# 使用 aria2 下载(支持断点续传,16 线程)
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

# 如果中断,再次执行相同命令会自动续传

方案二:在 Windows 中用浏览器重新下载

  1. 直接点击下载链接(不要用右键另存为):

    http://archive.d-robotics.cc/TogetheROS/cross_compile_docker/pc_tros_ubuntu22.04_v1.0.0.tar.gz
    
  2. 使用下载工具(如 IDM、FDM、迅雷等):

    • 这些工具支持断点续传
    • 下载完成后检查文件大小是否约 2.5GB
  3. 复制到 WSL

    # Windows 文件复制到 WSL
    cp /mnt/c/Users/你的用户名/Downloads/pc_tros_ubuntu22.04_v1.0.0.tar.gz ~/rdk_cross_compile/
    
    # 删除 Zone.Identifier 文件
    rm ~/rdk_cross_compile/pc_tros_ubuntu22.04_v1.0.0.tar.gz:Zone.Identifier
    
    # 验证大小
    ls -lh ~/rdk_cross_compile/pc_tros_ubuntu22.04_v1.0.0.tar.gz
    # 应该显示约 2.5G
    

方案三:验证下载是否成功

# 1. 检查文件大小
ls -lh pc_tros_ubuntu22.04_v1.0.0.tar.gz
# 正常应该显示约 2.5G

# 2. 尝试加载镜像
sudo docker load --input pc_tros_ubuntu22.04_v1.0.0.tar.gz

# 3. 如果加载失败会提示错误,如:
# "archive/tar: invalid tar header" 或 "unexpected EOF"
# 这说明文件损坏,需要重新下载

快速检查清单

检查项 正常值 你的情况
文件大小 ~2.5GB :cross_mark: 679MB
文件后缀 .tar.gz
Zone.Identifier 可有可无 有(正常)
docker load 成功加载 待验证

建议

  1. 删除当前文件,重新下载
  2. 使用 aria2 或 IDM 等支持断点续传的工具
  3. 下载完成后先验证大小(约 2.5GB)再加载
  4. 如果多次下载都失败,可以在社区发帖求助,看是否有开发者分享了镜像文件

需要我帮你确认最新的镜像下载地址或版本号吗?

如何进入这个docker中,加载后的docker是2.09G

文件大小正常 ✓

2.09G 是正常的文件大小,可以继续使用。


进入 Docker 容器的步骤

第一步:查看镜像 ID

# 加载镜像
sudo docker load --input pc_tros_ubuntu22.04_v1.0.0.tar.gz

# 查看已加载的镜像
sudo docker images | grep pc_tros

输出示例:

pc_tros_ubuntu22.04    v1.0.0    4cbdb9d61e19    2 months ago    2.09GB

记下 IMAGE ID(如 4cbdb9d61e19


第二步:启动并进入容器

# 创建工作目录(在宿主机 WSL 中)
mkdir -p ~/rdk_cross_compile/cc_ws/tros_ws/src

# 启动容器并挂载目录
sudo docker run -it --rm \
  --entrypoint="/bin/bash" \
  -v ~/rdk_cross_compile:/work \
  4cbdb9d61e19    # 替换为你的 IMAGE ID

参数说明:

参数 作用
-it 交互式终端
--rm 容器退出后自动删除
--entrypoint="/bin/bash" 直接进入 bash
-v ~/rdk_cross_compile:/work 挂载宿主机目录到容器 /work

第三步:验证进入成功

进入容器后,提示符会变成类似:

root@4cbdb9d61e19:/ros2_ws#

验证环境:

# 检查 ROS2 环境
source /opt/ros/humble/setup.bash
ros2 --version

# 检查挂载目录
ls /work

# 查看容器内目录结构
ls -la /ros2_ws

第四步:开始交叉编译

# 进入工作目录
cd /work/cc_ws/tros_ws

# 获取配置文件
git clone https://github.com/D-Robotics/robot_dev_config.git -b develop
cd robot_dev_config

# 切换到稳定版本
git tag --list
git reset --hard tros_2.3.2

# 拉取源码
cd ..
vcs-import src < ./robot_dev_config/ros2_release.repos

# 编译 X5 版本
bash ./robot_dev_config/build.sh -p X5

退出容器

# 在容器内执行
exit

# 或使用 Ctrl+D

由于使用了 --rm 参数,容器退出后会自动删除,但挂载的 /work 目录数据会保留


常见问题

问题 解决
permission denied 在宿主机执行 sudo chmod 777 ~/rdk_cross_compile
vcs-import 失败 配置 Git 代理或换网络
容器启动后立刻退出 检查 --entrypoint 参数是否正确
找不到 IMAGE ID 重新执行 sudo docker images 确认

官方文档参考

按以上步骤操作,有问题把具体报错贴出来。