Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

4.2.2 通过系列点的运动

实际任务很少只从一点走到另一点:拾取—放置要经过提起、放下两个中间点,避障要在障碍物周围加密路径点,高曲率路段也要多设点。点对点的方法因此不够用了,问题升级为「经过 NN 个指定点」。最直接的解法(用一个 N−1N-1 阶多项式穿过所有点)有五个致命缺点,于是逼出四条修正路线——指定速度、计算速度、三次样条、抛物线混合。录播 1:10:50–1:57:28。

4.2.2.0 问题与「一个高阶多项式」的五个缺点

问题的提法(1:11:44、教材 §4.2.2):当 NN 个点被指定(称为路径点 path points)时,要生成的轨迹要求机械手在指定的各个瞬时依次通过它们。每个关节变量因此都有 NN 个约束,于是很自然地会想到用一个 (N−1)(N-1) 阶多项式一次穿过全部 NN 个点——「这其实是最简单的,或者最不需要思考就可以想到的」(1:12:25)。

为什么不用单个高阶多项式(教材 §4.2.2 的五条)
  1. 不可能指定起始速度和终点速度——所有自由度都被「过点」用光了;
  2. 阶数增加时振动特性增加,可能导致机械手产生不自然的轨迹。老师 1:13:13 的直观解释:一个 10 阶多项式经过 10 个点,其导数有 9 个极值点,「实际运动过程中就是从起点到终点,但它是有震荡的」;
  3. 阶数增加时,系数计算的数值精度降低——方程系统的矩阵维度变大,数值求解的精度随之下降;
  4. 约束方程系统求解繁难——方程系统一大,就要耗费大量计算资源;
  5. 系数取决于所有指定的点——「只要其中某一个点变了,所有的量都得重新算,我之前耗费多少资源计算出的结果都需要重新计算」(1:14:57)。

出路:不再用单个高阶多项式,而改用一组适当数量、在路径点处彼此连续的低阶插值多项式;最低阶数是三次——三次多项式在满足两端位置约束后还剩两个自由度,正好可以用来施加速度的连续性(1:15:34)。

定义 4.2.5 · 通过系列点的插值问题

对单个关节变量,寻求一个由 N−1N-1 个连续且具有连续一阶导数的三阶多项式 Πk(t)\Pi_k(t)(k=1,…,N−1k=1,\dots,N-1)首尾相接而成的函数 q(t)q(t)。当 t=tkt=t_k(k=1,…,Nk=1,\dots,N)时 q(tk)=qkq(t_k)=q_k,且 q1=qi, t1=0, qN=qf, tN=tfq_1=q_i,\ t_1=0,\ q_N=q_f,\ t_N=t_f。序列 qkq_k 给出 t=tkt=t_k 时刻描述期望轨迹的路径点。

每一段三次多项式有 4 个系数,位置的两个端点值已经给出,还需要两个方程才能把它们全部定住。补这两个方程的方式不同,就分出四条路线:

四条修正路线(课件 1:15:33 页、老师 0:17:22)
路线 补的两个约束 保证的连续性 出处
① 在路径点指定速度 用户给出 qkq_k 与 q˙k\dot q_k 位置、速度连续 4.2.2.1
② 按规则计算速度 用相邻分段斜率定 q˙k\dot q_k 位置、速度连续 4.2.2.2
③ 要求加速度连续(样条) 速度连续 + 加速度连续 位置、速度、加速度连续 4.2.2.3
④ 低于三阶的多项式 + 抛物线混合 用梯形速度曲线的做法 位置、速度连续(加速度跳跃) 4.2.2.4

小结:前两条路线「可以保证位置的平滑性和连续性、保证速度的连续性,但是不能保证速度的平滑性——加速度是有跳跃的」;只有样条能保证加速度连续(0:19:08)。

4.2.2.1 路线①:在路径点指定速度

路径点指定速度的插值多项式

在连接 qkq_k 与 qk+1q_{k+1} 的一般多项式 Πk(t)\Pi_k(t) 上,施加下列条件:

Πk(tk)=qk,Πk(tk+1)=qk+1,Π˙k(tk)=q˙k,Π˙k(tk+1)=q˙k+1,\Pi_k(t_k)=q_k,\qquad \Pi_k(t_{k+1})=q_{k+1},\qquad \dot\Pi_k(t_k)=\dot q_k,\qquad \dot\Pi_k(t_{k+1})=\dot q_{k+1},

