Minimum Snap轨迹规划详解(二)- 闭式求解


转载自https://blog.csdn.net/q597967420/article/details/79031791
如果QP问题只有等式约束没有不等式约束,那么是可以闭式求解(close form)的。闭式求解效率要快很多,而且只需要用到矩阵运算,不需要QPsolver。
这里介绍Nicholas Roy文章中闭式求解的方法。

1.QP等式约束构建

闭式法中的 Q Q Q矩阵计算和之前一样,但约束的形式与之前略为不同,在之前的方法中,等式约束只要构造成 [ . . . ] p = b [...]p=b [...]p=b的形式就可以了,而闭式法中,每段poly都构造成
M i p i = d i M i = [ M 0 M t ] i T , d i = [ d 0 , d T ] i M_ip_i=d_i \\ M_i=[M_0\quad M_t]^T_i,\\ d_i=[d_0,d_T]_i Mipi=diMi=[M0Mt]iT,di=[d0,dT]i
其中 d 0 , d T d_0,d_T d0,dT为第 i i i段poly的起点和终点的各阶导数组成的向量,比如只考虑PVA: d 0 = [ p 0 , v 0 , a 0 ] T ] d_0=[p_0,v_0,a_0]^T] d0=[p0,v0,a0]T],当然也可以把jerk,snap等加入到向量。注意:这里是不管每段端点的PVA是否已知,都写进来。
块合并各段轨迹的约束方程得到
M t o t a l ⏟ k ( n + 1 ) × 6 k [ p 1 ⋮ p k ] = [ d 1 ⋮ d k ] = [ p 1 ( t 0 ) v 1 ( t 0 ) a 1 ( t 0 ) p 1 ( t 1 ) v 1 ( t 1 ) a 1 ( t 1 ) ⋮ p k ( t k − 1 ) v k ( t k − 1 ) a k ( t k − 1 ) p k ( t k ) v k ( t k ) a k ( t k ) ] 6 k × 1 \begin{aligned} \underbrace{M_{total}}_{k(n+1)\times 6k} \begin{bmatrix}p_1\\\vdots\\ p_k\end{bmatrix} =\begin{bmatrix}d_1\\\vdots \\d_k\end{bmatrix} =\begin{bmatrix}p_1(t_0)\\v_1(t_0)\\a_1(t_0)\\p_1(t_1)\\v_1(t_1)\\a_1(t_1)\\ \vdots \\p_k(t_{k−1})\\v_k(t_{k−1})\\a_k(t_{k−1})\\p_k(t_k)\\v_k(t_k)\\a_k(t_k)\end{bmatrix}_{6k\times 1} \end{aligned} k(n+1)×6k Mtotalp1pk=d1dk=p1(t0)v1(t0)a1(t0)p1(t1)v1(t1)a1(t1)pk(tk1)vk(tk1)ak(tk1)pk(tk)vk(tk)ak(tk)6k×1
k k k为轨迹段数, n n n为轨迹的阶数,设只考虑pva, M t o t a l M_{total} Mtotal的size为 ( n o r d e r + 1 ) k × 6 k (n_{order}+1)k\times 6k (norder+1)k×6k。这里为了简化,没有把每段poly的timestamp都改成从0开始,一般,为了避免timestamp太大引起数值问题,每段poly的timestamp都成0开始。

由上式可以看到, M t o t a l M_{total} Mtotal是已知的(怎么构造可参见文章一种的等式约束构造方法),而 d d d中只有少部分(起点、终点的pva等)是已知的,其他大部分是未知的。如果能够求出 d d d,那么轨迹参数可以通过 p = M − 1 d p=M^{−1}d p=M1d很容易求得。

2. 如何求d?

闭式法的思路是:将 d d d向量中的变量分成两部分:”d中所有已知量组成的Fix部分 d F d_F dF”和”所有未知量组成的Free部分 d P d_P dP”。然后通过推导,根据 d F d_F dF求得 d P d_P dP,从而得到 d d d,最后求得 p p p
使得 d = C [ d F d P ] d=C\begin{bmatrix}d_F\\d_P\end{bmatrix} d=C[dFdP]
下面介绍整个推导过程,

2.1. 消除重复变量(连续性约束)

