最优轨迹生成(二)—— 无约束BVP轨迹优化

   本系列文章是学习深蓝学院-移动机器人运动规划课程第五章最优轨迹生成 过程中所记录的笔记,本系列文章共包含四篇文章,依次介绍了微分平坦特性、无约束BVP轨迹优化、无约束BIVP轨迹优、 带约束轨迹优化等内容

   本系列文章链接如下:

   最优轨迹生成(一)—— 微分平坦

   最优轨迹生成(二)—— 无约束BVP轨迹优化

   最优轨迹生成(三)—— 无约束BIVP轨迹优化

   最优轨迹生成(四)—— 带约束轨迹优化


   二、无约束BVP轨迹优化

   通过前文的介绍,可以知道,我们在优化时是对微分平坦输出 z = { r , ψ } ∈ R 3 × S O ( 2 ) z=\{r,\psi\}\in\mathbb{R}^3\times\mathrm{SO}(2) z={r,ψ}R3×SO(2)做优化,而不是直接对状态x和输入u做优化。该优化问题的一般化数学描述如下:

   min ⁡ z ( t ) , T ∫ 0 T v ( t ) T W v ( t ) d t + ρ ( T ) , s. t. z ( s ) ( t ) = v ( t ) , ∀ t ∈ [ 0 , T ] , G ( z ( t ) , ⋯   , z ( s ) ( t ) ) ⪯ 0 , ∀ t ∈ [ 0 , T ] , z ( t ) ∈ F , ∀ t ∈ [ 0 , T ] , z [ s − 1 ] ( 0 ) = z ˉ o , z [ s − 1 ] ( T ) = z ˉ f , z [ s − 1 ] : = ( z T , z ˙ T , ⋯   , z ( s − 1 ) T ) T . \begin{aligned} \min_{z(t),T}& \int_0^Tv(t)^\mathrm{T}\mathbf{W}v(t)\mathrm{d}t+\rho(T), \\ \text{s. t.}& z^{(s)}(t)=v(t),\forall t\in[0,T], \\ &\mathcal{G}(z(t),\cdots,z^{(s)}(t))\preceq\mathbf{0},\forall t\in[0,T], \\ &z(t)\in\mathcal{F},\forall t\in[0,T], \\ &z^{[s-1]}(0)=\bar{z}_o,z^{[s-1]}(T)=\bar{z}_f, \\ &z^{[s-1]}:=(z^\mathrm{T},\dot{z}^\mathrm{T},\cdots,z^{(s-1)^\mathrm{T}})^\mathrm{T}. \end{aligned} z(t),Tmins. t.0Tv(t)TWv(t)dt+ρ(T),z(s)(t)=v(t),t[0,T],G(z(t),,z(s)(t))0,t[0,T],z(t)F,t[0,T],z[s1](0)=zˉo,z[s1](T)=zˉf,z[s1]:=(zT,z˙T,,z(s1)T)T.

   上式中,z(t)即微分平坦输出的轨迹,T是轨迹的时间,我们不仅要优化轨迹本身,还要优化轨迹的时长。微分平坦输出的高阶导肯定是存在的,我们选取其高阶导 z ( s ) ( t ) = v ( t ) z^{(s)}(t)=v(t) z(s)(t)=v(t)作为平滑项,当s=1时,目标函数的含义即让一阶导的能量函数尽可能低,让它更加平滑,若W取单位对角矩阵,则我们优化的就是 v T v v^Tv vTv。因为,我们需要使得时间T尽快短,所以要在目标函数中加上一项 ρ ( T ) \rho(T) ρ(T),作为时间T的惩罚项。

   上式中 z ( t ) ∈ F , ∀ t ∈ [ 0 , T ] , z(t)\in\mathcal{F},\forall t\in[0,T], z(t)F,t[0,T],中的 F \mathcal{F} F表示栅格地图或者点云地图中可通行区域。

   上式中, G ( z ( t ) , ⋯   , z ( s ) ( t ) ) ⪯ 0 , ∀ t ∈ [ 0 , T ] , \mathcal{G}(z(t),\cdots,z^{(s)}(t))\preceq\mathbf{0},\forall t\in[0,T], G(z(t),,z(s)(t))0,t[0,T],是关于微分平坦轨迹输出的约束,这个 G \mathcal{G} G里面可以放很多的约束。

   上式中, z [ s − 1 ] ( 0 ) = z ˉ o , z [ s − 1 ] ( T ) = z ˉ f z^{[s-1]}(0)=\bar{z}_o,z^{[s-1]}(T)=\bar{z}_f z[s1](0)=zˉo,z[s1](T)=zˉf z [ s − 1 ] : = ( z T , z ˙ T , ⋯   , z ( s − 1 ) T ) T . z^{[s-1]}:=(z^{\mathrm{T}},\dot{z}^{\mathrm{T}},\cdots,z^{(s-1)^{\mathrm{T}}})^{\mathrm{T}}. z[s1]:=(zT,z˙T,,z(s1)T)T. 表示轨迹需要满足的边界条件, z ‾ o , \overline{z}_{o}, zo, z ‾ f \overline{z}_{f} zf是给定的初始和终端的状态。

