Skip to content

Common 公共工具库与消息定义

Apollo 的 commoncommon_msgs 是两个基础支撑模块。common 提供全平台共享的工具类、数学库和基础设施;common_msgs 统一定义了各模块间通信所使用的 Protobuf 消息结构。几乎所有上层模块(感知、规划、控制等)都依赖这两个模块。

第一部分:common 工具库

模块职责

common 模块(位于 modules/common/)为 Apollo 各功能模块提供:

  • 模块间通信的 Topic 名称注册与管理
  • 通用数学运算(几何、滤波、插值)
  • 车辆状态与车辆模型的统一抽象
  • 轻量级键值存储
  • 日志与监控基础设施
  • 工厂模式、序列化解析等通用工具

子模块详解

adapters — Topic 注册与通信适配

adapters 子模块通过 adapter_gflags 定义了 Apollo 系统中 110+ 个 Topic 名称,是模块间基于 Cyber RT 消息通信的基础。每个 Topic 对应一个 DEFINE_string 类型的 gflag,上层模块通过引用这些 flag 来订阅或发布消息,避免硬编码 Topic 字符串。

cpp
// 典型用法示例
DEFINE_string(chassis_topic, "/apollo/canbus/chassis", "chassis topic name");
DEFINE_string(localization_topic, "/apollo/localization/pose", "localization topic name");

configs / data — 车辆配置

configsdata 是两个独立的子目录,分别存放配置定义和车辆物理参数数据文件,包括车辆尺寸、轮距、最大转向角等。这些配置以 Protobuf 文本格式或 JSON 存储,在系统启动时加载,供规划、控制等模块使用。

filters — 数字滤波器

提供信号处理所需的滤波器实现:

滤波器类型类名用途
数字低通滤波器DigitalFilter平滑传感器噪声
均值滤波器MeanFilter滑动窗口均值计算

滤波器广泛用于控制模块中对速度、加速度等信号的平滑处理。

kv_db — 键值数据库

轻量级键值数据库,用于存储系统范围的运行时参数。典型使用场景包括:

  • 存储标定结果
  • 缓存模块间需要持久化的中间状态
  • 保存用户偏好设置

接口简洁,支持 Put(key, value)Get(key) 操作。

latency_recorder — 时延记录

记录各模块处理时延,用于性能监控和瓶颈分析。与 monitor_log 配合,可将时延数据上报至 Dreamview 进行可视化展示。

math — 数学库

Apollo 数学库是规划和控制模块的核心依赖,提供丰富的几何与数值计算能力:

几何基元:

描述
Vec2d二维向量,支持加减、点积、叉积、旋转等
LineSegment2d二维线段,支持投影、距离计算
Box2d有向矩形包围盒,用于碰撞检测
Polygon2d凸多边形,支持包含判断、面积计算
AABox2d轴对齐包围盒

数值算法:

算法描述
KalmanFilter卡尔曼滤波,用于状态估计与预测
lerp / slerp / InterpolateUsingLinearApproximation线性插值函数,用于轨迹点补全
IntegrateBySimpson / IntegrateByTrapezoidal / IntegrateByGaussLegendre数值积分函数
CartesianFrenetConverter笛卡尔坐标与 Frenet 坐标互转

monitor_log — 日志与监控

提供 MonitorLogBuffer 类,用于向 Dreamview 的监控面板发送监控消息。与 Apollo 的 MonitorMessage proto 对应,支持 INFO、WARN、ERROR、FATAL 等级别。

注意:AINFOAERROR 等日志宏由 Cyber RT 日志模块提供,而非 monitor_logmonitor_log 专门用于向 Dreamview 上报监控信息。

cpp
// monitor_log 使用示例
MonitorLogBuffer buffer(MonitorMessageItem::PLANNING);
buffer.INFO("Planning module initialized");
buffer.ERROR("Failed to get localization data");

proto — 公共序列化定义

定义 common 模块自身使用的 Protobuf 消息。注意 proto 文件分散在各子模块中,没有统一的 common/proto 顶级目录。常见的 proto 定义包括:

  • VehicleState:车辆综合状态
  • AdapterConfig:适配器配置

注意:VehicleParam(车辆物理参数)定义在 common_msgs/config_msgs/vehicle_config.proto 中,而非 common/protoStatus 是 C++ 类(位于 status/status.h),不是 Proto 消息。

status — 执行状态

提供 Status 类,用于函数返回值的统一状态判断,类似于 gRPC 的 Status 模式:

cpp
Status status = planning.Plan(current_time);
if (!status.ok()) {
  AERROR << "Planning failed: " << status.error_message();
}

util — 通用工具集

工具描述
Factory工厂设计模式模板,支持按名称动态创建对象
EncodeBase64 / StrFormat字符串编码与格式化独立函数
MessageUtilProtobuf 消息的序列化/反序列化辅助
PointFactory快速构造各类几何点对象
JsonUtilJSON 解析工具

Factory 模式在 Apollo 中广泛使用,例如规划模块通过工厂注册不同的 Planner 实现。

vehicle_state — 车辆状态

封装车辆当前运行状态的统一访问接口,聚合来自底盘(Chassis)和定位(Localization)的数据:

  • 当前位置(x, y, z)
  • 速度与加速度
  • 航向角(heading)
  • 转向角
  • 档位状态

service_wrapper — 服务封装

提供对底层服务调用的封装工具,简化模块间的 Service 通信模式。

