参考文章
https://blog.youkuaiyun.com/AdamShan/article/details/80779615
https://blog.youkuaiyun.com/weixin_43619346/article/details/104973670
笛卡尔坐标系的替代解决方案为 Frenet 坐标系,Frenet 坐标系描述了汽车相对于道路的位置,在 Frenet 框架中,s 代表沿道路的距离称为纵坐标,d表示与纵向线的位移称为横坐标。
世界坐标系下的一个位置可能在Frenet 坐标系中表示的位置不是唯一的,可以通过限制曲率条件做到一对一的转换关系。
planing主要是根据routing产生的全局路径规划一条几秒内运行的轨迹,这个轨迹包括了路径+速度两部分。
在apollo中,用到的方法主要有两种,分别是路径-速度解耦方法和lattice规划方式。
1. 速度-路径解耦规划
路径-速度解耦规划将轨迹规划分为两步:
路径规划、速度规划。
首先在路径规划步骤中生成候选曲线,使用成本函数对每条路径进行评估,该函数包含平滑度、安全性、与车道中心的偏离以及想要考虑的其他任何因素,按成本对路径进行排名并选择成本最低的路径。
确定沿这条路线行进的速度,需要选择的是与路径点相关的一系列速度而不是单个速度,将该序列称作“速度曲线”。可以使用优化功能为路径选择,受到各种限制的良好速度曲线,通过将路径和速度曲线相结合可构建车辆行驶轨迹。
为了在路径-速度解耦规划中生成候选路径,
- 首先将路段分割成单元格,
- 然后对这些单元格中的点进行随机采样
通过从每个单元格中取一个点并将点连接,创建了候选路径,通过重复此过程可以构建多个候选路径。
生成一条可行路径后,建立S-T图,这里的S指的是路径,而不是frenet中的s,T指的则是时间。
这两个图其实就很好的解释了整个过程,只要错开其他车辆出现在规划路径上的时间,即可实现避障的过程。
2. lattice方法
这里有两种不同的方式,其实本质上是一样的。
一种是建立d-t图和s-t图。
另一种是建立s-t和s-d图。
个人感觉第二种方法更容易理解。
横向:车辆最终沿着参考线(道路中心线)平行的方向行驶,所以我们令 di˙=di¨=0 ,那么目标配置只涉及 di 和 Tj 两个变量的组合。
定义 (dmin,dmax) 和 (Tmin,Tmax) 来约束目标配置的取值范围,通过 Δd 和 ΔT 来限制采样密度,从而在每一个制动周期获得一个有限的备选轨迹集合,如下图所示:
要在备选集合中选择最优轨迹(即上图中的绿色轨迹),我们需要设计损失函数,对于不同的场景,损失函数也不相同,以横向轨迹为例,在较高速度的情况下,损失函数为:
纵向:
纵向轨迹的优化场景大致分成如下三类:
* 跟车
* 汇流和停车
* 车速保持
在高速公路等应用场景中,目标配置中并不需要考虑目标位置(即 s1 ),所以在该场景下,目标配置仍然是 (s0,s0˙,s0¨) ,目标配置变成了 (s1˙,s1¨) ,损失函数为:
其中 sc˙ 是我们想要保持的纵向速度,第三个惩罚项的引入实际上是为了让目标配置中的纵向速度尽可能接近设定速度,该情景下的目标配置集为:
即优化过程中的可变参数为 Δsi˙ 和 Tj ,同样,也可以通过设置 ΔT 和 ΔΔsi˙ 来设置轨迹采样的密度,从而获得一个有限的纵向轨迹集合:
其中,绿线即为纵向最优轨迹。以上我们分别讨论了横向和纵向的最优轨迹搜索方法,在应用中,我们将两个方向的损失函数合并为一个,即:
这样,我们就可以通过最小化 Ctotal 得到优化轨迹集合(我们不能得到“最优”的轨迹多项式参数,还可以得到“次优”,“次次优”轨迹等等)。
二次规划
二次规划主要是将规划的点位和路径进行优化,使得更符合车辆模型和保证舒适感。
可以用5次轨迹多项式求解进行优化。
三次多项式轨迹规划只能够保证速度和位移连续,并不能保证加速度连续。加速度不连续将会对使电机抖动、甚至冲击。
加速度不连续的话,会导致人感觉到车辆jerk特别大,不舒服。
https://blog.youkuaiyun.com/weixin_39258979/article/details/105755351
总结:
路径-速度解耦的方法是产生一条路径,然后在此路径上进行速度规划,这个过程对异常的处理可能比较乏力,只能通过重规划。
lattice的方法产生了多条备选路径,即使最优路径在执行过程中发现问题,也可以从优先队列中取出次优、次次优路径进行解决,其实是一种相对较好的方式。
路径-速度解耦需要估计动态障碍物在路径中出现的时间,这个需要一定的预测能力。
lattice其实是遍历了整个可行空间,相对简单一点,但是速度可能相对较低。