在这里插入图片描述

   当选取不同的平滑项阶次s时,会有不同的效果,当s取为3时,即最小化jerk,同时也是最小化角速度,有利于视觉跟踪。当s取4时,最小化snap,减小差动推力(力矩),节约能源。

在这里插入图片描述



  

   下面来看一下无约束情况下该问题怎么解,其数学描述如下,我们可以仅指定起点和目标点的Z值,也可以再指定中间某些点的z值(即可指定位置也可指定速度)

   min ⁡ z ( t ) ∫ t 0 t M v ( t ) T W v ( t ) d t , s . t . z ( s ) ( t ) = v ( t ) , ∀ t ∈ [ t 0 , t M ] , z [ s − 1 ] ( t 0 ) = z ˉ o , z [ s − 1 ] ( t M ) = z ˉ f , z [ d i − 1 ] ( t i ) = z ˉ i , 1 ≤ i < M , t i − 1 < t i , 1 ≤ i ≤ M . \begin{aligned} &\operatorname*{min}_{z(t)} \begin{aligned}\int_{t_0}^{t_M}v(t)^\mathrm{T}\mathbf{W}v(t)\mathrm{d}t,\end{aligned} \\ &s.t. z^{(s)}(t)=v(t),\forall t\in[t_0,t_M], \\ &z^{[s-1]}(t_{0})=\bar{z}_{o},z^{[s-1]}(t_{M})=\bar{z}_{f}, \\ &z^{[d_i-1]}(t_i)=\bar{z}_i,1\leq i<M, \\ &t_{i-1}<t_{i},1\leq i\leq M. \end{aligned} z(t)mint0tMv(t)TWv(t)dt,s.t.z(s)(t)=v(t),t[t0,tM],z[s1](t0)=zˉo,z[s1](tM)=zˉf,z[di1](ti)=zˉi,1i<M,ti1<ti,1iM.

   以上问题的解 z ∗ ( t ) : [ t 0 , t M ] ↦ R m , z^{*}(t):[t_{0},t_{M}]\mapsto\mathbb{R}^{m}, z(t):[t0,tM]Rm,是最优的当且仅当以下条件成立时:

   (1)z在每一段轨迹上可以以一个2s-1次的多项式来表示,比如s是3的话,那么最优轨迹一定是5次多项式

   (2)边界条件和中间条件都成立。

   (3)最优解在 t i t_i ti时刻,一定是 2 s − d i − 1 2s-d_i-1 2sdi1次的连续可微,比如s=3,d=1时,需要z是4次连续可微的,即z的位置、速度、加速度、jerk、snap都是存在且连续的,因为此时s取的是3,所以位置、速度、加速度一定是存在且连续的,这个条件告诉我们要想轨迹最优还需保证jerk和snap是连续的,这是最优解的一个特质。


   我们把上面的数学描述再简化一下,去掉对终点节点的指定,仅给定起始点和目标点,由多段轨迹变成一段轨迹,其数学描述如下

   min ⁡ z ( t ) ∫ 0 T v ( t ) T W v ( t ) d t , s . t . z ( s ) ( t ) = v ( t ) , ∀ t ∈ [ 0 , T ] , z [ s − 1 ] ( t 0 ) = z ˉ o , z [ s − 1 ] ( t M ) = z ˉ f . Boundary   value \begin{aligned} &\min_{z(t)} \int_0^Tv(t)^{\mathrm{T}}\mathbf{W}v(t)\mathrm{d}t, \\ &\begin{matrix}{s.t.}\\\end{matrix} z^{(s)}(t)=v(t),\forall t\in[0,T], \\ &z^{[s-1]}(t_0)=\bar{z}_o, \\ &z^{[s-1]}(t_{M})=\bar{z}_{f}.\quad\textsf{Boundary value} \end{aligned} z(t)min0Tv(t)TWv(t)dt,s.t.z(s)(t)=v(t),t[0,T],z[s1](t0)=zˉo,z[s1](tM)=zˉf.Boundary value

   在让无人机接乒乓球的示例中,我们可以仅指定当前状态和目标状态,去解这样的BVP问题,得到一系列的轨迹,如下图所示,然后对每个轨迹进行检查是否与障碍物相撞,是否满足动力学约束,然后从符合要求的轨迹中选取能量耗费最少或者目标函数值最小的轨迹。

