ROS 2 Humble 编译报错全记录:APT 签名、镜像与 rosidl 工具链缺失

摘要

在 Ubuntu 22.04(Jammy)+ ROS 2 Humble 环境下使用 colcon build 编译自定义消息包时,可能先后遇到:APT 源 GPG 签名过期 、国内访问 GitHub 失败 、以及一系列 Target dependency ... does not exist (rosidl_* 可执行文件缺失)。本文记录现象、原因与处理步骤,便于同类环境排查。


一、环境说明

  • 系统:Ubuntu 22.04(Jammy),ARM64(如树莓派等)
  • ROS:Humble(/opt/ros/humble)
  • 工作空间:含 robot_msgs、puppy_control_msgs 等带 rosidl_generate_interfaces 的包
  • Shell:zsh(若使用 setup.bash 需特别注意,见后文)

二、问题一:apt update 报 EXPKEYSIG / 源未签名

现象

text 复制代码
W: GPG error: ... InRelease: The following signatures were invalid: EXPKEYSIG F42ED6FBAB17C654 Open Robotics
E: The repository 'https://.../ros2/ubuntu jammy InRelease' is not signed.

原因

Open Robotics 用于签名 ROS APT 源的公钥已过期 (常见为 F42ED6FBAB17C654)。换国内镜像(如清华、阿里云)不能单独解决 ,因为镜像只同步软件包,本机 keyring 仍必须是新密钥。

处理

  1. 将 ROS 2 源写为使用 signed-by=/usr/share/keyrings/ros-archive-keyring.gpg(官方推荐方式)。
  2. 更新密钥文件(任选一种能访问的方式):
bash 复制代码
sudo curl -fsSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key \
  -o /usr/share/keyrings/ros-archive-keyring.gpg

若直连 GitHub 失败,可:

  • 使用 HTTP 代理后加 sudo -E curl ...(把 http_proxy/https_proxy 传给 sudo);
  • 或在能联网的机器下载 ros.key 后拷贝到本机同路径。
  1. 再执行:
bash 复制代码
sudo apt-get update

注意: 不要用 [trusted=yes] 关闭签名验证来"消除"报错,会降低安全性。


三、问题二:将 ROS / Ubuntu 源换为阿里云(示例)

Ubuntu ports(ARM)

/etc/apt/sources.list 中示例:

text 复制代码
deb https://mirrors.aliyun.com/ubuntu-ports/ jammy main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu-ports/ jammy-updates main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu-ports/ jammy-backports main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu-ports/ jammy-security main restricted universe multiverse

ROS 2

/etc/apt/sources.list.d/ros2-latest.list 示例:

text 复制代码
deb [arch=arm64 signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] \
  https://mirrors.aliyun.com/ros2/ubuntu jammy main

修改后同样执行 sudo apt-get update。


四、问题三:colcon build 报 rosidl_* 的 Target dependency 不存在

典型现象

CMake 报错类似:

text 复制代码
CMake Error at .../rosidl_xxx_generate_interfaces.cmake:xx (message):
  Target dependency
  '/opt/ros/humble/lib/<包目录>/<可执行文件名>'
  does not exist

例如(路径随报错变化):

缺失路径(示例) 常见对应 Debian 包
.../rosidl_generator_c/rosidl_generator_c ros-humble-rosidl-generator-c
.../rosidl_typesupport_fastrtps_c/rosidl_typesupport_fastrtps_c ros-humble-rosidl-typesupport-fastrtps-c
.../rosidl_typesupport_introspection_c/rosidl_typesupport_introspection_c ros-humble-rosidl-typesupport-introspection-c
.../rosidl_typesupport_c/rosidl_typesupport_c ros-humble-rosidl-typesupport-c
.../rosidl_generator_cpp/rosidl_generator_cpp ros-humble-rosidl-generator-cpp
.../rosidl_typesupport_fastrtps_cpp/rosidl_typesupport_fastrtps_cpp ros-humble-rosidl-typesupport-fastrtps-cpp
.../rosidl_typesupport_cpp/rosidl_typesupport_cpp ros-humble-rosidl-typesupport-cpp

原因

  • 历史上安装过旧版本 Humble,或与当前镜像上的新版本混用;
  • 部分 .deb 未正确解压、文件被误删、或目录被其它内容覆盖;
  • 结果:rosidl_generate_interfaces 调用链上的某个命令行工具在磁盘上不存在。

处理(单包重装)

先确认文件是否真的缺失:

bash 复制代码
ls -la /opt/ros/humble/lib/<报错中的目录>/

