基于二次规划的路径规划算法

二次规划问题

二次规划问题标准形式:
m i n i m i s e :   f ( x ) = 1 2 x T P x + q T x s u b j e c t   t o :   l ≤ A x ≤ u \begin{aligned} &minimise:\ f(x)=\frac{1}{2}x^TPx+q^Tx\\ &subject\ to: \ l\le Ax \le u\\ \end{aligned} minimise: f(x)=21xTPx+qTxsubject to: lAxu

Apollo使用osqp进行二次规划问题的求解。第一行为代价函数,第二行为约束条件。二次优化的目标就是在满足约束条件的基础上,找到变量的最有估值使得代价函数的值最小。二次规划只在代价函数为凸函数的时候能够收敛到最优解,因此这需要P矩阵为半正定矩阵,这是非常重要的一个条件。这反映在Apollo中的规划算法则为需要进行求解的空间为凸空间,这样二次规划才能收敛到一条最优路径。

定义优化变量

在这里插入图片描述

路径规划一般是在Frenet坐标系中进行的。s为沿着参考线的方向,l为垂直于坐标系的方向。如图所示,将障碍物分别投影到SL坐标系上。在s方向上以间隔 △ s \triangle s s作为一个间隔点,从 s 0 , s 1 , s 2 s_0,s_1,s_2 s0,s1,s2一直到 s n − 1 s_{n-1} sn1,构成了规划的路径。选取每个间隔点的 l , l ˙ , l ¨ l,\dot{l},\ddot{l} l,l˙,l¨作为优化变量:

l 0 l ˙ 0 l ¨ 0 ⟶ △ s l 1 l ˙ 1 l ¨ 1 ⟶ △ s l 2 l ˙ 2 l ¨ 2   . . . . . .   l n − 2 l ˙ n − 2 l ¨ n − 2 ⟶ △ s l n − 1 l ˙ n − 1 l ¨ n − 1 \begin{aligned} l_0\\ \dot{l}_0\\ \ddot{l}_0\\ \end{aligned}\stackrel{\triangle s}{\longrightarrow}\begin{aligned} l_1\\ \dot{l}_1\\ \ddot{l}_1\\ \end{aligned}\stackrel{\triangle s}{\longrightarrow}\begin{aligned} l_2\\ \dot{l}_2\\ \ddot{l}_2\\ \end{aligned}\ ......\ \begin{aligned} l_{n-2}\\ \dot{l}_{n-2}\\ \ddot{l}_{n-2}\\ \end{aligned}\stackrel{\triangle s}{\longrightarrow}\begin{aligned} l_{n-1}\\ \dot{l}_{n-1}\\ \ddot{l}_{n-1}\\ \end{aligned} l0l˙0l¨0sl1l˙1l¨1sl2l˙2l¨2 ...... ln2l˙n2l¨n2sln1l˙n1l¨n1
如此,就构成了优化变量x:
x = { l 0 , l 1 , . . . , l n − 1 , l ˙ 0 , l ˙ 1 , . . . , l ˙ n − 1 , l ¨ 0 , l ¨ 1 , . . . , l ¨ n − 1 } x = \{l_0, l_1, ..., l_{n-1},\dot{l}_0, \dot{l}_1, ..., \dot{l}_{n-1},\ddot{l}_0, \ddot{l}_1, ..., \ddot{l}_{n-1}\} x={l0,l1,...,ln1,l˙0,l˙1,...,l˙n1,l¨0,l¨1,...,l¨n1}

定义目标函数

对于目标函数的设计,我们需要明确以下目标:

  • 确保安全、礼貌的驾驶,尽可能贴近车道中心线行驶: ∣ l i ∣ ↓ |l_i|\downarrow li
  • 确保舒适的体感,尽可能降低横向速度/加速度/加加速度: ∣ l i ∣ ↓ , ∣ l ˙ i ∣ ↓ , ∣ l ¨ i ∣ ↓ |l_i|\downarrow,|\dot{l}_i|\downarrow,|\ddot{l}_i|\downarrow li,l˙i,l¨i
  • 确保终点接近参考终点(这个往往用在靠边停车场景之): l e n d = l r e f l_{end}=l_{ref} lend=lref

