1. 轨迹规划是什么?

在机器人导航过程中,如何控制机器人从A点移动到B点,通常称之为运动规划。运动规划一般又分为两步:

  1. 路径规划:在地图(栅格地图、四\八叉树、RRT地图等)中搜索一条从A点到B点的路径,由一系列离散的空间点(waypoint)组成。
  2. 轨迹规划:由于路径点可能比较稀疏、而且不平滑,为了能更好的控制机器人运动,需要将稀疏的路径点变成平滑的曲线或稠密的轨迹点,也就是轨迹。

2. 轨迹是什么?

轨迹一般用n阶多项式(polynomial)来表示,即

p(t)=p0+p1t+p2t2...+pntn=∑i=0npiti

p(t) = p_0+p_1t+p_2t^2...+p_nt^n=\sum_{i=0}^{n}p_it^i
其中 p0,p1,...,pnp_0,p_1,...,p_n为轨迹参数(n+1个),设参数向量 p=[p0,p1,...,pn]Tp=[p_0,p_1,...,p_n]^T,则轨迹可以写成向量形式,

p(t)=[1,t,t2,...,tn]⋅p

p(t) = [1,t,t^2,...,t^n]\cdot p
对于任意时刻 tt,可以根据参数计算出轨迹的位置P(osition),速度V(elocity),加速度A(cceleration),jerk,snap等。

v(t)=p′(t)=[0,1,2t,3t2,4t3,...,ntn−1]⋅pa(t)=p′′(t)=[0,0,2,6t,12t2,...,n(n−1)tn−2]⋅pjerk(t)=p(3)(t)=[0,0,0,6,24t,...,n!(n−3!)tn−3]⋅psnap(t)=p(4)(t)=[0,0,0,0,24,...,n!(n−4!)tn−4]⋅p

\begin{equation} v(t) = p'(t) = [0,1,2t,3t^2,4t^3,...,nt^{n-1}]\cdot p\\ a(t) = p''(t)=[0,0,2,6t,12t^2,...,n(n-1)t^{n-2}]\cdot p\\ jerk(t)=p^{(3)}(t) =[0,0,0,6,24t,...,\frac{n!}{(n-3!)}t^{n-3}]\cdot p \\ snap(t)=p^{(4)}(t) =[0,0,0,0,24,...,\frac{n!}{(n-4!)}t^{n-4}]\cdot p \end{equation}

一个多项式曲线过于简单,一段复杂的轨迹很难用一个多项式表示,所以将轨迹按时间分成多段,每段各用一条多项式曲线表示,形如:

p(t)=⎧⎩⎨⎪⎪⎪⎪⎪⎪[1,t,t2,...,tn]⋅p1   t0≤t<t1[1,t,t2,...,tn]⋅p2   t1≤t<t2...[1,t,t2,...,tn]⋅pk   tk−1≤t<tk

\begin{equation} p(t) = \begin{cases} [1,t,t^2,...,t^n]\cdot p_1~~~t_0\leq t
kk为轨迹的段数,pi=[pi0,pi1,...,pin]Tp_i=[p_{i_0},p_{i_1},...,p_{i_n}]^T为第i段轨迹的参数向量。

此外,实际问题中的轨迹往往是二维、三维甚至更高维,通常每个维度单独求解轨迹。

3. Minimum Snap轨迹规划

轨迹规划的目的:求轨迹的多项式参数p1,...,pkp_1,...,p_k。
我们可能希望轨迹满足一系列的约束条件,比如:希望设定起点和终点的位置、速度或加速度,希望相邻轨迹连接处平滑(位置连续、速度连续等),希望轨迹经过某些路径点,设定最大速度、最大加速度等,甚至是希望轨迹在规定空间内(corridor)等等。
通常满足约束条件的轨迹有无数条,而实际问题中,往往需要一条特定的轨迹,所以又需要构建一个最优的函数,在可行的轨迹中找出“最优”的那条特定的轨迹。
所以,我们将问题建模(fomulate)成一个约束优化问题,形如:

minf(p)s.t.  Aeqp=beq,        Aieqp≤bieq

\begin{equation} \min f(p)\\ s.t.~~A_{eq}p = b_{eq},\\ ~~~~~~~~A_{ieq}p \leq b_{ieq} \end{equation}
这样,就可以通过最优化的方法求解出目标轨迹参数 pp。注意:这里的轨迹参数pp是多端polynomial组成的大参数向量 p=[pT1,pT2,...,pTk]Tp = [p_1^T,p_2^T,...,p_k^T]^T。
我们要做的就是: 将优化问题中的f(p)f(p)函数和Aeq,beq,Aieq,bieqA_{eq},b_{eq},A_{ieq},b_{ieq}参数给列出来,然后丢到优化器中求解轨迹参数p。
Minimum Snap顾名思义,Minimum Snap中的最小化目标函数是Snap(加加加速度),当然你也可以最小化Acceleration(加速度)或者Jerk(加加速度),至于它们之间有什么区别,quora上有讨论。一般不会最小化速度。

minimum snap: minf(p)=min(p(4)(t))2minimum jerk: minf(p)=min(p(3)(t))2minimum acce: minf(p)=min(p(2)(t))2

\begin{equation} minimum~snap:~\min f(p)=\min (p^{(4)}(t))^2 \\ minimum~jerk:~\min f(p)=\min (p^{(3)}(t))^2 \\ minimum~acce:~\min f(p)=\min (p^{(2)}(t))^2 \\ \end{equation}

4. 一个简单的例子

给定包含起点终点在内的k+1个二维路径点pt0,pt1,...,ptk,pti=(xi,yi)pt_0,pt_1,...,pt_k,pt_i=(x_i,y_i),给定起始速度和加速度为v0,a0v_0,a_0,末端加速度为ve,aev_e,a_e,给定时间T,规划出经过所有路径点的平滑轨迹。

a. 初始轨迹分段与时间分配

根据路径点,将轨迹分为k段,计算每段的距离,按距离平分时间T(匀速时间分配),得到时间序列t0,t1,...,tkt_0,t_1,...,t_k。对x,y维度单独规划轨迹。后面只讨论一个维度。
时间分配的方法:匀速分配或梯形分配,假设每段polynomial内速度满足匀速或梯形速度变化,根据每段的距离将总时间T分配到每段。
这里的轨迹分段和时间分配都是初始分配,在迭代算法中,如果corridor check和feasibility check不满足条件,会插点或增大某一段的时间,这个后续细说。

b. 构建优化函数

Minimum Snap的优化函数为:

min∫T0(p(4)(t))2dt=min∑i=1k∫titi−1(p(4)(t))2dt=min∑i=1k∫titi−1([0,0,0,0,24,...,n!(n−4!)tn−4]⋅p)T[0,0,0,0,24,...,n!(n−4!)tn−4]⋅p dt=min∑i=1kpT∫titi−1[0,0,0,0,24,...,n!(n−4!)tn−4]T[0,0,0,0,24,...,n!(n−4!)tn−4] dt p=min∑i=1kpTQip

\begin{equation}\min \int _0^T(p^{(4)}(t))^2 {\rm d}t\\=\min \sum_{i=1}^k \int _{t_{i-1}}^{t_i}(p^{(4)}(t))^2 {\rm d}t\\=\min \sum_{i=1}^k \int _{t_{i-1}}^{t_i} ([0,0,0,0,24,...,\frac{n!}{(n-4!)}t^{n-4}]\cdot p)^T[0,0,0,0,24,...,\frac{n!}{(n-4!)}t^{n-4}]\cdot p~{\rm d}t\\=\min \sum_{i=1}^k p^T\int _{t_{i-1}}^{t_i}[0,0,0,0,24,...,\frac{n!}{(n-4!)}t^{n-4}]^T[0,0,0,0,24,...,\frac{n!}{(n-4!)}t^{n-4}]~{\rm d}t~p\\=\min \sum_{i=1}^k p^TQ_ip \end{equation}
其中,

