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

摘要

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


一、环境说明

  • 系统:Ubuntu 22.04(Jammy),ARM64(如树莓派等)
  • ROS:Humble(/opt/ros/humble
  • 工作空间:含 robot_msgspuppy_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 buildrosidl_* 的 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 依赖 bashBASH_SOURCE;在 zsh 里直接 source setup.bash 时,前缀路径可能解析错误,从而去 source 错误位置的 setup.sh

处理

  • 推荐: 在 zsh 中使用官方 zsh 配置:
bash 复制代码
source /opt/ros/humble/setup.zsh
  • 或先进入 bashsource /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 / 官方仓库为准;升级全系统前建议在重要环境做快照或备份。

相关推荐
时空未宇5 小时前
Hi3403开发板 + openEuler Embedded 运行IB-Robot + 控制 Lerobot 机械臂跳舞
ros2·具身智能·lerobot·hi3403·ib-robot
kyle~1 天前
ROS2 ---- TF2坐标变换(1.动态、静态发布,2.缓存,3.监听)
c++·机器人·ros2
知秋贺1 天前
ROS2的安装和使用
ros2
maxmaxma1 天前
ROS2机器人少年创客营:编程思维启蒙
机器人·ros2
maxmaxma2 天前
ROS2 机器人 少年创客营:Day6 - colcon
机器人·ros2
maxmaxma2 天前
ROS2 机器人 少年创客营:Day 6
机器人·ros2
kyle~2 天前
ROS2---客户端服务(rclcpp::Client)
c++·物联网·机器人·ros2
maxmaxma3 天前
ROS2 机器人 少年创客营:Day 5
机器人·ros2
maxmaxma3 天前
ROS2 机器人 少年创客营:Day 4
机器人·ros2