本文介绍了基于优化的自动驾驶路径规划方法,通过解耦为参考线生成和基于分段加加速度的优化两个阶段,有效地利用了道路结构,实现了更清晰的场景理解。其中,参考线生成采用二次规划进行解决,并且考虑了参考线曲率导数的连续性,路径边界生成部分考虑了交通规则、自车状态以及堵塞障碍物信息的决策树,路径优化采用连续性、安全性和曲率约束等方法,采用OSQP求解器进行求解。该方法已在百度阿波罗开放平台发布,并进行了多种场景的路测,具有较高的效率和鲁棒性。
路径要求平顺且安全,符合车辆的非完整约束,同时还要在动态、复杂的场景中保持较好的鲁棒性。而要做到这些,需要面临不小的挑战。
对此,作者提供了一个基于优化的路径规划方法,将路径规划问题解耦成两个阶段:第一个阶段基于地图数据找到一条合适的参考线;第二个阶段基于Frenet坐标系进行基于分段加加速度的优化(Piecewise-Jerk)。
在这一部分介绍了过去的一些方法的缺陷,也介绍了基于优化的算法的优势。
作者指出了部分阐明传统的这些采样类规划算法(RRT,PRM等等)无法利用结构化道路环境中的domain knowledge;Discrete search类的方法由于其复杂度随着环境复变得杂而指数级增长,难以适用于复杂的环境之中;State lattice可以被视作一类特殊的Discrete Search,不过得到的路径比较依赖于采样的单元(比如单元的分布状况、数量等等,这些会显著影响计算量),而且需要对环境信息有一个较高程度的建模,对于动态环境适应程度一般。
优化类的算法能够实现最优性建模,同时由于将离散化后的路径/轨迹作为优化变量,对于复杂场景的鲁棒性较好。
在Frenet坐标系中规划的优点是有效地利用了道路结构,实现了更清晰的场景理解。
作者在这里提到了一篇文献[1],这篇文献的方法是先转换到Frenet坐标系中,并且对参考线进行横向、纵向上的解耦,将规划问题在1D的空间内进行计算,分别得到基于多项式的横纵向的轨迹集,最后将横纵向重新组合并转换到笛卡尔坐标系中进行筛选。(这个思路和Apollo具体实现思路还是比较相似的,不过Apollo是采用优化的方法得到一维的轨迹)
[1] Werling, Moritz, et al. “Optimal Trajectory Generation for Dynamic Street Scenarios in a Frenét Frame.” 2010 IEEE International Conference on Robotics and Automation, 2010, https://doi.org/10.1109/robot.2010.5509799.
作者指出多项式的轨迹难以适用于复杂的场景之中,因此结合了优化方法以及Frenet坐标系的优势,构建了二次规划问题,规划实时性较好。因为在复杂、动态场景中的自动驾驶需要较短的规划周期,他们构建了QP问题进行求解,最后测试时路径优化部分在他们的测试条件下可以跑到15ms左右,参考线生成与平滑20ms左右(不过,参考线由于直接依赖于地图数据,可以离线进行规划,节省在线规划时间)。
不过Apollo在 ( x , y , θ ) (x,y,\theta) (x,y,θ)的基础上增加了曲率 κ \kappa κ这一个维度。
κ \kappa κ的作用:车辆的即时转向曲率,若车辆的转向轮保持一定的角度,车辆将会做圆周运动,圆周运动的半径就是曲率半径,倒数为曲率 κ \kappa κ。加入 κ \kappa κ,有助于控制模块获得更准确的控制反馈,设计更加平稳的控制器。
路径规划的问题就是要在复杂、动态的环境中找到一条安全无碰撞、符合车辆动力学约束同时若是载人的,还需拥有一定的成员舒适度。
Apollo总体策略还是考虑了动态障碍物的,不过本文(基于路径规划部分)还是主要考虑静态障碍物。
下图是Apollo基于Frenet坐标系运动规划的一个示意图。这张图说明了apollo将Path Planning的问题解耦成路径规划和速度规划两部分,之后再重新组合转换到原始坐标系中。车辆的状态变量为 ( x , y , θ , κ , v , a ) (x,y,\theta,\kappa,v,a) (x,y,θ,κ,v,a)应该是考虑了速度规划的部分。
下图很好地说明了路径规划的具体流程:
一般都参考线只包括位置信息 ( x , y ) (x,y) (x,y),但如此一来则严重影响到路径规划的效果与质量。Apollo依据文献[1]指出,至少要保证参考线曲率导数的连续,如此可以减少路径的不平滑度以及跟踪控制时可能产生的超调。
Apollo在他们之前的工作中利用五次螺旋线构造参考线,同时利用非线性规划的方式去解决,但这种方式计算量和计算难度上都较大,实时性难以保证。于是,他们在这次的工作中采用了二次规划的方式进行解决(不过具体目标函数的构造以及二次规划问题是如何建立的在这篇文章中没有提及,只是阐述了他们方案的一种思路)。这篇博文Apollo星火计划学习笔记——参考线平滑算法解析及实现(以U型弯道场景仿真调试为例)有相应的描述。
看图说话,主要是最小化 p i p_i pi到 p i − 1 p_{i-1} pi−1和 p i + 1 p_{i+1} pi+1之间的欧式距离,同时考虑可能的地图误差,允许输入点在一定程度(一定程度用一个boundingbox去约束)上偏离其原始坐标,以在保持线的原始形状的同时实现可能更高的平滑度。此外,为了确保安全,平滑的引导线必须保持在车道边界内。
具体构造大致如下:
m i n ∑ k = 1 n − 2 ∣ ∣ 2 P k − P k − 1 + P k + 1 ∣ ∣ 2 2 + ∑ k = 0 n − 1 ∣ ∣ 2 P k − P k − r e f ∣ ∣ 2 2 + ∑ k = 0 n − 2 ∣ ∣ P k + 1 − P k ∣ ∣ 2 2 s . t . P k ∈ B , f o r : k = 0 , … , n − 1 ∣ ∣ 2 P k − P k − 1 − P k + 1 ∣ ∣ 2 < d r e f 2 R m i n f o r : k = 1 , … , n − 2 \begin{aligned} &min\sum_{k=1}^{n-2}||2P_k-P_{k-1}+P_{k+1}||_2^2+ \\ &\sum_{k=0}^{n-1}||2P_k-P_{k-ref}||_2^2+ \\ &\sum_{k=0}^{n-2}||P_{k+1}-P_k||_2^2 \\ &s.t.P_k\in B,for:k =0,\ldots,n-1||2P_k-P_{k-1}-P_{k+1}||_2<\frac{d_{ref}^2}{R_{min}}for:k=1,\ldots,n-2 \end{aligned} mink=1∑n−2∣∣2Pk−Pk−1+Pk+1∣∣22+k=0∑n−1∣∣2Pk−Pk−ref∣∣22+k=0∑n−2∣∣Pk+1−Pk∣∣22s.t.Pk∈B,for:k=0,…,n−1∣∣2Pk−Pk−1−Pk+1∣∣2<Rmindref2for:k=1,…,n−2
其中:
路径边界这部分和现在apollo8.0的部分有许多不一样的地方。这里的路径边界生成主要包括两部分:道路选择决策以及路径边界生成。
对于道路选择方面,一个简单的方法是使用所有可用的车道作为可驾驶区域。但未考虑不必要的换道行为所带来的危险影响以及在部分区域需要暂时借用相邻或对向车道这种情况。
对此,他们采用了基于交通规则、自车状态、堵塞障碍物信息的决策树去决定使用什么车道。
路径边界生成这一步的目标是通过考虑车辆的位置和周围的障碍物,对从上一步到具体边界的可用车道进行精细处理。
以 Δ s \Delta s Δs为间隔进行离散化。从第一个点 s 0 s_0 s0开始向前搜索,如果 s i s_i si位置没有障碍物,直接以车道的边界作为路径边界,继续搜索下一个点。如果在 s i s_i si的位置有静止或低速障碍物,依据自车估计出的 l l l以及除去障碍物剩下的可用的空间,对可能的侧向通过方向进行排序。接着从最宽点处搜索后续的点,如果搜索失败,则回溯,搜索其他方向(Apollo8.0的代码暂时没看到有回溯这一操作)。动态障碍物或高速障碍物在速度规划部分考虑。
最后输出是一系列 ( l m i n , l m a x ) (l_{min},l_{max}) (lmin,lmax)路径边界点对构成的路径边界。
l 0 l 1 l 2 l n − 2 l n − 1 l 0 ′ → Δ s l 0 ′ → Δ s l 2 ′ … l n − 2 ′ → Δ s l n − 1 ′ l 0 ′ ′ l 0 ′ ′ l 2 ′ ′ l n − 2 ′ ′ l n − 1 ′ ′ \begin{matrix}l_0&&l_1&&l_2&&l_{n-2}&&l_{n-1}\\l_0^{\prime}&\xrightarrow{\Delta s}&l_0^{\prime}&\xrightarrow{\Delta s}&l_2^{\prime}&\ldots&l_{n-2}^{\prime}&\xrightarrow{\Delta s}&l_{n-1}^{\prime}\\l_0^{\prime\prime}&&l_0^{\prime\prime}&&l_2^{\prime\prime}&&l_{n-2}^{\prime\prime}&&l_{n-1}^{\prime\prime}\end{matrix} l0l0′l0′′Δsl1l0′l0′′Δsl2l2′l2′′…ln−2ln−2′ln−2′′Δsln−1ln−1′ln−1′′
PS:用常三阶导数项 l ′ ′ ′ l''' l′′′连接相邻的离散点,其值用相邻的二阶导数差分得到。
连续性约束
l i + 1 ′ ′ = l i ′ ′ + ∫ 0 Δ s l i → i + 1 ′ ′ ′ d s = l i ′ ′ + l i → i + 1 ′ ′ ′ ∗ Δ s l i + 1 ′ = l i ′ + ∫ 0 Δ s l ′ ′ ( s ) d s = l i ′ + l i ′ ′ ∗ Δ s + 1 2 ∗ l i → i + 1 ′ ′ ′ ∗ Δ s 2 l i + 1 = l i + ∫ 0 Δ s l ′ ( s ) d s = l i + l i ′ ∗ Δ s + 1 2 ∗ l i ′ ′ ∗ Δ s 2 + 1 6 ∗ l i → i + 1 ′ ′ ′ ∗ Δ s 3 \begin{aligned} &l_{i+1}^{\prime\prime} \begin{aligned}=l''_i+\int_0^{\Delta s}l'''_{i\to i+1}ds&=l''_i+l'''_{i\to i+1}*\Delta s\end{aligned} \\ &l_{i+1}^{\prime} =l_i^{\prime}+\int_0^{\Delta s}\boldsymbol{l''}(s)ds=l_i^{\prime}+l_i^{\prime\prime}*\Delta s+\frac12*l_{i\to i+1}^{\prime\prime\prime}*\Delta s^2 \\ &l_{i+1} =l_i+\int_0^{\Delta s}\boldsymbol{l'}(s)ds \\ &=l_i+l_i^{\prime}*\Delta s+\frac12*l_i^{\prime\prime}*\Delta s^2+\frac16*l_{i\to i+1}^{\prime\prime\prime}*\Delta s^3 \end{aligned} li+1′′=li′′+∫0Δsli→i+1′′′ds=li′′+li→i+1′′′∗Δsli+1′=li′+∫0Δsl′′(s)ds=li′+li′′∗Δs+21∗li→i+1′′′∗Δs2li+1=li+∫0Δsl′(s)ds=li+li′∗Δs+21∗li′′∗Δs2+61∗li→i+1′′′∗Δs3
安全性约束
l l l方向的点需要在边界内。
l ( s ) ∈ l B ( s ) , ∀ s ∈ [ 0 , s m a x ] l(s)\in l_B(s),\forall s\in[0,s_{max}] l(s)∈lB(s),∀s∈[0,smax]
曲率约束
自车的转角不能超过最大转角。
t a n ( α m a x ) ∗ k r ∗ l − t a n ( α m a x ) + ∣ k r ∣ ∗ L ⩽ 0 tan(\alpha_{max})*k_r*l-tan(\alpha_{max})+|k_r|*L\leqslant0 tan(αmax)∗kr∗l−tan(αmax)+∣kr∣∗L⩽0
其实可看到apollo后续的版本还是在此基础上做了不少改进的。
采用OSQP求解器。