本系列文章是学习深蓝学院-移动机器人运动规划课程第五章最优轨迹生成 过程中所记录的笔记,本系列文章共包含四篇文章,依次介绍了微分平坦特性、无约束BVP轨迹优化、无约束BIVP轨迹优、 带约束轨迹优化等内容
本系列文章链接如下:
最优轨迹生成(一)—— 微分平坦
最优轨迹生成(二)—— 无约束BVP轨迹优化
最优轨迹生成(三)—— 无约束BIVP轨迹优化
最优轨迹生成(四)—— 带约束轨迹优化
如果我们需要处理更一般的约束,并给定状态点的可行域约束,并且需要进一步优化轨迹的总时间以及轨迹在时间和空间上的形状,则上面介绍的BVP和BIVP就不再适应,且存在以下难点:
①、最佳参数化是未知的,即最优的轨迹不一定是2s-1阶多项式了。
②、时空剖面涉及多个自由度,我们即要优化轨迹的时域又要优化轨迹的空间域,轨迹的速度、加速度、jerk等都需要优化。
③、 G \mathcal{G} G可能包含是非凸的约束。
④、安全区域(环境中的可行域)可能是高复杂性。
我们可以对以上问题进行一些可能的简化
①、虽然最优解不一定再是多项式曲线,但是我们能不能就在多项式曲线中去寻找最优解呢?
②、我们能不能把轨迹的飞行时间固定,从而不再对轨迹的时间进行优化?
③、我们能不能只把速度、加速度的幅值约束一下,不要管其他的角速率、推力等约束
④、我们能不能使安全约束凸化,从而得到一些局部凸区域约束。
基于以上思路,我们可以把问题转换成凸优化问题,假设我们给定几个凸的问题,它们首尾相接,如下图所示的例子中,我们把轨迹分为首尾相接的三段,每段各自约束在各自的凸问题中,比如第一段 A 0 p < b 0 A_0p<b_0 A0p<b0、第二段 A 1 p < b 1 A_1p<b_1 A1p<b1 …
arg min Φ J q = ∑ i = 0 n − 1 ∫ 0 Δ t i ∣ ∣ Φ i ( q ) ( t ) ∣ ∣ 2 d t Φ i ( k ) ( Δ t i ) = Φ i + 1 ( k ) ( 0 ) , k = 0 … q a n d i = 1 … N − 2 , Φ 0 ( k ) ( 0 ) = u s ( k ) , Φ N − 1 ( k ) ( Δ t N − 1 ) = u g ( k ) , k = 0 … q , A i T Φ i ( t ) ≤ b i , i = 0 … N − 1. \begin{aligned} \arg\operatorname*{min}_{\Phi}J^{q}& =\sum_{i=0}^{n-1}\intop_0^{\Delta t_i}||\Phi_i^{(q)}(t)||^2dt \\ \Phi_{i}^{(k)}(\Delta t_{i})& =\Phi_{i+1}^{(k)}(0),\quad k=0\ldots q\mathrm{~and~}i=1\ldots N-2, \\ \Phi_{0}^{(k)}(0)& =u_{s}^{(k)},\Phi_{N-1}^{(k)}(\Delta t_{N-1})=u_{g}^{(k)},k=0\ldots q, \\ \mathbf{A}_{i}^{T}\Phi_{i}(t)& \leq\mathbf{b}_{i},i=0\ldots N-1. \end{aligned} argΦminJqΦi(k)(Δti)Φ0(k)(0)AiTΦi(t)=i=0∑n−10∫Δti∣∣Φi(q)(t)∣∣2dt=Φi+1(k)(0),k=0…q and i=1…N−2,=us(k),ΦN−1(k)(ΔtN−1)=ug(k),k=0…q,≤bi,i=0…N−1.
该问题与BIVP问题最大的区别在于多了安全约束。上述目标函数中q=3时等价于BIVP中的最小化jerk,上面的第一个等式约束也与BIVP中两段相邻轨迹的连续性约束相似,所不同的是该问题中并不像BIVP中那样对中间位置点进行指定,而是通过优化去确定中间位置点,上面的第二个等式约束也与BIVP中对起始和终末状态进行指定相同。最后的不等式约束 A i T Φ i ( t ) ≤ b i \mathbf{A}_i^T\Phi_i(t)\leq\mathbf{b}_i AiTΦi(t)≤bi即该问题与BIVP问题的最大区别,对于该不等式约束,可以在每段轨迹的若干个时间点进行采样,看其是否满足。采样点越密集,安全约束就也稠密
在BVP或BIVP中没有推导过代价泛函或代价函数具有什么样的形式,因为在BVP或BIVP中不需要去解最优解。但这里需要用到。
我们先来看目标函数,对于一个多项式,我们求它的四阶导,得到snap,再将其平方,把snap多项式的系数进行卷积,在进行积分。然后,我们就可以将第j段轨迹的目标函数写成一个二次型的形式,流程如下所示:
f ( t ) = ∑ p i t i ⟹ f ( 4 ) ( t ˙ ) ‾ = ∑ i ( i − 1 ) ( i − 2 ) ( i − 3 ) t i − 4 p i ⟹ ( f ( 4 ) ( t ) ) = 2 i ≥ 4 ∑ i ≥ 4 , l ≥ 4 i ( i − 1 ) ( i − 2 ) ( i − 3 ) l ( l − 1 ) ( l − 2 ) ( l − 3 ) t i + l − 8 p i p l ⟹ J ( T ) = ∫ T j − 1 T j ( f 4 ( t ) ) 2 d t = ∑ i ≥ 4 , l ≥ 4 i ( i − 1 ) ( i − 2 ) ( i − 3 ) j ( l − 1 ) ( l − 2 ) ( l − 3 ) i + l − 7 ( T j i + l − 7 − T j − 1 i + l − 7 ) p i p l ⟹ J ( T ) = ∫ T j − 1 T j ( f 4 ( t ) ) 2 d t = [ ⋮ p i ⋮ ] T [ ⋯ i ( i − 1 ) ( i − 2 ) ( i − 3 ) l ( l − 1 ) ( l − 2 ) ( l − 3 ) i + l − 7 T i + l − 7 ⋯ ⋮ ⋮ ] [ ⋮ p l ⋮ ] ⇒ J j ( T ) = p j T Q j p j \begin{aligned} &f(t)=\sum p_{i}t^{i} \\ &\Longrightarrow f^{(4)}\overline{(\dot{t})}=\sum_{}i(i-1)(i-2)(i-3)t^{i-4}p_{i} \\ &\Longrightarrow\left(f^{(4)}(t)\right)\overset{2_{i\geq4}}{=}\sum_{i\geq4,l\geq4}i(i-1)(i-2)(i-3)l(l-1)(l-2)(l-3)t^{i+l-8}p_{i}p_{l} \\ &\Longrightarrow J(T)=\int_{T_{j-1}}^{T_{j}}\left(f^{4}(t)\right)^{2}dt=\sum_{i\geq4,l\geq4}\frac{i(i-1)(i-2)(i-3)j(l-1)(l-2)(l-3)}{i+l-7}(T_{j}^{i+l-7}-T_{j-1}^{i+l-7})p_{i}p_{l} \\ &\implies J(T)=\int_{T_{j-1}}^{T_{j}}\left(f^4(t)\right)^2dt \\ &=\begin{bmatrix}\vdots\\p_i\\\vdots\end{bmatrix}^T\begin{bmatrix}\cdots&\dfrac{i(i-1)(i-2)(i-3)l(l-1)(l-2)(l-3)}{i+l-7}T^{i+l-7}&\cdots\\\vdots&\vdots\end{bmatrix}\begin{bmatrix}\vdots\\p_l\\\vdots\end{bmatrix} \\ &\Rightarrow J_{j}(T)=\mathbf{p}_{j}^{T}\mathbf{Q}_{j}\mathbf{p}_{j} \end{aligned} f(t)=∑piti⟹f(4)(t˙)=∑i(i−1)(i−2)(i−3)ti−4pi⟹(f(4)(t))=2i≥4i≥4,l≥4∑i(i−1)(i−2)(i−3)l(l−1)(l−2)(l−3)ti+l−8pipl⟹J(T)=∫Tj−1Tj(f4(t))2dt=i≥4,l≥4∑i+l−7i(i−1)(i−2)(i−3)j(l−1)(l−2)(l−3)(Tji+l−7−Tj−1i+l−7)pipl⟹J(T)=∫Tj−1Tj(f4(t))2dt= ⋮pi⋮ T ⋯⋮i+l−7i(i−1)(i−2)(i−3)l(l−1)(l−2)(l−3)Ti+l−7⋮⋯ ⋮pl⋮ ⇒Jj(T)=pjTQjpj
其中Q是二次型矩阵,P是多项式的系数,所以给定一个多项式,给定 T j − 1 T_{j-1} Tj−1、 T j T_j Tj,给定轨迹的总时间 t j t_j tj、系数P,我们就可以把该段轨迹的能量或者说目标函数值的表达式。
然后,我们再来看等式约束,比如给定的初始条件和终末条件,需要对多项式进行求导,然后把系数和对应的边界条件写出来,把权重和系数分离开,写成矩阵的形式,就可以获得等式约束,如下所示:
f j ( k ) ( T j ) = x j ( k ) ⇒ ∑ i ≥ k i ! ( i − k ) ! T j i − k p j , i = x T , j ( k ) ⇒ [ ⋯ i ! ( i − k ) ! T j i − k ⋯ ] [ ⋮ p j , i ⋮ ] = x T , j ( k ) ⇒ [ . . . i ! ( i − k ) ! T j − 1 i − k . . . . . . i ! ( i − k ) ! T j i − k . . . ] [ ⋮ p j , i ⋮ ] = [ x 0 , j ( k ) x T , j ( k ) ] | ⇒ A j p j = d j \begin{aligned} &f_j^{(k)}(T_j)=x_j^{(k)} \\ &\Rightarrow\sum_{i\geq k}\frac{i!}{(i-k)!}T_{j}^{i-k}p_{j,i}=x_{T,j}^{(k)} \\ &\Rightarrow\begin{bmatrix}\cdots&\frac{i!}{(i-k)!}T_j^{i-k}&\cdots\end{bmatrix}\begin{bmatrix}\vdots\\p_{j,i}\\\vdots\end{bmatrix}=x_{T,j}^{(k)} \\ &\Rightarrow\begin{bmatrix}...&\dfrac{i!}{(i-k)!}T_{j-1}^{i-k}&...\\...&\dfrac{i!}{(i-k)!}T_j^{i-k}&...\\\end{bmatrix}\begin{bmatrix}\vdots\\p_{j,i}\\\vdots\end{bmatrix}=\begin{bmatrix}x_{0,j}^{(k)}\\x_{T,j}^{(k)}\end{bmatrix}& \text{|} \\ &\Rightarrow\mathbf{A}_j\mathbf{p}_j=\mathbf{d}_j \end{aligned} fj(k)(Tj)=xj(k)⇒i≥k∑(i−k)!i!Tji−kpj,i=xT,j(k)⇒[⋯(i−k)!i!Tji−k⋯] ⋮pj,i⋮ =xT,j(k)⇒ ......(i−k)!i!Tj−1i−k(i−k)!i!Tji−k...... ⋮pj,i⋮ =[x0,j(k)xT,j(k)]⇒Ajpj=dj|
两段之间的连续性约束:当没有给出特定导数时,确保轨迹段之间的连续性
f j ( k ) ( T j ) = f j + 1 ( k ) ( T j ) ⇒ ∑ i ≥ k i ! ( i − k ) ! T j i − k p j , i − ∑ l ≥ k l ! ( l − k ) ! T j l − k p j + 1 , l = 0 ⇒ [ ⋯ i ! ( i − k ) ! T j i − k ⋯ − l ! ( l − k ) ! T j l − k ⋯ ] [ ⋮ p j , i ⋮ p j + 1 , l ⋮ ] = 0 ⇒ [ A j − A j + 1 ] [ p j p j + 1 ] = 0 \begin{aligned} &f_{j}^{(k)}(T_{j})=f_{j+1}^{(k)}(T_{j}) \\ &\Rightarrow\sum_{i\geq k}\frac{i!}{(i-k)!}T_{j}^{i-k}p_{j,i}-\sum_{l\geq k}\frac{l!}{(l-k)!}T_{j}^{l-k}p_{j+1,l}=0 \\ &\Rightarrow\begin{bmatrix}\cdots&\frac{i!}{(i-k)!}T_j^{i-k}&\cdots&-\frac{l!}{(l-k)!}T_j^{l-k}&\cdots\end{bmatrix}\begin{bmatrix}\vdots\\p_{j,i}\\\vdots\\p_{j+1,l}\\\vdots\end{bmatrix}=0 \\ &\Rightarrow\begin{bmatrix}\mathbf{A}_j&-\mathbf{A}_{j+1}\end{bmatrix}\begin{bmatrix}\mathbf{p}_j\\\mathbf{p}_{j+1}\end{bmatrix}=0 \end{aligned} fj(k)(Tj)=fj+1(k)(Tj)⇒i≥k∑(i−k)!i!Tji−kpj,i−l≥k∑(l−k)!l!Tjl−kpj+1,l=0⇒[⋯(i−k)!i!Tji−k⋯−(l−k)!l!Tjl−k⋯] ⋮pj,i⋮pj+1,l⋮ =0⇒[Aj−Aj+1][pjpj+1]=0
凸优化的全局最优解与局部最优解是一致的,凸函数中任意两点连线之间的值始终要比这两点要小,即下式成立
f ( θ x + ( 1 − θ ) y ) ≤ θ f ( x ) + ( 1 − θ ) f ( y ) f(\theta x+(1-\theta)y)\leq\theta f(x)+(1-\theta)f(y) f(θx+(1−θ)y)≤θf(x)+(1−θ)f(y)
对于一个集合,若任意两点连线都属于集合内部,则为凸集合
θ x + ( 1 − θ ) y ∈ C . \theta x+(1-\theta)y\in C. θx+(1−θ)y∈C.
如果一个问题具有凸的函数,并且它的不等式约束构成的集合是一个凸集合,则将其称为凸优化问题
一般来说要求等式约束是线性的,不等式约束是凸的
如何把常见的轨迹优化转换成凸优化问题呢,应该转换成什么类的凸优化呢。最简单的就是线性规划LP,线性的目标函数和约束。然后是比较常用的二次规划QP,它的目标函数带有二次项,约束项跟LP类似是线性的。如果我们把QP的不等式约束也放松成二次的,则为QCQP规划。锥规划SOCP的目标函数和等式约束都是线性的,不等式约束是 ∥ A i x + b i ∥ ≤ c i T x + d i \|A_{i}x+b_{i}\|\leq c_{i}^{T}x+d_{i} ∥Aix+bi∥≤ciTx+di的形式。另外LP、QP、QCQP都是可以转换成SOCP形式的。
把轨迹优化转换成凸优化问题后,可以调用一些库来求解凸优化问题,比如锥规划中效率很高的库Mosek,再比如对线性求解效率比较高、稳定性很高的GLPK。此外,还有CVX、OOQP等
CVX:http://cvxr.com/cvx/
Mosek:https://www.mosek.com/
OOQP:https://pages.cs.wisc.edu/~swright/ooqp/
GLPK:https://www.gnu.org/software/glpk/
凸优化也存在一些数值不稳定问题,我们可以采用相对时间来表示每一段的轨迹,并把每一段轨迹占有的时间归一化为1,来使得问题的条件数更好,我们把一个问题的数值缩放100倍、缩放1000倍和不缩放对凸优化而言它的效率是不一样的
如何把凸优化应用到实际的运动规划中去呢?
首先,我们可以把障碍物进行栅格化,然后从栅格地图中寻找从起始点到目标点的一系列的由长方形构成的可行区域(搜索飞行走廊),然后把狭窄的可行区域进行扩大,获得更大的长方体,然后再在长方体构成的可行域内进行轨迹优化。
我们在进行轨迹优化时,需要让状态中的位置不要超出长方体构成的几何区域,同样求导后的速度也不要超过限制(也是一个长方体)依次类推,加速度也适应。
·前面为了简化问题,我们将每段轨迹的时间进行了任务分配,而时间分配显著影响最终轨迹。那么如何合理分配时间?
时间分配问题是非凸优化问题,凸优化无法处理,一个比较好的方案是使用飞行走廊。飞行走廊的容错率比较高,比如我们有下面三个有重叠部分的长方体,我们只需要分配各个长方体中的飞行时间即可,由于长方体存在重叠部分,指定的时间就有了浮动范围,但该浮动也存在上限。我们也可以在每段轨迹上采用梯形的速度,先加速,再匀速,再减速
在考虑安全约束、动力学约束,并且要优化时间分配的情况下,该怎样处理呢?
轨迹p(t)可以被航时T和航点q决定,采用这种新的参数化的方式,直接调整航点q和时间向量T来使得,比如把某段轨迹的时间过短,超出了其最大速度,可以把时间拉伸,同样的轨迹的某段超出了安全区域,可以把航点q进行调整,使得轨迹变为安全轨迹。
所以,一个轨迹需要有直接进行空间时间形变的能力,这样就可以处理一些列违背约束的情况
利用上述时空形变的方法可以完成一系列高效的求解
我们将这种时间空间形变的轨迹用在多面体或者球体空间中,都可以在很短的时间内达到 V m a x V_{max} Vmax,即下图中红色曲线,保持这样的最大速度均速飞行。
参考资料:
1、深蓝学院-移动机器人运动规划