Qi=∫titi−1[0,0,0,0,24,...,n!(n−4!)tn−4]T[0,0,0,0,24,...,n!(n−4!)tn−4] dt=⎡⎣⎢04×40(n−3)×404×(n−3)r!(r−4)!c!(c−4)!1(r−4)+(c−4)+1(t(r+c−7)i−t(r+c−7)i−1)⎤⎦⎥

\begin{equation} Q_i = \int _{t_{i-1}}^{t_i}[0,0,0,0,24,...,\frac{n!}{(n-4!)}t^{n-4}]^T[0,0,0,0,24,...,\frac{n!}{(n-4!)}t^{n-4}]~{\rm d}t \\ =\left[\begin{matrix} 0_{4\times 4} & 0_{4\times (n-3)}\\ 0_{(n-3) \times 4} & \frac{r!}{(r-4)!}\frac{c!}{(c-4)!}\frac{1}{(r-4)+(c-4)+1}(t_{i}^{(r+c-7)}-t_{i-1}^{(r+c-7)}) \end{matrix}\right] \end{equation}
注意:r,c为矩阵的行索引和列索引, 索引从0开始,即第一行r=0

Q=⎡⎣⎢⎢⎢⎢⎢Q1Q2⋱Qk⎤⎦⎥⎥⎥⎥⎥minpTQp

\begin{equation}Q = \left[\begin{matrix}Q_1 &&&\\&Q_2&&\\&&\ddots &\\&&&Q_k\end{matrix}\right] \\\min p^TQp \end{equation}
可以看到,问题建模成了一个数学上的二次规划(Quadratic Programming,QP)问题。

c. 构建等式约束方程

  1. 设定某一个点的位置、速度、加速度或者更高为一个特定的值,可以构成一个等式约束。例如:

    位置约束:[1,t0,t20,...,tn0,0...0(k−1)(n+1)]p=p0速度约束:[0,1,2t0,...,ntn−10,0...0(k−1)(n+1)]p=v0加速度约束:[0,0,2,...,n(n−1)tn−20,0...0(k−1)(n+1)]p=a0

    \begin{equation}位置约束:[1,t_0,t_0^2,...,t_0^n,\underbrace{0...0}_{(k-1)(n+1)}]p = p_0\\速度约束:[0,1,2t_0,...,nt_0^{n-1},\underbrace{0...0}_{(k-1)(n+1)}]p = v_0\\加速度约束:[0,0,2,...,n(n-1)t_0^{n-2},\underbrace{0...0}_{(k-1)(n+1)}]p = a_0 \end{equation}
    由于要过中间点,对中间点的位置也构建等式约束,方法同上。

  2. 相邻段之间的位置、速度、加速度连续可以构成一个等式约束,例如第i、i+1段的位置连续构成的等式约束为
    [0...0(i−1)(n+1),1,ti,t2i,...,tni,−1,−ti,−t2i,...,−tni,0...0(k−i−1)(n+1)]p=0

    [\underbrace{0...0}_{(i-1)(n+1)},1,t_i,t_i^2,...,t_i^n,-1,-t_i,-t_i^2,...,-t_i^n,\underbrace{0...0}_{(k-i-1)(n+1)}]p=0
    速度、加速度连续类似,不再罗列。

合并所有等式约束,得到

⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢1,t0,t20,...,tn0,0...0(k−1)(n+1)0,1,2t0,...,ntn−10,0...0(k−1)(n+1)0,0,2,...,n(n−1)tn−20,0...0(k−1)(n+1)⋮0...0(i−1)(n+1),1,ti,t2i,...,tni,0...0(k−i)(n+1)⋮0...0(k−1)(n+1),1,tk,t2k,...,tnk0...0(k−1)(n+1),0,1,2tk,...,ntn−1k0...0(k−1)(n+1),0,0,2,...,n(n−1)tn−2k0...0(i−1)(n+1),1,ti,t2i,...,tni,−1,−ti,−t2i,...,−tni,0...0(k−i−1)(n+1)0...0(i−1)(n+1),0,1,2ti,...,ntn−1i,−0,−1,−2ti,...,−ntn−1i,0...0(k−i−1)(n+1)0...0(i−1)(n+1),0,0,2,...,n!(n−2)!tn−2i,−0,−0,−2,...,−n!(n−2)!tn−2i,0...0(k−i−1)(n+1)⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥(4k+2)×(n+1)kp=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢p0v0a0⋮pi⋮pkvkak0⋮0⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

\begin{equation} \left[\begin{matrix} 1,t_0,t_0^2,...,t_0^n,\underbrace{0...0}_{(k-1)(n+1)}\\ 0,1,2t_0,...,nt_0^{n-1},\underbrace{0...0}_{(k-1)(n+1)}\\ 0,0,2,...,n(n-1)t_0^{n-2},\underbrace{0...0}_{(k-1)(n+1)}\\ \vdots\\ \underbrace{0...0}_{(i-1)(n+1)} ,1,t_i,t_i^2,...,t_i^n,\underbrace{0...0}_{(k-i)(n+1)}\\ \vdots\\ \underbrace{0...0}_{(k-1)(n+1)},1,t_k,t_k^2,...,t_k^n\\ \underbrace{0...0}_{(k-1)(n+1)},0,1,2t_k,...,nt_k^{n-1}\\ \underbrace{0...0}_{(k-1)(n+1)},0,0,2,...,n(n-1)t_k^{n-2}\\ \underbrace{0...0}_{(i-1)(n+1)} ,1,t_i,t_i^2,...,t_i^n,-1,-t_i,-t_i^2,...,-t_i^n,\underbrace{0...0}_{(k-i-1)(n+1)}\\ \underbrace{0...0}_{(i-1)(n+1)} ,0,1,2t_i,...,nt_i^{n-1},-0,-1,-2t_i,...,-nt_i^{n-1},\underbrace{0...0}_{(k-i-1)(n+1)}\\ \underbrace{0...0}_{(i-1)(n+1)} ,0,0,2,...,\frac{n!}{(n-2)!}t_i^{n-2},-0,-0,-2,...,-\frac{n!}{(n-2)!}t_i^{n-2},\underbrace{0...0}_{(k-i-1)(n+1)}\\ \end{matrix}\right]_{(4k+2)\times (n+1)k}p=\\ \left[\begin{matrix} p_0\\ v_0\\ a_0\\ \vdots\\ p_i\\ \vdots\\ p_k\\ v_k\\ a_k\\ 0\\ \vdots\\ 0 \end{matrix}\right] \end{equation}
等式约束个数=3(起始PVA)+k-1(中间点的p)+3(终点pva)+3(k-1)(中间点PVA连续)=4k+2

d. 构建不等式约束

不等式约束与等式约束类似,也是设置某个点的P、V、A小于某一特定值,从而构建Aieqp=bieqA_{ieq}p=b_{ieq},不等式约束一般是在corridor中用的比较多,这里暂时先不使用不等式约束。

e. 求解

利用QP求解器进行求解,在MATLAB中可以使用quadprog() 函数,C++的QP求解器如OOQP,也可以自己去网上找。

实验结果

MATLAB代码在这里。
优化列表:

 min:snap等式约束:起点pva,终点pva,中间点的p,中间点pva连续不等式约束:无

生成x、y两个维度的轨迹,合并后如下图所示。包含起始终止共5个点,用四段poly来描述,中间点也就是poly之间的交界点。

