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

   本系列文章是学习深蓝学院-移动机器人运动规划课程第五章最优轨迹生成 过程中所记录的笔记,本系列文章共包含四篇文章,依次介绍了微分平坦特性、无约束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=0n10Δti∣∣Φi(q)(t)2dt=Φi+1(k)(0),k=0q and i=1N2,=us(k),ΦN1(k)(ΔtN1)=ug(k),k=0q,bi,i=0N1.

   该问题与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)=pitif(4)(t˙)=i(i1)(i2)(i3)ti4pi(f(4)(t))=2i4i4,l4i(i1)(i2)(i3)l(l1)(l2)(l3)ti+l8piplJ(T)=Tj1Tj(f4(t))2dt=i4,l4i+l7i(i1)(i2)(i3)j(l1)(l2)(l3)(Tji+l7Tj1i+l7)piplJ(T)=Tj1Tj(f4(t))2dt= pi T i+l7i(i1)(i2)(i3)l(l1)(l2)(l3)Ti+l7 pl Jj(T)=pjTQjpj

   其中Q是二次型矩阵,P是多项式的系数,所以给定一个多项式,给定 T j − 1 T_{j-1} Tj1 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)ik(ik)!i!Tjikpj,i=xT,j(k)[(ik)!i!Tjik] pj,i =xT,j(k) ......(ik)!i!Tj1ik(ik)!i!Tjik...... 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)ik(ik)!i!Tjikpj,ilk(lk)!l!Tjlkpj+1,l=0[(ik)!i!Tjik(lk)!l!Tjlk] pj,ipj+1,l =0[AjAj+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θ)yC.

   如果一个问题具有凸的函数,并且它的不等式约束构成的集合是一个凸集合,则将其称为凸优化问题

在这里插入图片描述

   一般来说要求等式约束是线性的,不等式约束是凸的

在这里插入图片描述


   如何把常见的轨迹优化转换成凸优化问题呢,应该转换成什么类的凸优化呢。最简单的就是线性规划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+biciTx+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、深蓝学院-移动机器人运动规划


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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

9. 回文数

给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 例如&#xff0c;121 是回文&#xff0c;而…

关于Python里xlwings库对Excel表格的操作(二十四)

这篇小笔记主要记录如何【如何使用xlwings库中的“api”类设置单元格边界线型、粗细、颜色】。前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】 &#xff08;1&#xff09;如何安装导入xlwings库&#xff1b;…

在Google Colab中调用Gemini的API实现智能问答

一、引言 Google终于放出大招&#xff0c;在2023年12月6日正式推出规模最大、功能最强大的人工智能模型Gemini&#xff0c;对标ChatGPT&#xff0c;甚至有要赶超ChatGPT-4.0的节奏。 相比之前的Bard&#xff0c;Gemini的文本理解能力、图片识别能力和语义抽取能力大大增强&am…

[C#]使用ONNXRuntime部署一种用于边缘检测的轻量级密集卷积神经网络LDC

源码地址&#xff1a; github.com/xavysp/LDC LDC: Lightweight Dense CNN for Edge Detection算法介绍&#xff1a; 由于深度学习方法的快速发展&#xff0c;近年来&#xff0c;用于执行图像边缘检测的卷积神经网络&#xff08;CNN&#xff09;模型爆炸性地传播。但边缘检测…

山西电力市场日前价格预测【2024-01-02】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-01-02&#xff09;山西电力市场全天平均日前电价为92.93元/MWh。其中&#xff0c;最高日前电价为275.90元/MWh&#xff0c;预计出现在18:00。最低日前电价为0.00元/MWh&#xff0c;预计出现…

磁盘阵列(RAID)

1.独立硬盘冗余阵列&#xff08;RAID, Redundant Array of Independent Disks&#xff09; 旧称廉价磁盘冗余阵列&#xff08;Redundant Array of Inexpensive Disks&#xff09;&#xff0c;简称磁盘阵列 用虚拟化存储技术把多个硬盘组合起来&#xff0c;成为一个或多个硬盘阵…

基于JAVA的酒店管理系统设计

摘 要 我们对酒店进行调研&#xff0c;发现部分酒店依托第三方平台&#xff0c;但第三方平台没有办法更好帮助酒店管理&#xff0c;故我们决定帮助酒店开发一套基于 Java 的酒店管理系统。使用基于Java的酒店管理系统可以帮助酒店完成顾客入住信息的管理&#xff0c;酒店物资的…

Python进行批量字符替换的3种方法

一、问题的提出 之前&#xff0c;我写过一篇如何在word中计算数学算式&#xff1a; 如何用Python批量计算Word中的算式-CSDN博客 为了计算算式&#xff0c;就需要对算式进行格式化&#xff0c;把不规则的算式转换成规则的算式&#xff0c;这时就会涉及到一些字符的批量替换。…

基于蚁狮算法优化的Elman神经网络数据预测 - 附代码

基于蚁狮算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于蚁狮算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于蚁狮优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针…

分布式系统架构设计之分布式数据存储的扩展方式、主从复制以及分布式一致性

三、水平扩展和垂直扩展 在分布式系统中&#xff0c;数据存储的扩展是为了适应业务的增长和提高系统的性能。分为水平扩展和垂直扩展两种方式&#xff0c;这两种方式在架构设计和应用场景上有着不同的优势和局限性。 水平扩展 水平扩展是通过增加节点或服务器的数量来扩大整…

【NLP论文】03 基于 jiagu 的情感分析

本篇是NLP论文系列的最后一篇&#xff0c;主要介绍如何计算情感分析结果&#xff0c;并将其融入到XX评价体系和物流关键词词库&#xff0c;之前我已经写了两篇关于情感分析的文章&#xff0c;分别是 SnowNLP 和 Cemotion 技术&#xff0c;最终我才用了 jiagu 来写我的论文&…

【MyBatis】操作数据库——入门

文章目录 为什么要学习MyBatis什么是MyBatisMyBatis 入门创建带有MyBatis框架的SpringBoot项目数据准备在配置文件中配置数据库相关信息实现持久层代码单元测试 为什么要学习MyBatis 前面我们肯定多多少少学过 sql 语言&#xff0c;sql 语言是一种操作数据库的一类语言&#x…