自动驾驶决策技术(Apollo)

决策的目的
限制信息:
  • 路径的长度以及左右边界限制
  • 路径上的速度限制
  • 时间上的位置限制
环境信息:
  • Routing信息
  • 道路结构(汇入车道、路口)
  • 交通信号和标识
  • 障碍物状态信息(障碍物类型、大小)
  • 障碍物预测信息(可能的运动轨迹)

 
 
 


决策的五大功能

决策的五大功能
  • 参考路径

参考路径
  • 后续的交规决策、路径决策和速度决策都是基于参考路径或者参考路径下的Frenet Frame(一种道路坐标系)完成的。
  • Routing : Apollo的一个模块,解决A点到B点的路由寻径问题,其路径规划的层次要更加深入到无人车所使用的高精地图的车道(Lane)级别,这里的Lane比实际车道更为精细。
  • 参考路径也用于表达换道需求,一般会有两条参考路径,有不同优先级。
  • 优先级高的路径->目标路径,优先级低的路径->当前路径。

 
 

交规决策

交规决策
  • 有了参考路径后,我们沿着参考路径找到交通标志和信号灯。
  • 如果需要停止,会在停止线上生成一个虚拟墙。
  • 根据交通规则决定是否在相应的地方放置虚拟墙。

 
 

路径决策

路径决策
  • 交通标识和信号、虚拟墙和障碍物共同来影响路径决
  • 先判断是否需要换道(是否有优先级更高的参考路径)
  1. 明确要换道后,判断是否可以安全换道
  2. 如果安全,路径决策产生路径的边界,否则产生车道内的路径边界
  • 如果不需换道,需要确定是否需要借道避让
  • 判断条件有两个:
  1. 当前车道的可行驶宽度是否足够。
  2. 前方障碍物是否为静止状态且不是由于车流原因静止。
  • 如果确定需要借道避让,路径决策会产生车道内路径边界。

 
 

路径决策

车道内路径边界

分三种情况:

  1. 无障碍物
    路径边界一句车道边界或者道路边界来生成,并留有缓冲距离(绿色线)。
  2. 前方障碍物
    路径边界会被截至在第一个障碍物的后方。
  3. 左右方障碍物
    路径边界会依据车道线和障碍物的边界产生。
  • 借道避让的路径边界产生,是在确认可以安全借道之后完成的。
  • 是否可以安全借道的决策目前是根据一系列的规则来做出的,这个决策也可以依据ST图或者数据模型。
  • 在做路径决策时,我们只考虑静止障碍物,动态障碍物是在速度规划时考虑。
     
     

速度决策

速度决策
  • 有了路径边界后,我们调用路径优化器,得到平滑路径,得到平滑的路径后,我们就可以在路径上进行速度决策。
  • 首先对一整条路径或者部分路径产生一个或者多个速度边界,将多个速度集成。
  • 得到速度限制后,利用ST图来得到时间上的位置限制边界。
  • 最终把速度边界和位置边界传给速度优化器得到平滑的速度规划。
速度限制边界

路径有三种不同的速度限制:

  1. 道路限速(黄色)
  2. 减速带(红色)
  3. 行人(绿色)
路程-时间 图

左图中:

  1. 白色方框代表自动驾驶主车
  2. 蓝线是主车的路径
  3. 黑色方框代表障碍车
  4. 红线是障碍车的预测行驶轨迹

障碍车的预测轨迹和主车的交会关系在ST中表示出来

  1. t1为障碍车预测轨迹和主车路径的交会时间。
  2. s1、s2为交汇时障碍车在主车路径上的位置。
  3. s1代表车尾位置,s2代表车头位置。

在ST图中,我们的目的是找一条不和障碍物碰撞的曲线,同时曲线还要满足速度限制,如上图。
如果我们找到红色的曲线为最优曲线,时间上的位置限制就为红虚线段。
反之绿色的曲线和绿色虚线就为主车的行进跟随。

微信图片_20190326214325.jpg

有了速度限制和位置限制后,就可以把这两个决策传递给速度优化去得到平滑的速度规划,即每个点的时间。
生成速度规划后,就可以结合路径和速度生成最终的Planning的轨迹。

 
 

决策场景

什么是场景

*场景的概念首次在Apollo3.5中提出
 
 


场景的分类
  • 场景的划分没有特别严格的规定,取决于应用场景
  • 这是Apollo场景分类的一个例子,尽量保证场景之间相互独立。

 
 


场景的识别和转换

 


借道避让场景

我们来看看一个借道避让场景是如何实现的:

这个场景中,我们有6个stage(阶段),每个stage完成借道避让的一个步骤,类似于有限状态机的一个状态。

如果一个Stage发生了环境变化,或者出现错误,会出现Stage之间的跳转挥着退出该场景。

场景的Stage
  • 每一个Stage都包括交规决策,路径决策,路径优化,速度决策,速度优化。
  • 我们把每个功能定义为一个或者几个基本的Task(任务),每个Stage或者直接调用(使用默认参数),或者修改参数,或者修改输入值,这样的实现可以极大的提高场景之间的代码复用。

 


你可能感兴趣的:(自动驾驶决策技术(Apollo))