当前位置:网站首页>学习笔记12--路径-速度分解法之局部路径搜索
学习笔记12--路径-速度分解法之局部路径搜索
2022-07-31 14:39:00 【FUXI_Willard】
本系列博客包括6个专栏,分别为:《自动驾驶技术概览》、《自动驾驶汽车平台技术基础》、《自动驾驶汽车定位技术》、《自动驾驶汽车环境感知》、《自动驾驶汽车决策与控制》、《自动驾驶系统设计及应用》。
此专栏是关于《自动驾驶汽车决策与控制》书籍的笔记.
2.汽车局部轨迹规划
2.3 路径-速度分解法
路径-速度分解法将路径规划与速度规划分开进行,百度Apollo中的EM算法,分别应用了动态规划算法进行路径规划和二次规划算法进行速度规划,算法架构如下图所示:
2.3.1 局部路径搜索
基本算法介绍
启发式搜索算法
A ∗ A^* A∗算法
A ∗ A^* A∗算法是一种启发式搜索算法,基于深度优先算法(Depth First Search,DFS)和广度优先算法(Breadth First Search,BFS)的一种融合算法,按照一定原则确定如何选取下一个结点;
启发式搜索算法指:从起点出发,先寻找起点相邻的栅格,判断它是否是最好的位置,基于这个最好的栅格再往外向其相邻的栅格扩展,找到一个此时最好的位置,通过这样一步步逼近目标点,减少盲目的搜索,提高可行性和搜索效率;
深度优先搜索算法思想:搜索算法从起点开始进行搜索(初始状态下待搜索区域内所有结点均未被访问),与周围所有邻点进行比较,选择其中距离终点最近的点进行存储,然后再以该邻点为基础对比周围未被访问的所有邻点,仍然选择距离终点最近的邻点存储;若访问结点到达终点或访问完所有结点仍未到终点,则视为搜索失败,成功搜索所存储的结点连接而成的路径即为起点到终点的路径;
广度优先搜索算法思想:从起始点出发依次访问与它相连接的邻点,访问完毕后再从这些邻点出发访问邻点的邻点,但要保证先被访问的邻点的邻点要比后访问的邻点的邻点先访问,直至图中所有已被访问的结点的邻点都被访问到;如果此时图中尚有未被访问的结点,则需要选取一个尚未被访问的结点作为一个新的结点,继续搜索访问,直到图中所有的结点都被访问一遍为止;
深度优先算法优先选择离目标点最近的结点,广度优先算法选择离初始点最近的点;基于深度优先算法,能以最快的速度找到一条连接起始点到目标点的路径,但不能保证路径的最优性;广度优先搜索算法则必然能找到最短的路径,但由于需要遍历所有的结点,计算复杂度更大; A ∗ A^* A∗算法基于启发函数构建代价函数,既考虑了新结点距离初始点的代价,又考虑了新结点与目标点距离的代价;
A ∗ A^* A∗算法中包含了开启列表(OPEN表)和关闭列表(CLOSE表);在OPEN表中存放的是还没有访问到的结点,CLOSE表中存放的是已访问的结点;算法首先将起点放入开启列表中进行扩展,然后对开启列表中的结点进行路径评分,从而给出从小到大的排列;路径评分需要一个代价函数判断出该结点是否为OPEN表中代价最小的结点,在算法中,采用的代价函数:
F = G + H F=G+H F=G+H
其中: G G G为当前结点到起始点的距离; H H H为当前结点到目标点的距离, F F F为两者的距离和;OPEN表对列表中的结点根据 F F F值进行从小到大的排列,将 F F F值最小的结点从OPEN中删除,将其添加到CLOSE表中;最开始只有起点一个结点,因此起点被放入CLOSE表中,并将起点设为当前结点;通过当前结点搜索当前结点邻近的结点,如果该结点所扩展的结点不在OPEN表中,则将这些结点添加到OPEN表中,之后对添加到OPEN表中的结点进行排序,选出 F F F值最小的结点,选该结点作为当前结点,并扩展其邻近结点;如果所扩展的结点在OPEN表中,以当前结点为父结点,重新计算 G G G值,且和之前的 G G G值进行比较,从而找出最小 G G G值进行更新,并重新计算 F F F值,再次排序,按照上述步骤循环,直至将目标点添加到OPEN表中,此时搜索算法结束;根据父结点一直找到起点,即可得到搜索到的最佳路径。