得到 N−1N-1 个关于「四个未知系数」的四方程系统,每个系统都可以单独求解,不必与其他系统联立(1:19:47)。通常的做法是把轨迹的起始速度和终点速度设为零(q˙1=q˙N=0\dot q_1=\dot q_N=0),再通过

Π˙k(tk+1)=Π˙k+1(tk+1),k=1,…,N−2\dot\Pi_k(t_{k+1})=\dot\Pi_{k+1}(t_{k+1}),\qquad k=1,\dots,N-2

确保路径点处速度的连续性。老师强调这条式子不能写反(1:20:25):「一定要保证左端点的速度和右端点的速度相等——左侧多项式的右端点速度等于右侧多项式的左端点速度,这样速度才能连续」。

例 4.2.E(原书图 4.5)· 指定速度下的超调

取 q1=0, q2=2π, q3=π/2, q4=πq_1=0,\ q_2=2\pi,\ q_3=\pi/2,\ q_4=\pi,t1=0, t2=2, t3=3, t4=5t_1=0,\ t_2=2,\ t_3=3,\ t_4=5,并指定 q˙1=0, q˙2=π, q˙3=−π, q˙4=0\dot q_1=0,\ \dot q_2=\pi,\ \dot q_3=-\pi,\ \dot q_4=0。结果是:位置平滑且连续,速度连续但不平滑(加速度有跳跃)。

关键观察(1:21:40):中间点 q2=2πq_2=2\pi 处的速度不为零(被指定为 π\pi),于是轨迹会超调——「这点可能超过 2π2\pi 的值,然后再往回来」。速度由用户自由指定,代价则是可能出现过冲。

4.2.2.2 路线②:按规则计算速度

换一条思路:不指定速度,而是把路径点速度算出来,这样就能避免路线①中指定速度的任意性(1:22:25)。最常用的规则用的是线性分段的斜率:

线性分段斜率定速度(教材式 4.12)

令 vk=qk−qk−1tk−tk−1v_k=\dfrac{q_k-q_{k-1}}{t_k-t_{k-1}} 为时间区间 [tk−1,tk][t_{k-1},t_k] 内分段的斜率,则

