Channel数据格式文档介绍

【数据格式】文档,以【快速上手】中介绍的 demo_3.5.record 数据包为对象,介绍各个 Channel 和对应的内部消息格式(Message)。

前提条件

您需要提前了解:

Apollo 各模块通信框架

Apollo 系统各个模块之间的通信框架如下图所示:

image.png

橘色的实线为数据流动线,黑色实线为控制逻辑线。各个模块的功能如下:

模块 功能
感知(Perception) 识别交通参与者(汽车、自行车、行人等),识别交通信号灯等。
预测(Prediction) 对交通参与者的行为进行预测。
规划(Planning) 对主车行为进行决策,实时生成车辆规划线。
控制(Control) 根据规划线目标,生成控制车辆指令(转角、速度、加速度)。
高精地图(HD Map) 该模块类似于库。它不是发布和订阅消息,而是经常用作查询引擎支持,
以提供关于道路的特定结构化信息。高精地图还可以提供环境静态感知能力。
定位(Localization) 定位模块利用 GPS、LiDAR 和 IMU 的各种信息源来定位自动驾驶车辆的位置。
底盘通信 CANBus CANBus 是将控制命令传递给车辆硬件的接口。将控制车辆指令发送至底盘,
还将底盘信息传递给软件系统。
人机交互(HMI) Apollo 中的 HMI 和 DreamView 是一个用于查看车辆状态,测试其他模块以及
实时控制车辆功能的模块。
监控(Monitor) 车辆中所有模块的监控系统包括硬件。
Guardian 安全模块,用于干预监控检测到的失败和 action center 相应的功能。
执行操作中心功能并进行干预的新安全模块应监控检测故障。

Apollo 通信系统

Apollo 的各个模块是以组件的形式存在的。组件之间利用数据通道进行通信。其中,最小的数据单元是消息格式来定义的。也有其他 Node、writer\reader 等,为了避免混淆,这里只关注组件、数据通道和消息格式。

通信单元 定义
组件(Component) 在自动驾驶系统中,模块(如感知、定位、控制系统等)在 Cyber​​RT 下以
Component 的形式存在。不同 Component 之间通过 Channel 进行通信。
Component 概念不仅解耦了模块,还为将模块拆分为多个子模块提供了灵活性。
数据通道(Channel) 用于管理 Cyber​​ RT 中的数据通信。用户可以发布/订阅同一个 Channel,实现 P2P 通信。
消息格式 (Message) Cyber​​RT 中用于模块之间数据传输的数据单元。

组件

Apollo 的系统是由各个模块的组件组成的,每一个组件类似于一个功能。一个模块(例如:定位、感知等)可以有多个组件。 各个组件之间通信是通过 Channel 实现。Channel 通信通道的具体数据格式则由 Message 定义。

数据通道

Channel 是传输数据的通道,管理 Cyber​RT 中的数据通信。用户可以发布/订阅同一个 Channel 建立通信,实现点对点(P2P)通信。

播放数据包之后,打开 CyberMonitor 工具并进入特定数据通道,可以看到每个 Channel 中都有 ChannelNameMessageTypeFrameRatioRawMessage Size 数据字段。关于播放数据包,参见 使用 Dreamview 查看数据包

各个数据字段的名称和描述如下所示:

名称 描述
ChannelName 数据通道的名字。 例如:/apollo/perception/obstacles
MessageType 通道内的数据的数据类型。 例如:apollo.perception.PerceptionObstacles
FrameRatio 数据更新频率。 例如:10 HZ
RawMessage Size 原始数据的数据大小。 例如:16863 字节

其中,MessageType 字段展现的数据格式是本 Channel 通道里使用的最小数据单元,由消息格式(Message)定义。示例中 apollo.perception.PerceptionObstacles 是数据通道 /apollo/perception/obstacles 的核心消息格式。

消息格式

Message 是 Cyber​​RT 中用于模块之间数据传输的基本数据单元。Apollo 中,消息格式(Message)由 .proto 为后缀的文件定义。关于 .proto,参见 protobuf 官网

perception_obstacle.proto 文件定义的 PerceptionObstacles 消息格式为例:

message PerceptionObstacles {
  repeated PerceptionObstacle perception_obstacle = 1;  // An array of obstacles
  optional apollo.common.Header header = 2;             // Header
  optional apollo.common.ErrorCode error_code = 3 [default = OK];
  optional LaneMarkers lane_marker = 4;
  optional CIPVInfo cipv_info = 5;  // Closest In Path Vehicle (CIPV)
}

当一个消息格式(Message)由 .proto 文件定义好之后,其它模块均可以调用对应的消息格式。您可以根据自身需求,任意创建新的消息格式。参见 perception_obstacle.proto 文件

注意:为了让您更直观的了解数据格式,本文档只介绍 demo_3.5.record 相关 Channel 中的数据格式。

消息格式主要分为两大类,即:

  • 通用(Common)消息格式

    各模块通用的消息格式,如定义时间的时间戳消息格式、错误代码消息格式。

  • 特定模块消息格式

    各模块独有的消息格式。

下文将介绍 demo_3.5.record 相关的通用消息格式和特定模块的消息格式。

通用消息格式

常用的通用的消息格式如下所示:

文件 定义的数据内容 Message 定义
header 头信息 apollo.common.Header 定义
error_code 错误码 apollo.common.ErrorCode 定义

关于获取更多通用消息格式的信息,参见 Common 消息格式

特定模块的消息格式

播放数据包并打开 CyberMonitor 后,可以看到以下数据通道和对应的主消息格式。 关于主消息格式的更多内容,参见对应的文档深入了解。

模块 数据通道 主消息格式
CANBUS 模块 /apollo/canbus/chassis apollo.canbus.Chassis
控制模块 /apollo/control apollo.control.ControlCommand
Guardian模块 /apollo/guardian apollo.guardian.GuardianCommand
人机交互模块 /apollo/hmi/status apollo.dreamview.HMIStatus
定位模块 /apollo/localization/msf_gnss apollo.localization.LocalizationEstimate
/apollo/localization/msf_lidar apollo.localization.LocalizationEstimate
/apollo/localization/msf_status apollo.localization.LocalizationStatus
/apollo/localization/pose apollo.localization.LocalizationEstimate
/apollo/sensor/gnss/corrected_imu apollo.localization.CorrectedImu
/apollo/sensor/gnss/odometry apollo.localization.Gps
监控模块 /apollo/monitor apollo.common.monitor.MonitorMessage
/apollo/monitor/system_status apollo.monitor.SystemStatus
感知模块 /apollo/perception/obstacles apollo.perception.PerceptionObstacles
/apollo/perception/traffic_light apollo.perception.TrafficLightDetection
规划模块 /apollo/planning apollo.planning.ADCTrajectory
预测模块 /apollo/prediction apollo.prediction.PredictionObstacles

文档意见反馈

如果您在使用文档时遇到问题,请到我们在【开发者社区】建立的 反馈意见收集问答页面,反馈相关的问题。我们会根据反馈意见对文档进行迭代优化。

上车使用教程感知模块