5. Commsgs 模块架构设计
本文描述 autonomy/commsgs 的逻辑架构、双层消息模型与全栈集成关系。
5.1 设计目标
commsgs 模块遵循以下设计原则:
ROS 语义兼容:字段命名、坐标系约定、Stamped/WithCovariance 模式与 ROS 2
common_msgs保持一致双层分离:C++ struct 供算法零开销使用,proto 供序列化与跨进程通信
显式边界转换:
ToProto/FromProto在模块边界集中调用,便于测试与审计无 ROS 运行时依赖:不使用
rosidl/rclcpp,Autonomy 自研通信栈可扩展:新增消息包遵循 proto → hpp → cpp 三层模式
5.2 实现状态
组件 |
实现度 |
说明 |
|---|---|---|
16 个 proto 包 |
✅ |
schema 已定义 |
C++ struct 定义 |
✅ |
主要消息类型已覆盖 |
|
⏳ |
核心包完整,部分 stub |
PointCloud2 工具 |
✅ |
迭代器 + 字段转换 |
Nav2 Action/Service |
✅ proto |
C++ 层仅 |
错误码体系 |
✅ proto |
含 Nav2 遗留别名 |
独立 CMake 目标 |
❌ |
随 |
5.3 分层架构
5.4 文件组织模式
每个消息包遵循固定三文件模式:
proto/<pkg>.proto ← schema 定义(单一事实来源)
<pkg>_msgs.hpp ← C++ struct + ToProto/FromProto 声明
<pkg>_msgs.cpp ← 转换函数实现
依赖方向(仅向下):
geometry_msgs.hpp → std_msgs.hpp → builtin_interfaces.hpp
sensor_msgs.hpp → geometry_msgs.hpp, std_msgs.hpp
map_msgs.hpp → geometry_msgs.hpp, std_msgs.hpp
planning_msgs.hpp → geometry_msgs.hpp, std_msgs.hpp
nav_msgs.proto → planning_msgs.proto, geometry_msgs.proto, error_code.proto
5.5 构建集成
commsgs 无独立 CMake 目标,通过根工程统一构建:
# cmake/autonomy_sources.cmake
file(GLOB_RECURSE AUTONOMY_SOURCES "autonomy/*.cpp")
file(GLOB_RECURSE ALL_PROTOS "autonomy/*.proto")
# 根 CMakeLists.txt
protoc --cpp_out=${PROJECT_BINARY_DIR} ...
add_library(autonomy SHARED ${AUTONOMY_SOURCES} ${GENERATED_PROTO_SRCS})
target_link_libraries(autonomy protobuf autolink ...)
安装时同步安装源 hpp 与生成 *.pb.h 到 include/autonomy/commsgs/。
5.6 运行时数据流
5.6.1 进程内 Pub/Sub
模块 A Autolink 模块 B
│ │ │
│ Write(Imu struct) │ │
├────────────────────────►│ │
│ [序列化] │
│ ├─────────────────────────►│
│ │ callback(shared_ptr<Imu>)
Autolink 在 Writer/Reader 边界自动处理序列化,应用代码始终操作 C++ struct。
5.6.2 Service / Action
Client (proto) ──request──► Service (proto)
│
FromProto()
│
C++ struct 业务逻辑
│
ToProto()
│
Client (proto) ◄─response── Service (proto)
5.6.3 跨模块传递(无网络)
同一进程内模块间可直接传递 C++ struct 引用或 shared_ptr,无需 proto 转换:
// system::Autonomy 内部
controller_->SetPlan(path); // planning_msgs::Path,无序列化
5.7 消费模块矩阵
模块 |
使用的 commsgs 包 |
典型消息 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
多种 commsgs |
|
|
|
|
|
全部 |
ROS ↔ Autonomy 转换 |
5.8 扩展点
扩展场景 |
步骤 |
|---|---|
新增消息类型 |
proto → hpp struct → cpp 转换 → 重编译 |
新增消息包 |
新建三文件 + 在消费模块 include |
新增 Action |
在 |
新增错误码 |
在 |
ROS 桥接 |
在 |
5.9 与 ROS 2 架构对比
维度 |
ROS 2 |
Autonomy commsgs |
|---|---|---|
消息定义 |
|
手写 hpp + proto |
序列化 |
CDR / Fast-DDS |
Protocol Buffers |
运行时 |
rclcpp |
Autolink |
类型系统 |
单一生成类型 |
C++ struct + proto 双层 |
扩展 |
新 .msg 文件 |
proto + hpp + cpp 三文件 |