在这里插入图片描述


   那么我们如何把一段轨迹求出来呢?比如s取3时,由上面介绍的最优解条件,可知最优轨迹一定是5次多项式,我们可以设其表达式如下,

   x ( t ) = c 0 + c 1 t + c 2 t 2 + c 3 t 3 + c 4 t 4 + c 5 t 5 x(t)=c_0+c_1t+c_2t^2+c_3t^3+c_4t^4+c_5t^5 x(t)=c0+c1t+c2t2+c3t3+c4t4+c5t5

在这里插入图片描述

   我们可以对其求一次导得到速度表达式,求二次导得到加速度表达式,再将上面给定的边界值条件代入,可以得到以下关系式

   [ a v 0 0 b v T 0 ] = [ 1 0 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 1 T T 2 T 3 T 4 T 4 0 1 2 T 3 T 2 4 T 3 5 T 4 0 0 2 6 T 12 T 2 20 T 3 ] [ c 0 c 1 c 2 c 3 c 4 c 5 ] \begin{bmatrix}a\\\color{red}{v_0}\\0\\b\\\color{red}{v_T}\\0\end{bmatrix}=\begin{bmatrix}1&0&0&0&0&0\\0&1&0&0&0&0\\0&0&2&0&0&0\\1&T&T^2&T^3&T^4&T^4\\0&1&2T&3T^2&4T^3&5T^4\\0&0&2&6T&12T^2&20T^3\end{bmatrix}\begin{bmatrix}c_0\\c_1\\c_2\\c_3\\c_4\\c_5\end{bmatrix} av00bvT0 = 100100010T10002T22T2000T33T26T000T44T312T2000T45T420T3 c0c1c2c3c4c5

   上式可表示成 d = A F ( T ) c d=\mathbf{A}_{\mathrm{F}}(T)c d=AF(T)c,对A矩阵求逆放到左边即可得到该5次多项式的系数c,从而解出该轨迹。

   对于一些由离散的点构成的折线路径,无人机很难进行跟踪,我可以采用以上的方法,在每段折线的起点和终点处解BVP问题,给定起始点和终点状态时保证上一段折线的终点状态和下一段折线的起始点状态相同即可。就可以得到一个由多段多项式构成的光滑路径。

