一架无人机从 0 米处出发,第 4 秒经过 4 米处的航点,第 10 秒到达 10 米处并停下。通过航点时,速度给定为 1.9 米/秒,加速度为 7/907/90 米/秒²。

运动开始前和结束后保持静止。为了让加速度的变化也能与静止阶段衔接,起终点的 Jerk 都设为零,两段运动在航点处使用同一个 Jerk。

现在需要选择的是:航点处的 Jerk 应当取多少,才能让整段运动的 Jerk 变化代价最小?

下面用两段七次多项式,逐步计算这个数,并检查得到的运动。

一、从 Jerk 再向前一步:Snap 是什么?

1. 用变化率描述运动

位置、速度、加速度和 Jerk 依次通过求导联系起来:

p(t) ⟶ v(t) ⟶ a(t) ⟶ j(t).p(t)\ \longrightarrow\ v(t)\ \longrightarrow\ a(t)\ \longrightarrow\ j(t).

每向右一步,都在问前一个量随时间怎样变化。继续对 Jerk 求导,得到 Snap,本文记为 σ(t)\sigma(t):

σ(t)=dj(t)dt=d4p(t)dt4.\boxed{\sigma(t)=\frac{dj(t)}{dt}=\frac{d^4p(t)}{dt^4}}.

例如,Jerk 在 1 秒内从 0 均匀增加到 0.6 m/s30.6\,\mathrm{m/s^3},这段 Snap 为:

σ=0.6−01=0.6 m/s4.\sigma=\frac{0.6-0}{1}=0.6\,\mathrm{m/s^4}.

同样的 Jerk 变化,若在 0.2 秒内完成,则:

σ=0.6−00.2=3 m/s4.\sigma=\frac{0.6-0}{0.2}=3\,\mathrm{m/s^4}.

Snap 描述 Jerk 变化得有多快。 在 Jerk 随时间变化的图上,它对应曲线的斜率。

2. 给整段变化一个分数

将 Snap 平方,再沿时间累积,得到:

J4=∫010σ(t)2 dt.\boxed{J_4=\int_0^{10}\sigma(t)^2\,dt}.

平方让正、负 Snap 都贡献非负代价,积分把各个时刻的贡献加起来。J4J_4 的单位为 m2/s7\mathrm{m^2/s^7}。

Minimum Snap 使用这个积分作为目标函数,在规定的边界与衔接条件下选择轨迹。

这里有两个需要一起确定的部分:边界条件规定起终 Jerk 为零、航点 Jerk 连续;目标函数比较满足这些条件的运动,衡量整段 Jerk 的变化。

二、把待求数放进运动要求

1. 固定条件与待求量

通道中的直线路径已经通过碰撞检查,用沿通道的坐标 pp 表示无人机中心位置。本文计算沿这条直线的参考运动。

航点 W 把运动分为两段:第一段 4 秒,第二段 6 秒。把航点处的 Jerk 记为 κ\kappa,读作 kappa:

运动量 起点 S 航点 W 终点 G
位置(米) 0 4 10
速度(米/秒) 0 1.9 0
加速度(米/秒²) 0 7/90≈0.077787/90\approx0.07778 0
Jerk(米/秒³) 0 待求:κ\kappa 0

第一段结束时与第二段开始时,都使用同一个 κ\kappa。位置、速度、加速度和 Jerk 四个量由此在航点处连续。

途中要求保持:

0≤v(t)≤2 m/s,∣a(t)∣≤1 m/s2.0\le v(t)\le2\,\mathrm{m/s},\qquad |a(t)|\le1\,\mathrm{m/s^2}.

本例固定航点速度、加速度和分段时间,只优化航点 Jerk。 先求这组条件下的最低 Snap 代价,再检查速度、加速度上限。

2. 为什么使用七次多项式?

每段起点和终点各有四项要求:位置、速度、加速度、Jerk,共八个条件。

选择含八个系数的七次多项式:

P(s)=b0+b1s+b2s2+⋯+b7s7.P(s)=b_0+b_1s+b_2s^2+\cdots+b_7s^7.

