赞
踩
apollo中的planning模块的场景选择是通过scenario-stage-task并利用状态机对车辆状态和规划功能进行维护的。
planning模块是基于Scenario、Stage、Task这样的层次结构的,针对不同的场景设计不同的算法细节。
相应地,一个Scenario包含多个Stage,一个Stage包含多个Task。
为实现决策功能,设计了一个双层状态机
决策模块相当于无人驾驶系统的大脑,保障无人车的行车安全,同时也要理解和遵守交通规则。为了实现这样的功能,决策模块为无人车提供了各种的限制信息包括:
此外,决策模块几乎利用了所有和无人驾驶相关的环境信息,包括:
正因为决策模块处理了所有上层业务逻辑信息,并抽出了抽象的限制信息,我们保证了下游路径和速度优化的抽象性,并完全和上层的地图,感知,预测的解耦
apollo决策主要分为五大功能:
参考路径(Reference Line)在 apollo决策中起着非常重要和关键的作用。
其中,优先级搞的路径表示目标路径,优先级低的路径表示当前路径。
目前在 Apollo 里,参考路径的计算是根据routing的路线,找到相应的高精地图中的道路中心线,然后进行平滑。
有了参考路径之后,我们会沿着该路径找到所有在该路径上的交通标示和交通信号灯,并根据一系列的交通规则来决定是否在需要停止在交通标示或者交通信号灯的停止线前。如果需要停止,决策模块会在停止线上生成一个虚拟的墙。虚拟墙会影响后继的路径和速度决策。
如下图,在无人车的参考路径(蓝色)上有交通灯,根据交通灯的状态:
这样我们就完成了绿灯行红灯停的交通规则。其他的交通规则也采取类似的方法,根据规则决定是否在相应的地方放置虚拟墙。
准备知识
开始决策
有了根据交通标示和交通信号灯产生的虚拟墙,再加上从感知模块得到的障碍物信息,我们就可以开始进行路径决策。路径决策。路径决策的过程类似下面的决策树:
车道内路径边界的决策有图中所示的三种情况:车道内无障碍物,车道前方有障碍物,车道左右方有障碍物。实际路况中会是其中一种情况或者多种情况的组合。
注意,图中的蓝色线是车辆的参考路径(Reference Line),路径边界的生成是在参考路径的Frenet Frame 下完成的
借道的路径边界
换道的路径边界
另外需要强调的是,在做路径决策时,只考虑静止障碍物。动态障碍物是在速度规划时考虑
有了路径边界后,我们调用路径优化器(Path Optimizer)得到在边界限制内的平滑路径。得到平滑的路径后,我们就可以在路径上进行速度决策。
速度决策的流程如下图所示。
speed bound decider
在很多情况下,出于行车安全和遵守交规的原因,需要对车辆的速度进行限制。比如,当路径旁边有行人时,我们要减速慢行;当我们要借道避让时,也要减速慢行。这样的速度限制可能是对整条路径,比如道路限速,也有可能是对路径中的一小段,比如减速带。
如下图,沿着路径(s)有三种不同的限制:
为了得到整条路径的综合限速,我们把这几种限速集成到一起。如右下图
得到路径上的速度边界之后,我们就可以利用ST图来求解时间上的位置边界。下图是一个简单的 ST 图的例子,我们用这个例子来简单解释我们为什么需要 ST 图以及如何从 ST 图上得到时间上的位置边界。
左图是一个简单的驾驶场景
把障碍车的预测轨迹和主车的路径的交汇关系在 ST 图中表示出来。如下右图:
在st图中,我们的目标是找到一条不和障碍物碰撞的曲线,同时,曲线还需要满足我们之前计算的路径上的速度限制,即曲线的斜率不能超过 v 的限边界。找到最优的一条曲线后,我们根据曲线计算时间上的位置限制边界。
例如,如果我们找到红色的曲线为最优曲线,时间上的位置限制就为红虚线段。
在 x,y 平面中,就表现为主车在障碍车换道前进行超车。反之,绿色的曲线和绿色虚线段表示主车在障碍车换道后,进行跟随。
有了路径上的速度限制,及时间上的位置限制之后,我们就可以把这两个决策传递给速度优化器得到平滑的速度规划,即在路径上的每个点的时间。生成速度规划后,我们就可以结合路径和速度生成最终的 Planning 的轨迹。
以上就是 Apollo 决策的一些基本设计和实现。
场景的概念首次在Apollo3.5中提出
场景的优点:
场景的缺点:
场景的划分其实没有特别严格的规定,同时这也取决于自动驾驶的应用场景,比如送货小车和高速卡车在场景的划分上肯定不太一样。上图中,我们给出了 Apollo 场景分类的一个例子,来尽量保证每个场景之间相对独立,这样的分类设计仅供大家参考。
我们把场景分为两大类,Lane Follow 和 Lane Breaking:
在 Lane Breaking 下,我们又细分为三个小类:
有了场景的分离之后,我们就可以对场景进行识别和转换。对于选择哪个场景,我们采用了两层的识别机制。
接下来,我们用借道避让场景的一个实现,来说明场景是如何实现的。
在这个场景中,我们有6个state(阶段),每个state完成借道避让的一个步骤,类似于有限状态机中的一个状态。主要state有一定的时序依赖关系,如果在一个state(阶段)中发现环境变化了,或者出现错误,就会出现state之间的跳转或者退出该场景。
在每一个state(阶段)中,都要实现上图中的功能,保留交规决策,路径决策,路径优化,速度决策,速度优化。
我们把每个功能定义为一个或者几个基本的 Task(任务),每个 Stage(阶段)或者直接调用(使用默认参数),或者修改参数,或者修改输入值。这样的实现可以极大的提高场景之间的代码复用。
在上述的 Apollo 决策的实现中,我们使用了路径和速度分离的方法。这样的实现极大的简化了决策和优化问题,但是同时也使得最终轨迹不一定是最优的。
我们同时也在探索一些方法,使得路径和速度的决策和优化能够关联起来。
一种可能的方法(如左图所示)是路径决策时输出几种不同的路径,在速度决策和优化时,同时考虑多条路径,并选出最优轨迹。
另外一种思路(如右图所示)是速度和路径之间形成反馈环,如果速度决策和优化时发现路径决策不理想,会反馈至路径决策,重新进行路径决策和优化。
scenario功能模块中的主要功能如下:
场景的实现主要包含三种类:
planning模块对于scenario的切换的代码是在scenario_manager中实现的,目前apollo一共支持11中场景和场景的定义
车道保持场景是默认的驾驶场景,它不仅仅包含单车道巡航。同时也包含了:
在这种情况下,如果在自动驾驶车辆(ADC)的车道上有静态车辆或静态障碍物,并且车辆不能在不接触障碍物的情况下安全地通过车道,则执行以下策略:
停止标识有两种分离的驾驶场景:
未保护:在这种情况下,汽车预计会通过具有双向停车位的十字路口。因此,我们的ADC必须爬过并测量十字路口的交通密度,然后才能继续走上它的道路。
受保护:在此场景中,汽车预期通过具有四向停车位的十字路口导航。我们的ADC将必须对在它之前停下来的汽车进行测量,并在移动之前了解它在队列中的位置。
在apollo的planning中,场景首先通过配置文件进行配置
Scenario的配置在“planning/conf/scenario”文件夹中。以pull over场景为例,在对应的scenario type中配置包含的stage列表,在stage中配置其包含的task列表。
从配置文件中也可以看出一个Scenario包含多个Stage,一个Stage包含多个Task。
void ScenarioManager::Update(const common::TrajectoryPoint& ego_point,
const Frame& frame) {
场景转换在ScenarioManager::Update中实现,这个函数有两个输入:
Update函数首先调用Observe函数,获取当前要处理的overlaps。
而ScenarioManager::ScenarioDispatch函数则会对场景进行具体的处理,在apollo 6.0的planning模块中共有2种处理模式,分别是经典模式(能够有具体的场景定义的)与学习模式(通过深度学习进行场景处理的),分别会根据配置文件调用其后的ScenarioManager::ScenarioLearningDispatch与ScenarioManager::ScenarioNoLearningDispatch。
ScenarioManager::ScenarioNoLearningDispatch则是通过车辆状态frame中的scenario_type对车辆具体场景模块进行切换 ScenarioManager::Select*Scenario,并且由场景执行stage。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。