Dijkstra算法
- Dijkstra算法是典型基于启发式算法的最短路径算法,用于计算一个结点到其他所有结点的最短路径;
- 该算法主要特点:以起始点为中心向外层扩展,直到扩展到终点为止;Dijkstra算法能得出最短路径的最优解,但由于该算法遍历计算的结点很多,因此效率低;
- Dijkstra算法运行过程:
- 创建两个表:OPEN表和CLOSE表;
- OPEN表保存所有已生成而未考察的结点,CLOSE表记录已访问过的结点;
- 访问离起始点最近且没有被检查过的点,把这个点放入OPEN表中等待检查;
- 从OPEN表中找出距起始点最近的点,找出这个点的所有子结点,把这个点放到CLOSE表中;
- 遍历考察这个点的子结点,求出这些子结点距起始点的距离值,将子结点放到OPEN表中;
- 重复4、5两步,直到OPEN表为空,或找到目标点;
随机采样算法
基于随机采样的运动规划算法的基本思路:通过对状态空间均匀随机采样来构建一个连通图,当初始、目标状态都在图中或都可以连接到图中时,问题得到解决;基于随机采样的算法不需要对状态空间自由区域进行显式建模,由碰撞检测来验证轨迹的可行性;
典型的基于随机采样的算法:概率路图法(Probabilistic Road Map,PRM)和快速随机扩展树法(Rapidly Random Tree,RRT);
PRM构建
- PRM是一种图搜索方法,将连续空间转换成离散空间,再利用 A ∗ A^* A∗等搜索算法在路线图上寻找路径,以提高搜索效率;这种方法能用相对少的随机采样点来找到一个解;
- 将运动规划环境抽象成一个二维封闭平面空间,记为 C C C,可以自由移动的区域为自由空间,记为 C f r e e C_{free} Cfree,障碍物区域记为 C o b s C_{obs} Cobs;基本PRM算法思想:在自由空间区域随机采样路标点,以一种规则连接各路标点,形成一个随机的网络,这一随机网络即为概率地图;
- 概率地图是一种无向图,用 G = ( V , E ) G=(V,E) G=(V,E)表示, V V V表示结点集,即自由空间的随机采样点, E E E表示边集;然后利用搜索算法在路径图搜索一条可行的路径;算法总体上分为两个阶段:构图阶段(Construction Phase)和查询阶段(Query Phase):
- 构图阶段:在自由空间中随机采样,构成路标点集合 F F F,然后由局部规划器检索每个路标点的邻近点,并连接路标点和邻近点;局部规划器可以设定最邻近的 K K K个点或与路标点距离小于 d d d的点作为邻近点;碰撞检测要求随机采样点不能处于绝对碰撞区内,路标点和邻近点的连线不能与障碍区相交;
- 查询阶段:将起点和终点添加到轨迹点集合 v v v,局部规划器为其寻找最近的邻居点并建立连接,若起点到终点能形成连通图,则轨迹规划有解;基于某种图搜索算法求出连接起点和终点的最优轨迹;
- PRM算法的伪代码:

RRT的构建
- 快速扩展随机树算法(Rapid-exploration Random Tree,RRT);该算法是从起始点开始向外拓展一个树状结构,树状结构的拓展方向是通过在规划空间内随机采点确定;
- 树的初始化:初始化树的结点集和边集,结点集只包含起始状态,边集为空;
- 树的生长:对状态空间随机采样,当采样点落在状态空间安全区域时,选择当前树中离采样点最近的结点,将其向采样点扩展(或连接);若生成的轨迹不与障碍物发生碰撞,则将该轨迹加入树的边集,该轨迹的终点加入到树的结点集;
- 重复上述步骤,直至扩展到目标状态集中;
- RRT构建的是初始状态作为根节点,目标状态作为叶结点的树结构;
- RRT算法伪代码:

DP算法
DP(Dynamic Programming)算法称为动态规划算法;
DP路径算法基本思路:基于给定的一条中心路径(Reference Line,参考线)和车道边界条件,每隔一定间隔的纵向距离(称为不同级上的 S S S值)对道路进行均匀采样(与中心点的横向偏移值称为 L L L值),这样得到采样点( W a y p o i n t Waypoint Waypoint,这些采样点称为航迹点)数组;
道路中心线用于建造 S − L S-L S−L坐标系, S S S代表沿中心线方向, L L L代表与中心线正交的方向;
DP算法是一种聚合重复的计算过程,分解得到的子问题是相互重叠的,子问题依赖于子子问题,子子问题又进一步依赖下一级的子子问题,这样不断循环直至抵达不需要再分解的初始条件;
S − L S-L S−L轨迹可表示为:
t r a j e c t o r y = l ( s ) ≈ ( l 1 , l 2 , l 3 , … , l n ) (12) trajectory=l(s)≈(l_1,l_2,l_3,\dots,l_n)\tag{12} trajectory=l(s)≈(l1,l2,l3,…,ln)(12)
计算复杂度为: O ( k n ) O(k^n) O(kn);最优化过程为:
m i n C o s t ( l n ∣ l n − 1 ) = m i n C o s t ( l n − 1 ) + C o s t ( l n − 1 , l n ) (13) min{Cost}(l_n|l_{n-1})=min{Cost}(l_{n-1})+Cost(l_{n-1},l_n)\tag{13} minCost(ln∣ln−1)=minCost(ln−1)+Cost(ln−1,ln)(13)m i n C o s t ( l n ) = m i n k n ( m i n C o s t ( l n − 1 ) + C o s t ( l n − 1 , l n ) ) (14) min{Cost(l_n)}=min_{k_n}(minCost(l_{n-1})+Cost(l_{n-1},l_n))\tag{14} minCost(ln)=minkn(minCost(ln−1)+Cost(ln−1,ln))(14)
计算复杂度为: O ( k 2 n ) O(k^{2n}) O(k2n);
基于DP算法,通过将汽车行驶过程中前方一定长度区域分解为可采样的诸多分段路径,对其进行撒点采样并逐级优化目标函数,即可得到一条可通行的规划路径;
路径规划过程的优化目标函数可以考虑以下因素进行构建:与道路中心线的偏差、路径曲率与曲率连续性、与障碍物应保持的合理距离、路径曲率符合汽车运动特性等;
局部路径平滑
- 通过路径搜索算法产生的路径能避开障碍,但因为结点连接起来是折线,不利于汽车跟踪,需要对路径进行平滑处理;拟合是路径平滑中常用的方法,常见的拟合方法:B样条曲线法、QP算法等;
- 拟合曲线根据曲线与给定点的关系分为:"点点通过"式、"平均通过"式;
- “点点通过”:当给定的离散点位置比较精确的时候,拟合曲线通过所有给定的点,根据通过对给定的离散点拟合得到的曲线方程以足够小的步长获取相邻离散点间若干个数据点的坐标,并用直线连接;求解相邻离散点间若干数据点的过程称为插值;
- “平均通过”:当给定的数据点存在误差的时候,拟合曲线不通过所有的数据点,曲线的走势反映了这些数据点的变化趋势;曲线拟合的目标是使得给定的数据点与曲线的"距离"总和最小,得到的曲线方程要尽量"逼近"给定的数据点;
- "点点通过"式的曲线称为插值曲线,"平均通过"式的曲线称为逼近曲线;
- 当给定的数据点较多时,对所有的点拟合曲线方程有所困难,即使得到曲线方程,方程亦会十分复杂;可以通过分段进行拟合,这种方式称为样条拟合;分段拟合需要考虑段与段之间连接点的光滑度问题;
样条曲线和QP算法在路径平滑中的应用:
三阶B样条曲线的研究
汽车侧向运动的动力学模型传递函数近似表示为:
G m ( s ) = b 1 s 2 + b 2 s + b 3 s 3 ( s + a 1 ) ( s + a 2 ) (15) G_m(s)=\frac{b_1s^2+b_2s+b_3}{s^3(s+a_1)(s+a_2)}\tag{15} Gm(s)=s3(s+a1)(s+a2)b1s2+b2s+b3(15)
进一步将动力学模型约束系统简化为: 1 / s 3 1/s^3 1/s3,依据此简化结果进行轨迹规划, G m ( s ) G_m(s) Gm(s)中的剩余部分通过自主汽车底层侧向跟踪控制模块进行补偿;关于B样条性质的一个结论: k + 1 k+1 k+1阶B样条曲线是形如下式的线性系统的一条轨迹:
d k d t k y ( t ) = u ( t ) (16) \frac{d^k}{dt^k}y(t)=u(t)\tag{16} dtkdky(t)=u(t)(16)三阶B样条曲线在路径平滑中的应用
利用B样条曲线平滑路径需要样条曲线通过给定的路径点,即路径点不能作为B样条曲线的控制点,要作为型值点被样条曲线穿过,但B样条曲线是通过控制点坐标来构建参数方程的,这需要通过型值点坐标来求解控制点坐标;通过型值点求解控制点的方式称为反算;
在B样条曲线中反算的目的在于利用B样条曲线对已知点进行插值,步骤依次为:利用型值点求解控制点、利用控制点构造B样条曲线方程、利用B样条曲线方程计算插值点;
假设当前得到的路径点为 Q i ( i = 1 , 2 , 3 , … , n ) Q_i(i=1,2,3,\dots,n) Qi(i=1,2,3,…,n),求三阶B样条曲线的控制点 P i ( i = 0 , 1 , 2 , … , n + 1 ) P_i(i=0,1,2,\dots,n+1) Pi(i=0,1,2,…,n+1);因为曲线段与段间首尾连接,即第 i i i段曲线的终点同时是第 i + 1 i+1 i+1段曲线的起点,且三阶B样条曲线二阶导数连续,光滑连接,因此每个型值点可看作每段三阶B样条曲线的起点;
三阶B样条曲线的型值点与控制点的位置存在如下关系:
p i ( t = 0 ) = P i − 1 + 4 P i + P i + 1 6 = Q i , i = 1 , 2 , … , n (17) p_i(t=0)=\frac{P_{i-1}+4P_i+P_{i+1}}{6}=Q_i,i=1,2,\dots,n\tag{17} pi(t=0)=6Pi−1+4Pi+Pi+1=Qi,i=1,2,…,n(17)
由上式得到 n n n个方程,但从 P 0 P_0 P0到 P i + 1 P_{i+1} Pi+1有 n + 2 n+2 n+2个未知数,因此需要将起点和终点两个边界条件考虑进去解出所有的未知数;对于B样条曲线边界处理,此要求曲线过 Q 1 Q_1 Q1和 Q n Q_n Qn,即 P 1 = Q 1 , P n = Q n P_1=Q_1,P_n=Q_n P1=Q1,Pn=Qn,可得线性方程组:
[ 6 0 1 4 1 … 1 4 1 0 6 ] [ P 1 P 2 ⋮ P n − 1 P n ] = 6 [ Q 1 Q 2 ⋮ Q n − 1 Q n ] (18) \begin{bmatrix} 6 & 0 &&&&\\ & 1 & 4 & 1 &&\\ &&&\dots&&\\ &&1 & 4 & 1 & \\ &&&&0&6 \end{bmatrix} \begin{bmatrix} P_1\\ P_2\\ \vdots\\ P_{n-1}\\ P_n \end{bmatrix}= 6\begin{bmatrix} Q_1\\ Q_2\\ \vdots\\ Q_{n-1}\\ Q_n \end{bmatrix}\tag{18} ⎣⎡601411…4106⎦⎤⎣⎡P1P2⋮Pn−1Pn⎦⎤=6⎣⎡Q1Q2⋮Qn−1Qn⎦⎤(18)
还需要增加 P 0 = 2 P 1 − P 2 P_0=2P_1-P_2 P0=2P1−P2和 P n + 1 = 2 P n − P n − 1 P_{n+1}=2P_n-P_{n-1} Pn+1=2Pn−Pn−1两个条件,即曲线起点和终点分别与 P 0 P 1 、 P n P n − 1 P_0P_1、P_nP_{n-1} P0P1、PnPn−1相切,这样构造的三阶B样条曲线在两端曲率为零;QP算法在路径平滑中的应用
使用QP算法(二次规划算法)需要限制条件:曲率和曲率连续性、贴近中心线、避免碰撞;
路径定义在Station-Lateral坐标系中;参数 s s s的取值范围为汽车的当前位置到默认规划路径的长度;将路径划分为 n n n段,每段路径用一个多项式来表示,每个样条段 i i i都有沿着参考线的累加距离 d i d_i di;每段的路径默认用5阶多项式表示:
l = f i ( s ) = a i 0 + a i 1 ⋅ s + a i 2 ⋅ s 2 + a i 3 ⋅ s 3 + a i 4 ⋅ s 4 + a i 5 ⋅ s 5 ( 0 ≤ s ≤ d i ) (19) l=f_i(s)=a_{i0}+a_{i1}·s+a_{i2}·s^2+a_{i3}·s^3+a_{i4}·s^4+a_{i5}·s^5(0≤s≤d_i)\tag{19} l=fi(s)=ai0+ai1⋅s+ai2⋅s2+ai3⋅s3+ai4⋅s4+ai5⋅s5(0≤s≤di)(19)
定义每个样条段优化目标函数:
c o s t = ∑ i = 1 n ( ω 1 ⋅ ∫ 0 d i f i ′ ( s ) 2 d s + ω 2 ⋅ ∫ 0 d i f i ′ ′ ( s ) 2 d s + ω 3 ⋅ ∫ 0 d i f i ′ ′ ′ ( s ) 2 d s ) (20) cost=\sum_{i=1}^n\left(\omega_1·\int_0^{d_i}f'_i(s)^2ds+\omega_2·\int_0^{d_i}f''_i(s)^2ds+\omega_3·\int_{0}^{d_i}f'''_i(s)^2ds\right)\tag{20} cost=i=1∑n(ω1⋅∫0difi′(s)2ds+ω2⋅∫0difi′′(s)2ds+ω3⋅∫0difi′′′(s)2ds)(20)
将最小化优化目标函数的过程转换为最小化QP公式的过程,OP公式参考:
{ min 1 2 ⋅ x T ⋅ H ⋅ x + f T ⋅ x s t L B ≤ x ≤ U B A e q x ≤ b e q A x ≥ b (21) \begin{cases} &\min\frac{1}{2}·x^T·H·x+f^T·x\\ &st{\space}LB≤x≤UB\\ &A_{eq}x≤b_{eq}\\ &Ax≥b \end{cases}\tag{21} ⎩⎨⎧min21⋅xT⋅H⋅x+fT⋅xst LB≤x≤UBAeqx≤beqAx≥b(21)
其中:- L U 、 U B LU、UB LU、UB分别是 s s s的上界和下界;
- A e q x ≤ b e q 、 A x ≥ b A_{eq}x≤b_{eq}、Ax≥b Aeqx≤beq、Ax≥b分别为根据实际约束条件转换得到的约束公式;
- H H H为由优化目标函数形式转换成 Q P QP QP公式形式得到的对应矩阵;
将优化目标函数转换为QP公式实例:
f i ( s ) = ∣ 1 s s 2 s 3 s 4 s 5 ∣ ⋅ ∣ a i 0 a i 1 a i 2 a i 3 a i 4 a i 5 ∣ f_i(s)=|1\space s\space s^2\space s^3 \space s^4\space s^5|·\begin{vmatrix} a_{i0}\\ a_{i1}\\ a_{i2}\\ a_{i3}\\ a_{i4}\\ a_{i5}\\ \end{vmatrix} fi(s)=∣1 s s2 s3 s4 s5∣⋅∣∣ai0ai1ai2ai3ai4ai5∣∣f i ′ ( s ) = ∣ 0 1 2 s 3 s 2 4 s 3 5 s 4 ∣ ⋅ ∣ a i 0 a i 1 a i 2 a i 3 a i 4 a i 5 ∣ f'_i(s)=|0\space 1\space 2s\space 3s^2 \space 4s^3\space 5s^4|·\begin{vmatrix} a_{i0}\\ a_{i1}\\ a_{i2}\\ a_{i3}\\ a_{i4}\\ a_{i5}\\ \end{vmatrix} fi′(s)=∣0 1 2s 3s2 4s3 5s4∣⋅∣∣ai0ai1ai2ai3ai4ai5∣∣
f i ′ ( s ) 2 = ∣ a i 0 a i 1 a i 2 a i 3 a i 4 a i 5 ∣ ⋅ ∣ 0 1 2 s 3 s 2 4 s 3 5 s 4 ∣ ⋅ ∣ 0 1 2 s 3 s 2 4 s 3 5 s 4 ∣ ⋅ ∣ a i 0 a i 1 a i 2 a i 3 a i 4 a i 5 ∣ f'_i(s)^2=|a_{i0}\space a_{i1}\space a_{i2}\space a_{i3} \space a_{i4}\space a_{i5}|·\begin{vmatrix} 0\\ 1\\ 2s\\ 3s^2\\ 4s^3\\ 5s^4\\ \end{vmatrix}·|0 \space 1\space 2s \space 3s^2\space 4s^3\space 5s^4| ·\begin{vmatrix} a_{i0}\\ a_{i1}\\ a_{i2}\\ a_{i3}\\ a_{i4}\\ a_{i5}\\ \end{vmatrix} fi′(s)2=∣ai0 ai1 ai2 ai3 ai4 ai5∣⋅∣∣012s3s24s35s4∣∣⋅∣0 1 2s 3s2 4s3 5s4∣⋅∣∣ai0ai1ai2ai3ai4ai5∣∣
∫ 0 d i f i ′ ( s ) 2 d s = ∣ a i 0 a i 1 a i 2 a i 3 a i 4 a i 5 ∣ ⋅ ∫ 0 d i ∣ 0 1 2 s 3 s 2 4 s 3 5 s 4 ∣ ⋅ ∣ 0 1 2 s 3 s 2 4 s 3 5 s 4 ∣ d s ⋅ ∣ a i 0 a i 1 a i 2 a i 3 a i 4 a i 5 ∣ \int_0^{d_i}f'_i(s)^2ds=|a_{i0}\space a_{i1}\space a_{i2}\space a_{i3} \space a_{i4}\space a_{i5}|·\int_{0}^{d_i}\begin{vmatrix} 0\\ 1\\ 2s\\ 3s^2\\ 4s^3\\ 5s^4\\ \end{vmatrix}·|0 \space 1\space 2s \space 3s^2\space 4s^3\space 5s^4|ds ·\begin{vmatrix} a_{i0}\\ a_{i1}\\ a_{i2}\\ a_{i3}\\ a_{i4}\\ a_{i5}\\ \end{vmatrix} ∫0difi′(s)2ds=∣ai0 ai1 ai2 ai3 ai4 ai5∣⋅∫0di∣∣012s3s24s35s4∣∣⋅∣0 1 2s 3s2 4s3 5s4∣ds⋅∣∣ai0ai1ai2ai3ai4ai5∣∣
可得:
∫ 0 d i f i ′ ( s ) 2 d s = ∣ a i 0 a i 1 a i 2 a i 3 a i 4 a i 5 ∣ ⋅ ∣ 0 0 0 0 0 0 0 d i d i 2 d i 3 d i 4 d i 5 0 d i 2 4 3 d i 3 6 4 d i 4 8 5 d i 5 10 6 d i 6 0 d i 3 6 4 d i 4 9 5 d i 5 12 6 d i 6 15 7 d i 7 0 d i 4 8 5 d i 5 12 6 d i 6 16 7 d i 7 20 8 d i 8 0 d i 5 10 6 d i 6 15 7 d i 7 20 8 d i 8 25 9 d i 9 ∣ ⋅ ∣ a i 0 a i 1 a i 2 a i 3 a i 4 a i 5 ∣ \int_{0}^{d_i}f'_i(s)^2ds=|a_{i0}\space a_{i1}\space a_{i2}\space a_{i3} \space a_{i4}\space a_{i5}|· \begin{vmatrix} 0 & 0 & 0 & 0 & 0 & 0\\ 0 & d_i & d_i^2 & d_i^3 & d_i^4 & d_i^5\\ 0 & d_i^2 & \frac{4}{3}d_i^3 & \frac{6}{4}d_i^4 & \frac{8}{5}d_i^5 & \frac{10}{6}d_i^6\\ 0 & d_i^3 & \frac{6}{4}d_i^4 & \frac{9}{5}d_i^5 & \frac{12}{6}d_i^6 & \frac{15}{7}d_i^7\\ 0 & d_i^4 & \frac{8}{5}d_i^5 & \frac{12}{6}d_i^6 & \frac{16}{7}d_i^7 & \frac{20}{8}d_i^8\\ 0 & d_i^5 & \frac{10}{6}d_i^6 & \frac{15}{7}d_i^7 & \frac{20}{8}d_i^8 & \frac{25}{9}d_i^9 \end{vmatrix} ·\begin{vmatrix} a_{i0}\\ a_{i1}\\ a_{i2}\\ a_{i3}\\ a_{i4}\\ a_{i5}\\ \end{vmatrix} ∫0difi′(s)2ds=∣ai0 ai1 ai2 ai3 ai4 ai5∣⋅∣∣0000000didi2di3di4di50di234di346di458di5610di60di346di459di5612di6715di70di458di5612di6716di7820di80di5610di6715di7820di8925di9∣∣⋅∣∣ai0ai1ai2ai3ai4ai5∣∣
得到一个6阶的矩阵表示5阶样条插值的衍生开销;平滑过程应考虑的约束条件:初始点约束、终点约束、平滑点约束、点采样边界约束;
初始点约束:假设第一个点为: ( s 0 , l 0 ) (s_0,l_0) (s0,l0),其中 l 0 l_0 l0表示横向的偏移,对应的一阶、二阶导数为: l 0 ′ 、 l 0 ′ ′ l'_0、l''_0 l0′、l0′′;规划路径的起始点衍生开销可由 f i ( s ) 、 f i ′ ( s ) 、 f i ′ ′ ( s ) f_i(s)、f'_i(s)、f''_i(s) fi(s)、fi′(s)、fi′′(s)计算得到;
将上述约束转换为QP约束等式,使用等式: A e q x = b e q A_{eq}x=b_{eq} Aeqx=beq;
转换的具体步骤:
f i ( s 0 ) = ∣ 1 s 0 s 0 2 s 0 3 s 0 4 s 0 5 ∣ ⋅ ∣ a i 0 a i 1 a i 2 a i 3 a i 4 a i 5 ∣ = l 0 f_i(s_0)= \begin{vmatrix} 1 \space s_0 \space s_0^2 \space s_0^3 \space s_0^4 \space s_0^5 \end{vmatrix}·\begin{vmatrix} a_{i0}\\ a_{i1}\\ a_{i2}\\ a_{i3}\\ a_{i4}\\ a_{i5}\\ \end{vmatrix}=l_0 fi(s0)=∣∣1 s0 s02 s03 s04 s05∣∣⋅∣∣ai0ai1ai2ai3ai4ai5∣∣=l0f i ′ ( s 0 ) = ∣ 0 1 2 s 0 3 s 0 2 4 s 0 3 5 s 0 4 ∣ ⋅ ∣ a i 0 a i 1 a i 2 a i 3 a i 4 a i 5 ∣ = l 0 ′ f'_i(s_0)=|0\space 1\space 2s_0\space 3s_0^2 \space 4s_0^3\space 5s_0^4|·\begin{vmatrix} a_{i0}\\ a_{i1}\\ a_{i2}\\ a_{i3}\\ a_{i4}\\ a_{i5}\\ \end{vmatrix}=l'_0 fi′(s0)=∣0 1 2s0 3s02 4s03 5s04∣⋅∣∣ai0ai1ai2ai3ai4ai5∣∣=l0′
f i ′ ′ ( s 0 ) = ∣ 0 0 2 3 × 2 s 0 4 × 3 s 0 2 5 × 4 s 0 3 ∣ ⋅ ∣ a i 0 a i 1 a i 2 a i 3 a i 4 a i 5 ∣ = l 0 ′ ′ f''_i(s_0)=|0\space 0\space 2\space 3\times2s_0\space 4\times3s_0^2 \space 5\times4s_0^3|·\begin{vmatrix} a_{i0}\\ a_{i1}\\ a_{i2}\\ a_{i3}\\ a_{i4}\\ a_{i5}\\ \end{vmatrix}=l''_0 fi′′(s0)=∣0 0 2 3×2s0 4×3s02 5×4s03∣⋅∣∣ai0ai1ai2ai3ai4ai5∣∣=l0′′
其中: i i i是包含的样条段 s 0 s_0 s0的索引值;
终点约束:终点 ( s e , l e ) (s_e,l_e) (se,le)应当按照起始点计算方法生成约束条件,将起始点和终点组合在一起,得出约束条件为:
∣ 1 s 0 s 0 2 s 0 3 s 0 4 s 0 5 0 1 2 s 0 3 s 0 2 4 s 0 3 5 s 0 4 0 0 2 6 s 0 12 s 0 2 20 s 0 3 1 s e s e 2 s e 3 s e 4 s e 5 0 1 2 s e 3 s e 2 4 s e 3 5 s e 4 0 0 2 6 s e 12 s e 2 20 s e 3 ∣ ⋅ ∣ a i 0 a i 1 a i 2 a i 3 a i 4 a i 5 ∣ = ∣ l 0 l 0 ′ l 0 ′ ′ l e l e ′ l e ′ ′ ∣ \begin{vmatrix} 1 & s_0 & s_0^2 & s_0^3 & s_0^4 & s_0^5\\ 0 & 1 & 2s_0 & 3s_0^2 & 4s_0^3 & 5s_0^4\\ 0 & 0 & 2 & 6s_0 & 12s_0^2 & 20s_0^3\\ 1 & s_e & s_e^2 & s_e^3 & s_e^4 & s_e^5\\ 0 & 1 & 2s_e & 3s_e^2 & 4s_e^3 & 5s_e^4\\ 0 & 0 & 2 & 6s_e & 12s_e^2 & 20s_e^3 \end{vmatrix} ·\begin{vmatrix} a_{i0}\\ a_{i1}\\ a_{i2}\\ a_{i3}\\ a_{i4}\\ a_{i5}\\ \end{vmatrix}= \begin{vmatrix} l_0\\ l_0'\\ l_0''\\ l_e\\ l_e'\\ l_e'' \end{vmatrix} ∣∣100100s010se10s022s02se22se2s033s026s0se33se26ses044s0312s02se44se312se2s055s0420s03se55se420se3∣∣⋅∣∣ai0ai1ai2ai3ai4ai5∣∣=∣∣l0l0′l0′′lele′le′′∣∣平滑结点约束:该约束的目的是使样条的结点更加平滑;假设两个段 s e g k seg_k segk和 s e g k + 1 seg_{k+1} segk+1互相连接,且 s e q k seq_{k} seqk按结点的累计值 s s s为 s k s_k sk,计算约束的等式为: f k ( s k ) = f k + 1 ( s 0 ) f_k(s_k)=f_{k+1}(s_0) fk(sk)=fk+1(s0);
计算的具体步骤为:
∣ 1 s k s k 2 s k 3 s k 4 s k 5 ∣ ⋅ ∣ a k 0 a k 1 a k 2 a k 3 a k 4 a k 5 ∣ = ∣ 1 s 0 s 0 2 s 0 3 s 0 4 s 0 5 ∣ ⋅ ∣ a k + 1 , 0 a k + 1 , 1 a k + 1 , 2 a k + 1 , 3 a k + 1 , 4 a k + 1 , 5 ∣ \begin{vmatrix} 1 \space s_k \space s_k^2 \space s_k^3\space s_k^4 \space s_k^5 \end{vmatrix}· \begin{vmatrix} a_{k0}\\ a_{k1}\\ a_{k2}\\ a_{k3}\\ a_{k4}\\ a_{k5} \end{vmatrix}= \begin{vmatrix} 1 \space s_0 \space s_0^2 \space s_0^3 \space s_0^4 \space s_0^5 \end{vmatrix}· \begin{vmatrix} a_{k+1,0}\\ a_{k+1,1}\\ a_{k+1,2}\\ a_{k+1,3}\\ a_{k+1,4}\\ a_{k+1,5} \end{vmatrix} ∣∣1 sk sk2 sk3 sk4 sk5∣∣⋅∣∣ak0ak1ak2ak3ak4ak5∣∣=∣∣1 s0 s02 s03 s04 s05∣∣⋅∣∣ak+1,0ak+1,1ak+1,2ak+1,3ak+1,4ak+1,5∣∣
同样,可以为下述等式计算约束等式:
f k ′ ( s k ) = f k + 1 ′ ( s 0 ) , f k ′ ′ ( s k ) = f k + 1 ′ ′ ( s 0 ) , f k ′ ′ ′ ( s k ) = f k + 1 ′ ′ ′ ( s 0 ) f'_k(s_k)=f'_{k+1}(s_0),f''_k(s_k)=f''_{k+1}(s_0),f'''_k(s_k)=f'''_{k+1}(s_0) fk′(sk)=fk+1′(s0),fk′′(sk)=fk+1′′(s0),fk′′′(sk)=fk+1′′′(s0)点采样边界约束:在路径上均匀地取 m m m个点,检查这些点上的障碍物边界;将这些约束转换为QP约束不等式,使用不等式: A x ≥ b Ax≥b Ax≥b;
先基于道路宽度和周围的障碍物找到点 ( s j , l j ) (s_j,l_j) (sj,lj)的下边界 l l b , j l_{lb,j} llb,j,且 j ∈ [ 0 , m ] j\in[0,m] j∈[0,m];计算约束的不等式为:
∣ 1 s 0 s 0 2 s 0 3 s 0 4 s 0 5 1 s 0 s 0 2 s 0 3 s 0 4 s 0 5 ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ 1 s m s m 2 s m 3 s m 4 s m 5 ∣ ⋅ ∣ a i 0 a i 1 a i 2 a i 3 a i 4 a i 5 ∣ ≥ ∣ l l b , 0 l l b , 1 ⋮ l l b , m ∣ \begin{vmatrix} 1 & s_0 & s_0^2 & s_0^3 & s_0^4 & s_0^5\\ 1 & s_0 & s_0^2 & s_0^3 & s_0^4 & s_0^5\\ \vdots & \vdots & \vdots & \vdots & \vdots & \vdots\\ 1 & s_m & s_m^2 & s_m^3 & s_m^4 & s_m^5\\ \end{vmatrix}· \begin{vmatrix} a_{i0}\\ a_{i1}\\ a_{i2}\\ a_{i3}\\ a_{i4}\\ a_{i5} \end{vmatrix}≥ \begin{vmatrix} l_{lb,0}\\ l_{lb,1}\\ \vdots\\ l_{lb,m} \end{vmatrix} ∣∣11⋮1s0s0⋮sms02s02⋮sm2s03s03⋮sm3s04s04⋮sm4s05s05⋮sm5∣∣⋅∣∣ai0ai1ai2ai3ai4ai5∣∣≥∣∣llb,0llb,1⋮llb,m∣∣
上边界约束:
∣ 1 s 0 s 0 2 s 0 3 s 0 4 s 0 5 1 s 0 s 0 2 s 0 3 s 0 4 s 0 5 ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ 1 s m s m 2 s m 3 s m 4 s m 5 ∣ ⋅ ∣ a i 0 a i 1 a i 2 a i 3 a i 4 a i 5 ∣ ≤ ∣ l u b , 0 l u b , 1 ⋮ l u b , m ∣ \begin{vmatrix} 1 & s_0 & s_0^2 & s_0^3 & s_0^4 & s_0^5\\ 1 & s_0 & s_0^2 & s_0^3 & s_0^4 & s_0^5\\ \vdots & \vdots & \vdots & \vdots & \vdots & \vdots\\ 1 & s_m & s_m^2 & s_m^3 & s_m^4 & s_m^5\\ \end{vmatrix}· \begin{vmatrix} a_{i0}\\ a_{i1}\\ a_{i2}\\ a_{i3}\\ a_{i4}\\ a_{i5} \end{vmatrix}≤ \begin{vmatrix} l_{ub,0}\\ l_{ub,1}\\ \vdots\\ l_{ub,m} \end{vmatrix} ∣∣11⋮1s0s0⋮sms02s02⋮sm2s03s03⋮sm3s04s04⋮sm4s05s05⋮sm5∣∣⋅∣∣ai0ai1ai2ai3ai4ai5∣∣≤∣∣lub,0lub,1⋮lub,m∣∣
确定上述约束条件后,最小化QP目标函数后得到的曲线即为平滑后的路径;
基于汽车运动学和动力学的轨迹优化

根据二自由度转向模型可得汽车稳态横摆角速度增益为:
w r δ = u / L 1 + K u 2 (22) \frac{w_r}{\delta}=\frac{u/L}{1+Ku^2}\tag{22} δwr=1+Ku2u/L(22)
稳态横摆角速度为:
w r = u δ L ( 1 + K u 2 ) (23) w_r=\frac{u\delta}{L(1+Ku^2)}\tag{23} wr=L(1+Ku2)uδ(23)
其中: K = m L 2 ( a k 2 − b k 1 ) K=\frac{m}{L^2}\left(\frac{a}{k_2}-\frac{b}{k_1}\right) K=L2m(k2a−k1b), m m m为目标汽车质量, a a a为目标汽车质心距离前轴的距离, b b b为目标汽车距离后轴的距离, L L L为目标汽车轴距,即 a a a和 b b b之和, k 1 k_1 k1为前轮侧偏刚度, k 2 k_2 k2为后轮侧偏刚度, u u u为目标汽车在车身坐标系下沿 x x x轴方向的速度分量, δ \delta δ为前轮转角;稳态时汽车转弯半径 R R R为:
R = u w r = L ( 1 + K u 2 ) δ (24) R=\frac{u}{w_r}=\frac{L(1+Ku^2)}{\delta}\tag{24} R=wru=δL(1+Ku2)(24)
假设目标汽车当前时刻所处位置为 ( X 0 , Y 0 ) (X_0,Y_0) (X0,Y0),航向角为 θ 0 \theta_0 θ0,经过时间 t t t后,目标汽车所处位置为 ( X t , Y t ) (X_t,Y_t) (Xt,Yt),航向角为 θ t \theta_t θt,则目标汽车航向角的变化量 θ \theta θ为:
θ = w r ⋅ t (25) \theta=w_r·t\tag{25} θ=wr⋅t(25)
图4.20中未来 t t t时间后目标汽车所处位置在 x x x轴和 y y y轴上的增量为 Δ x 、 Δ y \Delta{x}、\Delta{y} Δx、Δy,则:
Δ x = R sin θ = L ( 1 + K u 2 ) δ sin ( u δ L ( 1 + K u 2 ) t ) Δ y = R − R cos θ = L ( 1 + K u 2 ) δ ( 1 − cos ( u δ L ( 1 + K u 2 ) t ) ) (26) \begin{aligned} &\Delta{x}=R\sin\theta=\frac{L(1+Ku^2)}{\delta}\sin\left(\frac{u\delta}{L(1+Ku^2)}t\right)\\ &\Delta{y}=R-R\cos\theta=\frac{L(1+Ku^2)}{\delta}\left(1-\cos\left(\frac{u\delta}{L(1+Ku^2)}t\right)\right) \end{aligned}\tag{26} Δx=Rsinθ=δL(1+Ku2)sin(L(1+Ku2)uδt)Δy=R−Rcosθ=δL(1+Ku2)(1−cos(L(1+Ku2)uδt))(26)
在 t t t时刻后,目标汽车所处位置为:
{ X t = X 0 + Δ x Y t = Y 0 + Δ y (27) \begin{cases} &X_t=X_0+\Delta{x}\\ &Y_t=Y_0+\Delta{y} \end{cases}\tag{27} { Xt=X0+ΔxYt=Y0+Δy(27)
航向角为:
θ t = θ 0 + θ (28) \theta_t=\theta_0+\theta\tag{28} θt=θ0+θ(28)
可积分的运动约束与几何约束在物理实质上没有区别,合称为完整约束;不可积的运动约束即不能化为几何约束的运动约束,在物理实质上不同于几何约束,称为非完整约束;无人驾驶系统速度项无法通过积分变换转化为系统对应的空间位置,使得系统的控制变量个数少于系统位姿自由度,因此无人驾驶系统是一个典型的非完整性约束系统;由于无人驾驶系统是一个受非完整性约束的非线性系统,因此汽车进行路径规划的时候不仅仅要满足几何约束和运动学约束,还要满足汽车动力学约束;
在车速一定的情况下,汽车行驶轨迹的曲率与汽车的侧向加速度成正比,汽车在实际运动过程中产生的侧向加速度受多个因素限制,如:发动机动力水平、轮胎特性、地面附着系数等,且为了乘坐人员提供舒适的驾乘体验,侧向加速度不宜过大,且越小越好,因此侧向加速度 a l a t a_{lat} alat存在如下约束:
∣ a l a t ∣ ≤ a m a x _ l a t (29) |a_{lat}|≤a_{max\_{lat}}\tag{29} ∣alat∣≤amax_lat(29)
其中: a m a x _ l a t a_{max\_lat} amax_lat为最大侧向加速度;
a l a t = u 2 R = u 2 δ L ( 1 + K u 2 ) δ = a l a t L ( 1 + K u 2 ) u 2 − a m a x _ l a t L ( 1 + K u 2 ) u 2 ≤ δ ≤ a m a x _ l a t L ( 1 + K u 2 ) u 2 (30) \begin{aligned} &a_{lat}=\frac{u^2}{R}=\frac{u^2\delta}{L(1+Ku^2)}\\ &\delta=a_{lat}\frac{L(1+Ku^2)}{u^2}\\ &-a_{max\_lat}\frac{L(1+Ku^2)}{u^2}≤\delta≤a_{max\_lat}\frac{L(1+Ku^2)}{u^2} \end{aligned}\tag{30} alat=Ru2=L(1+Ku2)u2δδ=alatu2L(1+Ku2)−amax_latu2L(1+Ku2)≤δ≤amax_latu2L(1+Ku2)(30)
由上式可知,前轮转角与汽车侧向加速度正相关,前轮转角与方向盘转角的关系由转向系传动比决定;一定车速下方向盘转角越大,侧向加速度越大,侧向加速度的约束可以转化为一定车速下对方向盘转角范围的约束,同时由于受转向系统机械结构的限制,方向盘转角变化连续且有界;根据上一时刻前轮的实际转角为参考,在其一定范围内均匀离散产生一组 ( n 个 ) (n个) (n个)转角,但要确保转角在要求的范围内,由这一组转角再推断经过 m m m个规划周期汽车的位置;
通过下式计算指标 w w w来评价每条局部路径与规划路径的接近程度:
w = ∑ i = 1 m [ ( x g t − x l t ) 2 + ( y g t − y l t ) 2 ] (31) w=\sum_{i=1}^m[(x_g^t-x_l^t)^2+(y_g^t-y_l^t)^2]\tag{31} w=i=1∑m[(xgt−xlt)2+(ygt−ylt)2](31)
然后从这一组 w 1 , w 2 , w 3 , … , w n w_1,w_2,w_3,\dots,w_n w1,w2,w3,…,wn中找出最小的 w w w所对应的局部路径,即为最优局部路径;
边栏推荐
- Use of el-tooltip
- 高等数学——常用不定积分公式
- NPM淘宝镜像(最新版本)于2021-11-21 16:53:52发布新版本npm镜像[通俗易懂]
- The meaning of node_exporter performance monitoring information collection in Prometheus
- 为什么要分库分表?
- Description of Hikvision camera streaming RTSP address rules
- 【Pytorch】torch.argmax()用法
- Resolved (pymysqL connect to the database error) pymysqL. Err. ProgrammingError: (1146, "Table" test. Students' doesn 't exist ")
- 易驱线主控芯片对比(电动三轮电机90O瓦世纪通达)
- "Listen to me, thank you" can be said in ancient poetry?Tsinghua University has developed an artifact of "Searching Sentences According to Meaning", which can search for the famous sayings you want wi
猜你喜欢

Redis 】 【 publish and subscribe message

已解决(pymysqL连接数据库报错)pymysqL.err.ProgrammingError: (1146,“Table ‘test.students‘ doesn‘t exist“)

Why do we need to sub-library and sub-table?

232层3D闪存芯片来了:单片容量2TB,传输速度提高50%

Spark学习(2)-Spark环境搭建-Local

Sentinel限流和异常处理

Essential Learning for Getting Started with Unity Shader - Transparency Effect

消息队列消息数据存储MySQL表设计

Architecture actual combat battalion module 8 message queue table structure design

Spark学习(3)-Spark环境搭建-Standalone
随机推荐
Spark学习(2)-Spark环境搭建-Local
An article makes it clear!What is the difference and connection between database and data warehouse?
PDF 拆分/合并
Nuget打包并上传教程
A detailed guide to simulating latency with SQL/JDBC
How to grab configuration information for DELL SC compellent storage system
SetoolKit User Guide
NPM淘宝镜像(最新版本)于2021-11-21 16:53:52发布新版本npm镜像[通俗易懂]
Numbers that appear only once in LeetCode
The Selenium IDE of the Selenium test automation
我把问烂了的MySQL面试题总结了一下
IDEA connects to MySQL database and uses data
1小时直播招募令:行业大咖干货分享,企业报名开启丨量子位·视点
UnityShader入门学习(一)——GPU与Shader
BigDecimal 简介,常用方法
MySQL玩到这种程度,难怪大厂抢着要!
[QNX Hypervisor 2.2用户手册]9.14 safety
OAuth2:微服务权限校验Session共享
架构实战营模块8消息队列表结构设计
Groupid(artifact id)