q˙1=0,q˙k={0,sgn⁡(vk)≠sgn⁡(vk+1)vk+vk+12,sgn⁡(vk)=sgn⁡(vk+1)q˙N=0.(4.12)\dot q_1=0,\qquad \dot q_k=\begin{cases}0, & \operatorname{sgn}(v_k)\neq\operatorname{sgn}(v_{k+1})\\[1mm] \dfrac{v_k+v_{k+1}}{2}, & \operatorname{sgn}(v_k)=\operatorname{sgn}(v_{k+1})\end{cases}\qquad \dot q_N=0. \tag{4.12}

即:前后两段斜率异号(该点是极值点,路径在此折返)⇒ 该点速度取 0;同号(路径继续朝一个方向走)⇒ 取两段斜率的平均。全部速度确定之后,插值多项式的求解与路线①完全相同。

例 4.2.F(原书图 4.6)· 中间点零速度

用与 例 4.2.E 相同的路径点数据,但速度改为按 (4.12) 计算。结果是:这组路径点使中间点处的速度为零——在 q2=2πq_2=2\pi 处斜率由正转负,两段异号 ⇒ 速度取 0,于是不再超调,「到这点的情况下它就是 2π2\pi 的,没有到高,到 2π2\pi 就往回返」(1:23:55)。

4.2.2.3 路线③:三次样条(加速度连续)

前两条路线都无法保证加速度的连续性(1:24:12)。如果连速度也要平滑,加速度就必须连续——把这一层要求补上,就得到样条。

定义 4.2.6 · 三次样条 spline

给定一个由 NN 个路径点构成的序列,若对每一对相邻的三次多项式施加两个位置约束,并施加保证速度连续性与加速度连续性的两个约束,则除首末两点(其速度、加速度由边界条件指定)之外,在每一个路径点 tkt_k 上加速度也是连续的。

满足的方程(k=2,…,N−1k=2,\dots,N-1)为

Πk−1(tk)=qk,Πk−1(tk)=Πk(tk),Π˙k−1(tk)=Π˙k(tk),Π¨k−1(tk)=Π¨k(tk).\Pi_{k-1}(t_k)=q_k,\qquad \Pi_{k-1}(t_k)=\Pi_k(t_k),\qquad \dot\Pi_{k-1}(t_k)=\dot\Pi_k(t_k),\qquad \ddot\Pi_{k-1}(t_k)=\ddot\Pi_k(t_k).

这样的三次多项式序列称为样条,表示「插入一个给定点序列以确保函数及其导数连续性的光滑函数」(1:47:34)。

定理 4.2.G · 方程计数与两个虚拟点

先把方程数一数,问题就来了。 中间点贡献 4(N−2)4(N-2) 个方程,极值点贡献 6 个方程,共 4N−24N-2 个;而 N−1N-1 个三次多项式只有 4(N−1)4(N-1) 个未知系数——方程比未知数多 2,系统不能直接求解(教材 §4.2.2)。多出来的这两个,正是「初始与最终加速度」这两个可以任意指定的条件。

三种出路:

  1. 让第一段和最后一段改用四阶多项式(5 个系数容纳 5 个约束)——但算法通常要求各段形式一致,不理想;
  2. 只要求在部分时间内保持轨迹一致(工程近似);
  3. 引入两个虚拟点(virtual points):对它们施加位置、速度和加速度的连续性约束,但不指定其实际位置。由于位置约束只考虑连续性,虚拟点定位在何处无关紧要。

把两个虚拟点引入之后,要确定的是 N+1N+1 个三次多项式,即 4(N+1)4(N+1) 个未知数;相应地有:k=3,…,Nk=3,\dots,N 的中间点 4(N−2)4(N-2) 个方程、起始点与终点的 6 个方程、两个虚拟点的 6 个方程,合计 4(N+1)4(N+1) 个方程——未知数与方程数相等,解存在且唯一(1:29:55)。

降维:从 4(N+1)4(N+1) 个未知数到 NN 个。 直接解 4(N+1)4(N+1) 个方程「对计算要求比较苛刻,即使是对较小的 NN」(教材 §4.2.2)。教材的做法,是利用三次多项式的二阶导数必为时间的线性函数:

定理 4.2.H · 降维与三对角系统

第一步:写出二阶导数。 对一般多项式 Πk(t)\Pi_k(t)(k=1,…,N+1k=1,\dots,N+1),

Π¨k(t)=Π¨k(tk+1)Δtk(tk+1−t)+Π¨k(tk)Δtk(t−tk),Δtk=tk+1−tk.(4.26)\ddot\Pi_k(t)=\frac{\ddot\Pi_k(t_{k+1})}{\Delta t_k}(t_{k+1}-t)+\frac{\ddot\Pi_k(t_k)}{\Delta t_k}(t-t_k),\qquad \Delta t_k=t_{k+1}-t_k . \tag{4.26}

对时间两次积分,就得到 Πk(t)\Pi_k(t) 只取决于 4 个未知数:Π¨k(tk), Π¨k(tk+1), Πk(tk), Πk(tk+1)\ddot\Pi_k(t_k),\ \ddot\Pi_k(t_{k+1}),\ \Pi_k(t_k),\ \Pi_k(t_{k+1})。

第二步:逐层消元。 借助 (4.13) 的 NN 个位置指定值,再加上位置连续性与加速度连续性,把未知数从 4(N+1)4(N+1) 降到 2(N+1)2(N+1),再降到 NN;被消掉的 q2q_2、qN+1q_{N+1} 是虚拟点位置,可以用 Π1(t1)\Pi_1(t_1)、ΠN+1(tN+2)\Pi_{N+1}(t_{N+2}) 表达。

第三步:用速度连续性补齐。 到这一步唯一没用上的条件是速度连续性(1:44:02):左侧多项式右端点的速度等于右侧多项式左端点的速度,k=1,…,Nk=1,\dots,N,恰给出 NN 个方程:

A [Π¨2(t2) ⋯ Π¨N+1(tN+1)]T=b(4.28)A\,\big[\ddot\Pi_2(t_2)\ \cdots\ \ddot\Pi_{N+1}(t_{N+1})\big]^{\mathrm T}=b \tag{4.28}

其中 bb 为已知项,AA 为非奇异系数矩阵,解存在且唯一。AA 具有三对角带结构

A=[a11a120a21a22a23⋱⋱⋱aN−1,N−1aN−1,N0aN,N−1aNN],A=\begin{bmatrix} a_{11}&a_{12}&&\mathbf 0\\ a_{21}&a_{22}&a_{23}&\\ &\ddots&\ddots&\ddots\\ &&a_{N-1,N-1}&a_{N-1,N}\\ \mathbf 0&&a_{N,N-1}&a_{NN} \end{bmatrix},

这大大简化了求解(见习题 4.4):前向计算 + 后向计算即可。关键性质:AA 对所有关节都一样——因为它只依赖指定的时间间隔 Δtk\Delta t_k,而所有关节的时间间隔相同(1:46:35);唯一随关节变化的只有右端项 bb(它与关节角度相关)。

样条降维:从 4(N+1) 个未知数到 N 个未知数的三对角系统 上方一行表示原始系统 4(N+1) 个未知数;中间箭头标出三步消元:位置指定值与连续性、加速度连续性、虚拟点位置表达;下方是最终的 N×N 三对角矩阵 A 与右端向量 b,并注明 A 只依赖时间间隔、对所有关节相同。 原始:N+1N+1 个三次多项式 ⇒ 4(N+1)4(N+1) 个未知系数 位置指定值 (4.13) + 位置连续性 + 加速度连续性 ⇒ 降到 2(N+1)2(N+1) ⇒ NN 虚拟点位置 q2,qN+1q_2,q_{N+1} 用 Π1,ΠN+1\Pi_1,\Pi_{N+1} 表达后消去 最后用速度连续性(唯一未用条件)补 NN 个方程 (4.28) AA:三对角带,N×NN\times N A Π=bA\,\boldsymbol\Pi=b AA 只依赖 Δtk\Delta t_k ⇒ 所有关节共用同一个 AA(1:46:35) bb 与关节角度相关 ⇒ 换关节只换右端项
样条降维(本教程绘):把 4(N+1)4(N+1) 个未知数的巨型系统,靠「位置指定值 + 位置/加速度连续性 + 虚拟点表达」压到 NN 个未知数,再用最后剩下的速度连续性写成三对角系统 (4.28)。AA 与关节无关这一点,是多关节实现时最大的算力红利。
例 4.2.I(原书图 4.7)· 两组虚拟点的对比

数据 q1=0, q3=2π, q4=π/2, q6=πq_1=0,\ q_3=2\pi,\ q_4=\pi/2,\ q_6=\pi,t1=0, t3=2, t4=3, t6=5t_1=0,\ t_3=2,\ t_4=3,\ t_6=5,q˙1=q˙6=0\dot q_1=\dot q_6=0。分别取两组虚拟点时刻:t2=0.5, t5=4.5t_2=0.5,\ t_5=4.5(实线)与 t2=1.5, t5=3.5t_2=1.5,\ t_5=3.5(虚线)。

读图要点(1:48:16):加速度是连续的(线性、无跳跃);第二组虚拟点更接近两个中间点的时刻,得到的加速度值更大——「因为它离这个点近,在很短的时间内就需要完成从这点到这点的过渡,所以加速度和速度值就会比较大」(1:49:09)。此时速度曲线也平滑了,代价是计算量更高。

4.2.2.4 路线④:与抛物线混合的内插线性多项式

最后一条路线采用最简化的做法:用线性分段插值 NN 个路径点,只在路径点附近用抛物线过渡,以免速度跳跃(1:50:13)。这样整条轨迹就由「线性多项式 + 二次多项式」交替拼接而成——代价是容忍加速度的不连续。

定义 4.2.7 · 抛物线混合的线性内插

令 Δtk=tk−tk−1\Delta t_k=t_k-t_{k-1} 为 qk−1q_{k-1} 与 qkq_k 之间的时间长度;Δtk′\Delta t'_k 为抛物线混合段的时间长度;qk−1,kq_{k-1,k} 为连接 qk−1q_{k-1} 与 qkq_k 的常值速度(即线性段斜率);q¨k\ddot q_k 为 qkq_k 处持续时间为 Δtk′\Delta t'_k 的抛物线混合加速度。假定 qk,Δtk,Δtk′q_k,\Delta t_k,\Delta t'_k 已给定,则中间点的速度与加速度为

qk−1,k=qk−qk−1Δtk,q¨k=qk,k+1−qk−1,kΔtk′.(4.29,4.30)q_{k-1,k}=\frac{q_k-q_{k-1}}{\Delta t_k},\qquad \ddot q_k=\frac{q_{k,k+1}-q_{k-1,k}}{\Delta t'_k}. \tag{4.29,4.30}

这里有两个必须注意的点:

  1. 首末两段要加长。 为了让轨迹与第一段、最后一段至少在部分时间内保持一致,轨迹应有更长的持续时间 tN−t1+Δt1′+ΔtN′2,t_N-t_1+\frac{\Delta t'_1+\Delta t'_N}{2}, 也就是说,首段向左、末段向右各延伸半个混合时间(1:53:10)。
  2. 轨迹不经过路径点。 q(t)q(t) 不达到路径点 qkq_k 中的任何一个,而是从其附近经过——此时把路径点称为经由点(via point)更合适。混合加速度越大,通路与经由点越接近(教材 §4.2.2)。

例 4.2.J(原书图 4.9)· 混合时间越短,越贴近经由点

数据 q1=0, q2=2π, q3=π/2, q4=πq_1=0,\ q_2=2\pi,\ q_3=\pi/2,\ q_4=\pi,t1=0, t2=2, t3=3, t4=5t_1=0,\ t_2=2,\ t_3=3,\ t_4=5,q˙1=q˙4=0\dot q_1=\dot q_4=0。对 k=1,…,4k=1,\dots,4 分别取 Δtk′=0.2\Delta t'_k=0.2(实线)与 Δtk′=0.6\Delta t'_k=0.6(虚线)。

读图要点(1:54:38):第一种情形(Δtk′=0.2\Delta t'_k=0.2)下 q(t)q(t) 的通路更接近经由点,但以更高的加速度为代价——「在更短的时间内完成从一个速度到另一个速度的过渡,就需要更大的加速度」。

工业上为什么选它? 「采用梯形速度曲线是比较简单的、比较通用的方式,在工业上其实是比较常用的」——当不要求轨迹恰在指定瞬时从经由点附近经过时,用梯形速度曲线开发轨迹规划算法就很有吸引力,因为它足够简单(1:55:22)。

例 4.2.K(原书图 4.10)· 用「时间超前」省掉一次停顿

只有一个中间点的情形:数据 qi=0, qf=3π/2q_i=0,\ q_f=3\pi/2,ti=0, tf=2t_i=0,\ t_f=2,中间点位于 q=πq=\pi、时刻 t=1t=1。

保守做法:把运动分成两段,每段各生成一条梯形速度曲线。机械手关节肯定到达中间点,但「在继续朝向最终点运动之前,它会被强迫停在那里」——加速、匀速、减速到零、停住、再重新加速(1:56:21)。这段位移和时间的浪费相当明显。

灵活做法:用速度(或位置)的和作参考,在第一分段结束之前就开始产生第二分段——也就是引入时间超前。这样关节仍到达最终点,但不再保证在指定时刻穿越中间点(π\pi 点于是成了经由点),全局持续时间更短;代价是中间点的速度不为零。两个分段的最大加速度分别为 ∣q¨1∣=6π|\ddot q_1|=6\pi 与 ∣q¨2∣=3π|\ddot q_2|=3\pi,预期时间 0.180.18(教材 §4.2.2)。

推广到多段(2:20:27):时间超前量按递归关系 Δtj=Δtj−1+δtj\Delta t_j=\Delta t_{j-1}+\delta t_j 估计——它等于前一分段已产生的时间超前,加上当前分段开始的时间超前(教材式 4.50)。老师提醒:这种规划没有考虑速度连续性,实际中要加抛线段做平滑过渡,或做提前预判规划。

考点 · 老师原话(录播时间点)

样条是本节的理论重点,但「主要理解思路」。 「实际过程中其实都有程序已经写好,包括已经商用的一些机械臂,这种规划都是有的……主要是理解这个思路」(1:47:59)。

降维是样条的关键一步。 「这个方程系统很大的……对很小的一个机械臂的计算量都是非常大的,所以需要一些技巧的方法——怎么对未知数或者整个方程系统进行降维」(1:30:25)。

AA 与关节无关是最大红利。 「AA 是一个非奇异的系数矩阵,具有三角带的结构。对于所有的关节 AA 都是一样的,因为它只依赖于指定的时间间隔……你只要把某一个关节的 AA 计算出来了,其他所有关节的 AA 都是一样的」(1:46:37)。

工业上用梯形速度曲线。 「采用梯形速度曲线是比较简单、比较通用的方式,在工业上其实是比较常用的」(1:55:22)——前提是不要求指定瞬时时刻经过经由点。

多段混合要加预判。 「实际过程中对于多线段分段,一般是采用这种方法(时间超前)来进行规划的……但是要写代码还是需要仔细」(2:21:59)。

默写点 · 合上书再写(主动回忆)

不看正文与速查卡,先写出下面几条,再展开核对。写不出来就说明这一节还没「拿走」。

  1. 说出高阶插值多项式的五个缺点(至少四条)。
  2. 写出路线②的速度计算规则 (4.12)。
  3. 样条的方程计数:中间点几个、极值点几个、未知数几个?差多少?两个虚拟点补在哪里?
  4. 写出 (4.29)(4.30),并说明为什么叫「经由点」而不是「路径点」。
核对

① 不能指定首末速度;② 阶数高 ⇒ 振动/不自然轨迹;③ 数值精度降低;④ 方程系统求解繁难;⑤ 系数依赖全部点,改一点全重算。

q˙1=0\dot q_1=0;sgn⁡(vk)≠sgn⁡(vk+1)⇒q˙k=0\operatorname{sgn}(v_k)\ne\operatorname{sgn}(v_{k+1})\Rightarrow\dot q_k=0;同号 ⇒q˙k=(vk+vk+1)/2\Rightarrow\dot q_k=(v_k+v_{k+1})/2;q˙N=0\dot q_N=0,其中 vk=(qk−qk−1)/(tk−tk−1)v_k=(q_k-q_{k-1})/(t_k-t_{k-1})。

中间点 4(N−2)4(N-2)、极值点 6,共 4N−24N-2;未知数 4(N−1)4(N-1);多 2 个(即初始与最终加速度这两个任意条件)。引入两个虚拟点后变成 N+1N+1 个三次多项式:4(N+1)4(N+1) 方程对 4(N+1)4(N+1) 未知数,配平。

qk−1,k=(qk−qk−1)/Δtkq_{k-1,k}=(q_k-q_{k-1})/\Delta t_k;q¨k=(qk,k+1−qk−1,k)/Δtk′\ddot q_k=(q_{k,k+1}-q_{k-1,k})/\Delta t'_k。因为抛物线混合段让轨迹从路径点附近经过而非到达,中间点的位置被「削角」,故改称经由点。

4.2.2 小结与常见错误

  • 一条主线:NN 个点 ⇒ 单个 (N−1)(N-1) 阶多项式不可用(五个缺点)⇒ 改用 N−1N-1 段三次多项式 ⇒ 每段差 2 个方程 ⇒ 四条补法(指定速度 路径点指定速度的插值多项式 / 计算速度 线性分段斜率定速度 / 样条 / 抛物线混合)。
  • 一个计数:样条 4N−24N-2 vs 4(N−1)4(N-1) 差 2 ⇒ 虚拟点 ⇒ 4(N+1)4(N+1) 配平 ⇒ 降维到 NN ⇒ 三对角 AΠ¨=bA\ddot\Pi=b,AA 与关节无关。
  • 一句话:「通过系列点的运动,本质上是在每一段上重复点对点的方法,再补上段与段之间的连续性条件。」
常见错误清单 · 自查三条
  1. 把样条当成「光滑的插值」就完事——它的定义性特征是加速度连续;只保证速度连续的是路线①②,不是样条。
  2. 虚拟点当成真实路径点:虚拟点不指定位置,只施加连续性约束;一旦给它们赋位置值,系统又变超定。
  3. 经由点 = 路径点:抛物线混合下 q(t)q(t) 不到达路径点,只从附近经过;「混合加速度越大越贴近」是反直觉但正确的关系。