前言:
后台已经完成Apollo Planning决策规划算法的完整解析,从规划模块的入口OnLanePlanning开始,介绍到常见的规划器PublicRoadPlanner;接着介绍了在PublicRoadPlanner中如何通过类似有限状态机的ScenarioDispatch进行场景决策。之后又介绍了在每个场景Scenario中如何配置以及判断当前所处的stage,以及对于每个stage又是如何注册tasks来执行具体的规划任务。
现在回头来看,这个系列应该是目前全网最完整的apollo规划算法planning模块的解析教程了,所以现在阶段性的,想再对apollo整个规划算法的流程做一个总结,也可以当做是整个系列的文章的概述。
如果对apollo规划算法感兴趣,想学习完整的系列文章,可以订阅下面专栏:https://blog.csdn.net/nn243823163/category_11685852.htmlhttps://blog.csdn.net/nn243823163/category_11685852.html
也可以加我vx公众号(L5Player)进一步交流学习。
Apollo Planning决策规划算法解析的系列文章如下:
Apollo Planning决策规划算法代码详细解析 (1):Scenario选择
Apollo Planning决策规划算法代码详细解析 (2):Scenario执行
Apollo Planning决策规划算法代码详细解析 (3):stage执行
Apollo Planning决策规划算法代码详细解析 (4):Stage逻辑详解
Apollo Planning决策规划算法代码详细解析 (5):规划算法流程介绍
Apollo Planning决策规划算法代码详细解析 (6):LaneChangeDecider
Apollo Planning决策规划算法代码详细解析 (7): PathReuseDecider
Apollo Planning决策规划算法代码详细解析 (8): PathLaneBorrowDecider
Apollo Planning决策规划算法代码详细解析 (9): PathBoundsDecider
Apollo Planning决策规划算法代码详细解析 (10):PiecewiseJerkPathOptimizer_
Apollo Planning决策规划算法代码详细解析 (11): PathAssessmentDecider
Apollo Planning决策规划算法代码详细解析 (12): PathDecider
Apollo Planning决策规划算法代码详细解析 (13): RuleBasedStopDecider
Apollo Planning决策规划算法代码详细解析 (14):SPEED_BOUNDS_PRIORI_DECIDER
Apollo Planning决策规划算法代码详细解析(15): 速度动态规划SPEED_HEURISTIC_OPTIMIZ 上
Apollo Planning决策规划算法代码解析 (16):SPEED_HEURISTIC_OPTIMIZER 速度动态规划中
Apollo Planning决策规划算法代码解析 (17):SPEED_HEURISTIC_OPTIMIZER 速度动态规划下_
Apollo Planning决策规划算法代码详细解析 (18):SpeedDecider 障碍物纵向决策上
在本文将会讲解下面这些内容:
1、apollo规划算法整体运行框架pipline
2、常用的LANE_FOLLOW场景如何执行具体的规划任务;
3、LANE_FOLLOW_DEFAULT_STAGE有哪些tasks,这些task分别执行什么任务;
4、完整的决策规划流程
正文如下:
一、apollo规划算法整体运行框架
在每个运行周期内,可以理解为task是最小的执行单位;按照配置不同的task构成了stage;当确定所处stage后,会执行stage下注册的所有task。
apollo规划算法中,task的执行流程如下,下图便是apollo规划算法的完整运行流程:
二、apollo规划算法具体执行的task
上文讲到PublicRoadPlanner 的 LaneFollowStage 是在自动驾驶过程中使用频率最高的场景与stage,LaneFollowStage的配置如下,正是下面这些task组成了在LaneFollowStage状态下完整的决策规划算法。
scenario_type: LANE_FOLLOW
stage_type: LANE_FOLLOW_DEFAULT_STAGE
stage_config: {
stage_type: LANE_FOLLOW_DEFAULT_STAGE
enabled: true
task_type: LANE_CHANGE_DECIDER
task_type: PATH_REUSE_DECIDER
task_type: PATH_LANE_BORROW_DECIDER
task_type: PATH_BOUNDS_DECIDER
task_type: PIECEWISE_JERK_PATH_OPTIMIZER
task_type: PATH_ASSESSMENT_DECIDER
task_type: PATH_DECIDER
task_type: RULE_BASED_STOP_DECIDER
task_type: ST_BOUNDS_DECIDER
task_type: SPEED_BOUNDS_PRIORI_DECIDER
task_type: SPEED_HEURISTIC_OPTIMIZER
task_type: SPEED_DECIDER
task_type: SPEED_BOUNDS_FINAL_DECIDER
# task_type: PIECEWISE_JERK_SPEED_OPTIMIZER
task_type: PIECEWISE_JERK_NONLINEAR_SPEED_OPTIMIZER
task_type: RSS_DECIDER
}
三、apollo规划算法tasks最完整解析
上文提到task组成了在LaneFollowStage状态下完整的决策规划算法,本节将会完整介绍这些task设置的目的,具体执行什么样的任务:
1、LaneChangeDecider
LaneChangeDecider 是lanefollow 场景下,所调用的第一个task,它的作用主要有两点:
- 判断当前是否进行变道,以及变道的状态,并将结果存在变量lane_change_status中;
- 变道过程中将目标车道的reference line放置到首位,变道结束后将当前新车道的reference line放置到首位
流程图如下:
2、PathReuseDecider
PathReuseDecider 是lanefollow 场景下,所调用的第 2 个 task,它的作用主要是换道时:
- 根据横纵向跟踪偏差,来决策是否需要重新规划轨迹;
- 如果横纵向跟踪偏差,则根据上一时刻的轨迹生成当前周期的轨迹,以尽量保持轨迹的一致性
流程如下:
3、PathLaneBorrowDecider
PathLaneBorrowDecider 是第3个task,PathLaneBorrowDecider会判断已处于借道场景下判断是否退出避让;判断未处于借道场景下判断是否具备借道能力。
需要满足下面条件才能判断是否可以借道:
- 只有一条参考线,才能借道
- 起点速度小于最大借道允许速度
- 阻塞障碍物必须远离路口
- 阻塞障碍物会一直存在
- 阻塞障碍物与终点位置满足要求
- 为可侧面通过的障碍物
4、PathBoundsDecider
PathBoundsDecider 是第四个task,PathBoundsDecider根据lane borrow决策器的输出、本车道以及相邻车道的宽度、障碍物的左右边界,来计算path 的boundary,从而将path 搜索的边界缩小,将复杂问题转化为凸空间的搜索问题,方便后续使用QP算法求解。
5、PiecewiseJerkPathOptimizer
PiecewiseJerkPathOptimizer 是lanefollow 场景下,所调用的第 5 个 task,属于task中的optimizer类别它的作用主要是:
- 1、根据之前decider决策的reference line和 path bound,以及横向约束,将最优路径求解问题转化为二次型规划问题;
- 2、调用osqp库求解最优路径;
6、PathAssessmentDecider
PathAssessmentDecider 是lanefollow 场景下,所调用的第 6 个 task,属于task中的decider 类别它的作用主要是:
- 选出之前规划的备选路径中排序最靠前的路径;
- 添加一些必要信息到路径中
7、PathDecider
PathDecider 是lanefollow 场景下,所调用的第 7 个 task,属于task中的decider 类别它的作用主要是:
在上一个任务中获得了最优的路径,PathDecider的功能是根据静态障碍物做出自车的决策,对于前方的静态障碍物是忽略、stop还是nudge
8、RuleBasedStopDecider
RuleBasedStopDecider 是lanefollow 场景下,所调用的第 8 个 task,属于task中的decider 类别它的作用主要是:
- 根据一些规则来设置停止标志。
9、SPEED_BOUNDS_PRIORI_DECIDER
SPEED_BOUNDS_PRIORI_DECIDER 是lanefollow 场景下,所调用的第 10 个 task,属于task中的decider 类别它的作用主要是:
(1)将规划路径上障碍物的st bounds 加载到路径对应的st 图上
(2)计算并生成路径上的限速信息
SPEED_BOUNDS_PRIORI_DECIDER 这个task 是 SpeedBoundsDecider 这个类的对象,使用SPEED_BOUNDS_PRIORI_DECIDER 的config进行初始化,相关代码在 http://task_factory.cc 中定义。
10、PathTimeHeuristicOptimizer
SPEED_HEURISTIC_OPTIMIZER 是lanefollow 场景下,所调用的第 11个 task,属于task中的optimizer 类别,它的作用主要是:
- apollo中使用动态规划的思路来进行速度规划,其实更类似于使用动态规划的思路进行速度决策;
- 首先将st图进行网格化,然后使用动态规划求解一条最优路径,作为后续进一步速度规划的输入,将问题的求解空间转化为凸空间
代码总流程如下:
- 1、遍历每个障碍物的boundry,判度是否有碰撞风险,如果有碰撞风险使用fallback速度规划;
- 2、初始化cost table
- 3、按照纵向采样点的s,查询各个位置处的限速
- 4、搜索可到达位置
- 5、计算可到达位置的cost
- 6、搜索最优路径
11、SpeedDecider
SpeedDecider 是lanefollow 场景下,Apollo Planning算法所调用的第12个 task,属于task中的decider 类别它的作用主要是:
- 1、对每个目标进行遍历,分别对每个目标进行决策
- 2、或得mutable_obstacle->path_st_boundary()
- 3、根据障碍物st_boundary的时间与位置的分布,判断是否要忽略
- 4、对于虚拟目标 Virtual obstacle,如果不在referenceline的车道上,则跳过
- 5、如果是行人则决策结果置为stop
- 6、SpeedDecider::GetSTLocation() 获取障碍物在st图上与自车路径的位置关系
- 7、根据不同的STLocation,来对障碍物进行决策
- 8、如果没有纵向决策结果,则置位ignore_decision;
12、SPEED_BOUNDS_FINAL_DECIDER
SPEED_BOUNDS_FINAL_DECIDER 是lanefollow 场景下,所调用的第 13 个 task,属于task中的decider 类别它的作用主要是:
- (1)将规划路径上障碍物的st bounds 加载到路径对应的st 图上
- (2)计算并生成路径上的限速信息
13、PiecewiseJerkSpeedOptimizer
PiecewiseJerkSpeedOptimizer 是lanefollow 场景下,所调用的第 14个 task,属于task中的decider 类别它的作用主要是:
- 1、根据之前decider决策的speed decider和 speed bound,以及纵向约束,将最优速度求解问题转化为二次型规划问题;
- 2、调用osqp库求解最优路径;
四、文章推荐
Apollo Planning决策规划算法代码详细解析 (16):SPEED_HEURISTIC_OPTIMIZER 速度动态规划中_自动驾驶 Player的博客-CSDN博客
自动驾驶算法详解(5): 贝塞尔曲线进行路径规划的python实现_自动驾驶 Player的博客-CSDN博客_自动驾驶路径规划算法
Apollo Planning决策规划算法代码解析 (17):SPEED_HEURISTIC_OPTIMIZER 速度动态规划下_自动驾驶 Player的博客-CSDN博客
Apollo规划决策算法仿真调试(5):动态障碍物绕行_自动驾驶 Player的博客-CSDN博客_apollo 障碍物
版权归原作者 自动驾驶Player 所有, 如有侵权,请联系我们删除。