可以会发现,上面构造等式约束时,并没有加入连续性约束,连续性约束并不是直接加到等式约束中。考虑到连续性(这里假设PVA连续), d d d向量中很多变量其实重复了,即
p i ( t i ) = p i + 1 ( t i ) v i ( t i ) = v i + 1 ( t i ) a i ( t i ) = a i + 1 ( t i ) \begin{aligned} p_i(t_i)&=p_{i+1}(t_i)\\ v_i(t_i)&=v_{i+1}(t_i)\\ a_i(t_i)&=a_{i+1}(t_i) \end{aligned} pi(ti)vi(ti)ai(ti)=pi+1(ti)=vi+1(ti)=ai+1(ti)
因此需要一个映射矩阵将一个变量映射到两个重复的变量上,怎么映射?

  • [ a a ] = [ 1 1 ] a \begin{bmatrix}a\\a\end{bmatrix}=\begin{bmatrix}1\\1\end{bmatrix}a [aa]=[11]a,将变量 a a a映射到左边向量中的两个变量。
    所以构造映射矩阵 C 1 ( 6 k × 3 ( k + 1 ) ) C_{1(6k\times 3(k+1))} C1(6k×3(k+1))
    [ d 1 ⋮ d k ] 6 k × 1 = [ 1 1 1 1 1 1 1 1 1 ⋱ ] [ p ( t 0 ) v ( t 0 ) a ( t 0 ) p ( t 1 ) v ( t 1 ) a ( t 1 ) p ( t 2 ) v ( t 2 ) a ( t 2 ) ⋮ p ( t k ) v ( t k ) a ( t k ) ] 3 ( k + 1 ) × 1 \begin{bmatrix} d_1\\ \vdots \\d_k \end{bmatrix}_{6k\times 1} = \begin{bmatrix} 1&&&&&&\\ &1&&&&&\\ &&1&&&&\\ &&&1&&&\\ &&&&1&&\\ &&&&&1&\\ &&&1&&&\\ &&&&1&&\\ &&&&&1&\\ &&&&&&\ddots \end{bmatrix} \begin{bmatrix} p(t_0)\\v(t_0)\\a(t_0)\\p(t_1)\\v(t_1)\\a(t_1)\\p(t_2)\\v(t_2)\\a(t_2)\\\vdots \\p(t_k)\\v(t_k)\\a(t_k) \end{bmatrix}_{3(k+1)\times1} d1dk6k×1=111111111p(t0)v(t0)a(t0)p(t1)v(t1)a(t1)p(t2)v(t2)a(t2)p(tk)v(tk)a(tk)3(k+1)×1

d = C 1 d ′ d=C_1d^\prime d=C1d

2.2 向量元素置换

消除掉重复变量之后,需要调整 d ′ d^\prime d中的变量,把fix部分和free部分分开排列,可以左成一个置换矩阵 C 2 C_2 C2,使得
d ′ = C 2 [ d F d P ] d^\prime=C_2\begin{bmatrix}d_F\\d_P\end{bmatrix} d=C2[dFdP]
C 2 C_2 C2矩阵怎么构造?

  • 举个例子,设 d ′ = [ a b c d ] d^\prime=\begin{bmatrix}a\\b\\c\\d\end{bmatrix} d=abcd,其中 a , c , d a,c,d a,c,d是已知( d F d_F dF), b b b未知( d P d_P dP),构造一个 4 × 4 4\times4 4×4的单位阵,取 d F d_F dF所在的(1,3,4)列放到左边,再取 d P d_P dP所在的(2)列放到右边,就构造出置换矩阵 C 2 C_2 C2
    [ a b c d ] = [ 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 ] = [ a c d b ] \begin{bmatrix}a\\b\\c\\d\end{bmatrix}= \begin{bmatrix}1&0&0&0\\0&0&0&1\\ 0&1&0&0\\0&0&1&0\end{bmatrix} = \begin{bmatrix}a\\c\\d\\b\end{bmatrix} abcd=1000001000010100=acdb
2.3 转成无约束优化问题