然后对对应包执行重装(示例):

bash 复制代码
sudo apt-get install --reinstall -y ros-humble-rosidl-generator-cpp

处理(一次性对齐常用工具链)

为减少"修一个又冒下一个",可批量重装/升级到当前镜像版本:

bash 复制代码
sudo apt-get install --reinstall -y \
  ros-humble-rosidl-generator-c \
  ros-humble-rosidl-generator-cpp \
  ros-humble-rosidl-typesupport-c \
  ros-humble-rosidl-typesupport-cpp \
  ros-humble-rosidl-typesupport-fastrtps-c \
  ros-humble-rosidl-typesupport-fastrtps-cpp \
  ros-humble-rosidl-typesupport-introspection-c \
  ros-humble-rosidl-typesupport-introspection-cpp \
  ros-humble-rosidl-generator-py \
  ros-humble-rosidl-runtime-py

更彻底:在可接受时间与流量前提下执行 sudo apt-get upgrade ,把大量可升级的 ros-humble-* 拉到同一批次,降低再缺文件的概率。


五、问题四:zsh 下 source /opt/ros/humble/setup.bash 异常

现象

text 复制代码
/opt/ros/humble/setup.bash:.:11: no such file or directory: .../setup.sh

(路径有时是当前目录下的 setup.sh,或尚未 colcon build 的工作空间。)

原因

setup.bash 依赖 bash 的 BASH_SOURCE;在 zsh 里直接 source setup.bash 时,前缀路径可能解析错误,从而去 source 错误位置的 setup.sh。

处理

  • 推荐: 在 zsh 中使用官方 zsh 配置:
bash 复制代码
source /opt/ros/humble/setup.zsh
  • 或先进入 bash 再 source /opt/ros/humble/setup.bash。
  • 不要在还没有 install/setup.* 时,在 ~/.zshrc 里 source 未编译工作空间;编译成功后再 overlay。

六、编译与验证

bash 复制代码
source /opt/ros/humble/setup.zsh   # 或 bash + setup.bash
cd <你的工作空间>
colcon build

若仍失败,把完整 CMake 报错中的那条绝对路径 复制下来,用 dpkg -S 查归属包,再对该包 apt-get install --reinstall。


七、总结

问题类型 要点
APT 签名 更新 /usr/share/keyrings/ros-archive-keyring.gpg(新 ros.key),与是否换阿里云镜像无关
网络 GitHub 拉 key 失败时用代理或离线拷贝
colcon / rosidl 缺哪个路径就重装对应的 ros-humble-rosidl-* 包,或整体 upgrade
Shell zsh 用 setup.zsh,避免在 zsh 里直接 source setup.bash

免责声明: 包名与版本以你本机 apt-cache policy / 官方仓库为准;升级全系统前建议在重要环境做快照或备份。

相关推荐
大雨歌1 天前
笛卡尔坐标 → 自然坐标(Frenet) 逐步推导全解 -2
ros2
米糕闯编程5 天前
鱼香ros2(十七)C++小海龟巡逻
开发语言·c++·机器人·ros2·服务·小海龟
风合星语6 天前
2026 机器人工程实例(七):Nav2 到站了,任务却没完成——AMR 载货导航中的托盘滑移与验收闭环
人工智能·机器人·ros2·机器人仿真·nav2·mujoco·amr
米糕闯编程12 天前
鱼香ros2(十二)C++话题订阅与发布
开发语言·c++·ros2·话题
朝朝辞暮i14 天前
C++ 第 36 课:Action——机械臂/VLA 非常重要
开发语言·c++·算法·ros2
朝朝辞暮i15 天前
C++ 第 39 章: 阶段性总复习——类、对象、构造、继承、this、指针与智能指针
开发语言·c++·算法·ros2
朝朝辞暮i15 天前
C++ 第 40 章:ROS2 Publisher + Timer + Subscriber + Callback + Executor 完整闭环
开发语言·c++·算法·ros2
朝朝辞暮i15 天前
C++ 第 38 课:线程、SingleThreadedExecutor、MultiThreadedExecutor、Callback Group
开发语言·c++·算法·ros2
小奇不哭16 天前
ROS2 单节点,RGB-D 深度相机局部路径提取 + B 样条平滑路径 + YOLOv8 障碍物检测 + 深度测距,用于移动机器人视觉局部循迹。
python·yolov8·ros2·cv2·路径探索循迹
zhangrelay18 天前
机械臂末端规划智能模型的误区演示
linux·笔记·学习·ubuntu·ros2