最后会得到以下目标函数:
m i n   f = ∑ i = 0 n − 1 ( w r e f ( l i − l i _ r e f ) 2 + w l l i 2 + w d l l ˙ i 2 + w d d l l ¨ i 2 + w d d d l l . . . i 2 + w e n d − l ( l n − 1 − l e n d ) 2 + w e n d − d l ( l ˙ n − 1 − l ˙ e n d ) 2 + w e n d − d d l ( l ¨ n − 1 − l ¨ e n d ) 2 \begin{aligned} min\ f&=\sum_{i=0}^{n-1}(w_{ref}(l_i-l_{i\_ref})^2 + w_l l_i^2 + w_{dl}\dot{l}_i^2 + w_{ddl}\ddot{l}_i^2 +{w}_{dddl}\stackrel{...}{l}_i^2 \\ &+w_{end-l}(l_{n-1}-l_{end})^2 + w_{end-dl}(\dot{l}_{n-1}-\dot{l}_{end})^2 + w_{end-ddl}(\ddot{l}_{n-1}-\ddot{l}_{end})^2\\ \end{aligned} min f=i=0n1(wref(lili_ref)2+wlli2+wdll˙i2+wddll¨i2+wdddll...i2+wendl(ln1lend)2+wenddl(l˙n1l˙end)2+wendddl(l¨n1l¨end)2
其中: l . . . i = l ¨ i + 1 − l ¨ i △ s = ( l ¨ i + 1 ) 2 + ( l ¨ i ) 2 − 2 l ¨ i + 1 l ¨ i △ s 2 \stackrel{...}{l}_i=\frac{\ddot{l}_{i+1} - \ddot{l}_{i}}{\triangle s} = \frac{(\ddot{l}_{i+1})^2 + (\ddot{l}_{i})^2-2\ddot{l}_{i+1}\ddot{l}_{i}}{\triangle s^2} l...i=sl¨i+1l¨i=s2(l¨i+1)2+(l¨i)22l¨i+1l¨i w l , w d l , w d d l , w d d d l 是对优化变量的权重 w_{l},w_{dl},w_{ddl},w_{dddl}是对优化变量的权重 wlwdlwddlwdddl是对优化变量的权重 w e n d − l , w e n d − d l , w e n d − d d l 是对偏移终点的权重 w_{end-l},w_{end-dl},w_{end-ddl}是对偏移终点的权重 wendl,wenddl,wendddl是对偏移终点的权重

为了方便后续矩阵编写,将目标函数按阶次整理如下:
m i n   f = ∑ i = 0 n − 1 w l l i + ∑ i = 0 n − 1 w r e f ( l i − l i _ r e f ) 2 + w l e n d ( l n − 1 − l e n d ) + ∑ i = 0 n − 1 w l ˙ l ˙ i + w l ˙ e n d ( l ˙ n − 1 − l ˙ e n d ) + ∑ i = 0 n − 1 w l ¨ l ¨ i + w l ¨ e n d ( d l ˙ n − 1 − l ¨ e n d ) + ∑ i = 0 n − 2 w l . . . i l . . . i 2 \begin{aligned} min\ f&=\sum_{i=0}^{n-1}w_l l_i + \sum_{i=0}^{n-1}w_{ref}(l_i-l_{i\_ref})^2 + w_{l_{end}}({l_{n-1} - l_{end}}) \\ &+\sum_{i=0}^{n-1}w_{\dot{l}}\dot{l}_i + w_{\dot{l}_{end}}({\dot{l}_{n-1} - \dot{l}_{end}})\\ &+\sum_{i=0}^{n-1}w_{\ddot{l}}\ddot{l}_i + w_{\ddot{l}_{end}}({d\dot{l}_{n-1} - \ddot{l}_{end}})\\ &+ \sum_{i=0}^{n-2}{w}_{\stackrel{...}{l}_i}\stackrel{...}{l}_i^2 \\ \end{aligned} min f=i=0n1wlli+i=0n1wref(lili_ref)2+wlend(ln1lend)+i=0n1wl˙l˙i+wl˙end(l˙n1l˙end)+i=0n1wl¨l¨i+wl¨end(dl˙n1l¨end)+i=0n2wl...il...i2

上式中 ∑ i = 0 n − 2 l . . . i 2 \sum_{i=0}^{n-2}\stackrel{...}{l}_i^2 i=0n2l...i2展开为:
∑ i = 0 n − 2 l . . . i 2 = ( l ¨ 0 ) 2 △ s 2 + 2 ∑ i = 0 n − 2 ( l ¨ i ) 2 △ s 2 + ( l ¨ n − 1 ) 2 △ s 2 − 2 ∑ i = 0 n − 2 l ¨ i l ¨ i + 1 △ s 2 \sum_{i=0}^{n-2}\stackrel{...}{l}_i^2=\frac{(\ddot{l}_{0})^2}{\triangle s^2}+2\sum_{i=0}^{n-2}\frac{(\ddot{l}_{i})^2}{\triangle s^2}+\frac{(\ddot{l}_{n-1})^2}{\triangle s^2} - 2\sum_{i=0}^{n-2}\frac{\ddot{l}_{i}\ddot{l}_{i+1}}{\triangle s^2} i=0n2l...i2=s2(l¨0)2+2i=0n2s2(l¨i)2+s2(l¨n1)22i=0n2s2l¨il¨i+1

进一步对目标函数展开合并,且移除常量项可得:
m i n   f = ∑ i = 0 n − 1 w l l i 2 + ∑ i = 0 n − 1 w r e f ( l i − l i _ r e f ) 2 + w l e n d ( l n − 1 − l e n d ) 2 + ∑ i = 0 n − 1 w l ˙ l ˙ i 2 + w l ˙ e n d ( l ˙ n − 1 − l ˙ e n d ) + ∑ i = 0 n − 1 w l ¨ l ¨ i + w l ¨ e n d ( l ¨ n − 1 − l ¨ e n d ) + w l . . . [ ( l ¨ 0 ) 2 △ s 2 + 2 ∑ i = 0 n − 2 ( l ¨ i ) 2 △ s 2 + ( l ¨ n − 1 ) 2 △ s 2 − 2 ∑ i = 0 n − 2 l ¨ i l ¨ i + 1 △ s 2 ] \begin{aligned} min\ f&=\sum_{i=0}^{n-1}w_l l^2_i + \sum_{i=0}^{n-1}w_{ref}(l_i-l_{i\_ref})^2 + w_{l_{end}}({l_{n-1} - l_{end}})^2 \\ &+\sum_{i=0}^{n-1}w_{\dot{l}}\dot{l}^2_i + w_{\dot{l}_{end}}({\dot{l}_{n-1} - \dot{l}_{end}})\\ &+\sum_{i=0}^{n-1}w_{\ddot{l}}\ddot{l}_i + w_{\ddot{l}_{end}}({\ddot{l}_{n-1} - \ddot{l}_{end}})\\ &+ w_{\stackrel{...}{l}}[\frac{(\ddot{l}_{0})^2}{\triangle s^2}+2\sum_{i=0}^{n-2}\frac{(\ddot{l}_{i})^2}{\triangle s^2}+\frac{(\ddot{l}_{n-1})^2}{\triangle s^2} - 2\sum_{i=0}^{n-2}\frac{\ddot{l}_{i}\ddot{l}_{i+1}}{\triangle s^2}]\\ \end{aligned} min f=i=0n1wlli2+i=0n1wref(lili_ref)2+wlend(ln1lend)2+i=0n1wl˙l˙i2+wl˙end(l˙n1l˙end)+i=0n1wl¨l¨i+wl¨end(l¨n1l¨end)+wl...[s2(l¨0)2+2i=0n2s2(l¨i)2+s2(l¨n1)22i=0n2s2l¨il¨i+1]

要满足的约束条件

  • 主车必须在道路边界内,同时不能和障碍物有碰撞:
    l i ∈ ( l m i n i , l m a x i ) l_i\in(l^i_{min},l^i_{max}) li(lmini,lmaxi)

  • 根据当前状态,主车的横向速度/加速度/加加速度有特定运动学限制:
    l ˙ i ∈ ( l ˙ m i n i , l ˙ m a x i ) , l ¨ i ∈ ( l ¨ m i n i , l ¨ m a x i ) , l . . . i ∈ ( l . . . m i n i , l . . . m a x i ) \dot{l}_i\in(\dot{l}^i_{min},\dot{l}^i_{max}), \ddot{l}_i\in(\ddot{l}^i_{min},\ddot{l}^i_{max}), \stackrel{...}{l}_i\in(\stackrel{...}{l}^i_{min},\stackrel{...}{l}^i_{max}) l˙i(l˙mini,l˙maxi),l¨i(l¨mini,l¨maxi),l...i(l...mini,l...maxi)

  • 连续性约束:
    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 ¨ i → i + 1 d s = l ˙ i + l ¨ i △ s + 1 2 l . . . i → i + 1 △ s 2 l i + 1 = l i + ∫ 0 △ s l ˙ i → i + 1 d s = l i + l ˙ i △ s + 1 2 l ¨ i △ s 2 + 1 6 l . . . i → i + 1 △ s 3 \begin{aligned} \ddot{l}_{i+1} &= \ddot{l}_{i} + \int_{0}^{\triangle s} \stackrel{...}{l}_{i\rightarrow i+1} ds = \ddot{l}_{i} + \stackrel{...}{l}_{i\rightarrow i+1} \triangle s\\ \dot{l}_{i+1} &= \dot{l}_{i} + \int_{0}^{\triangle s} \ddot{l}_{i\rightarrow i+1} ds = \dot{l}_{i} + \ddot{l}_{i}\triangle s + \frac{1}{2}\stackrel{...}{l}_{i\rightarrow i+1} \triangle s^2\\ {l}_{i+1} &= {l}_{i} + \int_{0}^{\triangle s} \dot{l}_{i\rightarrow i+1} ds = l_i + \dot{l}_{i}\triangle s + \frac{1}{2}\ddot{l}_{i} \triangle s^2 + \frac{1}{6} \stackrel{...}{l}_{i\rightarrow i+1} \triangle s^3\\ \end{aligned} l¨i+1l˙i+1li+1=l¨i+0sl...ii+1ds=l¨i+l...ii+1s=l˙i+0sl¨ii+1ds=l˙i+l¨is+21l...ii+1s2=li+0sl˙ii+1ds=li+l˙is+21l¨is2+61l...ii+1s3

  • 起点约束:
    l 0 = l i n i t , l ˙ 0 = l ˙ i n i t , l ¨ 0 = l ¨ i n i t l_0=l_{init}, \dot{l}_0=\dot{l}_{init}, \ddot{l}_0=\ddot{l}_{init} l0=linit,l˙0=l˙init,l¨0=l¨init

参考文献

  1. PnC进阶(9.0版)1
  2. 非线性规划 拉格朗日乘子法2
  3. 规划模块TASK之PIECEWISE_JERK_PATH_OPTIMIZER3

  1. https://apollo.baidu.com/community/course/outline/809?activeId=21481 ↩︎

  2. https://www.cnblogs.com/MarisaMagic/p/17905078.html ↩︎

  3. https://blog.csdn.net/sinat_52032317/article/details/132485220 ↩︎

最近更新

  1. TCP协议是安全的吗?

    2024-06-19 05:16:03       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-19 05:16:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-19 05:16:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-19 05:16:03       20 阅读

热门阅读

  1. Shellcode详解

    2024-06-19 05:16:03       8 阅读
  2. 在JPA项目启动时新增MySQL字段

    2024-06-19 05:16:03       8 阅读
  3. 访问者模式

    2024-06-19 05:16:03       8 阅读
  4. 使用ReentrantLock和ThreadPoolExecutor模拟抢课

    2024-06-19 05:16:03       8 阅读
  5. 最大子段和问题

    2024-06-19 05:16:03       9 阅读
  6. 探索VtKLoader源码中THREE.BufferGeometry的奥秘

    2024-06-19 05:16:03       6 阅读
  7. 深入解析Postman接口测试工具:功能与应用详解

    2024-06-19 05:16:03       8 阅读