为什么我下载了用于交叉编译的docker,但是里面没有sysroot_docker文件夹

root@7fd16d1abdba:/work/cc_ws/tros_ws# ls
build install log robot_dev_config src
root@7fd16d1abdba:/work/cc_ws/tros_ws# bash ./robot_dev_config/build.sh -p X5
PACKAGE_SELECTION is empty and reset with RAW_OPTIONS
PACKAGE_SELECTION:
rm: cannot remove ‘/work/cc_ws/tros_ws/../sysroot_docker/usr’: No such file or directory
rm: missing operand
Try ‘rm --help’ for more information.
find: ‘tros_arm_build/packages’: No such file or directory
rm: missing operand
Try ‘rm --help’ for more information.
build platform X5
build X5
ln: failed to create symbolic link ‘/work/cc_ws/tros_ws/../sysroot_docker/usr’: No such file or directory
[INFO] Running pre_function
[INFO] Creating symlinks…
touch: cannot touch ‘./src/tools/benchmark/performance_test_ros1_msgs/COLCON_IGNORE’: No such file or directory
touch: cannot touch ‘./src/tools/benchmark/performance_test_ros1_publisher/COLCON_IGNORE’: No such file or directory
touch: cannot touch ‘./src/tools/benchmark/performance_report/COLCON_IGNORE’: No such file or directory
touch: cannot touch ‘./src/box/hobot_perception/hobot_bev/COLCON_IGNORE’: No such file or directory
touch: cannot touch ‘./src/box/hobot_perception/hobot_centerpoint/COLCON_IGNORE’: No such file or directory
touch: cannot touch ‘./src/box/hobot_perception/parking_perception/COLCON_IGNORE’: No such file or directory
touch: cannot touch ‘./src/box/hobot_sensor/hobot_rgbd_cam/COLCON_IGNORE’: No such file or directory
touch: cannot touch ‘./src/box/hobot_sensor/hobot_stereo_usb_cam/COLCON_IGNORE’: No such file or directory
touch: cannot touch ‘./src/box/hobot_llamacpp/COLCON_IGNORE’: No such file or directory
touch: cannot touch ‘./src/box/hobot_xlm/COLCON_IGNORE’: No such file or directory
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 /work/cc_ws/tros_ws/../sysroot_docker/usr/ros/humble/bin/rtabmap-res_tool not exist
  • warnning: source file /work/cc_ws/tros_ws/../sysroot_docker/usr/ros/humble/bin/rtabmap-res_tool-0.3.0 not exist
  • warnning: source file /work/cc_ws/tros_ws/../sysroot_docker/usr/ros/humble/lib/x86_64-linux-gnu/librtabmap_utilite.so.0.22 not exist

我来帮你排查这个问题。首先搜索一下社区是否有类似的解决方案。

你好 @vzenith,根据你提供的错误日志和社区已有经验,问题很明确:你的 robot_dev_config 仓库版本过旧或缺失关键配置,导致 sysroot_docker 目录未正确初始化。

核心结论

