摘要
在 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 仍必须是新密钥。
处理
- 将 ROS 2 源写为使用
signed-by=/usr/share/keyrings/ros-archive-keyring.gpg(官方推荐方式)。 - 更新密钥文件(任选一种能访问的方式):
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后拷贝到本机同路径。
- 再执行:
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 / 官方仓库为准;升级全系统前建议在重要环境做快照或备份。