这里 ss 是本段从 0 到 1 的归一化时间。一段持续 TT 秒时:

v=P′(s)T,a=P′′(s)T2,j=P′′′(s)T3,σ=P′′′′(s)T4.v=\frac{P'(s)}T,\qquad a=\frac{P''(s)}{T^2},\qquad j=\frac{P'''(s)}{T^3},\qquad \sigma=\frac{P''''(s)}{T^4}.

撇号表示对 ss 求导。每求一次实际时间导数,就多除以一次 TT。

给定 κ\kappa 后,每段的八个边界条件都已确定,能够求出八个系数。改变 κ\kappa,两段曲线也随之变化。

三、把两段曲线写成航点 Jerk 的函数

1. 第一段:从静止进入运动

第一段使用:

s=t4,0≤t≤4.s=\frac t4,\qquad 0\le t\le4.

起点的位置、速度、加速度和 Jerk 都为零,所以:

b0=b1=b2=b3=0.b_0=b_1=b_2=b_3=0.

例如,起点 Jerk 为 6b3/436b_3/4^3,令它等于零,就得到 b3=0b_3=0。剩下:

P1(s)=b4s4+b5s5+b6s6+b7s7.P_1(s)=b_4s^4+b_5s^5+b_6s^6+b_7s^7.

在本段终点 s=1s=1,分别代入位置、速度、加速度和 Jerk:

b4+b5+b6+b7=4,4b4+5b5+6b6+7b7=4×1.9=385,12b4+20b5+30b6+42b7=42×790=5645,24b4+60b5+120b6+210b7=43κ=64κ.\begin{aligned} b_4+b_5+b_6+b_7&=4,\\ 4b_4+5b_5+6b_6+7b_7&=4\times1.9=\frac{38}{5},\\ 12b_4+20b_5+30b_6+42b_7&=4^2\times\frac7{90}=\frac{56}{45},\\ 24b_4+60b_5+120b_6+210b_7&=4^3\kappa=64\kappa. \end{aligned}

每一行都对应表中的一项要求。例如最后一行表示:归一化曲线的三阶导数除以 64,必须得到实际 Jerk κ\kappa。

可以依次消元。第二行减去第一行的 4 倍,得到:

b5+2b6+3b7=−425.b_5+2b_6+3b_7=-\frac{42}{5}.

第三行减去第一行的 12 倍,再用上式消去 b5b_5,得到:

b6+3b7=929.b_6+3b_7=\frac{92}{9}.

第四行先消去 b4b_4,再用这两个关系消去 b5b_5 和 b6b_6,剩下:

6b7=64κ−58415.6b_7=64\kappa-\frac{584}{15}.

于是:

b7=323κ−29245.b_7=\frac{32}{3}\kappa-\frac{292}{45}.

逐个代回,得到全部系数:

系数 关于 κ\kappa 的表达式
b4b_4 2629−323κ\dfrac{262}{9}-\dfrac{32}{3}\kappa
b5b_5 32κ−21744532\kappa-\dfrac{2174}{45}
b6b_6 133645−32κ\dfrac{1336}{45}-32\kappa
b7b_7 323κ−29245\dfrac{32}{3}\kappa-\dfrac{292}{45}

这些数字都来自同一组边界方程。每选一个 κ\kappa,就能算出第一段完整运动。

2. 第二段:从航点状态接续

第二段使用自己的时间刻度:

s=t−46,4≤t≤10.s=\frac{t-4}{6},\qquad 4\le t\le10.

起点位置为 4,速度为 1.9,加速度为 7/907/90,Jerk 为 κ\kappa。它们直接确定前四项:

P2(s)=4+575s+75s2+36κs3+d4s4+d5s5+d6s6+d7s7.P_2(s)=4+\frac{57}{5}s+\frac75s^2+36\kappa s^3 +d_4s^4+d_5s^5+d_6s^6+d_7s^7.

例如:

(57/5)6=1.9,2(7/5)62=790,6(36κ)63=κ.\frac{(57/5)}6=1.9, \qquad \frac{2(7/5)}{6^2}=\frac7{90}, \qquad \frac{6(36\kappa)}{6^3}=\kappa.

它们分别给出本段起始速度、加速度和 Jerk。

再把终点位置 10、速度 0、加速度 0、Jerk 0 代入,解出剩余系数:

系数 关于 κ\kappa 的表达式
d4d_4 −144κ−32-144\kappa-32
d5d_5 216κ+37216\kappa+37
d6d_6 −144κ−575-144\kappa-\dfrac{57}{5}
d7d_7 36κ−2536\kappa-\dfrac25

以下数值公式统一采用米、秒为单位,κ\kappa 按米/秒³计;多项式中的各项系数带有对应的单位。

现在,整条轨迹只剩一个待求数 κ\kappa。它同时改变航点前后的两段运动。

四、把 Snap 积分变成一个二次函数

1. 先求一段曲线的 Snap

对七次多项式求四次导数,低于四次的项都消失:

P′′′′(s)=24b4+120b5s+360b6s2+840b7s3.P''''(s)=24b_4+120b_5s+360b_6s^2+840b_7s^3.

例如,b4s4b_4s^4 连续求导四次:

b4s4→4b4s3→12b4s2→24b4s→24b4.b_4s^4\to4b_4s^3\to12b_4s^2\to24b_4s\to24b_4.

对于第一段,代入上一节的系数,再除以 44=2564^4=256,得到实际 Snap:

σ1(s;κ)=(13148−κ)+(15κ−108748)s+(1674−45κ)s2+(35κ−51124)s3.\begin{aligned} \sigma_1(s;\kappa) &=\left(\frac{131}{48}-\kappa\right) +\left(15\kappa-\frac{1087}{48}\right)s\\ &\quad+\left(\frac{167}{4}-45\kappa\right)s^2 +\left(35\kappa-\frac{511}{24}\right)s^3. \end{aligned}

每个 κ\kappa 都对应一条具体的 Snap 曲线,后面要累计它的平方。

2. 归一化时间怎样影响代价?

一段持续 TT 秒,满足 dt=T dsdt=T\,ds。因此:

∫σ(t)2dt=1T7∫01[P′′′′(s)]2ds.\int\sigma(t)^2dt =\frac1{T^7}\int_0^1[P''''(s)]^2ds.

这里,Snap 平方带来 1/T81/T^8,时间换算乘上 TT,合起来为 1/T71/T^7。

本例的总代价为:

J4(κ)=147∫01[P1′′′′(s)]2ds+167∫01[P2′′′′(s)]2ds.J_4(\kappa)= \frac1{4^7}\int_0^1[P_1''''(s)]^2ds + \frac1{6^7}\int_0^1[P_2''''(s)]^2ds.

3. 展开平方,逐项积分

先把一个三次式写成:

σ(s)=A+Bs+Cs2+Ds3.\sigma(s)=A+Bs+Cs^2+Ds^3.

平方展开后,每项都是 ss 的幂,可以使用:

∫01smds=1m+1.\int_0^1s^m ds=\frac1{m+1}.

例如,平方中的常数项 A2A^2 积分后为 A2A^2;一次项 2ABs2ABs 积分后为 ABAB。把全部项相加:

∫01σ(s)2ds=A2+AB+B2+2AC3+AD+BC2+C2+2BD5+CD3+D27.\begin{aligned} \int_0^1\sigma(s)^2ds &=A^2+AB+\frac{B^2+2AC}{3} +\frac{AD+BC}{2}\\ &\quad+\frac{C^2+2BD}{5} +\frac{CD}{3}+\frac{D^2}{7}. \end{aligned}

以 κ=0\kappa=0 为例,第一段使用:

A=13148,B=−108748,C=1674,D=−51124.A=\frac{131}{48},\quad B=-\frac{1087}{48},\quad C=\frac{167}{4},\quad D=-\frac{511}{24}.

代入后,归一化区间上的积分为 6023/86406023/8640。第一段实际持续 4 秒,因此:

J4,1(0)=4×60238640=60232160≈2.7884.J_{4,1}(0)=4\times\frac{6023}{8640} =\frac{6023}{2160}\approx2.7884.

这里积分的是已经换算成实际单位的 σ\sigma,所以只需乘本段时间。

保留 κ\kappa,按同样的方法计算两段,得到:

J4,1(κ)=4κ2+1312κ+60232160,J_{4,1}(\kappa)=4\kappa^2+\frac{13}{12}\kappa+\frac{6023}{2160},

J4,2(κ)=83κ2+3227κ+615114580.J_{4,2}(\kappa)=\frac83\kappa^2+\frac{32}{27}\kappa+\frac{6151}{14580}.

相加:

J4(κ)=203κ2+245108κ+3744511664.\boxed{ J_4(\kappa)=\frac{20}{3}\kappa^2 +\frac{245}{108}\kappa +\frac{37445}{11664}. }

一个航点 Jerk,决定两段轨迹;两段 Snap 的平方积分,给这个选择打出一个分数。

比较几组取值:

航点 Jerk κ\kappa(米/秒³) 第一段代价 第二段代价 总代价 J4J_4
-0.500 3.2468 0.4960 3.7427
-0.350 2.8993 0.3337 3.2330
0 2.7884 0.4219 3.2103
0.200 3.1651 0.7656 3.9307

表中所有方案使用相同的时间和边界要求,代价单位均为米²/秒⁷。最低点可以继续通过这个二次函数求出。

五、求出最优航点 Jerk

对代价函数求导:

dJ4dκ=403κ+245108.\frac{dJ_4}{d\kappa}=\frac{40}{3}\kappa+\frac{245}{108}.

在最低点,变化率为零。令上式等于零,两边乘以 108:

1440κ+245=0.1440\kappa+245=0.

得到:

κ=−49288≈−0.17014 m/s3.\boxed{\kappa=-\frac{49}{288}\approx-0.17014\,\mathrm{m/s^3}}.

还可以把代价整理成平方形式:

J4(κ)=203(κ+49288)2+563105186624.\boxed{ J_4(\kappa)=\frac{20}{3} \left(\kappa+\frac{49}{288}\right)^2 +\frac{563105}{186624}. }

平方项大于或等于零,只有 κ=−49/288\kappa=-49/288 时恰好为零。因此,它是本例固定时间、航点速度和加速度条件下,两段七次曲线的唯一最低代价解。

最低代价为:

J4,min⁡=563105186624≈3.0173.J_{4,\min}=\frac{563105}{186624}\approx3.0173.

固定航点速度和加速度时,Snap 代价随航点 Jerk 呈抛物线变化,最低点约为负 0.17014

将 κ\kappa 从 0 调到这个值,第一段代价从约 2.7884 降到 2.7199,第二段从约 0.4219 降到 0.2974,总代价随之下降。

航点加速度为 7/90>07/90>0,Jerk 则为负。这两个量描述不同的变化:此时速度还在增加,加速度正在减小。

六、恢复曲线,看它怎样运动

1. 代回系数,得到两段位置公式

将 κ=−49/288\kappa=-49/288 代入,第一段为:

P1(s)=83527s4−241945s5+52715s6−1121135s7.\boxed{ P_1(s)=\frac{835}{27}s^4-\frac{2419}{45}s^5 +\frac{527}{15}s^6-\frac{1121}{135}s^7. }

第二段为:

P2(s)=4+575s+75s2−498s3−152s4+14s5+13110s6−26140s7.\boxed{ \begin{aligned} P_2(s)&=4+\frac{57}{5}s+\frac75s^2-\frac{49}{8}s^3 -\frac{15}{2}s^4\\ &\quad+\frac14s^5+\frac{131}{10}s^6-\frac{261}{40}s^7. \end{aligned} }

按总时间写成:

p(t)={P1(t/4),0≤t≤4,P2((t−4)/6),4<t≤10.p(t)= \begin{cases} P_1(t/4),&0\le t\le4,\\[4pt] P_2((t-4)/6),&4<t\le10. \end{cases}

例如,第 2 秒位于第一段,s=2/4=0.5s=2/4=0.5。位置为:

p(2)=83527(12)4−241945(12)5+52715(12)6−1121135(12)7=1273717280≈0.7371 米.\begin{aligned} p(2)&=\frac{835}{27}\left(\frac12\right)^4 -\frac{2419}{45}\left(\frac12\right)^5\\ &\quad+\frac{527}{15}\left(\frac12\right)^6 -\frac{1121}{135}\left(\frac12\right)^7\\ &=\frac{12737}{17280}\approx0.7371\text{ 米}. \end{aligned}

在同一个 s=0.5s=0.5 处,计算 P1′/4P_1'/4、P1′′/16P_1''/16 和 P1′′′/64P_1'''/64,就得到速度、加速度和 Jerk。

总时刻(秒) 位置(米) 速度(米/秒) 加速度(米/秒²) Jerk(米/秒³)
0 0 0 0 0
2 0.7371 1.0859 0.8353 -0.2689
4 4.0000 1.9000 0.0778 -0.1701
7 8.9771 1.0462 -0.5959 -0.0562
10 10.0000 0 0 0

第 4 秒的四个量同时构成第一段末端与第二段起点的状态。

2. Jerk 怎样接到静止阶段?

下图使用一条五次轨迹作为对照。它采用相同的时间、位置、速度和加速度条件,以 Jerk 平方积分为目标求得;起终 Jerk 分别为 23/2423/24 和 13/36 m/s313/36\,\mathrm{m/s^3}。

本篇七次曲线进一步指定起终 Jerk 为零。

五次曲线与七次曲线的 Jerk 对照:七次曲线在起终时刻都与静止段的零 Jerk 连续衔接

运动前后的静止段中,速度、加速度和 Jerk 都为零。本篇曲线的这三个量在两端也都为零,位置则分别接到 0 米和 10 米处。

航点两侧同样满足:

p(4−)=p(4+)=4,v(4−)=v(4+)=1.9,a(4−)=a(4+)=790,j(4−)=j(4+)=−49288.\begin{aligned} p(4^-)&=p(4^+)=4,\\ v(4^-)&=v(4^+)=1.9,\\ a(4^-)&=a(4^+)=\frac7{90},\\ j(4^-)&=j(4^+)=-\frac{49}{288}. \end{aligned}

4−4^- 和 4+4^+ 分别表示从第 4 秒之前、之后接近这个时刻。两侧位置及前三阶导数都接得上,称为 C3C^3 连续。

图中两种方案的边界条件有所不同,因此这里观察的是它们的衔接与运动形态;Snap 代价的高低,则在前面那组具有相同条件的七次曲线之间比较。

3. Snap 曲线显示了什么?

本篇轨迹的 Snap 曲线:航点两侧都约为负 0.1389,起终时刻允许与静止段发生有限跳变

Snap 为正时,Jerk 上升;Snap 为负时,Jerk 下降。曲线的正负变化共同塑造了上一张图中的 Jerk。

本例最优解在航点两侧还满足:

σ(4−)=σ(4+)=−536≈−0.1389 m/s4.\sigma(4^-)=\sigma(4^+)=-\frac5{36} \approx-0.1389\,\mathrm{m/s^4}.

这个关系可以直接由两段位置公式求四次导数核对,它是本次优化产生的结果。

在运动区间两端,Snap 与静止段的零值之间仍有有限跳变。本文规定的整体连续性到 Jerk 为止。

七、检查速度与加速度上限

1. 查询整段曲线的极值

要核验上限,需要检查每一段内部可能出现的极值,再与段端点比较。

要检查的量 变化率 需要计算的候选时刻
速度 vv 加速度 aa 每段满足 a=0a=0 的时刻,以及段端点
加速度 aa Jerk jj 每段满足 j=0j=0 的时刻,以及段端点

计算时,只保留归一化区间 0≤s≤10\le s\le1 内的实根。求出根后,再用本段开始时刻和持续时间换回总时间。

例如,第二段速度峰值对应 s≈0.065813s\approx0.065813。换回总时间:

t=4+6s≈4.3949 秒.t=4+6s\approx4.3949\text{ 秒}.

把各段候选点一起比较,得到:

检查项目 总时刻(秒,约) 数值
最高速度 4.3949 1.9160 m/s1.9160\,\mathrm{m/s}
最大正加速度 1.6940 +0.8783 m/s2+0.8783\,\mathrm{m/s^2}
最小负加速度 7.2151 −0.6020 m/s2-0.6020\,\mathrm{m/s^2}

整段速度保持非负。结合端点和全部极值:

0≤v(t)≤1.9161<2 m/s,0\le v(t)\le1.9161<2\,\mathrm{m/s},

∣a(t)∣≤0.8783<1 m/s2.|a(t)|\le0.8783<1\,\mathrm{m/s^2}.

因此,本例求得的最低代价解同时满足速度和加速度限制。位置也从 0 米单调增加到 10 米,始终沿着已检查过的直线路径运动。

2. 运动上限与平滑代价分别观察

速度曲线对照:两种方案均以每秒 1.9 米经过航点,本篇轨迹最高速度约为每秒 1.9160 米

加速度曲线对照:本篇轨迹保持航点加速度不变,整段加速度大小不超过每二次方秒 1 米

加入起终 Jerk 条件后,曲线在整个时间区间内重新分配运动。与图中的五次曲线相比,本篇方案的速度峰值、加速度峰值略有增加,同时满足既定上限。

平方积分评价整段变化,运动上限约束某个量允许达到多大。 两者共同决定最终可用的方案。需要限制 Snap 峰值时,可以再规定 ∣σ(t)∣≤σmax⁡|\sigma(t)|\le\sigma_{\max}。

八、从这个算例理解 Minimum Snap

本例的求解过程可以整理成:

给定位置、到达时间、速度与加速度

指定起终 Jerk,并共享航点 Jerk

用八个端点条件确定每段七次式

对位置求四次导数,累加 Snap 平方积分

求出总代价最小的航点 Jerk

恢复曲线,检查衔接与运动上限

给定位置、到达时间、速度与加速度

指定起终 Jerk,并共享航点 Jerk

用八个端点条件确定每段七次式

对位置求四次导数,累加 Snap 平方积分

求出总代价最小的航点 Jerk

恢复曲线,检查衔接与运动上限

这里的航点速度 1.9 和加速度 7/907/90 都是固定条件。得到的 κ=−49/288\kappa=-49/288,是在这组固定条件下的最优选择。

当任务允许同时选择航点速度、加速度和 Jerk 时,可以把这三个量一起作为决策变量;增加航点后,再把各航点的待求状态放进同一个问题。固定分段时间时,边界方程使系数随这些变量线性变化,平方积分由此形成一个二次目标。

Minimum Jerk 与 Minimum Snap 的评价对象可以这样对应:

方法 目标函数 评价的变化
Minimum Jerk ∫j(t)2dt\displaystyle\int j(t)^2dt 加速度的变化
Minimum Snap ∫σ(t)2dt\displaystyle\int\sigma(t)^2dt Jerk 的变化

它们各自配合明确的边界、连续性和运动约束使用。比较方案的代价时,需要统一目标函数、时间和约束条件。

小结

在这个两段、10 米的算例中,给起终点增加 Jerk 为零的条件,再把航点 Jerk 作为变量,就得到了一组能够连续衔接的七次轨迹。

Snap 平方积分将这组曲线转化为一个关于 κ\kappa 的二次函数。最低点为 κ=−49/288≈−0.17014\kappa=-49/288\approx-0.17014 米/秒³,恢复后的轨迹满足指定航点状态,并通过了速度、加速度上限检查。

边界条件决定曲线怎样衔接,目标函数决定在可选曲线中怎样取舍,区间检查决定运动需求是否符合限制。

轨迹已经给出了位置、速度、加速度以及更高阶变化。接下来可以进一步研究:执行这段运动需要怎样的推力与姿态,以及这些要求怎样通过多旋翼动力学计算出来。