5. 轨迹怎么用?(轨迹跟踪)

至此,我们已经求得了轨迹(很多段高阶多项式的参数),但怎么用来控制机器人运动呢?轨迹跟踪是:根据轨迹和机器人当前状态(当前位置、速度、加速度),输出机器人控制指令(速度、加速度、角速度等),控制机器人沿着轨迹运动。有很多种跟踪方法

  • 最简单的跟踪方法是位置控制:计算轨迹上离当前位置最近的点,以最近点为期望位置做位置控制,即v=kp(pnearest−pcur)v=k_p(p_{nearest}-p_{cur})
  • Minimum Snap中的前馈控制:计算轨迹上离最近点的(位置pep_e、速度vev_e、加速度aea_e),
    速度指令:v加速度前馈:a=ve=ae+kp(pe−pcur)+kd(ve−vcur)

    \begin{equation} \begin{aligned} 速度指令:v &= v_e\\ 加速度前馈:a&=a_e+k_p(p_e-p_{cur})+k_d(v_e-v_{cur}) \end{aligned} \end{equation}

6. 小结

  1. 轨迹规划问题通常建模成一个带约束的二次规划(QP)问题来求解,优化函数可以是snap、jerk、acceleration及它们的组合或其他任何能够formulate成pTQpp^TQp形式的函数,约束包括等式约束和不等式约束。
  2. 轨迹规划中默认时间t已知,通常根据期望速度和总路程计算一个总时间T,再按照匀速运动和梯形速度曲线分配到每段polynomial上。
  3. 上面例子中规划出的轨迹并不是很好,有以下问题:
    a) 轨迹与路径相差有点大,而且在第三个waypoint处会有打结的现象;
    b) y轴的加速度非常大(接近20m/s220m/s^2),超过了机器人的最大加速度。实际轨迹需要进行feasibility check(可行性检测),确保满足工程可行性,比如最大速度、最大角速度限制等。
  4. 这两个问题的根本原因在于时间给的不合理,时间分配是轨迹规划中比较蛋疼的问题,给的时间太小,速度、加速度自然就很大,两段时间分配不当就会生成打结的轨迹。下一节,专门讨论时间分配问题。

参考文献

  1. 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.
  2. Vijay Kumar的一系列论文:Mellinger D, Kumar V. Minimum snap trajectory generation and control for quadrotors[C]//Robotics and Automation (ICRA), 2011 IEEE International Conference on. IEEE, 2011: 2520-2525.

