ROS2 自定义消息接口
本文以无人机集群通信为例,从零创建一个 ROS 2 自定义消息接口包 onboard_msgs,其中包含两类消息:OnboardCommand(下发命令)和 OnboardState(上报状态)。整个过程分五步:创建接口包、编写 .msg、配置 CMakeLists.txt、配置 package.xml、编译验证。
适用环境:
- ROS 2 Humble,Linux + bash;
- 已创建工作空间
~/ros2_ws,并包含src目录; - 构建工具 colcon,构建类型
ament_cmake。
一、创建接口包
1 | cd ~/ros2_ws/src |
--dependencies 后面填写消息定义所需的依赖,其中 rosidl_default_generators 是必须的。
进入包目录,创建存放消息的文件夹:
1 | cd onboard_msgs |
二、定义消息
msg/OnboardCommand.msg:
1 | uint16 target_id # 目标无人机编号 |
msg/OnboardState.msg:
1 | uint16 uav_id # 无人机编号 |
完成后的包结构(节选):
1 | onboard_msgs/ |
三、配置 CMakeLists.txt
在包根目录的 CMakeLists.txt 中加入以下关键内容(保留模板中已有的行):
1 | cmake_minimum_required(VERSION 3.8) |
四、配置 package.xml
确保依赖和接口组声明完整:
1 |
|
五、编译与验证
在工作空间根目录编译,并加载环境:
1 | cd ~/ros2_ws |
确认接口已经生成:
1 | ros2 interface list | grep onboard_msgs |
查看具体定义:
1 | ros2 interface show onboard_msgs/msg/OnboardCommand |
六、用命令行试发消息
用 ros2 topic pub 和 ros2 topic echo 快速检查消息格式和编解码是否正常。发布一条命令到 /uav/cmd:
1 | ros2 topic pub /uav/cmd onboard_msgs/msg/OnboardCommand \ |
回显无人机状态(需要已有节点发布到 /uav/state):
1 | ros2 topic echo /uav/state onboard_msgs/msg/OnboardState |
在 bash 中传 JSON 时要注意双引号转义,也可以改用 YAML 多行写法避免转义错误。
七、在其他包中使用
使用这些消息的 C++ 包,需要在自己的 CMakeLists.txt 中加入:
1 | find_package(ament_cmake REQUIRED) |
并在 package.xml 中添加:
1 | <depend>onboard_msgs</depend> |
八、常见错误
| 现象 | 原因与处理 |
|---|---|
| 新增的消息没有生成 | 没有加进 rosidl_generate_interfaces,补上后重新 colcon build |
| 其他包找不到生成的类型 | package.xml 缺少 <depend>rosidl_default_runtime</depend> |
| 终端找不到接口定义 | 编译后没有 source install/setup.bash |
| 命令行发布 JSON 报错 | 引号转义错误;外层用单引号、内部双引号转义,或改用 YAML |
| 多机话题互相干扰 | 为每架无人机使用不同的命名空间,如 /uav1/..、/uav2/.. |
参考
- ROS 2 Interface Definition:https://design.ros2.org/articles/interface_definition.html
- ROS 2 文档:https://docs.ros2.org
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Dreamer Island!

