apollo
目录名称 | 目录作用 |
---|---|
cyber | 消息中间件,替换ros作为消息层 |
docker | docker有关的文件,如启动docker脚本,进入docker容器脚本 |
docs | 文档模块,有完整英文文档和部分中文文档 |
modules | 自动驾驶模块,主要的定位,预测,感知,规划都在这里 |
scripts | 脚本 |
third_party | 第三方库 |
tools | 编译相关配置文件 |
.github/ISSUE_TEMPLATE目录 | 记录的文档 |
.vscode | 的一些参数配置 |
-
Apollo项目是用Bazel来做为代码编译工具,相当于java中的maven.
-
每个源码文件夹下都有一个 BUILD文件即bazel的编译配置文件。
apollo/cyber
官方文档: apollo/docs/cyber
目录名称 | 目录作用 |
---|---|
base/ | 高性能线程安全基础库 主要有原子哈希表、原子读写锁、有界队列、并发对象池、对象池、可重入读写锁、信号、线程池、线程安全队列、无界队列、等待策略等Apollo内部使用的基础设施。------这些接口的封装使得开发者能够轻松处理并发环境下的数据使用、同步问题,提高代码的健壮性 |
blocker/ | 消息管道容器,和data模块有一定的近似,面向开发者的接口 |
class_loader/ | 类加载器,用于加载组件的库文件。Apollo中存在多个Component,这些组件将会以库文件的方式编译生成 |
common | 公共的test、proto转*文件、其他工具 |
component | 组件基类、外部的modules需要继承该component |
conf | 配置文件 |
croutine | 协程类及协程工厂,是调度单元 |
data | 传感器数据的读取和写入 |
doxy-docs | 一些文档 |
event | 事件类 |
example | 示例 |
io | epoll+io |
logger | 日志器 |
mainboard | Apollo系统的启动入口 |
message | 消息类 |
node | 节点定义 |
parameter | 参数及参数服务器 |
proto | proto文件夹 |
python | pythonAPI |
record | 消息记录 |
scheduler | 调度模块 |
service | |
service_discovery | |
sysmo | 就是 system monitor |
task | 任务 启动调度 |
time | 时钟与rate |
timer | 单例定时器 管理task |
tools | 一大堆工具channel launch |
transport | 多进程通信,为上层封装了底层数据传输的细节 |
apollo/ modules
目录名称 | 目录作用 |
---|---|
audio | |
bridge | |
calibration | 校准,主要用于传感器坐标的校准,用于感知模块做传感器融合。现在已经实现自动校准的功能 |
canbus | 通讯总线,工业领域的标准总线 |
canbus_vehicle | |
common | 公共源码模块如日志,工厂模式的实现,日志系统,监控模块,数学算法等 |
contrib | |
control | 控制模块,根据planning生成的路径对车辆轨迹进行控制,再底层就是发送命令到can总线,实现车辆的控制。 |
data | 地图等生成好的数据放在这里 |
dreamview | 仿真,能够对自动驾驶过程中的数据进行回放 |
drivers | 雷达,lidar,GPS, canbus,camera等驱动 |
guardian | 监护进程,主要是为了安全 |
localization | 定位,获取汽车的当前位置: 输入GPS和IMU信息输出自车定位信息 |
map | 高精地图模块,输出结构化地图信息,如车道线,十字路口等 |
monitor | 监控模块,主要是监控汽车状态,同时把状态发给hmi,并且记录,用于故障定位,健康检查等 |
perception | 感知,获取汽车当前的环境,行人,车辆,红绿灯等,给planning模块规划线路 |
planning | 规划,针对感知到的情况,对路径做规划,短期规划,只规划100-200M的距离, 生成好的路径给control模块 |
prediction | 预测,属于感知模块,对运动物体的轨迹做预测 |
routing | 导航线路,就是百度地图上查询2点之间的线路,生成的线路短期规划还是planning模块 |
storytelling | |
task_manager | |
third_party_perception | 第三方感知模块 |
tools | |
transform | |
v2x | 顾名思义就vehicle-to-everything,其希望实现车辆与一切可能影响车辆的实体实现信息交互, 目的是减少事故发生,减缓交通拥堵,降低环境污染以及提供其他信息服务. |
apollo/modules/guardian
目录名称 | 目录作用 |
---|---|
BUILD | |
conf | |
cyberfile.xml | |
dag | |
guardian.BUILD | |
guardian_component.cc | |
launch | |
proto |
apollo/modules/monitor
目录名称 | 目录作用 |
---|---|
BUILD | |
common | |
cyberfile.xml | |
dag | |
hardware | |
launch | |
monitor.BUILD | |
monitor.cc | |
README.md | |
software |
apollo/modules/routing
目录名称 | 目录作用 |
---|---|
BUILD | |
common | |
conf | |
core | |
cyberfile.xml | |
dag | |
graph | |
launch | |
proto | |
README_cn.md | |
README.md | |
routing.BUILD | |
routing.cc | |
routing_component.cc | |
routing.h | |
strategy | |
tools | |
topo_creator |
apollo/ modules / perception
目录名称 | 目录作用 |
---|---|
base | 基础类 |
BUILD | |
camera | 相机相关 |
common | 公共目录 |
cyberfile.xml | |
data | 相机的内参和外参 |
fusion | 传感器融合 |
inference | 深度学习推理模块 |
lib | 一些基础的库,包括线程、文件配置等 |
lidar | 激光雷达相关 |
map | 地图 |
onboard | 各个子模块的入口 |
perception.BUILD | |
Perception_README_3_5.md | |
pipeline | |
production | 感知模块入口 — 通过cyber启动子模块 |
proto | 数据格式,protobuf |
radar | 毫米波雷达 |
README.md | |
README_paddle3D_CN.md | |
testdata | 几个模块的测试数据 |
tool | 离线测试工具 |
16 director
apollo/modules / planning
目录名称 | 目录作用 |
---|---|
common | 轨迹合成,拼接。。。。。 |
conf | 与模块启动相关的配置,模块配置 |
constraint_checker | 约束检查和碰撞检查 |
dag | 与模块启动相关的配置,默认建图文件是dag/planning.dag,内部实现模块节点间的通讯配置,构建DAG(有向无环图),dag中再设置了config中的相关配置文件 |
data | |
images | |
integration_tests | |
lattice | |
launch | 与模块启动相关的配置:默认启动文件是launch/planning.launch,它是cyber系统的luanch命令启动相关配置,内部决定了模块间的通讯配置建图文件(*.dag) |
learning_based | |
math | 曲线求解,优化等 |
planning_component.cc | 组件入口 |
planning_base.cc | planning模块主体 |
on_lane_planning.cc | planning模块主体 |
navi_planning.cc | planning模块主体 |
planner | 调度器和规划器 |
scenarios | 场景管理 |
apollo/modules/planning/planner
目录名称 | 目录作用 |
---|---|
planner.h | 规划器的基类,里面定义了planning和PlannerWithReferenceLine两个虚类 |
planner_dispatcher.cc | 规划分配器 |
on_lane_planner_dispatcher.cc | 继承了PlannerDispatcher |
navi_planner_dispatcher.cc | 继承了PlannerDispatcher |
lattice | |
navi | |
public_road | |
rtk |
.
├── BUILD
├── lattice
├── navi
├── planner_dispatcher.h
├──
├── public_road
└──
apollo/ modules / map
目录名称 | 目录作用 |
---|---|
BUILD | |
cyberfile.xml | |
data | 生成好的地图 |
hdmap | 高清地图模块,类似一个库,不像其他模块使用发布与订阅机制,它频繁被调用用来检索相关道路的结构信息 |
map.BUILD | |
pnc_map | 给规划控制模块用的地图 |
relative_map | 相对地图 |
testdata | / 测试数据? |
tools | / 工具 |
data
目录名称 | 目录作用 |
---|---|
borregas_ave | |
BUILD | |
demo | |
README.md |
modules/map/hdmap
目录名称 | 目录作用 |
---|---|
adapter | 从xml文件读取地图(opendrive保存格式为xml) |
BUILD | |
hdmap.cc | |
hdmap_common.cc | |
hdmap_impl.cc | 主要实现了一系列的api来查找道路中的元素。 |
hdmap_util.cc | |
test-data |
modules/map/hdmap/adapter
目录名称 | 目录作用 |
---|---|
BUILD | |
opendrive_adapter.cc | 加载opendrive格式地图 |
proto_organizer.cc | |
xml_parser, xml_parser | xml_parser将会针对道路的不同元素做相应解析 |
只需要知道map模块的主要功能是“加载opendrive格式的地图,并且提供一系列的API给其他模块使用”。然后再根据具体的场景来了解地图各个部分的作用,就算是对map模块比较了解了。
- apollo的高精度地图采用了opendrive格式,opendrive是一个统一的地图标准,这样保证了地图的通用性。其中map模块主要提供的功能是读取高精度地图,并且转换成apollo程序中的Map对象。直白一点就是说把xml格式的opendrive高精度地图,读取为程序能够识别的格式。
apollo/ modules / perception
.
├── base //基础类
├── BUILD
├── camera //相机检测相关(比如车道线,障碍物检测,红绿灯检测)
├── common //公共目录
├── cyberfile.xml
├── data //相机的参数定义(内参和外参)
├── fusion //传感器融合
├── inference //深度学习推理模块
├── lib //基础的库,包括线程,时间注册灯
├── lidar //激光雷达相关代码
├── map //地图
├── onboard //每个子模块入口
├── perception.BUILD
├── Perception_README_3_5.md
├── pipeline //流水线代码和统一配置文件
├── production //感知模块入口
├── proto //数据格式
├── radar //毫米级雷达
├── README.md
├── README_paddle3D_CN.md
├── testdata //模块的测试数据
└── tool //离线测试工具
感知模块主要功能是识别周围环境树木,人,路面,交通灯灯信息,为后面路径规划,控制等做辅助。感知模块主要包含两个子模块:
- 障碍物检测(3D obstacles perception).
- 交通信号灯检测(Traffic light perception).
感知模块输入来源于汽车物理感知设备,主要包含激光雷达点云数据,视觉摄像头数据。同时,交通信号灯检测也依赖于其他模块提供的数据,包含定位模块数据,高精地图数据(信号灯实时检测是不可行的或者说是不合理不必要的,原因在于太过耗费计算资源,实际只需要定位与高精度地图模块提供相应的位置信息,指示感知模块在什么时间段与路面段做信号灯检测),E.g.路口需要启动信号灯检测,中间路段只需要障碍物检测,不存在信号灯。
(1) 感知模块输入数据
- Point cloud data/点云数据 (ROS topic /apollo/sensor/velodyne64/comensator/pointCloud2)
- Radar data/雷达数据 (ROS topic /apollo/sensor/conti_radar)
- Image data/图像数据 (ROS topic /apollo/sensor/camera/traffic/image_long & /apollo/sensor/camera/traffic/image_short)
- Coordinate frame transformation information over time/坐标系转换数据 (ROS topic /tf)
- HDMap/高精地图
- Extrinsic parameters of LiDAR sensor calibration/激光雷达传感器矫正外参 (ROS topic /tf_static)
- Extrinsic parameters of radar sensor calibration/雷达传感器矫正外参 (来自外部YAML文件)
- Extrinsic and Intrinsic parameters of all camera calibration/所有相机/长焦+短焦相机的内参和外参 (来自外部YAML文件)
- Velocity of host vehicle/主车体速度 (ROS topic /apollo/localization/pos)
(2) 感知模块输出数据
- 3D障碍物跟踪的方向,速度以及树,人,车辆等分类信息
- 交通信号灯的标定框以及信号灯状态信息
预测模块: Prediction
预测模块主要功能为从感知模块获取障碍物信息,包括位置,方向,速度,加速度等。最终预测障碍物未来时刻的运动轨迹。当感知模块发布障碍物信息时,自动触发预测模块。
(1) 预测模块输入数据
- Obstacles from perception module/感知模块障碍物信息
- Localization from localization module/定位模块信息
(2) 预测模块输出数据
- Obstacles additionally with predicted trajectories/障碍物预测轨迹
预测模块函数和功能
- Contrainer/容器
- Contrainer存储来自ROS订阅的输入数据,目前版本支持存储感知障碍物(perception onstacles),车辆定位(vehicle localization),车辆轨迹规划(vehicle planning)
- Evaluator/评估器
- Evaluator对视野中的每个障碍物独立评估路径和速度。
- 评估器通过使用保存在prediction/data下的模型数据来对每个车道序列进行路径评估,输出车辆在每个车道的概率
- Predictor/预测器
- Predictor最终生成障碍物的预测轨迹,目前支持的预测器有:
- Lane sequence: 障碍物沿着车道线运动
- Move sequence: 障碍物遵循汽车动态模式,沿车道线运动
- Free movement: 障碍物自由运动
- Regional movement: 障碍物在一定区域内运动
- Predictor最终生成障碍物的预测轨迹,目前支持的预测器有:
路由模块: Routing
路由模块根据请求(起始地和目的地)生成高层的导航信息,通过一系列的车道线和车道信息,指示车辆如何抵达目的地
(1) 路由模块输入数据
- Map data/地图数据
- Routing request/路由请求,包含起始地与目的地位置信息。
(2) 路由模块输出数据
- 路由导航信息
控制模块: Control
控制模块通过生成诸如节流阀,制动器,转向的控制指令给CanBus模块,执行来自规划模块的时空轨迹命令。
(1) 控制模块输入数据
- Planning trajectory/规划路径
- Car status/车辆状态
- Localization/定位信息
- Dreamview AUTO mode change request/模式切换请求
(2) 控制模块输出数据
- control command (steering, throttle, brake) to canbus/具体的控制指令
控制区域网络模块: CanBus
类似于下位机,控制区域网络模块讲来自于控制模块的具体控制指令传递给汽车硬件,同时向上层软件反馈车辆硬件信息。
(1) 控制区域网络模块输入数据
- Control command/控制指令
(2) 控制区域网络模块输出数据
- Chassis status/机箱状态
- Chassis detail status/机箱具体状态
定位模块: Localization
定位模块从不同的信息源,比如GPS(经纬度),LiDAR(距离)和IMU(加速度等)来评估车辆当前的信息。常用的定位技术有两类:
- 基于RTK(Real-Time Kinematic, 实时动态载波相位差分技术)定位。由OnTimer函数以一定频率触发定位。
- 多传感器融合(Multiple Sensor Fusion, MSF)定位。由一系列传感器触发函数触发。
(1) 定位模块输入数据
- RTK-base method.
- GPS - Global Position System/全球定位系统
- IMU - Interial Measurement Unit/惯性测量单元
- MSF method.
- GPS - Global Position System/全球定位系统
- IMU - Interial Measurement Unit/惯性测量单元
- LiDAR - Light Detection And Ranging Sensor/光检测和测距传感器,激光雷达
proto分析
Apollo项目中的很多数据结构都是通过Protocol Buffers定义的。所以你看不到这些类的C++文件,因为C++需要的相关文件是在编译时通过proto文件自动生成的。
Protocol Buffers是Google的开源项目。它具有语言无关,平台无关的特性,并且有很好的可扩展性。Protocol Buffers通常用于序列化结构化数据。
Apollo使用Protocol Buffers的一个很重要的作用是,用它来将结构化数据导出到物理文件中,并且也可以很方便的从物理文件中读取信息。例如,Routing模块需要的Topo地图就是proto结构导出的。另外,如果导出的是文本形式的文件,也可以方便的进行人为的修改。例如,上面提到的routing_config.pb.txt。
proto文件都位于名称为proto的文件夹中,你可以通常下面这条命令在apollo源码的根目录下找到所有的proto文件夹:
apollo$ find . -name proto
role_attributes.proto
SocketAddr
数据类型 | 定义 | 说明 |
---|---|---|
optional string | ip = 1; | ip地址 |
optional uint32 | port = 2; | 端口 |
RoleAttributes
数据类型 | 定义 | 说明 |
---|---|---|
optional string | host_name = 1; | common::GlobalData::Instance()->HostName() |
optional string | host_ip = 2; | common::GlobalData::Instance()->HostIp() |
optional int32 | process_id = 3; | common::GlobalData::Instance()->ProcessId() |
optional string | node_name = 4; | 当前所属节点名 |
optional uint64 | node_id = 5; | hash ( node_name) |
optional string | channel_name = 6; | 当前所关联的管道的名 |
optional uint64 | channel_id = 7; | hash ( channel_name) |
optional string | message_type = 8; | 管道中存放的消息类型 |
optional bytes | proto_desc = 9; | protobuf的描述 |
optional uint64 | id = 10 | common::GlobalData::RegisterNode(node_name); |
optional QosProfile | qos_profile = 11; | |
optional SocketAddr | socket_addr = 12; | reserved for socket communication |
optional string | service_name = 13; | |
optional uint64 | service_id = 14; | hash value of service_name |
parameter.proto
cyber/proto/parameter.proto
参数是节点和节点之间共享的数据
ParamType
定义了参数服务器支持的参数类型
Parameter type | C++ data type | protobuf data type |
---|---|---|
apollo::cyber::proto::ParamType::INT | int64_t | int64 |
apollo::cyber::proto::ParamType::DOUBLE | double | double |
apollo::cyber::proto::ParamType::BOOL | bool | bool |
apollo::cyber::proto::ParamType::STRING | std::string | string |
apollo::cyber::proto::ParamType::PROTOBUF | std::string | string |
apollo::cyber::proto::ParamType::NOT_SET | 默认值 |
Param
参数的一些属性
数据类型 | 定义 | 说明 |
---|---|---|
optional string | name = 1; |
|
optional ParamType | type = 2; |
|
optional string | type_name = 3; |
|
oneof | oneof_value |
|
optional bytes | proto_desc = 8; |
Params
数据类型 | 定义 | 说明 |
---|---|---|
repeated Param | param = 1; |
NodeName
数据类型 | 定义 | 说明 |
---|---|---|
optional string | value = 1; |
ParamName
数据类型 | 定义 | 说明 |
---|---|---|
optional string | value = 1; |
BoolResult
数据类型 | 定义 | 说明 |
---|---|---|
optional bool value = 1; |
poi.proto
modules/common_msgs/routing_msgs/poi.proto
Landmark
地图上的一个点,包含了名称和位置信息。
数据类型 | 定义 | 说明 |
---|---|---|
optional string | name = 1; | 名称 |
repeated LaneWaypoint | waypoint = 2; | 道路上的路径点,包含了id,长度和位置点信息。 |
optional apollo.routing.ParkingInfo | parking_info = 4; |
POI
Point of interest的缩写,一个POI中可以包含多个Landmark
数据类型 | 定义 | 说明 |
---|---|---|
repeated Landmark | landmark = 1; |
routing_config.proto
modules/routing/proto/routing_config.proto
TopicConfig
数据类型 | 定义 | 说明 |
---|---|---|
optional string | routing_response_topic = 1; | |
optional string | routing_response_history_topic = 2 |
RoutingConfig
描述了Routing模块的配置信息,routing_gflags.cc中提到的routing_conf_file文件(routing_config.pb.txt)就是这个格式的。
数据类型 | 定义 | 说明 |
---|---|---|
optional double | base_speed = 1; | 节点创建者的基本速度[m/s] |
optional double | left_turn_penalty = 2; | 节点创建者的左转惩罚[m] |
optional double | right_turn_penalty = 3; | 节点创建者的右转惩罚[m] |
optional double | uturn_penalty = 4; | 节点创建者的左转惩罚[m] |
optional double | change_penalty = 5; | 边缘创建者的更改惩罚[m] |
optional double | base_changing_length =6; | 边缘创建者的基本更改长度惩罚[m] |
optional TopicConfig | topic_config = 7; | 主题信息配置 |
routing.proto
modules/common_msgs/routing_msgs/routing.proto
类型名称 | 描述 |
---|---|
LaneWaypoint | 道路上的路径点,包含了id,长度和位置点信息。 |
LaneSegment | 道路的一段,包含了id和起止点信息。 |
RoutingRequest | 描述了路由请求的信息,一次路由请求可以包含多个路径点。详细结构见下文。 |
Measurement | 描述测量的距离。 |
ChangeLaneType | 道路的类型,有FORWARD,LEFT,RIGHT三种取值。 |
Passage | 一段通路,其中可以包含多个LaneSegment,以及ChangeLaneType。 |
RoadSegment | 道路的一段,拥有一个id,并可以包含多个Passage。 |
RoutingResponse | 路由请求的响应结果,可以包含多个RoadSegment,距离等信息。 |
LaneWaypoint
道路上的路径点
数据类型 | 定义 | 说明 |
---|---|---|
optional string | id = 1; | |
optional double | s = 2; | 长度 |
optional apollo.common.PointENU | pose = 3; | 位置点信息 |
optional double | heading = 4; | 当开发人员在dreamview路线编辑上选择一个点时,可以通过拖动鼠标指定方向。dreamview基于此计算航向,以支持构建带有航向的车道点 |
LaneSegment
道路的一段
数据类型 | 定义 | 说明 |
---|---|---|
optional string | id = 1; | |
optional double | start_s = 2; | 起止点 |
optional double | end_s = 3; |
ParkingSpaceType
停车类型
enum ParkingSpaceType | 定义 | 说明 |
---|---|---|
VERTICAL_PLOT = 0; | ||
PARALLEL_PARKING = 1; |
DeadEndRoutingType
enum DeadEndRoutingType | 定义 | 说明 |
---|---|---|
ROUTING_OTHER = 0; | ||
ROUTING_IN = 1; | ||
ROUTING_OUT = 2; |
topo_graph.proto
类型名称 | 描述 |
---|---|
CurvePoint | 曲线上的一个点。 |
CurveRange | 曲线上的一段。 |
Node | 车道上的一个节点,包含了所属车道,道路,长度,曲线起止点,中心线等信息。 |
Edge | 连接车道之间的边,包含了起止车道id,代价和方向等信息。 |
Graph | 完整地图的Topo结构,这其中包含了多个Node和Edge。 |
geometry.proto
PointENU
描述了地图上的一个点(map reference frame)。
- 原点指标是(0, 0, 0).
- 大多数模块,包括定位,感知,预测和决策模块,他们的结果都是基于这个数据结构产生的
- 当前,Apollo地图使用通用横轴墨卡托投影(Universal Transverse Mercator),简称UTM坐标系统。
- 在一些情况下,z字段可能会被忽略。此时表示二维屏幕上的点
数据类型 | 定义 | 说明 |
---|---|---|
optional double | x = 1 [default = nan]; | East from the origin, in meters. |
optional double | y = 2 [default = nan]; | North from the origin, in meters. |
optional double | z = 3 [default = 0.0]; | Up from the WGS-84 ellipsoid, in meters. |
PointLLH
描述了地图上的一个点(global reference frame.)。
数据类型 | 定义 | 说明 |
---|---|---|
optional double | lon = 1 [default = nan]; | Longitude in degrees, ranging from -180 to 180. |
optional double | lat = 2 [default = nan]; | Latitude in degrees, ranging from -90 to 90. |
optional double | height = 3 [default = 0.0]; | WGS-84 ellipsoid height in meters. |
Point2D
二维平面上的一个点。其含义和单位取决于上下文,必须在代码中注释补充。
数据类型 | 定义 | 说明 |
---|---|---|
optional double | x = 1 [default = nan]; | |
optional double | y = 2 [default = nan]; |
Point3D
三维平面上的一个点。其含义和单位取决于上下文,必须在代码中注释补充。
数据类型 | 定义 | 说明 |
---|---|---|
optional double | x = 1 [default = nan]; | |
optional double | y = 2 [default = nan]; | |
optional double | z = 3 [default = nan]; |
Quaternion
四元数:旋转,应该是三种坐标变换——缩放、旋转和平移,中最复杂的一种了。大家应该都听过,有一种旋转的表示方法叫四元数。
数据类型 | 定义 | 说明 |
---|---|---|
optional double | qx = 1 [default = nan]; | |
optional double | qy = 2 [default = nan]; | |
optional double | qz = 3 [default = nan]; | |
optional double | qw = 4 [default = nan]; |
Polygon
map_lane.proto
Lane
- 车道是道路的一部分,指定供单行车辆使用。
- 大多数公共道路(包括高速公路)有两条以上的车道。
数据类型 | 定义 | 说明 |
---|---|---|
optional Id | id = 1; | |
optional Curve | central_curve = 2; | 作为reference轨迹的中心车道,不必是几何中心。 |
optional LaneBoundary | left_boundary = 3; | 左车道边界,一般是曲线(直线是特殊的曲线) |
optional LaneBoundary | right_boundary = 4; | 右车道边界,一般是曲线 |
optional double | length = 5; | 长度,单位m |
optional double | speed_limit = 6; | 当前车道上的速度限制,单位m/s |
repeated Id | overlap_id = 7; | 重叠区域id |
repeated Id | predecessor_id = 8; | 所有均可驶入(或驶出)的车道,前任id |
repeated Id | left_neighbor_forward_lane_id = 10; | 同一方向上的相邻车道:左边相邻前方车道id |
repeated Id | right_neighbor_forward_lane_id = 11; | 同一方向上的相邻车道:右边相邻前方车道id |
optional LaneType | type = 12; | 车道类型 |
optional LaneTurn | turn = 13; | 转弯类型 |
repeated Id | left_neighbor_reverse_lane_id = 14; | 左边相邻反方向车道id |
repeated Id | right_neighbor_reverse_lane_id = 15; | 右边相邻反方向车道id |
optional Id | junction_id = 16; | |
repeated LaneSampleAssociation | left_sample = 17; | 中心点与最近左边界之间的关联 |
repeated LaneSampleAssociation | right_sample = 18; | 中心点与最近右边界之间的关联 |
optional LaneDirection | direction = 19 | 车道方向 |
repeated LaneSampleAssociation | left_road_sample = 20; | 中心点与最近左路边界之间的关联 |
repeated LaneSampleAssociation | right_road_sample = 21; | 中心点与最近右路边界之间的关联 |
enum LaneType | 车道类型 |
---|---|
NONE = 1; | 无 |
CITY_DRIVING = 2; | 城市道路 |
BIKING = 3; | 自行车 |
SIDEWALK = 4; | 人行道 |
PARKING = 5; | 停车 |
enum LaneTurn | 转弯类型 |
---|---|
NO_TURN = 1; | 直行 |
LEFT_TURN = 2; | 左转弯 |
RIGHT_TURN = 3; | 右转弯 |
U_TURN = 4; | 掉头 |
enum LaneDirection | 车道方向 |
---|---|
FORWARD = 1; | 前 |
BACKWARD = 2; | 后 |
BIDIRECTION = 3; | 双向 |
map_stop_sign.proto
停止信号
数据类型 | 定义 | 说明 |
---|---|---|
optional Id | id = 1; | 编号 |
repeated Curve | stop_line = 2; | 停止线,Curve曲线应该是基础类型 |
repeated Id | overlap_id = 3; | 重叠id |
optional StopType | type = 4; |
enum StopType {
UNKNOWN = 0; //未知
ONE_WAY = 1; //只有一车道可以停
TWO_WAY = 2;
THREE_WAY = 3;
FOUR_WAY = 4;
ALL_WAY = 5;
};
map_yield_sign.proto
让行标志(美国才有)
数据类型 | 定义 | 说明 |
---|---|---|
optional Id | id = 1; | 编号 |
repeated Curve | stop_line = 2; | 在哪里结束 |
repeated Id | overlap_id = 3; | 重叠id |
map_overlap.proto
map_road.proto
道路的信息,是由一些RoadSection组成
map_speed_bump.proto
减速带
数据类型 | 定义 | 说明 |
---|---|---|
optional Id | id = 1; | 编号 |
repeated Id | overlap_id = 2; | 重叠区域ID |
repeated Curve | position = 3; | 曲线位置 |
map_parking.proto
停车区域
ParkingSpace
数据类型 | 定义 | 说明 |
---|---|---|
optional Id | id = 1; | 编号 |
optional Polygon | polygon = 2; | |
repeated Id | overlap_id = 3; | |
optional double | heading = 4; |
map_clear_area.proto
禁止停车
数据类型 | 定义 | 说明 |
---|---|---|
optional Id | id = 1; | 编号 |
repeated Id | overlap_id = 2; | 重叠区域ID |
optional Polygon | polygon = 3; | 多边形 |
map_signal.proto
交通信号标志
message Subsignal {
enum Type {
UNKNOWN = 1; //未知
CIRCLE = 2; //圈???
ARROW_LEFT = 3; //左边
ARROW_FORWARD = 4; //前面
ARROW_RIGHT = 5; //右边
ARROW_LEFT_AND_FORWARD = 6; //左前
ARROW_RIGHT_AND_FORWARD = 7; //右前
ARROW_U_TURN = 8; //掉头
};
optional Id id = 1;
optional Type type = 2;
// Location of the center of the bulb. now no data support.
optional apollo.common.PointENU location = 3; //也是基础类型?
}
message Signal {
enum Type {
UNKNOWN = 1;
MIX_2_HORIZONTAL = 2;
MIX_2_VERTICAL = 3;
MIX_3_HORIZONTAL = 4;
MIX_3_VERTICAL = 5;
SINGLE = 6;
};
optional Id id = 1;
optional Polygon boundary = 2; //多边形
repeated Subsignal subsignal = 3; //子信号
// TODO: add orientation. now no data support.
repeated Id overlap_id = 4; //重叠id
optional Type type = 5; //这里的类型是主要指交通标识的个数及位置??
// stop line
repeated Curve stop_line = 6; //在哪里结束?
}
map_sidewalk.proto
路边的小路,或者行人走的路
map_crosswalk.proto
人行横道是为行人指定的横穿道路的地方。
Crosswalk
数据类型 | 定义 | 说明 |
---|---|---|
optional Id | id = 1; | 编号 |
optional Polygon | polygon = 2; | 多边形 |
repeated Id | overlap_id = 3; | 重叠ID |
map_junction.proto
Junction
交叉点是两条或多条道路交叉的平面交叉点。
数据类型 | 定义 | 说明 |
---|---|---|
optional Id | id = 1; | 编号 |
optional Polygon | polygon = 2; | 多边形 |
repeated Id | overlap_id = 3; | 重叠id |
optional Type | type = 4; |
enum Type | 定义 |
---|---|
UNKNOWN = 0; | |
IN_ROAD = 1; | |
CROSS_ROAD = 2; | |
FORK_ROAD = 3; | |
MAIN_SIDE = 4; | |
DEAD_END = 5; |
map.proto
地图消息格式。
map.proto 分为地图头部信息和结构体
- 头部信息主要介绍了地图的基本信息“版本,时间,投影方法,地图大小,厂家等”。
- 结构体主要是道路的不同组成部分,包括“人行横道,路口区域,车道,停车观察,信号灯,让路标志,重叠区域,禁止停车,减速带,道路,停车区域,路边的小路,或者行人走的路”。
Projection
这条消息定义了我们如何将椭球地球表面投影到一个平面上。
数据类型 | 定义 | 说明 |
---|---|---|
optional string | proj = 1; |
- Proj4是一个免费的GIS工具,它专注于地图投影的表达以及转换。采用一种非常简单明了的投影表达--PROJ4,比其它的投影定义简单,但很容易就能看到各种地理坐标系和地图投影的参数,同时它强大的投影转换功能,也是非常吸引人的。许多的 GIS软件中也将其集成在内。
Header
数据类型 | 定义 | 说明 |
---|---|---|
optional bytes | version = 1; | 地图版本 |
optional bytes | date = 2; | 时间 |
optional Projection | projection = 3; | 投影方法 |
optional bytes | district = 4; | 区 |
optional bytes | generation = 5; | |
optional bytes | rev_major = 6; | |
optional bytes | rev_minor = 7; | |
optional double | left = 8; | 左 |
optional double | top = 9; | 上 |
optional double | right = 10; | 右 |
optional double | bottom = 11; | 底 |
optional bytes | vendor = 12; | 供应商 |
Map
数据类型 | 定义 | 说明 |
---|---|---|
optional Header | header = 1; | 定义了地图的基本信息 |
repeated Crosswalk | crosswalk = 2; | 人行横道 |
repeated Junction | junction = 3; | 交叉路口 |
repeated Lane | lane = 4; | 车道 |
repeated StopSign | stop_sign = 5; | 停车标志,美国专用 |
repeated Signal | signal = 6; | 信号灯 |
repeated YieldSign | yield = 7; | 让车标志,美国专用 |
repeated Overlap | overlap = 8; | 重叠区域 |
repeated ClearArea | clear_area = 9; | 禁止停车区域 |
repeated SpeedBump | speed_bump = 10; | 减速带 |
repeated Road | road = 11; | 道路 |
repeated ParkingSpace | parking_space = 12; | 停车区域 |
repeated PNCJunction | pnc_junction = 13; | |
repeated RSU | rsu = 14; |
- (StopSign,YieldSign)是美国才有的,后来查看了下知乎发现对应到国内是(停,让),具体的含义都是一样,停车的意思是到路口先停止,看下有没有车,然后再开始启动,让车就是先让行,比如交汇路口,理应让直行的车辆先通过,然后再汇入道路。 [参考](国内为什么不能采用美国的stop sign制度在很多路口设置呢?)
- overlap在注释里的解释是“任何一对在地图上重合的东西,包括(车道,路口,人行横道)”,比如路口的人行横道和道路是重叠的,还有一些交通标志和道路也是重叠的,这是创造的一个逻辑概念。
decision.proto
TargetLane
数据类型 | 定义 | 说明 |
---|---|---|
optional string | id = 1; | lane的id |
optional double | start_s = 2; // in meters | 起点 |
optional double | end_s = 3; // in meters | 终点 |
optional double | speed_limit = 4; // in m/s | 限制的速度 |
ObjectDecisionType
oneof | object_tag |
oneof object_tag | ||
---|---|---|
ObjectIgnore | ignore = 1; | 忽略 |
ObjectStop | stop = 2; | 停止 |
ObjectFollow | follow = 3; | 跟随 |
ObjectYield | yield = 4; | 让行 |
ObjectOvertake | overtake = 5; | 超车 |
ObjectNudge | nudge = 6; | 绕行??? |
ObjectAvoid | avoid = 7; | ??? |
ObjectSidePass | side_pass = 8; | 借道通过(从旁边超过) |
nudge
- 自动驾驶汽车的 nudging 指的是主动接近、拥挤的行为,比如加塞、主动缩短跟车距离等,可以翻译为“挤过去”。
- 一辆车“nuding around obstacle”的视频: https://link.zhihu.com/?target=https%3A//youtu.be/L3mKw-RQyGw
- 【赛题解析】Apollo Nudge障碍物任务调试
- 其他车辆从右侧 nudging 示意图:
各个行为安全性:
- Lateral :nudge > ignore;
- Longitudinal:stop > yield >= follow > overtake > ignore
ignore 是最不安全的,表示车辆并没有正在执行某种已知的行为。
ObjectDecision
optional string | id = 1; | 字符串的id, |
optional int32 | perception_id = 2; | 感知目标的id |
repeated ObjectDecisionType | object_decision = 3; | 目标的决策类型 |
ObjectDecisions
repeated ObjectDecision | decision = 1; | 多个ObjectDecision |
MainDecision
主任务
oneof | task | 当前的任务是哪个 |
repeated TargetLane | target_lane = 5 [deprecated = true]; |
one task | |
---|---|
MainCruise | cruise = 1; |
MainStop | stop = 2; |
MainEmergencyStop | estop = 3; |
MainChangeLane | change_lane = 4 [deprecated = true]; |
MainMissionComplete | mission_complete = 6; |
MainNotReady | not_ready = 7; |
MainParking | parking = 8; |
DecisionResult
optional MainDecision | main_decision = 1; | 主要决策 |
optional ObjectDecisions | object_decision = 2; | 目标决策 |
optional apollo.common.VehicleSignal | vehicle_signal = 3; | 车辆信号 |
sl_boundary.proto
SLBoundary
/
// The start_s and end_s are longitudinal values.
// start_s <= end_s.
//
// end_s
// ^
// |
// S direction
// |
// start_s
//
// The start_l and end_l are lateral values.
// start_l <= end_l. Left side of the reference line is positive,
// and right side of the reference line is negative.
// end_l <-----L direction---- start_l
/
optional double | start_s = 1; |
optional double | end_s = 2; |
optional double | start_l = 3; |
optional double | end_l = 4; |
repeated apollo.common.SLPoint | boundary_point = 5; |
common/proto/pnc_point.proto
SLPoint
描述了Frenet坐标系上的一个点。
数据类型 | 定义 | 说明 |
---|---|---|
optional double | s = 1; | s表示距离起点的纵向距离。 起点怎么定义??? |
optional double | l = 2; | l表示距离中心线的侧向距离。 |
PathPoint
数据类型 | 定义 | 说明 |
---|---|---|
optional double | x = 1; | 坐标 |
optional double | y = 2; | 坐标 |
optional double | z = 3; | 坐标 |
optional double | theta = 4; | x-y平面上的方向 |
optional double | kappa = 5; | x-y规划中的曲率 |
optional double | s = 6; | 距离路径起点的累积距离 |
optional double | dkappa = 7; | kappa w.r.t s的导数。 |
optional double | ddkappa = 8; | kappa w.r.t的导数。 |
optional string | lane_id = 9; | 路径点所在的车道ID |
optional double | x_derivative = 10; | CosThetareferenceline中x和y与参数t的导数 |
optional double | y_derivative = 11; | CosThetareferenceline中x和y与参数t的导数 |
Path
数据类型 | 定义 | 说明 |
---|---|---|
optional string | name = 1; | |
repeated PathPoint | path_point = 2; | 一个路径是由很多路径上的点组成的 |
TrajectoryPoint
轨迹点
- ”轨迹“不同于“路径”,“轨迹”不仅仅包含了行驶路线,还要包含每个时刻的车辆的速度,加速度,方向转向等信息。
- 就和高精地图通过一系列的点来描述道路的中心线一样,车辆的行驶轨迹也是由一系列的点来描述的。
轨迹中的点通过TrajectoryPoint这个结构来描述。它的字段说明如下:
数据类型 | 定义 | 说明 |
---|---|---|
optional PathPoint | path_point = 1; |
|
optional double | v = 2; |
|
optional double | a = 3; |
|
optional double | relative_time = 4; |
|
optional double | da = 5; |
|
optional double | steer = 6; |
|
optional GaussianInfo | gaussian_info = 7; |
|
TrajectoryPoint仅仅是一个点。而一条轨迹一定是由许多个点构成的。因此,描述轨迹的类DiscretizedTrajectory继承自std::vector< common::TrajectoryPoint>。如下所示:
class DiscretizedTrajectory : public std::vector<common::TrajectoryPoint>
Trajectory
optional string | name = 1; | |
repeated TrajectoryPoint | trajectory_point = 2; |
VehicleMotionPoint
车辆移动点
optional TrajectoryPoint | trajectory_point = 1; | 轨迹点 |
optional double | steer = 2; | 车辆前轮与车辆纵轴之间的角度 |
VehicleMotion
optional string | name = 1; | |
repeated VehicleMotionPoint | vehicle_motion_point = 2; |
GaussianInfo
optional double | sigma_x = 1; | 高斯分布信息 |
optional double | sigma_y = 2; | 高斯分布信息 |
optional double | correlation = 3; | 高斯分布信息 |
optional double | area_probability = 4; | 代表性不确定区域信息 |
optional double | ellipse_a = 5; | 代表性不确定区域信息 |
optional double | ellipse_b = 6; | 代表性不确定区域信息 |
optional double | theta_a = 7; | 代表性不确定区域信息 |
TaskStats
在planning.proto中定义;
optional string | name = 1; | 任务的名字 |
optional double | time_ms = 2; | 运行时间 |
LatencyStats
潜在的状态, 在planning.proto中定义;
optional double | total_time_ms = 1; | 总时间 |
repeated TaskStats | task_stats = 2; | 任务的状态 |
optional double | init_frame_time_ms = 3; | 初始frame的时间 |
ADCTrajectory
ADCTrajectory的字面意思地自动驾驶车的轨迹, 在planning.proto中定义;
apollo.common.Header | header = 1; | |
optional double | total_path_length = 2; | 总路径的长度, 单位是米meters; |
optional double | total_path_time = 3; | 总路径的时间, 单位是seconds; |
optional EStop | estop = 6; | 是否有紧急停车 |
optional apollo.planning_internal.Debug | debug = 8; | |
optional bool | is_replan = 9 [default = false]; | 是否重新规划i\ |
optional apollo.canbus.Chassis.GearPosition | gear = 10; | 具体的档位位置 |
repeated apollo.common.TrajectoryPoint | trajectory_point = 12; | 重复的轨迹点 |
repeated apollo.common.PathPoint | path_point = 13; | 路径点PathPoint(没有速度信息)。 |
optional apollo.planning.DecisionResult | decision = 14; | planning的决策结果 |
optional LatencyStats latency_stats = 15; | 潜在的状态 | |
optional apollo.common.Header | routing_header = 16; | |
optional RightOfWayStatus | right_of_way_status = 17; | 道路右边的状态; |
repeated apollo.hdmap.Id | lane_id = 18; | 沿车道中线参考线的lane ID; |
optional apollo.common.EngageAdvice | engage_advice = 19; | 根据当前的计划结果设置engage的建议; – 这是一个遇到critical时才给予的运行时建议。 |
optional CriticalRegion | critical_region = 20; | 致命区域 |
optional TrajectoryType | trajectory_type = 21 [default = UNKNOWN]; | 轨迹的类型:不知道是什么类型, 正常的类型, 路径反馈的类型, 速度反馈的类型; |
optional string replan_reason = 22;
// lane id along target reference line
repeated apollo.hdmap.Id target_lane_id = 23;
// complete dead end flag
optional bool car_in_dead_end = 24;
// output related to RSS
optional RSSInfo rss_info = 100;