在这里插入图片描述

   上面给出了一种比较简单的实例的求解方式,那么对于更一般的BVP问题,该如何求解呢

   首先,我们可以像上面那样把这个2s-1次多项式的系数写出来,写成 d = A F ( T ) c d=\mathbf{A}_{\mathrm{F}}(T)c d=AF(T)c的形式,d是由初始和终末的边界条件构成的常量向量,一般情况下 A F ( t ) = [ E 0 F ( t ) G ( t ) ] \mathbf{A}_F(t)=\begin{bmatrix}\mathbf{E}&\mathbf{0}\\\mathbf{F}(t)&\mathbf{G}(t)\end{bmatrix} AF(t)=[EF(t)0G(t)]的各分块矩阵的构成如下:

   E i j = { ( i − 1 ) ! i f i = j , 0 i f i ≠ j , F i j ( t ) = { ( j − 1 ) ! / ( j − i ) ! ⋅ t j − i i f i ≤ j , 0 i f i > j , G i j ( t ) = ( s + j − 1 ) ! ( s + j − i ) ! ⋅ t s − i + j . \begin{aligned} &\mathbf{E}_{ij}=\begin{cases}(i-1)!&ifi=j,\\0&ifi\neq j,&\end{cases} \\ &\mathbf{F}_{ij}(t)=\left\{\begin{matrix}(j-1)!/(j-i)!\cdot t^{j-i}&ifi\leq j,\\0&ifi>j,\end{matrix}\right. \\ &\mathbf{G}_{ij}(t)=\frac{(s+j-1)!}{(s+j-i)!}\cdot t^{s-i+j}. \end{aligned} Eij={(i1)!0ifi=j,ifi=j,Fij(t)={(j1)!/(ji)!tji0ifij,ifi>j,Gij(t)=(s+ji)!(s+j1)!tsi+j.

   一般情况下,求系数c时需要对矩阵 A F ( t ) \mathbf{A}_F(t) AF(t)进行求逆,其实,我们也可以不用每次都直接求逆,在2021的论文Generating Large-Scale Trajectories Efficiently using Double Descriptions of Polynomials   中给出了其逆矩阵 A B ( t ) = [ U 0 V ( t ) W ( t ) ] \mathbf{A}_B(t)=\begin{bmatrix}\mathbf{U}&\mathbf{0}\\\mathbf{V}(t)&\mathbf{W}(t)\end{bmatrix} AB(t)=[UV(t)0W(t)]的表达形式,如下所示:

   U i j = { 1 / ( i − 1 ) ! i f   i = j , 0 i f   i ≠ j , V i j ( t ) = ∑ k = 0 s − max ⁡ ( i , j ) ( − 1 ) k ( s i + k ) ( 2 s − j − k − 1 s − 1 ) ( j − 1 ) !   ( − 1 ) i ⋅ t s + i − j , W i j ( t ) = ∑ k = 0 s − max ⁡ ( i , j ) ( s − k − 1 i − 1 ) ( 2 s − j − k − 1 s − 1 ) ( j − 1 ) ! ( − 1 ) i + j ⋅ t s + i − j . \begin{aligned} &\mathbf{U}_{ij}=\left\{\begin{matrix}1/(i-1)!&if\mathrm{~}i=j,\\0&if\mathrm{~}i\neq j,\end{matrix}\right. \\ &\mathbf{V}_{ij}(t)=\frac{\sum_{k=0}^{s-\max{(i,j)}}{(-1)^k\binom s{i+k}\binom{2s-j-k-1}{s-1}}}{(j-1)!\mathrm{~}(-1)^i\cdot t^{s+i-j}}, \\ &\mathbf{W}_{ij}(t)=\frac{\sum_{k=0}^{s-\max{(i,j)}}\binom{s-k-1}{i-1}\binom{2s-j-k-1}{s-1}}{(j-1)!(-1)^{i+j}\cdot t^{s+i-j}}. \end{aligned} Uij={1/(i1)!0if i=j,if i=j,Vij(t)=(j1)! (1)its+ijk=0smax(i,j)(1)k(i+ks)(s12sjk1),Wij(t)=(j1)!(1)i+jts+ijk=0smax(i,j)(i1sk1)(s12sjk1).

   所以,我们可以直接通过 c = A B ( T ) d c=\mathbf{A}_{\mathrm{B}}(T)d c=AB(T)d解出所需要的多项式系数c


在这里插入图片描述


   边界条件、中间条件:航路点位置(方向)可以通过路径规划(A*,RRT* 等算法)得到,再利用上述思路求解BVP对其进行平滑。

在这里插入图片描述

   此外,一般来说,对于任意次的多项式轨迹,还需要检测其最大速率、加速度是否超过允许范围,是否碰撞障碍物等,那么如何保证所得到的轨迹始终(在0~T时间内均满足,而不是只在一些离散的点满足)满足这些约束呢?

在这里插入图片描述

   我们用下面的多元多项式G来表示这些约束:

   G ( a , b , c ) : = ∑ e 1 + e 2 + e 3 ≤ d g d c ∈ R , e j ∈ N d c ⋅ a e 1 b e 2 c e 3 G(a,b,c):=\sum_{e_1+e_2+e_3\leq d_g}^{d_c\in\mathbb{R},e_j\in\mathbb{N}}d_c\cdot a^{e_1}b^{e_2}c^{e_3} G(a,b,c):=e1+e2+e3dgdcR,ejNdcae1be2ce3

   比如速度小于1,可表示成 X ˙ ( 1 ) 2 + X ˙ 2 ( 2 ) + X ˙ 2 ( 3 ) ≤ 1 \sqrt{\dot X{(1)}^{2}+\dot{X}^2(2)+\dot{X}^{2}{(3)}}\leq1 X˙(1)2+X˙2(2)+X˙2(3) 1,也即 X ˙ ( 1 ) 2 + X ˙ 2 ( 2 ) + X ˙ 2 ( 3 ) ≤ 1 \dot{X}(1)^{2}+\dot{X}^{2}(2)+\dot{X}^{2}(3)\leq1 X˙(1)2+X˙2(2)+X˙2(3)1这样一个三元二次多项式,再比如圆形障碍物的半径为r,圆心为o,则与该障碍物不碰撞可以表示成 ( x − 0 ) T ( x − 0 ) ≥ r 2 (x-0)^{T}(x-0)\geq r^{2} (x0)T(x0)r2,也是一个关于x1、x2、x3的多元多项式。

   那么如何求类似于上面的多元多项式呢?

   第一种思路是通过离散时间采样的方式,如下图中左下角的示意图所示,其优点是比较灵活,不仅仅适应于多元多项式,它适应于任意形式的约束。其缺点是若采样分辨率较低,会出现不行点恰好没有采到的情况,若采样分辨率很高,则会占用较多的计算资源。

   第二种思路是通过递归边界检查的思路,当检查0 ~ T 时间内加速度是否满足要求时,可以采用加速度的模的最大值一定会小于三个轴里面的每个轴最大值的平方和,即满足 max ⁡ t ∈ T ∥ a ( t ) ∥ 2 ≤ ∑ i = 1 3 max ⁡ t ∈ T a i ( t ) 2 \max\limits_{t\in\mathcal{T}}\|a(t)\|^2\le\sum\limits_{i=1}^3\max\limits_{t\in\mathcal{T}}a_i(t)^2 tTmaxa(t)2i=13tTmaxai(t)2,如果超了,则轨迹不可行,如果没有超,则将轨迹二分,直到上界给出一个答案或者T已经被二分到很小的分辨率。该方法比第一种思路要快,但它不是很灵活,它不一定适合于其他形式的多项式、它的效果也是跟分辨率相关的、且存在一些不确定的情况。

   第三种思路是用的比较多的,直接检查v有没有超过最大值,将v的范数对t求导,其表达式如下:

   d v n o r m ( t ) d t = 2 ( p ˙ ( t ) x ⋅ p ¨ ( t ) x + p ˙ ( t ) y ⋅ p ¨ ( t ) y + p ˙ ( t ) z ⋅ p ¨ ( t ) z ) − ( p ˙ ( t ) x ) 2 + ( p ˙ ( t ) y ) 2 + ( p ˙ ( t ) z ) 2 \begin{aligned}\frac{dv_{\mathrm{norm}}(t)}{dt}&=\frac{2\left(\dot{p}(t)_x\cdot\ddot{p}(t)_x+\dot{p}(t)_y\cdot\ddot{p}(t)_y+\dot{p}(t)_z\cdot\ddot{p}(t)_z\right)}{-\sqrt{(\dot{p}(t)_x)^2+(\dot{p}(t)_y)^2+(\dot{p}(t)_z)^2}}\end{aligned} dtdvnorm(t)=(p˙(t)x)2+(p˙(t)y)2+(p˙(t)z)2 2(p˙(t)xp¨(t)x+p˙(t)yp¨(t)y+p˙(t)zp¨(t)z)

   求这样关于t的多元多项式的值,来得到最大的速度,从而判断其速度是否超过约束,比如下图中右下角的示意图中红色的轨迹超了,蓝色的轨迹没有超。这种方法需要我们去求多项式的根,当轨迹的次数比较高的时候,也需要采用近似迭代的方式,也不能求得解析解。其优点是效率是稳定的,他不需要递归,有时候需要数值迭代。

在这里插入图片描述


   以上的三种思路都有一定的局限性,那么有没有一种方案,可以对所有的由连续的多元多项式表示的约束进行检查呢?

   第四种方法的思想如下:

   约束是由多元多项式构成的,轨迹本身又是多元多项式,我们可以把轨迹代入到约束中,如下式所示,其中G本身是关于t的单元多项式

   G ( p 1 ( i ) ( t ) , p 2 ( i ) ( t ) , p 3 ( i ) ( t ) ) < 0 , ∀ t ∈ [ 0 , T ] G(p_1^{(i)}(t),p_2^{(i)}(t),p_3^{(i)}(t))<0,\quad\forall t\in[0,T] G(p1(i)(t),p2(i)(t),p3(i)(t))<0,t[0,T]

   我们可以先检查t=0和T时,即起始状态和终末状态是否满足多元多项式约束,若满足再检查(0,T)内是否满足多元多项式约束,也就等价于检查轨迹与约束平面有没有相交的点,也就是G(t)=0 在(0,T)内有没有根的问题,若有根则不满足。该问题可通过斯图姆定理(Sturm Theorem)求解

   下面先来了解几个概念,斯图姆序列(Sturm Sequence)中第0项是单元多项式 G ( t ) \mathcal{G}(t) G(t),第1项是单元多项式的导数 G ( t ) ˙ \dot{\mathcal{G}(t)} G(t)˙,第2项是第0项除以第1项所得的余项取反(这里采用的就是多项式除法),即 − g k + 1 ( t ) = R e m ( g k − 1 ( t ) , g k ( t ) ) -g_{k+1}(t)=Rem(g_{k-1}(t),g_k(t)) gk+1(t)=Rem(gk1(t),gk(t))。利用该表达式,我们同样可以得到第3项、第4项 …第n项,每求一次除法,余项的次数就减1,直至一个0次多项式常量,所以n是有限的。

在这里插入图片描述


   利用上面介绍的斯图姆序列(Sturm Sequence),我们可以很容易把G(t)在(0,T)内根的个数算出来,方法如下,我们定义一个V(t),将时间t代入到斯图姆序列 g 0 ( t ) g_0(t) g0(t) g 1 ( t ) g_1(t) g1(t) g 2 ( t ) g_2(t) g2(t)、… 、 g n ( t ) g_n(t) gn(t)中,统计从序列开始到结束其值正负变换的次数,如n=5时,将t代入后 g 0 ( t ) g_0(t) g0(t) ~ g 5 ( t ) g_5(t) g5(t)的值的正负分别为 + - - +++,则其符号变换了2次,即由正变为负再变为正,此时就定义V(t)=2。

   取t=0和t=T,分别得到起始状态和终末状态的V(0)、V(T)。则|V(T)-V(0)|的值,即为G(t)在(0,T)上实根的个数。

   再举一个具体的例子,当G(t)= 18 t − 27 t 2 + 10 t 3 − t 4 18t-27t^2+10t^3-t^4 18t27t2+10t3t4,计算在T取[-1,7]范围上根的个数,首先对端点-1和7处进行验证其值是否为0,若不为0(即两端点处满足约束),再使用以上方法验证(-1,7)上是否满足

   容易得到该实例的斯图姆序列为:

   G ( t ) = − t ( t − 1 ) ( t − 3 ) ( t − 6 ) = 18 t − 27 t 2 + 10 t 3 − t 4 , g 0 ( t ) = G ( t ) , g 1 ( t ) = 18 − 54 t + 30 t 2 − 4 t 3 , g 2 ( t ) = − 11.25 + 20.25 t − 5.25 t 2 , g 3 ( t ) = 13.2245 − 10.7755 t , g 4 ( t ) = − 5.69473. \begin{aligned} &G(t)=-t(t-1)(t-3)(t-6)=18t-27t^{2}+10t^{3}-t^{4}, \\ &g_{0}(t)=G(t), \\ &g_{1}(t)=18-54t+30t^{2}-4t^{3}, \\ &g_{2}(t)=-11.25+20.25t-5.25t^{2}, \\ &g_{3}(t)=13.2245-10.7755t, \\ &\begin{aligned}g_4(t)=&-5.69473.\end{aligned} \end{aligned} G(t)=t(t1)(t3)(t6)=18t27t2+10t3t4,g0(t)=G(t),g1(t)=1854t+30t24t3,g2(t)=11.25+20.25t5.25t2,g3(t)=13.224510.7755t,g4(t)=5.69473.

   当t=-1时, g 0 ( t ) g_0(t) g0(t) ~ g 4 ( t ) g_4(t) g4(t)值依次为-56.00,106.00,-36.75,24.00,-5.69,正负号变化了4次,所以V(-1)=4

   当t=7时, g 0 ( t ) g_0(t) g0(t) ~ g 4 ( t ) g_4(t) g4(t)值依为-168.00、-262.00,-126.75,-62.20,-5.69。,正负号变化了0次,所以V(7)=0

   所以G(t)在[-1,7]上根的个数为 |0-4|=4,有根,不满足约束,如下图中的绿色圆圈所示:

在这里插入图片描述

   有一种特殊情况需要注意,当序列的值中含有0项时,比如 -5、0、 -1 、0、2则将0项删除后,再判断符号变换次数,比如-5、 -1 、2,符号变换了1次。


   一但判断出G(t)=0在某个区间有没有根,我们就知道G(t)在该时间区间内有没有满足连续的约束。利用该方法直接去检查一个轨迹 p ( t ) = c 0 + c 1 t + . . . . + c 5 t 5 p(t)=c0+c_1t+....+c_5t^5 p(t)=c0+c1t+....+c5t5的速度有没有超最大速度约束2时,可得G(t)= p ˙ 1 2 + p ˙ 2 2 + p ˙ 3 2 − 4 ≤ 0 \dot{p}_1^{2}+\dot{p}^{2}_2+\dot{p}^{2}_3-4\leq0 p˙12+p˙22+p˙3240,将 p ( t ) p(t) p(t)代入到G(t)中,算出该速度约束关于t的单元多项式,利用上面介绍的斯图姆定理(Sturm Theorem),可简单判断出是否有根,从而判断出是否满足约束。

   BVP可用于求解在复杂情况下RRT中状态点到状态点之间的连接,下图中给出了上面四种方法的性能对比:

在这里插入图片描述



   参考资料:

   1、深蓝学院-移动机器人运动规划


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/281066.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

8868体育助力意甲罗马俱乐部 迪巴拉有望付出

8868体育助力意甲罗马俱乐部 迪巴拉有望付出 意甲罗马俱乐部是8868体育合作球队之一&#xff0c;本赛季&#xff0c;在意甲第14轮的比赛中&#xff0c;罗马客场2-1战胜萨索洛&#xff0c;积分上升到意甲第4位。 有报道称&#xff0c;迪巴拉在对阵佛罗伦萨的比赛中受伤&#xff…

操作注册表

命令说明&#xff1a; regedit&#xff08;快速打开注册表命令&#xff09; reg query 显示注册表的所有子项和值 reg delete 从注册表删除项或值 /v EntryName &#xff08;注册表项和子项名称&#xff09; 删除子项下的特定项。如果未指定子项&#xff0c;则将删除子项…

将本地工作空间robot_ws上传到gitee仓库

git config --global user.name "geniusChinaHN" git config --global user.email "12705243geniuschinahnuser.noreply.gitee.com" cd ~/robot_ws #git init#创建原始仓库时候用 git add . git commit -m "上传文件内容描述" #git remote add r…

ISO27001 信息安全管理体系认证,让你的信息安全无懈可击

你是否担心过自己的个人信息被泄露&#xff1f;你的企业是否因为信息安全问题而遭受过损失&#xff1f;如果是&#xff0c;那么你一定不能错过 ISO27001 信息安全管理体系认证&#xff01; &#x1f31f;什么是 ISO27001 认证&#xff1f; ISO27001 是由国际标准化组织&#xf…

设计模式之初始设计模式和UML图

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

SNMP获取Linux系统信息

snmp测试 snmpwalk -v 2c -c public123 192.168.227.133 system[rootlocalhost ~]# snmpwalk -v 2c -c public123 192.168.227.133 system SNMPv2-MIB::sysDescr.0 STRING: Linux localhost.localdomain 5.10.0-60.18.0.50.oe2203.x86_64 #1 SMP Wed Mar 30 03:12:24 UTC 202…

2022年全球运维大会(GOPS深圳站)-核心PPT资料下载

一、峰会简介 GOPS 主要面向运维行业的中高端技术人员&#xff0c;包括运维、开发、测试、架构师等群体。目的在于帮助IT技术从业者系统学习了解相关知识体系&#xff0c;让创新技术推动社会进步。您将会看到国内外知名企业的相关技术案例&#xff0c;也能与国内顶尖的技术专家…

Unity坦克大战开发全流程——1)需求分析

实践项目&#xff1a;需求分析 该游戏共有三个主要部分&#xff1a;UI、数据储存、核心游戏逻辑&#xff0c;下面我们将从开始场景、游戏场景、结束场景三个角度切入进行分析。

教练技术中要注意的两点

今天看到2022 china devopsday中陈老师不错的关于教练技术描述的两个注意点的PPT&#xff0c;不错&#xff0c;分享下&#xff1a;

fastjosn利用分析

fastjosn一般是使用TemplatesImpl链来进行攻击的&#xff0c;在上面其实已经分析过fastjson在反序列化的时候会调用满足条件的getter方法&#xff0c;因此就会调用TemplatesImpl类的getOutputProperties方法&#xff0c;然后通过getOutputProperties&#xff0c;调用newTransfo…

Linux权限的基本理解

一:&#x1f6a9;Linux中的用户 1.1&#x1f966;用户的分类 &#x1f31f;在Linux中用户可以被分为两种用户: 超级用户(root):可以在Linux系统中做各种事情而不被约束普通用户:只能做有限的事情被权限约束 在实际操作时超级用户的命令提示符为#,普通用户的命令提示符为$,可…

react+redux+antd-mobile 之 记账本案例

1.环境搭建 //使用CRA创建项目&#xff0c;并安装必要依赖&#xff0c;包括下列基础包 //1. Redux状态管理 - reduxjs/toolkit 、 react-redux //2. 路由 - react-router-dom //3. 时间处理 - dayjs //4. class类名处理 - classnames //5. 移动端组件库 - antd-mobile //6. 请…

论文阅读——EfficientViT(cvpr2023)

EfficientViT: Memory Efficient Vision Transformer with Cascaded Group Attention 1、 从三个角度探讨如何提高vision transformers的效率&#xff1a;内存访问、计算冗余和参数使用。 2.1. Memory Efficiency 红色字体表示操作所花费的时间主要由内存访问决定&#xff0c;…

DHCP学习记录

目录 客户端向DHCP服务端申请租用IP的4个阶段: 客户端向HDCP服务器续租IP过程: 客户端重新连接租用IP过程: 客户端释放IP 声明: (Dynamic Host Configuration Protocol)动态主机配置协议&#xff0c;客户端向DHCP服务端申请获得ip的一种约定俗成的话语(协议) 手工配置方式…

Docker单点部署Seata(2.0.0) + Nacos(v2.3.0) + Mysql(5.7)

文章目录 一、部署Nacos二、部署Mysql三、Seata准备工作1. 记住nacos、mysql、宿主机的ip2. 建立数据库3. Nacos远程配置文件 四、部署Seata五、初步检验Seata部署情况六、微服务使用Seata1.引入依赖2. application.yml配置 七、遇到的坑1. Nacos显示Seata服务的ip为容器内网ip…

前端基础知识大汇总(建议收藏)

前言 这些内容主要是针对我自己的薄弱知识点进行的总结&#xff0c;目前正在准备面试中&#xff0c;有一些内容会写得特别特别详细&#xff0c;而有一些内容则写得比较少&#xff0c;但是保证里面的很多内容都是干货&#xff0c;很多都有详细的解释&#xff0c;干货都在后面啊…

网络层解读

基本介绍 概述 当两台主机之间的距离较远(如相隔几十或几百公里&#xff0c;甚至几千公里)时&#xff0c;就需要另一种结构的网络&#xff0c;即广域网。广域网尚无严格的定义。通常是指覆盖范围很广(远超过一个城市的范围)的长距离的单个网络。它由一些结点交换机以及连接这些…

redis客户端

3、Redis客户端 3.1 Redis自带的客户端 带密码进入客户端 [rootqianfeng01 redis-4.0.14]# src/redis-cli -h 192.168.10.101 -p 6379 -a root Warning: Using a password with -a option on the command line interface may not be safe. 192.168.10.101:6379> keys * (…

DevEco Studio4.0 Beta2集成ArkUI-X(开发鸿蒙,安卓.ios应用)/ACE Tools脚手架

ArkUI-X简介 ArkUI-X进一步将ArkUI扩展到了多个OS平台&#xff1a;目前支持OpenHarmony、HarmonyOS、Android、 iOS&#xff0c;后续会逐步增加更多平台支持。开发者基于一套主代码&#xff0c;就可以构建支持多平台的精美、高性能应用 该框架对应的IDE版本为 4.0 Beta2 &…

【Spark精讲】一文讲透SparkSQL聚合过程以及UDAF开发

SparkSQL聚合过程 这里的 Partial 方式表示聚合函数的模式&#xff0c;能够支持预先局部聚合&#xff0c;这方面的内容会在下一节详细介绍。 对应实例中的聚合语句&#xff0c;因为 count 函数支持 Partial 方式&#xff0c;因此调用的是 planAggregateWithoutDistinct 方法&a…