由上面两步可得
d = C 1 C 2 [ d F d P ] = C [ d F d P ] p = M − 1 d = M − 1 C [ d F d P ] \begin{aligned} d&=C_1C_2\begin{bmatrix}d_F\\d_P\end{bmatrix}=C\begin{bmatrix}d_F\\d_P\end{bmatrix}\\ p&=M^{-1}d=M^{-1}C\begin{bmatrix}d_F\\d_P\end{bmatrix} \end{aligned} dp=C1C2[dFdP]=C[dFdP]=M1d=M1C[dFdP]
代入优化函数
J = p T Q p = [ d F d P ] T C T M − T Q M − 1 C [ d F d P ] = [ d F d P ] T R [ d F d P ] = [ d F d P ] T [ R F F R F P R P F R P P ] [ d F d P ] = d F T R F F d F + d F T R F P d P + d P T R P F d F + d P T R P P d P \begin{aligned} J&=p^TQp = \begin{bmatrix}d_F\\d_P\end{bmatrix}^TC^TM^{-T}QM^{-1}C\begin{bmatrix}d_F\\d_P\end{bmatrix} \\ &= \begin{bmatrix}d_F\\d_P\end{bmatrix}^TR\begin{bmatrix}d_F\\d_P\end{bmatrix} =\begin{bmatrix}d_F\\d_P\end{bmatrix}^T \begin{bmatrix}R_{FF} & R_{FP} \\R_{PF} & R_{PP} \end{bmatrix} \begin{bmatrix}d_F\\d_P\end{bmatrix}\\ &=d^T_FR_{FF} d_F + d^T_FR_{FP} d_P+d^T_PR_{PF} d_F+d^T_PR_{PP} d_P \end{aligned} J=pTQp=[dFdP]TCTMTQM1C[dFdP]=[dFdP]TR[dFdP]=[dFdP]T[RFFRPFRFPRPP][dFdP]=dFTRFFdF+dFTRFPdP+dPTRPFdF+dPTRPPdP
J J J d P d_P dP的导数 ∂ J ∂ d P = 0 \frac{\partial J}{\partial d_P}=0 dPJ=0求极值点:
2 d F T R F P + 2 d P T R P P = 0 d P = − R P P − 1 R F P T d F \begin{aligned} 2d_F^TR_{FP} + 2d^T_PR_{PP} =0\\ d_P = -R^{-1}_{PP}R^T_{FP}d_F \end{aligned} 2dFTRFP+2dPTRPP=0dP=RPP1RFPTdF

至此求得 d P d_P dP,从而求出 p p p

3. 闭式法步骤

总结一下整个闭式法的步骤:

  • 先确定轨迹阶数(比如5阶),再确定 d d d向量中的约束量(pva),进而根据各段的时间分配求得 M t o t a l M_{total} Mtotal
  • 根据连续性约束构造映射矩阵 C 1 C_1 C1,并确定 d d d向量中哪些量是Fix(比如起点终点pva,中间点的p等),哪些量是Free,进而构造置换矩阵 C 2 C_2 C2,并求得 C = C 1 C 2 C=C_1C_2 C=C1C2
  • 计算QP目标函数中的Q( min ⁡ J e r k / S n a p \min Jerk/Snap minJerk/Snap)并计算 R = C T M − T Q M − 1 C R=C^TM^{-T}QM^{-1}C R=CTMTQM1C,根据fix变量的长度将R拆分成 R F F , R F P , R P F , R P P R_{FF},R_{FP},R_{PF},R_{PP} RFF,RFP,RPF,RPP四块。
  • 填入已知变量得到 d F d_F dF,并根据 d p = − R P P − 1 R F P T d F d_p=−R^{−1}_{PP}R^T_{FP}d_F dp=RPP1RFPTdF计算得到 d P d_P dP
  • 根据公式 p = M − 1 C [ d F d P ] p=M^{-1}C\begin{bmatrix}d_F\\d_P\end{bmatrix} p=M1C[dFdP]计算得到轨迹参数p。
  • 闭式法主要计算量就在A矩阵的求逆,其他计算基本上是矩阵构造,所以效率比较高,但由于没有不等式约束,所以在中间点只能加强约束,corridor不能直接加到QP问题中,只能是通过压点来实现corridor。
    在对计算效率要求比较高或者不想用QPsolver时,可以使用闭式法求解。

代码见这里,由于效果和文章一中的效果一样,这里就不再贴图。

参考文献

Richter C, Bry A, Roy N. Polynomial trajectory planning for aggressive quadrotor flight in dense indoor environments[M]//Robotics Research. Springer International Publishing, 2016: 649-666.

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值