9. 消息体系综述
本文从 ROS 兼容性、实现完整度、设计取舍三个维度对 commsgs 消息体系进行综述。
9.1 设计定位
commsgs 在 Autonomy 栈中扮演 ROS 2 common_msgs 的替代实现:
维度 |
ROS 2 |
Autonomy commsgs |
|---|---|---|
消息定义格式 |
|
|
代码生成 |
rosidl 统一生成 |
protoc 生成 proto + 手写 struct |
运行时类型 |
单一 ROS 消息类型 |
C++ struct(算法)+ proto(传输) |
序列化 |
CDR (DDS) |
Protocol Buffers |
通信中间件 |
DDS (Fast-DDS 等) |
Autolink |
坐标系约定 |
REP 103/105 |
完全继承 |
依赖 |
rclcpp + rosidl |
仅 protobuf + 标准库 |
核心取舍:牺牲 ROS 生态即插即用,换取更轻量的依赖链与显式的序列化边界。
9.2 实现完整度矩阵
9.2.1 消息包级别
包 |
struct 定义 |
proto 定义 |
ToProto/FromProto |
综合 |
|---|---|---|---|---|
|
✅ |
✅ |
✅ 完整 |
★★★★★ |
|
✅ |
✅ |
✅ 完整 |
★★★★★ |
|
✅ |
✅ |
✅ 大部分完整 |
★★★★☆ |
|
✅ |
✅ |
✅ Path 完整 |
★★★★☆ |
|
✅ |
✅ |
⏳ 部分 stub |
★★★☆☆ |
|
✅ |
✅ |
⏳ 部分 stub |
★★★☆☆ |
|
⏳ 仅 SpeedLimit |
✅ Action/Service 完整 |
⏳ |
★★★☆☆ |
|
✅ |
✅ |
⏳ 部分 |
★★★☆☆ |
|
✅ |
✅ |
❌ cpp 空 stub |
★★☆☆☆ |
|
✅ |
✅ |
❌ cpp 空 stub |
★★☆☆☆ |
|
✅ |
✅ |
❌ cpp 空 stub |
★★☆☆☆ |
|
✅ |
✅ |
⏳ 低 |
★★☆☆☆ |
|
⏳ 命名空间错误 |
✅ |
❌ cpp 空 stub |
★☆☆☆☆ |
|
❌ 空 |
✅ |
❌ 空 |
★☆☆☆☆ |
|
⏳ 空 struct |
✅ |
⏳ 低 |
★☆☆☆☆ |
|
❌ 仅 proto |
✅ |
N/A |
★★★★☆ (proto) |
9.2.2 已知 stub 示例
位置 |
问题 |
|---|---|
|
|
|
|
|
多个传感器消息转换不完整 |
|
|
|
全部为空函数体 |
|
全部为空函数体 |
9.3 ROS 2 消息对照表
9.3.1 包映射
ROS 2 包 |
commsgs 包 |
差异 |
|---|---|---|
|
|
一致 |
|
|
一致 |
|
|
新增 |
|
|
一致; |
|
|
OccupancyGrid/Odometry 拆分 |
|
|
Action/Service 在 proto 层 |
|
|
一致 |
|
|
一致 |
|
|
一致 |
|
|
一致 |
|
|
一致 |
|
|
命名空间 bug |
|
|
未实现 |
9.3.2 高频消息对照
ROS 2 消息 |
commsgs 对应 |
字段兼容 |
|---|---|---|
|
|
✅ |
|
|
✅ |
|
|
✅ |
|
|
✅ |
|
|
✅ |
|
|
✅ |
|
|
✅ |
|
|
✅ |
|
|
✅ |
|
|
✅ |
9.4 消息设计模式总结
模式 |
示例 |
用途 |
|---|---|---|
Stamped |
|
时间 + 坐标系 |
WithCovariance |
|
不确定性估计 |
child_frame_id |
|
父子坐标系 |
Action 三段式 |
|
长时任务 |
Service 请求/响应 |
|
同步查询 |
分段错误码 |
|
跨模块统一错误语义 |
packed repeated |
|
协方差高效序列化 |
SmartPtr 宏 |
|
ROS 2 风格 API |
9.5 与其他中间件对比
方案 |
优势 |
劣势 |
|---|---|---|
commsgs (当前) |
轻量、无 DDS 依赖、显式边界 |
不兼容 ROS 生态 |
ROS 2 rosidl |
生态成熟、工具链完整 |
依赖重、CDR 性能一般 |
FlatBuffers |
零拷贝、高性能 |
生态较小 |
Cap’n Proto |
零拷贝、RPC 内建 |
C++ 支持好但机器人生态弱 |
Protobuf only |
简单统一 |
算法层有 protobuf 运行时开销 |
commsgs 的 双层设计 兼顾了 protobuf 序列化优势与 C++ 算法层的零开销需求。
9.6 演进路线
阶段 |
目标 |
状态 |
|---|---|---|
Phase 1 |
核心消息 struct + proto 定义 |
✅ 完成 |
Phase 2 |
核心包 ToProto/FromProto 完整 |
⏳ 进行中 |
Phase 3 |
传感器/地图转换补全 |
⏳ 待做 |
Phase 4 |
visualization/trajectory 转换 |
⏳ 待做 |
Phase 5 |
bridge 模块 ROS ↔ commsgs |
⏳ 依赖 bridge |
Phase 6 |
shape_msgs 命名空间修复 |
⏳ 待做 |
9.7 选型建议
场景 |
建议 |
|---|---|
导航栈内部开发 |
直接使用 C++ struct,无需关心 proto |
Autolink 服务开发 |
使用 proto 类型,边界转换 |
新增消息 |
遵循 proto → hpp → cpp 三文件模式 |
与 ROS 系统互通 |
通过 |
单元测试 |
对关键消息编写 ToProto/FromProto 往返测试 |
性能敏感路径 |
进程内传递 struct 引用,避免 proto 转换 |
9.8 参考资源
资源 |
链接 |
|---|---|
ROS 2 common_msgs |
|
Nav2 msgs |
|
vision_msgs |
|
Autonomy 通信框架 |
|
Autonomy 框架集成 |
|
源码 |