1、planning框架介绍
总结起来就是
通过scenario update然后执行stage下的task,task全部执行完就算一个scenario的结束,同时会有个线程去执行生成轨迹参考线,然后task将障碍物、速度等信息往轨迹参考线上挂,最后通过ADCTrajectry发送给控制端。
同时会做强化学习的在线训练以及离线数据缓存
2、支持场景
目前planning支持以下几种场景:
- apollo::planning::LaneFollowScenario: 车道保持场景,是默认的自动驾驶场景,在这个场景中车辆沿着路由线路行驶,遇到障碍物根据情况在当前车道线内绕行,或者借道到相邻的车道绕行,并根据routing中的路线信息换道行驶。对道路上的交通标志,如停止,让行标志,人行道或减速带等,根据交通规则进行减速或停止让行。
- apollo::planning::PullOverScenario: 靠边停车场景,如果参数配置
enable_pull_over_at_destination
设置为true
, 当车辆到达终点附近时,将自动切入PullOverScenario
并完成靠边停车。
- apollo::planning::BareIntersectionUnprotectedScenario: 无保护交通路口场景,在交通路口既没有停止标志,也没有交通灯,车辆在路口前一段距离范围内切换到此场景。
- apollo::planning::TrafficLightProtectedScenario: 有保护的交通灯路口场景,在这种路口对前行,左转,右转都有明确的交通灯指示。
- apollo::planning::TrafficLightUnprotectedLeftTurnScenario: 无保护的交通灯左转,这种场景下,车辆在交通灯路口左转时,仍然会有对向车辆通过路口,这时车辆需要让行。所以TrafficLightUnprotectedLeftTurnScenario场景设计思路与有保护交通灯的区别是,在通过交通路口时,需要增加减速慢行阶段(Creep),以便观察对向车辆,并根据情况让行。
- apollo::planning::TrafficLightUnprotectedRightTurnScenario: 无保护的交通灯右转,这种场景下,车辆在交通灯右转时,可能会有对向车辆通过,这时车辆需要缓行,并观察红绿灯情况,在安全的前提下右转。
- apollo::planning::StopSignUnprotectedScenario: 无保护停止标志路口场景,这种场景下的路口,只有一个双向停止标志,车辆在通过路口前,需要观察路口来往车辆,在路口通行车辆密度较小时才通过路口。
- apollo::planning::YieldSignScenario: 路口有让行标志的场景,在车辆遇到让行标志时,对向有车辆时,要先让对向车辆先行。
- apollo::planning::ValetParkingScenario: 代客泊车入库的场景,当planning的输入命令RoutingResponse中包含了parking_id的信息时,即是指定将车辆泊入地图中parking_id对应的停车位中。
- apollo::planning::EmergencyPullOverScenario: 紧急停车场景,车辆在行驶过程中如果收到PadMessage命令“PULL_OVER”,车辆就近找到合适的位置在当前车道内停车,相比于直接停止,这样保证了行驶过程中的停车安全。
- apollo::planning::ParkAndGoScenario: 车辆辆靠边停车后,从当前位置起步向指定的下一个目标行驶的命令,这种场景适用于巴士接驳的情况。场景中使用了Open Space的算法,保证车辆能够安全从指定位置泊出。
详细功能列表如下:
功能名称 | 功能描述 | 功能相关代码包 | 功能图示 |
---|---|---|---|
lane follow | 车辆沿指令中的路由线路行驶,从地图中查询路由中的车道信息,规划沿车道线行驶的轨迹。 | LaneFollowScenario LaneFollowPath | |
nudge | 如果道路前方有静止或低速障碍物占据车道,但当前车道内还有足够空间,车辆可以在当前车道内绕过障碍物行驶。 | LaneFollowScenario LaneFollowPath | |
lane change | 车辆沿RoutingResponse中的路由线路行驶的过程中,从一个车道切换到相邻车道。 | LaneFollowScenario LaneChangePath | |
lane borrow | 如果道路前方有障碍物长时间停留阻塞道路,车辆无法通过在当前车道内绕过,需要往相邻车道借道,绕过当前障碍物。当车辆经过障碍物之后,车辆会立即回到原车道行驶。 | LaneFollowScenario LaneBorrowPath | |
pull over | 当车辆接近终点时,可以通过配置选择是否在终点处靠边停车。如果使能终点靠边停车,车辆在终点附近查找一个可以停车的位置,并将车辆停在这个位置上。如果这个位置前后有其他障碍物,车辆可以通过 OpenSpace 的泊车算法,将车辆停在这个位置。 | PullOverScenario PullOverPath | |
park and go | 如果车辆停车位置不在道路上,再次启动的时候,车辆会先从当前位置使用OpenSpace规划算法(如有必要)先行驶到车道线上,然后再正常沿道路行驶。 | ParkAndGoScenario | |
crosswalk | 当车辆行驶到人行道前时,如果有行人通过,车辆会停车等待行人通过后再通行。 | Crosswalk | |
bare intersection | 车辆行驶到无交通灯和停止标志的交通路口,因为对向车辆没有明确通行指示,所以需要车辆根据路口交通情况决定是否通行。 | BareIntersectionUnprotectedScenario | |
traffic light protected/unprotected | 车辆经过有红绿灯的交通灯路口时,如果交通灯有左转/右转通行箭头,车辆在红灯亮起时停止,绿灯亮起时通行;如果交通灯不是箭头指示灯,车辆在通过路口时可能还有对向车辆经过,这时就需要在通过路口前减速慢行,没有冲突时再通过路口。 | TrafficLight TrafficLightProtectedScenario TrafficLightUnprotectedLeftTurnScenario TrafficLightUnprotectedRightTurnScenario | |
stop sign | 当车辆前方有停止标志时,先停车观察,没有其他行人或车辆冲突时再通行。 | StopSign StopSignUnprotectedScenario | |
yield sign | 当车辆在没有交通灯的路口,有让行标志时,优先让其他对向车辆通行后自车再通行。 | YieldSign YieldSignScenario | |
keep clear area | 车辆经过Keep Clear Area区域时,不能在这个区域内停车。 | KeepClear | |
rerouting | 如果车辆在道路上被阻塞超出一段时间后,planning发出重新路由的请求以便脱困。 | Rerouting | |
valet parking | 给定地图上某一个停车位的id,车辆从当前位置导航到停车位,并泊车入库。 | ValetParkingScenario | |
emergency pull over | 在车辆行驶过程中,可以接收外部命令紧急靠边停车。 | EmergencyPullOverScenario |
3、规划器
planning 支持两种规划模式:OnLanePlanning 和 NaviPlanning,前者是基于高精地图的轨迹规划,也是默认的规划模式;后者是相对地图导航规划,主要用于交通规则较简单的高速公路。
每种规划模式可以通过 PlannerDispatcher 选择使用的 Planner ,目前 planning 模块中共有 4 种 Planner:
- apollo::planning::PublicRoadPlanner: 于高精地图的规划器;
- apollo::planning::NaviPlanner: 于实时相对地图的规划器;
- apollo::planning::LatticePlanner: 于网格算法的规划器
- apollo::planning::RTKReplayPlanner: 于录制轨迹的规划器
planning模块中有两个主要的线程,一个是根据输入环境和车辆信息,进行轨迹规划的主流程;另外一个是根据地图和输入的全局路线,生成参考线信息,这个线程是周期运行的线程,主流程规划都是在它生成的参考线基础上进行的。
在planning主流程中,默认使用OnLanePlanning->PublicRoadPlanner进行轨迹规划,在PublicRoadPlanner中,根据周围环境信息,切换到不同的场景中,规划生成轨迹并发送给control模块。
4、输入输出
输入
Planning 模块需要获取外部环境信息,车辆自身信息进行轨迹规划,以下是 planning 的外部输入信息:
信息分类 | 信息 | 说明 | 数据类型 | topic name |
---|---|---|---|---|
外部环境信息 | 障碍物预测信息 | perception 模块输出的障碍物信息,经过 prediction 处理后增添速度,加速度,和预测轨迹等信息。 | prediction::PredictionObstacles | /apollo/prediction |
交通灯感知信息 | perception 模块输出的交通灯感知信息,包含交通灯亮起的颜色,id 等信息。 | perception::TrafficLight | /apollo/perception/traffic_light | |
车辆信息 | 车辆定位 | localization 输出的车辆位姿信息。 | localization::LocalizationEstimate | /apollo/localization/pose |
底盘状态 | canbus 模块输出的车辆底盘信息,包含底盘速度,油门,刹车,档位,灯光等状态。 | canbus::Chassis | /apollo/canbus/chassis |
此外,planning 模块还需要外部输入的导航命令信息,用户首先向 external_command 发送导航命令请求,external_command 再将这些命令进行处理后转发给 planning 模块。下面介绍用户可以发送的几种导航命令:
信息分类 | 信息 | 说明 | 数据类型 | topic name |
---|---|---|---|---|
外部命令 | 沿车道线行驶命令 | 基于高精地图导航的命令,给定终点的位置或朝向,从当前车辆位置导航到目标终点位置。 | external_command::LaneFollowCommand | /apollo/external_command/lane_follow |
泊车命令 | 从当前位置导航泊车到停车位上。 | external_command::ValetParkingCommand | /apollo/external_command/valet_parking | |
流程操作命令 | HMI发送的流程操作命令,包括紧急靠边停车(PULL_OVER),紧急停车(STOP),继续行驶(CRUISE)等命令,目前只对PULL_OVER和STOP命令响应。 | planning::ActionCommand | /apollo/external_command/action |
输出
信息 | 说明 | 数据类型 | topic name |
---|---|---|---|
规划轨迹 | 输出规划轨迹,包含轨迹点,速度和时间等信息。 | planning::ADCTrajectory | /apollo/planning |
导航状态 | 导航命令的执行状态。 | external_command::CommandStatus | /apollo/planning/command_status |
重新路由的请求 | 在道路被阻塞,换道失败超时时,发送重新路由的申请。 | external_command::LaneFollowCommand | /apollo/external_command/lane_follow |
具体后面写走读代码再说