Minimum Snap轨迹规划详解(1)轨迹规划入门相关推荐

  1. Apollo6.0代码Lattice算法详解——Part6:轨迹评估及碰撞检测对象构建

    Apollo6.0代码Lattice算法详解--Part6:轨迹评估及碰撞检测对象构建 0.前置知识 1.涉及主要函数 2.函数关系 3.部分函数代码详解 3.1 lattice_planner.cc ...

  2. 消息轨迹全景图详解-独门秘籍

    简介: 消息轨迹全景图详解-独门秘籍 消息轨迹全景图详解-独门秘籍 消息轨迹全景图详解-独门秘籍 阿里云 IoT 企业物联网平台上线了消息轨迹全景图功能,帮助 IoT 开发者追踪消息通信的完整轨迹,快 ...

  3. 无人机航测流程详解:航线规划、像控点布设、CC刺点建模及CASS成图

    无人机航测是传统航空摄影测量手段的有力补充,具有机动灵活.高效快速.精细准确.作业成本低.适用范围广.生产周期短等特点,在小区域和飞行困难地区高分辨率影像快速获取方面具有明显优势,随着无人机与数码相机 ...

  4. mybatis 详解(三)------入门实例(基于注解)

    1.创建MySQL数据库:mybatisDemo和表:user 详情参考:mybatis 详解(二)------入门实例(基于XML) 一致 2.建立一个Java工程,并导入相应的jar包,具体目录如 ...

  5. (原)详解生产线物流规划的原理及操作方式

    牟砚逵 杭州吉奥汽车有限公司 本文首发于IT168 http://cio.it168.com/a2010/0612/1066/000001066055_all.shtml 企业的运营过程中,物流.资金 ...

  6. Python str / bytes / unicode 区别详解 - Python零基础入门教程

    目录 一.前言 二.Python str / bytes / unicode 区别 1.Python2.x 版本中 str / bytes / unicode 区别 2.Python3.x 版本中 s ...

  7. Java高并发编程详解系列-Java线程入门

    根据自己学的知识加上从各个网站上收集的资料分享一下关于java高并发编程的知识点.对于代码示例会以Maven工程的形式分享到个人的GitHub上面.   首先介绍一下这个系列的东西是什么,这个系列自己 ...

  8. python编程入门与案例详解-Pythony运维入门之Socket网络编程详解

    Socket是什么? Socket 是电脑网络中进程间数据流的端点Socket 是操作系统的通信机制应用程序通过Socket进行网络数据的传输 首先,简单了解一下TCP通信过程: TCP三次握手(面试 ...

  9. GitHub新手用法详解【适合新手入门-建议收藏!!!】

    目录 什么是Github,为什么使用它? 一.GitHub账号的注册与登录 二. gitbash安装详解 1.git bash的下载与安装 2.git常用命令 3. Git 和 GitHub 的绑定 ...

  10. Minimum Snap轨迹规划详解(3)闭式求解

    如果QP问题只有等式约束没有不等式约束,那么是可以闭式求解(close form)的.闭式求解效率要快很多,而且只需要用到矩阵运算,不需要QPsolver. 这里介绍Nicholas Roy文章中闭式 ...

最新文章

  1. 神经网络为什么需要多次epoch
  2. Linux中autoduck批量对接,科学网—用AutoDock进行分子对接教程——半柔性对接 - 杜文义的博文...
  3. Unicode字段也有collation
  4. ABAP常见面试问题
  5. 责任链(Chain of Responsibility Pattern)
  6. spring配置c3p0连接池、spring的声明式事务管理
  7. 使用直线标定板进行相机畸变校正,并且进行9点标定(halcon)
  8. ubuntu16 黑主题_给Ubuntu 8.10安装超炫酷黑色新主题
  9. 安装服务器选择什么系统盘,云服务器ecs选择什么系统盘
  10. [神奇的问题啊,GetProcAddress一个不存在的API时,返回非空值,且指向另一个API]谜团解开,错不在GetProcAddress...
  11. 还在花钱买课呢?教你白嫖开放注册图书馆价值上万元的学习资源
  12. PHP+Swoole 搭建 Websocket 聊天室
  13. 单片机位寻址举例_51单片机直接寻址方式与编程举例
  14. html2canvas.js 截屏微信头像不显示
  15. 浅谈“决策引擎”在身份管理的应用
  16. Unity 灯光系统详解
  17. Threejs创建几何体并贴材质
  18. 基于Swing的Java学生成绩管理系统
  19. [转]静态框架导航,左侧折叠树的样式,类似于treeview
  20. 文件夹的“只读”属性

热门文章

  1. 第五人格PC端下载以及解决打不开问题
  2. 【软考系统架构设计师】2015年下系统架构师案例分析历年真题
  3. Matlab在线性代数中的应用(三):求解非齐次线性方程组
  4. 差分信号,差分对和耦合(一)——基本概念介绍
  5. Vue中如何解决跨域问题
  6. 单片机常用芯片总结(二)——DS1302时钟芯片
  7. Digital Radiography厂家
  8. excel组合汇总_Excel汇总20150112
  9. 机器人SCI期刊及其特点、评价、投稿之我见
  10. arm tcm linux,认识S3C6410 - 深入理解ARM体系架构(S3C6410)_Linux编程_Linux公社-Linux系统门户网站...