你遇到的 sysroot_docker 文件夹不存在、rmln 报错,是因为:

  1. robot_dev_config 版本不对:未使用 RDK X5 对应的稳定版本(如 tros_2.3.2
  2. sysroot_docker 未正确生成:该目录应在 Docker 镜像启动时自动挂载,或通过脚本初始化

解决步骤

1. 确认 Docker 镜像和目录结构

首先确认你使用的 Docker 镜像是否正确,以及 sysroot_docker 是否存在:

# 在 Docker 容器内执行
ls -la /work/cc_ws/
# 应该看到 sysroot_docker 目录(与 tros_ws 同级)

如果 sysroot_docker 不存在,说明 Docker 镜像未正确挂载或版本不对。

2. 重新获取正确的 robot_dev_config

关键步骤:必须使用稳定版本标签(tag),而不是默认的 develop 分支。

cd /work/cc_ws/tros_ws

# 删除旧的 robot_dev_config(如果有)
rm -rf robot_dev_config

# 重新克隆并切换到稳定版本
git clone https://github.com/D-Robotics/robot_dev_config.git -b develop
cd robot_dev_config

# 查看可用标签
git tag --list

# 切换到 RDK X5 稳定版本(推荐 tros_2.3.2)
git reset --hard tros_2.3.2

:warning: 注意:如果不执行 git reset --hard tros_2.3.2build.sh 脚本可能不包含 X5 的配置,导致 sysroot_docker 路径错误。

3. 确认 sysroot_docker 目录

sysroot_docker 应该在 Docker 镜像中已存在,路径为:

/work/sysroot_docker

/work/cc_ws/sysroot_docker

检查你的 Docker 启动命令是否正确挂载了目录:

# 正确的启动方式示例
sudo docker run -it --rm \
  --entrypoint="/bin/bash" \
  -v ~/rdk_cross_compile:/work \
  <IMAGE_ID>

在容器内确认:

ls -la /work/sysroot_docker
# 或
ls -la /work/cc_ws/sysroot_docker

4. 重新拉取源码并编译

cd /work/cc_ws/tros_ws

# 使用正确的 repos 文件拉取源码
vcs-import src < ./robot_dev_config/ros2_release.repos

# 执行交叉编译
bash ./robot_dev_config/build.sh -p X5

常见错误对照

错误现象 原因 解决方案
rm: cannot remove '../sysroot_docker/usr': No such file or directory sysroot_docker 路径错误或未挂载 确认 Docker 启动时挂载了正确目录
ln: failed to create symbolic link '../sysroot_docker/usr' robot_dev_config 版本过旧 执行 git reset --hard tros_2.3.2
find: 'tros_arm_build/packages': No such file or directory 配置文件缺失 重新克隆 robot_dev_config 并切换 tag
touch: cannot touch './src/.../COLCON_IGNORE' 源码目录结构不对 确认 vcs-import 成功完成

验证清单

在执行 build.sh -p X5 前,请确认:

  • Docker 镜像为 pc_tros_ubuntu22.04_v1.0.0 或更新版本
  • robot_dev_config 已切换到 tros_2.3.2 标签
  • /work/sysroot_docker/work/cc_ws/sysroot_docker 目录存在
  • vcs-import 成功拉取所有源码包

相关资源

如果问题仍未解决,请提供:

  1. 你使用的 Docker 镜像名称(docker images 输出)
  2. ls -la /work/cc_ws/ 的完整输出
  3. git tag --list 的输出

这样可以更精准定位问题。

pc_tros_ubuntu22.04:v1.0.0 e42755fdcb63 4.28GB 2.09GB U

root@7fd16d1abdba:/work# ls -la /work/cc_ws/
total 12
drwxrwxr-x 3 1000 1000 4096 Jun 3 09:32 .
drwxrwxr-x 3 1000 1000 4096 Jun 3 09:46 ..
drwxrwxr-x 8 1000 1000 4096 Jun 3 10:14 tros_ws
root@7fd16d1abdba:/work#

root@7fd16d1abdba:/work/cc_ws/tros_ws/robot_dev_config#
git tag --list
cicd-test
hhp_1.0.1
hhp_1.0.2
hhp_1.0.3
hhp_1.0.4
hhp_1.0.5
tros_1.1.0
tros_1.1.1
tros_1.1.2
tros_1.1.3
tros_1.1.4
tros_1.1.5
tros_1.1.6
tros_1.1.7
tros_2.0.0
tros_2.0.1
tros_2.0.2
tros_2.1.0
tros_2.1.1
tros_2.1.1RC1
tros_2.1.2
tros_2.1.3
tros_2.2.0
tros_2.3.0
tros_2.3.1
tros_2.3.2
tros_2.3.3
tros_2.4.0
tros_2.4.1
tros_2.4.2
tros_2.4.3
tros_2.4.4
tros_2.4.5
tros_2.4.6
tros_2.5.0
tros_2.5.1
tros_2.5.2
v1.0RC1

你好 @vzenith,从你提供的信息看,sysroot_docker 目录确实缺失,这是导致所有 rmln 报错的根本原因。

核心问题

sysroot_docker 应该在 /work/ 目录下(与 cc_ws 同级),但你的 /work/cc_ws/ 下只有 tros_ws


快速排查与解决

1. 先确认 sysroot_docker 是否存在

# 在 Docker 容器内执行
ls -la /work/

预期结果:应该看到 sysroot_dockercc_ws 两个目录同级。

如果 /work/sysroot_docker 不存在,说明 Docker 镜像有问题,需要重新加载。


2. 确认 robot_dev_config 版本

你当前在 tros_ws/robot_dev_config 目录下,请执行:

cd /work/cc_ws/tros_ws/robot_dev_config
git log --oneline -1

确认是否已经切换到 tros_2.3.2。如果没有,执行:

git reset --hard tros_2.3.2

3. 如果 sysroot_docker 确实不存在

方案 A:检查 Docker 镜像是否正确加载

# 退出容器,在主机上执行
docker images | grep pc_tros

确认镜像是 pc_tros_ubuntu22.04:v1.0.0。如果镜像有问题,重新加载:

# 在主机上执行
sudo docker load --input pc_tros_ubuntu22.04_v1.0.0.tar.gz

方案 B:手动创建 sysroot_docker 软链接(临时方案)

如果镜像中确实没有 sysroot_docker,可以尝试从镜像内部查找:

# 在容器内执行
find / -name "sysroot_docker" -type d 2>/dev/null

如果找到其他位置的 sysroot,可以创建软链接:

cd /work/cc_ws
ln -s /找到的路径/sysroot_docker sysroot_docker

4. 验证目录结构

正确的目录结构应该是:

/work/
├── sysroot_docker/
│   ├── usr/
│   ├── lib/
│   └── ...
└── cc_ws/
    └── tros_ws/
        ├── src/
        ├── build/
        ├── install/
        └── robot_dev_config/

建议操作顺序

# 1. 检查 /work/ 目录
ls -la /work/

# 2. 如果 sysroot_docker 不存在,查找它
find / -name "sysroot_docker" -type d 2>/dev/null

# 3. 确认 robot_dev_config 版本
cd /work/cc_ws/tros_ws/robot_dev_config
git log --oneline -1
git reset --hard tros_2.3.2

# 4. 重新执行编译
cd /work/cc_ws/tros_ws
bash ./robot_dev_config/build.sh -p X5

如果问题仍未解决

请提供以下信息,方便进一步定位:

  1. ls -la /work/ 的完整输出
  2. find / -name "sysroot_docker" -type d 2>/dev/null 的输出
  3. 你是如何启动 Docker 容器的?(完整的 docker run 命令)

这样可以判断是镜像问题还是挂载问题。


相关资源

ls -la /work/
total 694584
drwxrwxr-x 3 1000 1000 4096 Jun 3 09:46 .
drwxr-xr-x 1 root root 4096 Jun 3 09:56 ..
drwxrwxr-x 3 1000 1000 4096 Jun 3 09:32 cc_ws
-rw-rw-r-- 1 1000 1000 711234283 Apr 24 2024 pc_tros_ubuntu22.04_v1.0.0.tar.gz
root@7fd16d1abdba:/work/cc_ws/tros_ws# find / -name “sysroot_docker” -type d 2>/dev/null
root@7fd16d1abdba:/work/cc_ws/tros_ws#

sudo docker run -it --rm
–entrypoint=“/bin/bash”
-v ~/rdk_cross_compile:/work
e42755fdcb63

你好 @vzenith,问题根因已定位:你使用的 Docker 镜像 pc_tros_ubuntu22.04:v1.0.0 内部缺少 sysroot_docker 目录

这是镜像文件不完整或版本错误导致的。从你的 /work/ 目录中还存在 .tar.gz 文件来看,可能是镜像加载过程有问题。


:bullseye: 解决方案

方案一:重新加载 Docker 镜像(推荐)

# 1. 退出当前容器
exit

# 2. 在主机上删除旧镜像
sudo docker rmi e42755fdcb63

# 3. 重新加载镜像(确保 tar.gz 文件完整)
cd ~/rdk_cross_compile
sudo docker load --input pc_tros_ubuntu22.04_v1.0.0.tar.gz

# 4. 验证镜像内容(关键步骤!)
sudo docker run --rm pc_tros_ubuntu22.04:v1.0.0 ls -la /work/

预期输出应该包含 sysroot_docker

total ...
drwxrwxr-x sysroot_docker
drwxrwxr-x cc_ws

如果还是没有 sysroot_docker,说明 tar.gz 文件本身有问题。


方案二:检查 tar.gz 文件完整性

# 在主机上检查文件大小
ls -lh ~/rdk_cross_compile/pc_tros_ubuntu22.04_v1.0.0.tar.gz
# 应该是 ~2.09GB 左右

# 检查 MD5(如果有官方提供的校验值)
md5sum ~/rdk_cross_compile/pc_tros_ubuntu22.04_v1.0.0.tar.gz

如果文件不完整,重新下载:

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

方案三:使用更新的镜像版本

社区已有用户使用更新版本解决问题,尝试下载新版镜像:

# 查看是否有更新版本
wget http://archive.d-robotics.cc/TogetheROS/cross_compile_docker/

# 或尝试 v1.0.5 版本(如果有)
wget http://archive.d-robotics.cc/TogetheROS/cross_compile_docker/pc_tros_ubuntu22.04_v1.0.5.tar.gz

:magnifying_glass_tilted_left: 验证步骤

重新加载镜像后,按以下顺序验证:

# 1. 启动新容器(不挂载任何目录,先检查镜像内部)
sudo docker run -it --rm --entrypoint="/bin/bash" pc_tros_ubuntu22.04:v1.0.0

# 2. 在容器内检查
ls -la /work/
# 应该看到 sysroot_docker

ls -la /work/sysroot_docker/usr/
# 应该看到 ros/ 目录

# 3. 确认有 X5 的 sysroot
ls /work/sysroot_docker/usr_x5/

:clipboard: 正确的目录结构

镜像内部应该是这样的:

/work/
├── sysroot_docker/          # ← 必须存在!
│   ├── usr/
│   ├── usr_x5/
│   ├── lib/
│   └── ...
└── cc_ws/                   # 可选,有些镜像包含示例
    └── tros_ws/

:warning: 注意事项

  1. 不要手动创建 sysroot_docker:这个目录必须来自镜像内部,手动创建会导致库文件缺失

  2. 挂载目录要正确:启动容器时,挂载的主机目录会覆盖镜像内的 /work/,所以:

    • 第一次使用时,不要挂载 /work/,先让镜像内部的 sysroot_docker 生效
    • 或者只挂载子目录,如 -v ~/my_code:/work/cc_ws/tros_ws/src/my_package
  3. 正确的启动命令(首次使用):

    # 不挂载 /work/,使用镜像内部目录
    sudo docker run -it --rm \
      --entrypoint="/bin/bash" \
      pc_tros_ubuntu22.04:v1.0.0
    
    # 在容器内工作,完成后用 docker cp 导出编译结果
    

:books: 相关资源


请先执行方案一中的验证步骤,告诉我 sudo docker run --rm pc_tros_ubuntu22.04:v1.0.0 ls -la /work/ 的输出结果,我们可以进一步判断是镜像问题还是下载文件问题。

vcs-import src < ./robot_dev_config/ros2_release.repos我只想在docker里面编译我的ros2包,应该不需要执行这一句吧

你好 @vzenith你的理解基本正确,但需要分情况讨论


:bullseye: 核心结论

编译方式 是否需要 vcs-import 原因
使用 build.sh -p X5 :white_check_mark: 需要 脚本会操作 TROS 源码目录
使用标准 colcon build + 工具链 :cross_mark: 不需要 只编译你自己的包

问题根因

从你的错误日志看,build.sh 脚本会尝试执行:

touch ./src/box/hobot_perception/hobot_bev/COLCON_IGNORE
touch ./src/rtabmap_ros/rtabmap_demos/COLCON_IGNORE
...

这些目录是 TROS 官方包,如果你没执行 vcs-import,这些目录不存在,就会报 touch: cannot touch 错误。


:white_check_mark: 推荐方案:标准 colcon 交叉编译(不需要 vcs-import)

如果你只想编译自己的 ROS2 包,不建议使用 build.sh,而是用标准方式:

1. 准备工作目录

# 在 Docker 容器内
mkdir -p /work/my_ws/src
cd /work/my_ws/src

2. 放置你的功能包

# 把你的包复制到这里
cp -r ~/your_package /work/my_ws/src/

3. 使用工具链文件编译

cd /work/my_ws

# 使用 RDK X5 的工具链文件
colcon build \
  --cmake-args \
    -DCMAKE_TOOLCHAIN_FILE=/work/sysroot_docker/usr/share/cmake/aarch64_toolchainfile.cmake \
    -DCMAKE_FIND_ROOT_PATH=/work/sysroot_docker/usr \
    -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER \
    -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \
    -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY

:warning: 关键:工具链文件路径可能不同,先确认存在:

find /work/sysroot_docker -name "*toolchain*.cmake" 2>/dev/null

:warning: 如果坚持使用 build.sh

必须执行 vcs-import,因为脚本依赖完整的 TROS 源码结构:

cd /work/cc_ws/tros_ws

# 拉取 TROS 源码(必须)
vcs-import src < ./robot_dev_config/ros2_release.repos

# 把你的包放到 src 目录下
cp -r ~/your_package src/

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

:magnifying_glass_tilted_left: 先解决 sysroot_docker 缺失问题

无论用哪种方案,sysroot_docker 必须存在。请先执行:

# 退出容器,在主机上
exit

# 重新加载镜像
sudo docker rmi pc_tros_ubuntu22.04:v1.0.0
sudo docker load --input ~/rdk_cross_compile/pc_tros_ubuntu22.04_v1.0.0.tar.gz

# 验证镜像内部是否有 sysroot_docker
sudo docker run --rm pc_tros_ubuntu22.04:v1.0.0 ls -la /work/

预期输出应包含:

sysroot_docker
cc_ws

如果还是没有,说明 tar.gz 文件损坏,需要重新下载。


:clipboard: 两种方案对比

特性 build.sh 方案 标准 colcon 方案
是否需要 vcs-import :white_check_mark: :cross_mark:
编译时间 长(编译整个 TROS) 短(只编译你的包)
适用场景 需要修改 TROS 源码 只开发自己的功能包
依赖 sysroot_docker :white_check_mark: 必须 :white_check_mark: 必须
推荐度 :star::star: :star::star::star::star::star:

建议

  1. 先修复镜像:确认 sysroot_docker 存在
  2. 推荐标准 colcon 方案:更适合只开发自己的包
  3. 如果遇到问题:把 find /work/sysroot_docker -name "*toolchain*.cmake" 的输出贴出来,帮你确认工具链路径

相关资源

先确认镜像问题,再选择编译方案。有问题继续交流!

还是没有,sysroot-docker

你好 @vzenith,既然重新加载镜像后仍然没有 sysroot_docker可以确定你下载的 pc_tros_ubuntu22.04_v1.0.0.tar.gz 文件已损坏或不完整

这是下载过程中网络中断导致的常见问题。


:bullseye: 立即解决方案

方案一:重新下载镜像(推荐)

使用 aria2 断点续传下载,避免文件损坏:

# 1. 在主机上安装 aria2
sudo apt update
sudo apt install -y aria2

# 2. 删除损坏的文件
rm ~/rdk_cross_compile/pc_tros_ubuntu22.04_v1.0.0.tar.gz

# 3. 使用 aria2 下载(16 线程,自动重试)
cd ~/rdk_cross_compile
aria2c -x 16 -s 16 -k 1M --max-tries=0 --retry-wait=30 \
  http://archive.d-robotics.cc/TogetheROS/cross_compile_docker/pc_tros_ubuntu22.04_v1.0.0.tar.gz

:stopwatch: 预计时间:2-3GB 文件,根据网速约 10-30 分钟

方案二:检查是否有更新版本

访问官方归档页面查看是否有新版镜像:

# 在浏览器打开
https://archive.d-robotics.cc/TogetheROS/cross_compile_docker/

# 或用命令行查看
curl -s http://archive.d-robotics.cc/TogetheROS/cross_compile_docker/ | grep -o 'pc_tros[^"]*\.tar\.gz'

如果有 v1.0.5 或更新版本,优先下载新版。


:magnifying_glass_tilted_left: 验证下载完整性

下载完成后,必须验证

# 1. 检查文件大小(应约 2.09GB)
ls -lh ~/rdk_cross_compile/pc_tros_ubuntu22.04_v1.0.0.tar.gz

# 2. 重新加载镜像
sudo docker rmi pc_tros_ubuntu22.04:v1.0.0 2>/dev/null
sudo docker load --input ~/rdk_cross_compile/pc_tros_ubuntu22.04_v1.0.0.tar.gz

# 3. 关键验证:不挂载目录,直接检查镜像内部
sudo docker run --rm pc_tros_ubuntu22.04:v1.0.0 ls -la /work/

预期输出必须包含:

sysroot_docker

如果还是没有,说明官方归档的文件可能有问题,需要联系官方获取。


:rocket: 临时替代方案(如果急需开发)

如果重新下载需要时间,你可以先在板端直接开发

# 在 RDK X5 板子上
sudo apt update
sudo apt install -y ros-humble-desktop

# 创建工作空间
mkdir -p ~/my_ws/src
cd ~/my_ws/src

# 放置你的功能包,直接编译
cd ~/my_ws
colcon build

板端开发的优势:

  • :white_check_mark: 无需交叉编译
  • :white_check_mark: 依赖自动匹配
  • :white_check_mark: 调试方便

缺点:

  • :cross_mark: 占用板端资源
  • :cross_mark: 编译速度可能较慢

:clipboard: 完整修复流程

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

# 1. 安装下载工具
sudo apt install -y aria2

# 2. 删除旧文件
rm ~/rdk_cross_compile/pc_tros_ubuntu22.04_v1.0.0.tar.gz

# 3. 重新下载
cd ~/rdk_cross_compile
aria2c -x 16 -s 16 -k 1M --max-tries=0 \
  http://archive.d-robotics.cc/TogetheROS/cross_compile_docker/pc_tros_ubuntu22.04_v1.0.0.tar.gz

# 4. 验证文件大小
ls -lh pc_tros_ubuntu22.04_v1.0.0.tar.gz
# 应该显示约 2.09G

# 5. 重新加载镜像
sudo docker rmi pc_tros_ubuntu22.04:v1.0.0 2>/dev/null
sudo docker load --input pc_tros_ubuntu22.04_v1.0.0.tar.gz

# 6. 验证镜像内容
sudo docker run --rm pc_tros_ubuntu22.04:v1.0.0 ls -la /work/
# 必须看到 sysroot_docker

# 7. 启动容器(首次不挂载 /work/)
sudo docker run -it --rm \
  --entrypoint="/bin/bash" \
  pc_tros_ubuntu22.04:v1.0.0

# 8. 在容器内验证
ls -la /work/sysroot_docker/
ls -la /work/sysroot_docker/usr_x5/

:telephone_receiver: 如果问题持续

如果重新下载后仍然没有 sysroot_docker,请:

  1. 在帖子中回复 sudo docker run --rm pc_tros_ubuntu22.04:v1.0.0 ls -la /work/ 的完整输出
  2. 提供文件大小 ls -lh ~/rdk_cross_compile/pc_tros_ubuntu22.04_v1.0.0.tar.gz
  3. 社区会协助联系官方确认镜像文件是否正常

:books: 相关资源


先执行重新下载步骤,下载完成后按验证流程检查。99% 的 sysroot_docker 缺失问题都是文件损坏导致的,重新下载即可解决。

有问题随时回复!

xsl@vm:~/rdk_cross_compile$ sudo docker run --rm pc_tros_ubuntu22.04:v1.0.0 ls -la /work/
ls: cannot access ‘/work/’: No such file or directory
xsl@vm:~/rdk_cross_compile$ ^C

你好 @vzenith,这个新信息很关键!/work/ 目录不存在说明镜像的目录结构和我们预期的不同。


:magnifying_glass_tilted_left: 立即排查:找出镜像真实结构

请执行以下命令,找出镜像内部的实际目录结构:

# 1. 查看镜像根目录
sudo docker run --rm pc_tros_ubuntu22.04:v1.0.0 ls -la /

# 2. 查找 sysroot_docker 的实际位置
sudo docker run --rm pc_tros_ubuntu22.04:v1.0.0 find / -name "sysroot_docker" -type d 2>/dev/null

# 3. 查找是否有类似目录
sudo docker run --rm pc_tros_ubuntu22.04:v1.0.0 find / -name "*sysroot*" -type d 2>/dev/null

# 4. 查看常见工作目录
sudo docker run --rm pc_tros_ubuntu22.04:v1.0.0 ls -la /root/
sudo docker run --rm pc_tros_ubuntu22.04:v1.0.0 ls -la /home/
sudo docker run --rm pc_tros_ubuntu22.04:v1.0.0 ls -la /opt/

:bullseye: 可能的情况

根据社区经验,有几种可能:

情况 说明 解决方案
目录在 /root/ 某些镜像把工作目录放在 home 目录 挂载时改为 -v ~/rdk_cross_compile:/root/rdk_cross_compile
目录在 /opt/ sysroot 可能放在 /opt/sysroot 调整工具链文件路径
镜像需要初始化 首次启动需要运行初始化脚本 进入容器执行初始化命令
镜像版本错误 下载的不是 RDK X5 专用镜像 重新确认下载链接

:clipboard: 请提供以下输出

把上面 4 个命令的输出结果贴出来,特别是:

  1. ls -la / 的完整输出
  2. find / -name "*sysroot*" 的输出

这样我可以帮你确定:

  • sysroot_docker 的实际位置
  • 正确的挂载方式
  • 是否需要更换镜像版本

:rocket: 同时检查镜像信息

# 查看镜像详细信息
sudo docker inspect pc_tros_ubuntu22.04:v1.0.0 | grep -A 5 "Env\|Cmd\|WorkDir"

# 查看镜像创建时间
sudo docker history pc_tros_ubuntu22.04:v1.0.0

这些信息能帮助确认镜像是否正确。


先执行上面的排查命令,把输出结果贴出来,我们马上定位问题!

我找到了,那接下来如何开发,只编译ros2包

你好 @vzenith,太好了!找到 sysroot_docker 后,只编译自己的 ROS2 包非常简单,不需要执行 vcs-import


:bullseye: 推荐方案:标准 colcon 交叉编译

1. 确认工具链文件位置

首先在容器内找到工具链文件:

# 在 Docker 容器内执行
find /work/sysroot_docker -name "*toolchain*.cmake" 2>/dev/null

常见路径

  • /work/sysroot_docker/usr/share/cmake/aarch64_toolchainfile.cmake
  • /work/sysroot_docker/usr_x5/toolchain.cmake

2. 创建工作空间

# 在 Docker 容器内
mkdir -p /work/my_ws/src
cd /work/my_ws/src

3. 放置你的功能包

# 方式 A:从主机复制(在主机上执行)
# exit 退出容器后
cp -r ~/your_package ~/rdk_cross_compile/my_ws/src/

# 方式 B:直接在容器内创建
cd /work/my_ws/src
# 把你的包代码放这里

4. 交叉编译(关键步骤)

cd /work/my_ws

# 设置环境变量
source /work/sysroot_docker/usr/ros/humble/setup.bash

# 使用工具链文件编译
colcon build \
  --cmake-args \
    -DCMAKE_TOOLCHAIN_FILE=/work/sysroot_docker/usr/share/cmake/aarch64_toolchainfile.cmake \
    -DCMAKE_FIND_ROOT_PATH=/work/sysroot_docker/usr \
    -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER \
    -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \
    -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY

:warning: 注意CMAKE_TOOLCHAIN_FILE 路径需要根据你实际找到的工具链文件调整


5. 部署到板端

# 编译完成后,在主机上执行
# 将 install 目录拷贝到 RDK X5 的 /opt/tros/

# 方式 A:使用 scp
scp -r ~/rdk_cross_compile/my_ws/install root@<板端IP>:/opt/tros/

# 方式 B:使用 U 盘中转
# 把 install 目录复制到 U 盘,插到板子上拷贝

6. 在板端运行

# 在 RDK X5 上
source /opt/tros/setup.bash
ros2 launch your_package your_launch.py

:clipboard: 完整工作流示例

# === 在 Docker 容器内 ===

# 1. 启动容器(挂载你的代码目录)
sudo docker run -it --rm \
  --entrypoint="/bin/bash" \
  -v ~/rdk_cross_compile:/work \
  pc_tros_ubuntu22.04:v1.0.0

# 2. 确认工具链文件
find /work/sysroot_docker -name "*toolchain*.cmake"

# 3. 创建工作空间
mkdir -p /work/my_ws/src
cd /work/my_ws/src

# 4. 放置你的包(假设你的包叫 my_robot)
# 可以从主机复制,或直接在容器内 git clone

# 5. 编译
cd /work/my_ws
source /work/sysroot_docker/usr/ros/humble/setup.bash
colcon build \
  --cmake-args \
    -DCMAKE_TOOLCHAIN_FILE=/work/sysroot_docker/usr/share/cmake/aarch64_toolchainfile.cmake \
    -DCMAKE_FIND_ROOT_PATH=/work/sysroot_docker/usr \
    -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER \
    -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \
    -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY

# 6. 验证编译结果
ls -la install/

:warning: 常见问题

问题 解决方案
ament_cmake not found 确保 source /work/sysroot_docker/usr/ros/humble/setup.bash
库文件架构不匹配 确认使用了正确的 CMAKE_TOOLCHAIN_FILE
依赖包缺失 CMakeLists.txt 中添加 find_package()
编译成功但板端运行报错 检查板端 TROS 版本与编译环境是否匹配

:books: 相关资源


先执行第 1 步找到工具链文件,把路径贴出来,我可以帮你确认编译命令是否正确!

sysroot_docker tros_ws
root@91d92c481e01:/work/cc_ws# ls
sysroot_docker tros_ws
root@91d92c481e01:/work/cc_ws# ls sysroot_docker/
usr
root@91d92c481e01:/work/cc_ws# ls sysroot_docker/usr
sysroot_docker/usr
root@91d92c481e01:/work/cc_ws# ls sysroot_docker/usr
sysroot_docker/ tros_ws/
root@91d92c481e01:/work/cc_ws# ls sysroot_docker/usr
sysroot_docker/ tros_ws/
root@91d92c481e01:/work/cc_ws# ls sysroot_docker/usr/
ls: cannot access ‘sysroot_docker/usr/’: No such file or directory
root@91d92c481e01:/work/cc_ws# ls sysroot_docker/usr
sysroot_docker/usr
root@91d92c481e01:/work/cc_ws# ls sysroot_docker/usr/^C
root@91d92c481e01:/work/cc_ws# ls sysroot_docker/usr/ros
ls: cannot access ‘sysroot_docker/usr/ros’: No such file or directory
root@91d92c481e01:/work/cc_ws# ^C
root@91d92c481e01:/work/cc_ws#

你好 @vzenith,从你的输出来看,sysroot_docker/usr 目录结构异常ls 显示的结果很奇怪(显示 sysroot_docker/usr 但访问不了)。

这可能是因为:

  1. usr 是一个损坏的符号链接
  2. 或者你当前在错误的目录下

:magnifying_glass_tilted_left: 立即排查

请执行以下命令,确认真实结构:

# 1. 确认当前目录
pwd

# 2. 回到 /work/ 目录查看
cd /work
ls -la

# 3. 检查 sysroot_docker 是否为符号链接
ls -la /work/sysroot_docker

# 4. 查看 usr 是什么类型
file /work/sysroot_docker/usr

# 5. 如果 usr 是链接,查看它指向哪里
readlink -f /work/sysroot_docker/usr

# 6. 直接查找 ros 设置文件
find /work/sysroot_docker -name "setup.bash" 2>/dev/null

# 7. 查找工具链文件
find /work/sysroot_docker -name "*toolchain*.cmake" 2>/dev/null

:bullseye: 预期正确结构

正常的 sysroot_docker 应该是这样的:

/work/sysroot_docker/
├── usr/
│   ├── ros/
│   │   └── humble/
│   │       ├── setup.bash
│   │       └── ...
│   ├── share/
│   │   └── cmake/
│   │       └── aarch64_toolchainfile.cmake
│   ├── include/
│   └── lib/
└── usr_x5/

:rocket: 临时解决方案

如果 sysroot_docker 结构确实损坏,可以尝试:

# 1. 在容器内查找是否有其他 sysroot 位置
find / -name "setup.bash" -path "*humble*" 2>/dev/null

# 2. 查看容器内是否已有 ROS 环境
ls -la /opt/ros/

# 3. 检查是否有预装的工具链
ls -la /usr/share/cmake/

:clipboard: 请提供以下输出

把上面排查命令的结果贴出来,特别是:

  1. pwd 的输出
  2. ls -la /work/ 的输出
  3. file /work/sysroot_docker/usr 的输出
  4. find /work/sysroot_docker -name "setup.bash" 的输出

这样我可以帮你确定:

  • sysroot_docker 是否可用
  • ROS 环境设置文件的正确路径
  • 工具链文件的位置

如果 sysroot_docker 确实损坏,可能需要:

  1. 重新加载 Docker 镜像
  2. 或者使用容器内预装的 ROS 环境

先执行排查命令,把输出贴出来!