注意:Apollo的决策和规划是⼀起做的,⼀起称之为Planning模块
Planning模块的运⾏机制如图,基于双层状态机,⼀层是Stage,⼀层是Task
根据场景,确定Stage,每个Stage都包含了路径的决策,规划
然后将任务分为两种,⼀种是有⻋道线的规划,⼀种是没有⻋道线的规划下⾯介绍决策模块
为了提⾼准确性,输⼊了所有的信息,包括Routing,道路结构交通信息以及感知的障碍物,以及预测信息
决策模块主要实现了以下五个功能
下⾯分别来介绍
⾸先是参考路径 ,也叫参考线,很重要
后⾯的各种规划和决策都是基于参考线运⾏
此外参考线也可以表达换道需求,如果需要换道,⽣成⼀个⽬标参考线,如图所⽰,
⽬标参考线的优先级⼤于当前参考路径,表⽰环道需求。
参考线实现⽅法主要是根据Routing的输出来找到道路中⼼线,也就是图中蓝⾊的线当有了这个参考线后,进⾏交规决策
结合⾼精地图和信号灯状态输出,遍历参考线上的交通灯以及交通灯的状态下⾯来判断路⼝是否⽣成停⽌墙(红线)
路径决策
路径判断是否需要换道:
如果需要换道,再判断能不能换道,如果可以换道,就会产⽣⼀个换道的路径边界, 否则产⽣道内边界
如果不需要换道,会判断是否要做⼀个避让,
避让有两个条件,⼀个是道路宽度是否⾜够去换道,另⼀个是障碍物是不是静态的注意:路径决策的时候考虑静态障碍物,动态障碍物由速度规划来考虑
下⾯来看路径边界
⼀个是⻋道内的边界,如图1所⽰,绿⾊的线,如果遇到⼀个障碍物,就会触发绿⾊的边界
第⼆个借道,其实同理
第三个,换道场景,边界由优先级⽐较⾼的道路决定
速度决策
为了⾏驶安全,要对速度进⾏限制
⽐如道路限速,⼈⾏避让等等
得到平滑的路径后,进⾏速度决策,对当前路径上产⽣⼀个或者多个速度边界,然后集成得到最终速度边界,然后再使⽤ST图得到时间上的位置限制边界,通过两个边界来得到平滑的速度规划。
完成速度规划就可以⽣成轨迹了
下⾯是Planning模块的运⾏流程 (很重要,值得反复学习)
⼀个规划周期内的全部流程如下:
(1)参考线平滑
主要使⽤参考线平滑算法,⽣成⼀条平滑的参考线
(2)交规⽣成
根据参考线和⻋辆状态以及道路状态来判断当前有哪些交规需要满⾜
(3)换道决策
根据当前⻋道和⻋辆状态和交规判断是否需要换道
(4)路径复⽤决策(如果复⽤,跳到10,否则按顺序执⾏)
判断路径是否可以复⽤,如果可以的话,就不需要再进⾏路径规划, 直接速度规划
(5)借道决策
判断是否需要借道,如果需要借道
(6)路径边界决策
判断道路的边界,便于后⾯进⾏⼆次规划
(7)路径优化对路径进⾏优化
(8)路径分配决策
(9)路径决策
对⽣成的⼏条路径进⾏⼀个打分,选择打分最⾼的路径,给速度规划
(10)速度边界优先级决策
⾸先⽣成ST图,ST图的S坐标轴是沿着路径规划的路径进⾏的
(11)速度启发式优化
(12)速度决策
使⽤动态规划进⾏速度的决策,判断哪些凸区域是可以⾏驶的
(13)速度最终决策
决定⼀个凸区域进⾏优化
(14)速度优化器
把凸区域和路径进⾏⼆次优化获得速度曲线
(15)合并轨迹
把速度和路径合并获得⼀条轨迹发给控制
下⾯来看场景的概念,Apollo3.5后提出
可以是⼀个静态的⼗字路⼝,也可以是⽆⼈⻋完成的动作,⽐如借道避让针对不同的⾃动驾驶场景,⽐如物流⻋,taxi也是不⼀样的
只要合理即可,没有明确界定
Apollo场景分类主要是两类:
⼀种是Lane Follow的场景,就是主⻋沿着⼀条⻋道线⾏驶,⽽且该⻋道前⽅⼀定距离内,是没有其他的⻋道与其交汇和穿越的
另⼀种是Lane Breaking场景,⼜分很多场景,分类为路⼝的,包含红绿灯等信息场景划分优点:
场景之间互不⼲扰,适合并⾏开发,独⽴调参,⽅便管理。功能之间可以相互解耦,有利于开发者开发⾃⼰的场景。
(⼆)交规决策刹场景实现机制
Scenario Manager主要定义了9种交规的类型
for循环遍历配置⽂件
⽐如⻋辆靠近交叉路⼝的时候,Scenario Manager判断进⼊哪个场景,根据信息来判断进⼊哪个场景。
由于察觉到了红绿灯,所以判断为traffic light的有保护的场景,⼜分为两个Stage
第⼀个Stage是⻋辆靠近阶段,第⼆个是进⼊场景阶段
每个Stage下⼜有很多的Task,每个Stage都会进⾏之前讲的决策规划流程
场景的进⼊阶段
进⼊场景之前需要判断,⼀个是判断它是不是交叉路⼝,另外⼀个是判断有没有保护的场景
进⼊场景后开始定义的Stage
两个场景,定义了不同的优先级
先执⾏apporach,然后再执⾏配置⽂件⾥可以看到
进⼊Approach阶段
来判断主⻋和停⽌线的距离,距离⼩于某⼀个值(5m,配置⽂件可查看)的时候,进
⼊场景
根据状态判断⾏为,⽐如红灯就停⽌进⼊交叉路⼝后进⼊Cruise阶段
主要是做⼀个判断,通过交叉路⼝后,就会恢复lane follow状态对于执⾏过程种,需要对交通灯检测
当检测到⻩灯红灯的时候,⽣成停⽌强墙
如果决策⽣成停⽌墙,这个距离也是配置⽂件定义好,可以看到是1m
总结:⻋辆⾏驶到红绿灯后,进⼊Approach阶段,然后根据红绿灯状态判断时候停⽌墙,然后Cruise,最后变成Lane Follow
(三)交通灯场景仿真实现
云实验部分
⾸先登陆,然后创建场景
如何能让⻋辆U型路⼝通过尽量平滑
(⼀)Apollo参考线介绍
⾸先,参考线是贯穿了整个导航决策规划的模块
Planning模块主要包含:交通规则的处理,障碍物的投影,路径的优化决策以及速度优化和决策
每个处理的过程,都需要先⽣成参考线,然后在基础上进⾏投影和处理参考线是整个规划算法的基础
导航模块数据有三层
第⼀层是Routing的搜索结果,是根据地图topo结构,从起点到终点进⾏搜索,整个路径搜索⻓度可能⼏公⾥,⼏百公⾥,因此Routing的结果是宏观数据,是静态的⽐较固
定的,如果没有障碍物,道路堵塞的情况下,⻋辆会⼀直沿着它⾏驶,只有道路堵塞的时候,才会重规划⽣成新的Routing
第⼆层是参考线的计算,参考线计算以Routing为基础,会考虑⻋辆周围的动态信息,
⽐如障碍物和交规信息,参考线包括⻋辆周围范围内,通常是⼏百⽶的范围,相当于
是Routing内的局部的数据。
第三层是轨迹,轨迹是决策规划模块最终输出结果,其依据就是第⼆层的结果,同⼀时刻可能有多个参考线,⽐如变道的时候,⾃⾝⻋道和⽬标⻋道都有参考线,但是在决策的时候,Planning模块会决定⻋辆最终要⾛那⼀条路线。这个唯⼀的结果就是输出的轨迹。所以这个轨迹更加具体以及更加局部,不仅包含了⻋辆的路线信息,还包含了⾏驶的详细状态,⽐如说⻋辆的⽅向,速度加速度等动态信息。
为什么要重新⽣成参考线呢?
因为我们的参考线是⾼精地图来的,⽽这个⾼精地图⼀般是⼈为采集的,⼀般都是不平滑的离散的点,如果直接拿来当参考线,可能导致规划轨迹不平滑,导致⻋辆具体
⾏驶过程中频繁晃动
此外,导航的路径可能⽐较⻓,对⾃⻋和障碍物进⾏投影的时候,由于路径很⻓,所以可能⽣成多个投影点,所以要根据Routing导航路径⽣成局部的平滑的参考线。这样可以节省不必要的算⼒。
参考线的数据结构如下
存储了参考线的信息
第⼀个是priority,表⽰优先级,多个参考线可以根据它来判断
第⼆个是限速,表明了参考线的速度限制的起点终点和限制,此外使⽤⼀个数组进⾏分段限速,⼀条参考线上多段速度限制
第三个是参考点,具体的离散点
最后⼀个是Map_path,是地图中的参考线,使⽤的时候需要将其映射到planning的参考线,他们俩是⼀⼀对应的
由Map_path继承⽽来,⽗类就只有点的坐标,Map_path增加了点的朝向,以及地图上的点对应道路上的点(这⾥是⼀个数组,因为⼀个点可能对应被多个⻋道占据)
然后RefrencePoint继承,增加了曲率和曲率的导数,这直接和控制相关下⾯来看如何处理参考线
两个线程,⼀个是Provider,⼀个是规划线程,对参考线进⾏规划
Provider根据Pnc地图⽣成参考线。⼀部分是参考线⽣成,⼀部分是参考线平滑平滑主要是三种⽅式,离散点平滑,样条曲线平滑以及螺旋线平滑
Apollo主要采⽤离散点平滑下⾯来看如何⽣成参考线
参考线⽣成时在CreateRef中⽣成的,⾸先获取⻋辆状态,然后获取Routing结果,根据Routing结果⽣成RouteSegments,最后结合⻋辆状态来对参考线进⾏平滑以及分割(Shrink)
如果不是新的Routing,就可以使⽤上个周期的参考线进⾏扩展,沿⽤旧的参考线,节省计算量