vehicle_model — 车辆模型

提供车辆运动学模型,用于轨迹预测和控制仿真。基于自行车模型(Bicycle Model),输入转向角和速度,输出预测轨迹。

数据流

传感器数据 ──→ adapters (Topic 路由) ──→ 各功能模块

车辆配置 ──→ configs / data ─────────────────┤

              math / filters ──────────────┤ (计算支持)

              vehicle_state ←── Chassis + Localization

              monitor_log ──→ Dreamview 监控面板
              kv_db ──→ 持久化存储

配置方式

  • Topic 名称:通过 gflags 在 adapter_gflags 中定义,可通过命令行参数或 flagfile 覆盖
  • 车辆参数configs/data/ 下的配置文件,Protobuf 文本格式
  • 滤波器参数:在各使用模块的配置文件中指定截止频率、窗口大小等

第二部分:common_msgs 消息定义

模块职责

common_msgs 模块(位于 modules/common_msgs/)集中管理 Apollo 全平台的 Protobuf 消息定义。将消息定义从功能模块中解耦出来,使得:

  • 各模块只需依赖 common_msgs 即可获取所需消息类型
  • 消息结构变更不会导致功能模块间的循环依赖
  • 统一版本管理,保证消息兼容性

该模块包含 22 个消息子目录,覆盖音频、底盘、控制、感知、规划、定位、地图等全部子系统。

核心消息定义

basic_msgs — 基础消息

全平台最基础的消息类型,被几乎所有其他消息引用:

消息描述
Header通用消息头,包含时间戳、模块名、序列号
ErrorCode统一错误码枚举
VehicleSignal车辆信号(转向灯、喇叭等)
EngageAdvice驾驶介入建议(定义于 drive_state.proto
SLPoint / FrenetFramePoint / SpeedPoint / PathPoint / TrajectoryPoint规划控制用的路径与轨迹点(定义于 pnc_point.proto
PointENU / PointLLH / Point2D / Point3D / Quaternion / Polygon几何基元(定义于 geometry.proto

chassis_msgs — 底盘消息

Chassis 是底盘状态的核心消息,包含:

  • DrivingMode:驾驶模式(自动/手动/紧急)
  • GearPosition:档位(P/R/N/D)
  • 车速、方向盘转角、油门/刹车踏板位置
  • 车辆信号灯状态

control_msgs — 控制消息

ControlCommand 是控制模块的输出消息:

protobuf
message ControlCommand {
  optional double throttle = 3;   // 油门开度 [0, 100]
  optional double brake = 4;      // 制动开度 [0, 100]
  optional double steering_target = 7;  // 目标转向角
  // ...
}

sensor_msgs — 传感器消息

消息描述
PointCloud激光雷达点云数据
Image相机图像帧
RadarObstacles毫米波雷达检测结果
Gnss全球导航卫星系统数据
Imu惯性测量单元数据

perception_msgs — 感知消息

消息描述
PerceptionObstacles感知到的障碍物列表,每个障碍物包含类型、位置、速度、包围盒
TrafficLightDetection交通信号灯检测结果,包含颜色和置信度

planning_msgs — 规划消息

消息描述
ADCTrajectory自动驾驶车辆规划轨迹,包含轨迹点序列、决策信息
PlanningCommand规划指令
DecisionResult规划决策(跟车、超车、停车等)

localization_msgs — 定位消息

消息描述
LocalizationEstimate定位估计结果,包含位姿、不确定性
Pose六自由度位姿(位置 + 姿态)

routing_msgs — 路由消息

消息描述
RoutingRequest路由请求,包含起点、终点、途经点
RoutingResponse路由响应,包含规划的道路级路径

transform_msgs — 坐标变换消息

消息描述
Transform坐标变换(平移 + 旋转)
TransformStamped带时间戳的坐标变换,用于 TF 树

其他消息子目录

子目录描述
audio_msgs音频相关消息
config_msgs系统配置消息
dreamview_msgsDreamview 可视化界面消息
drivers_msgs驱动层消息
external_command_msgs外部指令消息(HMI 交互)
guardian_msgs安全守护模块消息
map_msgs高精地图消息
monitor_msgs系统监控消息
prediction_msgs障碍物预测消息
simulation_msgs仿真环境消息
storytelling_msgs场景叙事消息(用于调试与回放)
task_manager_msgs任务管理消息
v2x_msgs车路协同(V2X)消息

消息数据流

common_msgs 在 Apollo 数据流中的位置:

传感器硬件


drivers (sensor_msgs) ──→ 感知 (perception_msgs) ──→ 预测 (prediction_msgs)
  │                                                         │
  ▼                                                         ▼
定位 (localization_msgs)                              规划 (planning_msgs)
  │                                                         │
  ▼                                                         ▼
底盘 (chassis_msgs) ←────────────────────────── 控制 (control_msgs)


Dreamview (dreamview_msgs) ←── 监控 (monitor_msgs)

所有模块间的消息传递均通过 Cyber RT 的发布-订阅机制完成,Topic 名称由 common/adapters 统一管理。

配置方式

  • 消息定义文件位于各子目录的 .proto 文件中
  • 编译时通过 Bazel 的 proto_library 规则生成对应语言的绑定代码
  • 模块通过在 BUILD 文件中声明对 common_msgs 相应子包的依赖来使用消息类型

贡献者

页面历史