三次样条轨迹
建议先阅读 机器人轨迹规划——三次样条轨迹1(基于速度的求解方法),这两篇文章中有一些思想是共通的,这一篇写得更加详细一点。
定义
当有 n + 1 个点时,可以使用 n 个次数为 p 的多项式(通常次数较低),每个多项式定义轨迹的一段。以这种方式定义的整体函数 s ( t ) s(t) s(t) 称为次数为 p 的样条曲线。p 的值根据所需的样条曲线的连续性程度来选择。例如,为了在时间瞬间 t k t_k tk 处获得速度和加速度的连续性,其中发生连续两段之间的过渡,可以假设次数为 p = 3 p = 3 p=3 的多项式(三次多项式)。
三次样条曲线的表达式如下所示:
s ( t ) = { q k ( t ) , t ∈ [ t k , t k + 1 ] , k = 0 , … , n − 1 } q k ( t ) = a k 0 + a k 1 ( t − t k ) + a k 2 ( t − t k ) 2 + a k 3 ( t − t k ) 3 q ˙ k ( t ) = a k 1 + 2 a k 2 ( t − t k ) + 3 a k 3 ( t − t k ) 2 q ¨ k ( t ) = 2 a k 2 + 6 a k 3 ( t − t k ) (1) \begin{aligned} s(t)&=\{q_k(t),t \in [t_k,t_{k+1}], k=0,\ldots,n-1\} \\ q_k(t) &=a_{k0}+a_{k1}(t-t_k)+a_{k2}(t-t_k)^2+a_{k3}(t-t_k)^3\\ \dot q_k(t) &= a_{k1} + 2a_{k2}(t-t_k)+3a_{k3}(t-t_k)^2 \\ \ddot q_k(t) &= 2a_{k2} + 6a_{k3}(t-t_k)\\ \end{aligned} \tag{1} s(t)qk(t)q˙k(t)q¨k(t)={qk(t),t∈[tk,tk+1],k=0,…,n−1}=ak0+ak1(t−tk)+ak2(t−tk)2+ak3(t−tk)3=ak1+2ak2(t−tk)+3ak3(t−tk)2=2ak2+6ak3(t−tk)(1)
另外三次多项式可以通过逐次积分的方式,若已知每段多项式起始时刻的 q k , v k , w k , j k q_k,v_k,w_k,j_k qk,vk,wk,jk,则
q
¨
k
(
t
)
=
w
k
+
j
k
(
t
−
t
k
)
q
˙
k
(
t
)
=
v
k
+
w
k
(
t
−
t
k
)
+
1
2
j
k
(
t
−
t
k
)
2
q
k
(
t
)
=
q
k
+
v
k
(
t
−
t
k
)
+
1
2
w
k
(
t
−
t
k
)
2
+
1
6
j
t
k
(
t
−
t
k
)
3
(1-1)
\begin{aligned} \ddot q_k(t) &= w_k + j_k (t - t_k)\\ \dot q_k(t) &= v_k + w_k(t-t_k) + \frac{1}{2}j_k(t-t_k)^2\\ q_k(t) &= q_{k} + v_{k}(t-t_k) + \frac{1}{2}w_{k}(t-t_k)^2 + \frac{1}{6}j_{t_k}(t-t_k)^3\\ \end{aligned} \tag{1-1}
q¨k(t)q˙k(t)qk(t)=wk+jk(t−tk)=vk+wk(t−tk)+21jk(t−tk)2=qk+vk(t−tk)+21wk(t−tk)2+61jtk(t−tk)3(1-1)
其中:
q
k
:
在
t
k
点的位置
v
k
:
在
t
k
点的速度
w
k
:
在
t
k
点的加速度
j
k
:
在
[
t
k
,
t
k
+
1
)
区间内的加加速度,在该区间内是常数
\begin{aligned} q_{k}&:在t_{k}点的位置\\ v_{k}&:在t_{k}点的速度\\ w_{k}&:在t_{k}点的加速度\\ j_{k}&:在[t_{k}, t_{k+1})区间内的加加速度,在该区间内是常数\\ \end{aligned}
qkvkwkjk:在tk点的位置:在tk点的速度:在tk点的加速度:在[tk,tk+1)区间内的加加速度,在该区间内是常数
可以看出来,三次样条曲线的速度曲线是二次多项式,加速度曲线是一次多项式,加加速度在每个阶段是恒定的。同时我们可以得到多项式的系数和端点位置、速度、加速度的关系,可以参考 机器人轨迹规划—三次多项式插值轨迹。知道每段多项式端点的位置、速度可以得到:
q
k
(
t
k
)
=
q
k
=
a
k
0
q
k
(
t
k
+
1
)
=
q
k
+
1
=
a
k
0
+
a
k
1
T
k
+
a
k
2
T
k
2
+
a
k
3
T
k
3
q
˙
k
(
t
k
)
=
v
k
=
a
k
1
q
˙
k
(
t
k
+
1
)
=
v
k
+
1
=
a
k
1
+
2
a
k
2
T
k
+
3
a
k
3
T
k
2
⟹
{
a
k
0
=
q
k
a
k
1
=
v
k
a
k
2
=
1
T
k
[
3
(
q
k
+
1
−
q
k
)
T
k
−
2
v
k
−
v
k
+
1
]
a
k
3
=
1
T
k
2
[
2
(
q
k
−
q
k
+
1
)
T
k
+
v
k
+
v
k
+
1
]
k
=
0
,
…
,
n
−
1
(1-2)
\begin{aligned} &q_k(t_k) = q_k = a_{k0} \\ &q_k(t_{k+1}) = q_{k+1} = a_{k0} + a_{k1}T_k + a_{k2}T_k^2 + a_{k3}T_k^3\\ &\dot q_k(t_k) = v_k = a_{k1} \\ &\dot q_k(t_{k+1}) = v_{k+1} = a_{k1} + 2a_{k2}T_k+3a_{k3}T_k^2\\ \\ \implies &\left.\left\{\begin{aligned} a_{k0}&=q_k\\ a_{k1}&=v_k\\ a_{k2}&=\frac{1}{T_k}\left[\frac{3(q_{k+1}-q_k)}{T_k}-2v_k-v_{k+1}\right]\\ a_{k3}&=\frac{1}{T_k^2}\left[\frac{2(q_k-q_{k+1})}{T_k}+v_k+v_{k+1}\right] \end{aligned}\right.\right. \quad k=0,\ldots,n-1 \\ \end{aligned} \tag{1-2}
⟹qk(tk)=qk=ak0qk(tk+1)=qk+1=ak0+ak1Tk+ak2Tk2+ak3Tk3q˙k(tk)=vk=ak1q˙k(tk+1)=vk+1=ak1+2ak2Tk+3ak3Tk2⎩
⎨
⎧ak0ak1ak2ak3=qk=vk=Tk1[Tk3(qk+1−qk)−2vk−vk+1]=Tk21[Tk2(qk−qk+1)+vk+vk+1]k=0,…,n−1(1-2)
从(1-2)四个约束求解出四个多项式系数,可以得到多项式系数和端点位置、速度的关系,其中
T
k
=
t
k
+
1
−
t
k
T_k=t_{k+1} - t_k
Tk=tk+1−tk。
同理:
q
k
(
t
k
)
=
q
k
=
a
k
0
q
k
(
t
k
+
1
)
=
q
k
+
1
=
a
k
0
+
a
k
1
T
k
+
a
k
2
T
k
2
+
a
k
3
T
k
3
q
¨
k
(
t
k
)
=
w
k
=
2
a
k
2
q
¨
k
(
t
k
+
1
)
=
w
k
+
1
=
2
a
k
2
+
6
a
k
3
T
k
⟹
{
a
k
0
=
q
k
a
k
1
=
q
k
+
1
−
q
k
T
k
−
T
k
6
(
w
k
+
1
+
2
w
k
)
a
k
2
=
w
k
2
a
k
3
=
w
k
+
1
−
w
k
6
T
k
k
=
0
,
…
,
n
−
1
(1-3)
\begin{aligned} &q_k(t_k) = q_k = a_{k0} \\ &q_k(t_{k+1}) = q_{k+1} = a_{k0} + a_{k1}T_k + a_{k2}T_k^2 + a_{k3}T_k^3\\ &\ddot q_k(t_k) = w_k = 2a_{k2}\\ &\ddot q_k(t_{k+1}) = w_{k+1} = 2a_{k2} + 6a_{k3}T_k \\ \\ \implies &\left.\left\{ \begin{aligned} a_{k0}&=q_k\\ a_{k1}&=\frac{q_{k+1}-q_k}{T_k}-\frac{T_k}{6}(w_{k+1}+2w_k)\\ a_{k2}&=\frac{w_k}{2}\\ a_{k3}&=\frac{w_{k+1}-w_k}{6T_k} \end{aligned} \right.\right. \quad k=0,\ldots,n-1 \end{aligned} \tag{1-3}
⟹qk(tk)=qk=ak0qk(tk+1)=qk+1=ak0+ak1Tk+ak2Tk2+ak3Tk3q¨k(tk)=wk=2ak2q¨k(tk+1)=wk+1=2ak2+6ak3Tk⎩
⎨
⎧ak0ak1ak2ak3=qk=Tkqk+1−qk−6Tk(wk+1+2wk)=2wk=6Tkwk+1−wkk=0,…,n−1(1-3)
从(1-3)可以得出多项式系数和端点位置、加速度的关系。
求解方法
为了计算样条曲线,需要求出每段多项式的4 个系数。由于定义通过 n + 1 个点的轨迹需要 n 个多项式,因此需要确定的总系数数量为 4n。为了解决这个问题,必须考虑以下条件:
- 2n 个条件用于插值给定的点: 因为每个三次函数必须在其端点处穿过这些点。
- n-1 个条件用于过渡点处速度(一阶导数)的连续性: 保证曲线在连接点处的速度平滑过渡。
- n-1 个条件用于过渡点处加速度(二阶导数)的连续性: 保证曲线在连接点处的加速度平滑过渡。
这样,一共就有 2n + 2(n-1) 个条件,因此剩余的自由度为 4n - 2n - 2(n-1) = 2。这里可以理解为一个条件就是一个线性等式,而有4n个未知数,要求出唯一解,就需要有4n个线性等式约束。为了计算样条曲线,必须再施加两个额外的约束条件。额外的条件通常有:
- 给定初始和结束的速度, s ˙ ( t 0 ) = v 0 \dot s(t_0) = v_0 s˙(t0)=v0, s ˙ ( t n ) = v n \dot s(t_n) = v_n s˙(tn)=vn,这是我们重点关注的
- 给定初始和结束的加速度 s ¨ ( t 0 ) , s ¨ ( t n ) \ddot s(t_0), \ddot s(t_n) s¨(t0),s¨(tn),这种条件一般称为自然曲线(natural)
- 约束 s ˙ ( t 0 ) = s ˙ ( t n ) , s ¨ ( t 0 ) = s ¨ ( t n ) \dot s(t_0) = \dot s(t_n), \ddot s(t_0) = \ddot s(t_n) s˙(t0)=s˙(tn),s¨(t0)=s¨(tn);这种条件称为循环曲线(cyclic),因为它会定义一个周期为 T = t n − t 0 T = t_n - t_0 T=tn−t0的循环样条曲线
- 可以约束在
t
1
,
t
n
−
1
t_1, t_{n-1}
t1,tn−1时刻的jerk的连续性:
d 3 s ( t ) d t 3 ∣ t = t 1 − = d 3 s ( t ) d t 3 ∣ t = t 1 + , d 3 s ( t ) d t 3 ∣ t = t n − 1 − = d 3 s ( t ) d t 3 ∣ t = t n − 1 + \left.\frac{d^{3}s(t)}{dt^{3}}\right|_{t=t_{1}^{-}}=\left.\frac{d^{3}s(t)}{dt^{3}}\right|_{t=t_{1}^{+}},\quad\left.\frac{d^{3}s(t)}{dt^{3}}\right|_{t=t_{n-1}^{-}}=\left.\frac{d^{3}s(t)}{dt^{3}}\right|_{t=t_{n-1}^{+}} dt3d3s(t) t=t1−=dt3d3s(t) t=t1+,dt3d3s(t) t=tn−1−=dt3d3s(t) t=tn−1+
给定边界点速度求解样条曲线
假设每一段三次多项式的端点加速度是: q ¨ ( t k ) = w k , k = 0 , … , n \begin{aligned}\ddot{q}(t_k)=w_k,k=0,\ldots,n\end{aligned} q¨(tk)=wk,k=0,…,n,那么结合公式(1)和(1-3)可以得到
q k ( t ) = ( t k + 1 − t ) 3 6 T k w k + ( t − t k ) 3 6 T k w k + 1 + ( q k + 1 T k − T k w k + 1 6 ) ( t − t k ) + + ( q k T k − T k w k 6 ) ( t k + 1 − t ) , t ∈ [ t k , t k + 1 ] (2) \begin{gathered} q_{k}(t) =\frac{(t_{k+1}-t)^{3}}{6T_{k}}w_{k}+\frac{(t-t_{k})^{3}}{6T_{k}}w_{k+1}+\left(\frac{q_{k+1}}{T_{k}}-\frac{T_{k}w_{k+1}}{6}\right)(t-t_{k})+ \\ +\left(\frac{q_k}{T_k}-\frac{T_kw_k}6\right)(t_{k+1}-t), t\in[t_{k},t_{k+1}] \end{gathered} \tag{2} qk(t)=6Tk(tk+1−t)3wk+6Tk(t−tk)3wk+1+(Tkqk+1−6Tkwk+1)(t−tk)++(Tkqk−6Tkwk)(tk+1−t),t∈[tk,tk+1](2)
q ˙ k ( t ) = ( t − t k ) 2 2 T k w k + 1 + ( t k + 1 − t ) 2 2 T k w k + q k + 1 − q k T k − T k ( w k + 1 − w k ) 6 (3) \begin{aligned} \dot{q}_k(t)&=\frac{(t-t_k)^2}{2T_k}w_{k+1}+\frac{(t_{k+1}-t)^2}{2T_k}w_k+\frac{q_{k+1}-q_k}{T_k}-\frac{T_k(w_{k+1}-w_k)}{6} \end{aligned}\tag{3} q˙k(t)=2Tk(t−tk)2wk+1+2Tk(tk+1−t)2wk+Tkqk+1−qk−6Tk(wk+1−wk)(3)
q ¨ k ( t ) = w k + 1 ( t − t k ) + w k ( t k + 1 − t ) T k (4) \ddot{q}_k(t)=\frac{w_{k+1}(t-t_k)+w_k(t_{k+1}-t)}{T_k} \tag{4} q¨k(t)=Tkwk+1(t−tk)+wk(tk+1−t)(4)
公式(4)其实就是在 w k , w k + 1 w_{k}, w_{k+1} wk,wk+1之间线性插值。
考虑中间点的速度和加速度连续性:
q ˙ k − 1 ( t k ) = q ˙ k ( t k ) (5-1) \begin{aligned} \dot{q}_{k-1}(t_k)&=\dot{q}_k(t_k) \end{aligned} \tag{5-1} q˙k−1(tk)=q˙k(tk)(5-1)
q ¨ k − 1 ( t k ) = q ¨ k ( t k ) = w k (5-2) \begin{aligned} \ddot{q}_{k-1}(t_k)&=\ddot{q}_k(t_k)=w_k \end{aligned} \tag{5-2} q¨k−1(tk)=q¨k(tk)=wk(5-2)
把(3)代入(5-1),合并(5-2),可以得到:
T k − 1 T k w k − 1 + 2 ( T k + T k − 1 ) T k w k + w k + 1 = 6 T k ( q k + 1 − q k T k − q k − q k − 1 T k − 1 ) , k = 0 , … , n − 1 (6) \frac{T_{k-1}}{T_k}w_{k-1}+\frac{2(T_k+T_{k-1})}{T_k}w_k+w_{k+1}=\frac{6}{T_k}\left(\frac{q_{k+1}-q_k}{T_k}-\frac{q_k-q_{k-1}}{T_{k-1}}\right),\quad k=0,\dots,n-1 \tag{6} TkTk−1wk−1+Tk2(Tk+Tk−1)wk+wk+1=Tk6(Tkqk+1−qk−Tk−1qk−qk−1),k=0,…,n−1(6)
根据边界条件 s ˙ ( t 0 ) = v 0 , s ˙ ( t n ) = v n \dot{s}(t_0)=\mathrm{v}_0,\quad\dot{s}(t_n)=\mathrm{v}_n s˙(t0)=v0,s˙(tn)=vn,可以得到:
T 0 2 3 w 0 + T 0 2 6 w 1 = q 1 − q 0 − T 0 v 0 T n − 1 2 3 w n + T n − 1 2 6 w n − 1 = q n − 1 − q n + T n − 1 v n (7) \begin{gathered} \begin{aligned}\frac{T_0^2}{3}w_0+\frac{T_0^2}{6}w_1\end{aligned} =q_1-q_0-T_0\text{v}_0 \\ \begin{aligned}\frac{T_{n-1}^2}{3}w_n+\frac{T_{n-1}^2}{6}w_{n-1}\end{aligned} =q_{n-1}-q_n+T_{n-1}\text{v}_n \end{gathered} \tag{7} 3T02w0+6T02w1=q1−q0−T0v03Tn−12wn+6Tn−12wn−1=qn−1−qn+Tn−1vn(7)
把(6)、(7)写成矩阵格式:
A w = c (8) \boldsymbol{Aw} = \boldsymbol{c} \tag{8} Aw=c(8)
其中 A \boldsymbol{A} A是 ( n + 1 ) × ( n + 1 ) (n+1)\times(n+1) (n+1)×(n+1) 三角对称方阵(tridiagonal and symmetric):
A = [ 2 T 0 T 0 0 ⋯ 0 T 0 2 ( T 0 + T 1 ) T 1 ⋮ 0 ⋱ 0 ⋮ T n − 2 2 ( T n − 2 + T n − 1 ) T n − 1 0 ⋯ 0 T n − 1 2 T n − 1 ] (9) \left. \boldsymbol{A} =\left[\begin{array}{cccccc} 2T_0 &T_0 &0 &\cdots&& &0\\ T_0 &2(T_0+T_1) &T_1 &&& &\vdots\\ 0 &&&\ddots& & &0\\ \vdots&&&&T_{n-2}&2(T_{n-2}+T_{n-1})&T_{n-1}\\ 0&&\cdots&&0&T_{n-1}&2T_{n-1}\end{array}\right.\right] \tag{9} A= 2T0T00⋮0T02(T0+T1)0T1⋯⋯⋱Tn−202(Tn−2+Tn−1)Tn−10⋮0Tn−12Tn−1 (9)
c \boldsymbol{c} c是:
c = [ 6 ( q 1 − q 0 T 0 − v 0 ) 6 ( q 2 − q 1 T 1 − q 1 − q 0 T 0 ) ⋮ 6 ( q n − q n − 1 T n − 1 − q n − 1 − q n − 2 T n − 2 ) 6 ( v n − q n − q n − 1 T n − 1 ) ] (10) \boldsymbol{c}=\begin{bmatrix}6\left(\frac{q_1-q_0}{T_0}-\mathrm{v}_0\right)\\ 6\left(\frac{q_2-q_1}{T_1}-\frac{q_1-q_0}{T_0}\right)\\ \vdots\\ 6\left(\frac{q_n-q_{n-1}}{T_{n-1}}-\frac{q_{n-1}-q_{n-2}}{T_{n-2}}\right)\\ 6\left(\mathrm{v}_n-\frac{q_n-q_{n-1}}{T_{n-1}}\right)\end{bmatrix} \tag{10} c= 6(T0q1−q0−v0)6(T1q2−q1−T0q1−q0)⋮6(Tn−1qn−qn−1−Tn−2qn−1−qn−2)6(vn−Tn−1qn−qn−1) (10)
根据(8)求解出所有多项式端点的加速度,就可以得到多项式的表达式,同时也可以求出多项式的系数。
求解等式(8)最直接的方法是 w = A − 1 c \boldsymbol{w}=\boldsymbol{A}^{-1}\boldsymbol{c} w=A−1c,但是这里由于矩阵 A \boldsymbol{A} A是三角对称矩阵,可以有一些方法避免求解逆矩阵,参考Thomas algorithm。
给定边界点速度和加速度求解样条曲线
以上我们可以给定样条轨迹边界点的速度来作为补充条件求解三次样条曲线,曲线两端点的速度可以设置为0,并且内部连续;曲线内部的加速度也是连续的,但是不能保证边界点的加速度是0,这就意味着会有一个加速度阶跃,影响轨迹的光滑性。那么如何能够同时定义边界点的速度和加速度呢?
- 在第一段和最后一段使用5次多项式(每段6个参数),可以多出来4个约束,用来定义起始和结束的加速度;一般这样会导致最大加速度、最大速度变得更大(over shoot)
- 在第一段和最后一段分别插入自由点,这两个自由点根据给定的初始和结束加速度计算
因为第一种方法的缺点,选择第二种方法,详细如下。
考虑需要被插值的 n-1 个点,可以表示为:
q = [ q 0 , q 2 , q 3 , … q n − 3 , q n − 2 , q n ] T (11-1) \boldsymbol{q}=[q_0,\quad q_2,\quad q_3,\quad\ldots\quad q_{n-3},\quad q_{n-2},\quad q_n]^T \tag{11-1} q=[q0,q2,q3,…qn−3,qn−2,qn]T(11-1)
对应的时间戳是:
t = [ t 0 , t 2 , t 3 , … t n − 3 , t n − 2 , t n ] T (11-2) \boldsymbol{t}=\begin{bmatrix}t_0,&t_2,&t_3,&\ldots&t_{n-3},&t_{n-2},&t_n\end{bmatrix}^T \tag{11-2} t=[t0,t2,t3,…tn−3,tn−2,tn]T(11-2)
注意上述公式中 q 、 t q、t q、t的下标。
同时给定边界速度条件 v 0 , v n v_0, v_n v0,vn和边界加速度约束 a 0 , a n a_0, a_n a0,an。为了施加加速度边界约束,增加两个额外的自由点 q ˉ 1 \bar{q}_1 qˉ1和 q ˉ n − 1 \bar{q}_{n-1} qˉn−1,对应的时间戳分别是 t ˉ 1 \bar{t}_1 tˉ1和 t ˉ n − 1 \bar{t}_{n-1} tˉn−1,如下所示:
q
ˉ
=
[
q
0
,
q
ˉ
1
,
q
2
,
q
3
,
…
q
n
−
3
,
q
n
−
2
,
q
ˉ
n
−
1
,
q
n
]
T
(12-1)
\bar{\boldsymbol{q}}=\begin{bmatrix}q_0,&\bar{q}_1,&q_2,&q_3,&\dots&q_{n-3},&q_{n-2},&\bar{q}_{n-1},&q_n\end{bmatrix}^T \tag{12-1}
qˉ=[q0,qˉ1,q2,q3,…qn−3,qn−2,qˉn−1,qn]T(12-1)
t
ˉ
=
[
t
0
,
t
ˉ
1
,
t
2
,
t
3
,
…
t
n
−
3
,
t
n
−
2
,
t
ˉ
n
−
1
,
t
n
]
T
(12-2)
\bar{\boldsymbol{t}}=\begin{bmatrix}t_0,&\bar{t}_1, &t_2, &t_3, &\dots &t_{n-3}, &t_{n-2},&\bar{t}_{n-1}, &t_n\end{bmatrix}^T \tag{12-2}
tˉ=[t0,tˉ1,t2,t3,…tn−3,tn−2,tˉn−1,tn]T(12-2)
这个问题可以利用类似 ( 8 ) 、 ( 9 ) 、 ( 10 ) (8)、(9)、(10) (8)、(9)、(10)的方法进行解决,但是这里面 q ˉ 1 \bar{q}_1 qˉ1和 q ˉ n − 1 \bar{q}_{n-1} qˉn−1是未知的,我们需要用已知的 q 0 , q n , v 0 , v n , a 0 , a n q_0,q_n,v_0,v_n,a_0, a_n q0,qn,v0,vn,a0,an以及 w 1 , w n − 1 w_1,w_{n-1} w1,wn−1来表示它,根据公式(2),分别代入 t = t ˉ 1 t = \bar{t}_1 t=tˉ1和 t = t ˉ n − 1 t=\bar{t}_{n-1} t=tˉn−1,得到:
q 1 = q 0 + T 0 v 0 + T 0 2 3 a 0 + T 0 2 6 w 1 (12) q_1=q_0+T_0\text{v}_0+\frac{T_0^2}3\text{a}_0+\frac{T_0^2}6w_1 \tag{12} q1=q0+T0v0+3T02a0+6T02w1(12)
q n − 1 = q n − T n − 1 v n + T n − 1 2 3 a n + T n − 1 2 6 w n − 1 (13) q_{n-1}=q_n-T_{n-1}\text{v}_n+\frac{T_{n-1}^2}3\text{a}_n+\frac{T_{n-1}^2}6w_{n-1} \tag{13} qn−1=qn−Tn−1vn+3Tn−12an+6Tn−12wn−1(13)
因此我们可以构建出新的
A
w
=
c
(14-1)
\boldsymbol{Aw}=\boldsymbol{c} \tag{14-1}
Aw=c(14-1)
注意这里的
A
\boldsymbol{A}
A的形状是
(
n
−
1
)
×
(
n
−
1
)
(n-1)\times(n-1)
(n−1)×(n−1),这是因为
w
0
,
w
n
w_0,w_{n}
w0,wn是给定的边界条件(
w
0
=
a
0
,
w
n
=
a
n
w_0=a_0,w_n=a_n
w0=a0,wn=an),所以在替换公式(9)时,实际上第一行和最后一行是不需要的,同理
c
\boldsymbol{c}
c也是,
w
\boldsymbol{w}
w是
w
1
,
w
2
,
…
,
w
n
−
2
,
w
n
−
1
w_1,w_2,\dots,w_{n-2},w_{n-1}
w1,w2,…,wn−2,wn−1。
把(12)、(13)代入
(
9
)
、
(
10
)
(9)、(10)
(9)、(10)之中,并进行化简得到:
A = [ 2 T 1 + T 0 ( 3 + T 0 T 1 ) T 1 0 ⋯ 0 T 1 − T 0 2 T 1 2 ( T 1 + T 2 ) T 2 ⋮ 0 T 2 2 ( T 2 + T 3 ) T 3 ⋮ ⋮ 0 T n − 3 2 ( T n − 3 + T n − 2 ) T n − 2 − T n − 1 T n − 2 0 ⋯ 0 T n − 2 2 T n − 2 + T n − 1 ( 3 + T n − 1 T n − 2 ) ] (14-2) \left.\boldsymbol{A}=\left[\begin{array}{c} &2T_1+T_0\left(3+\frac{T_0}{T_1}\right) &T_1 &0 &\cdots&& &0\\ &T_1-\frac{T_0^2}{T_1} &2(T_1+T_2) &T_2 &&& &\vdots\\ &0 &T_2 &2(T_2+T_3) &T_3 &&\\ &\vdots & & &\vdots&& &0\\ & & & &&T_{n-3} &2(T_{n-3}+T_{n-2}) &T_{n-2}-\frac{T_{n-1}}{T_{n-2}}\\ &0 &\cdots & &&0&T_{n-2} &2T_{n-2}+T_{n-1}\left(3+\frac{T_{n-1}}{T_{n-2}}\right) \end{array}\right.\right] \tag{14-2} A= 2T1+T0(3+T1T0)T1−T1T020⋮0T12(T1+T2)T2⋯0T22(T2+T3)⋯T3⋮Tn−302(Tn−3+Tn−2)Tn−20⋮0Tn−2−Tn−2Tn−12Tn−2+Tn−1(3+Tn−2Tn−1) (14-2)
c = [ 6 ( q 2 − q 0 T 1 − v 0 ( 1 + T 0 T 1 ) − a 0 ( 1 2 + T 0 3 T 1 ) T 0 ) 6 ( q 3 − q 2 T 2 − q 2 − q 0 T 1 + v 0 T 0 T 1 + a 0 T 0 3 T 1 ) 6 ( q 4 − q 3 T 3 − q 3 − q 2 T 2 ) ⋮ 6 ( q n − 2 − q n − 3 T n − 3 − q n − 3 − q n − 4 T n − 4 ) 6 ( q n − q n − 2 T n − 2 − q n − 2 − q n − 3 T n − 3 − v n T n − 1 T n − 2 + a n T n − 1 3 T n − 2 ) 6 ( q n − 2 − q n T n − 2 + v n ( 1 + T n − 1 T n − 2 ) − a n ( 1 2 + T n − 1 3 T n − 2 ) T n − 1 ) ] (14-3) \boldsymbol{c}=\begin{bmatrix} 6\left(\frac{q_2-q_0}{T_1}-\mathrm{v}_0\left(1+\frac{T_0}{T_1}\right)-\mathrm{a}_0\left(\frac12+\frac{T_0}{3T_1}\right)T_0\right)\\6\left(\frac{q_3-q_2}{T_2}-\frac{q_2-q_0}{T_1}+\mathrm{v}_0\frac{T_0}{T_1}+\mathrm{a}_0\frac{T_0}{3T_1}\right)\\6\left(\frac{q_4-q_3}{T_3}-\frac{q_3-q_2}{T_2}\right)\\\vdots\\6\left(\frac{q_{n-2}-q_{n-3}}{T_{n-3}}-\frac{q_{n-3}-q_{n-4}}{T_{n-4}}\right)\\6\left(\frac{q_n-q_{n-2}}{T_{n-2}}-\frac{q_{n-2}-q_{n-3}}{T_{n-3}}-\mathrm{v}_n\frac{T_{n-1}}{T_{n-2}}+\mathrm{a}_n\frac{T_{n-1}}{3T_{n-2}}\right)\\6\left(\frac{q_{n-2}-q_n}{T_{n-2}}+\mathrm{v}_n\left(1+\frac{T_{n-1}}{T_{n-2}}\right)-\mathrm{a}_n\left(\frac12+\frac{T_{n-1}}{3T_{n-2}}\right)T_{n-1}\right) \end{bmatrix} \tag{14-3} c= 6(T1q2−q0−v0(1+T1T0)−a0(21+3T1T0)T0)6(T2q3−q2−T1q2−q0+v0T1T0+a03T1T0)6(T3q4−q3−T2q3−q2)⋮6(Tn−3qn−2−qn−3−Tn−4qn−3−qn−4)6(Tn−2qn−qn−2−Tn−3qn−2−qn−3−vnTn−2Tn−1+an3Tn−2Tn−1)6(Tn−2qn−2−qn+vn(1+Tn−2Tn−1)−an(21+3Tn−2Tn−1)Tn−1) (14-3)
这里的 T 0 , T 1 T_0,T_1 T0,T1和 T n − 2 , T n − 1 T_{n-2},T_{n-1} Tn−2,Tn−1分别是 t ˉ 1 \bar{t}_1 tˉ1和 t ˉ n − 1 \bar{t}_{n-1} tˉn−1的函数,而 t ˉ 1 \bar{t}_1 tˉ1和 t ˉ n − 1 \bar{t}_{n-1} tˉn−1分别在区间 ( t 0 , t 2 ) (t_0, t_2) (t0,t2)和 ( t n − 2 , t n ) (t_{n-2}, t_n) (tn−2,tn)之间,可以随便给定一个值,比如: t ˉ 1 = t 0 + t 2 2 \bar{t}_1=\frac{t_0+t_2}{2} tˉ1=2t0+t2, t ˉ n − 1 = t n − 2 + t n 2 \bar{t}_{n-1}=\frac{t_{n-2}+t_n}{2} tˉn−1=2tn−2+tn。
同理根据 Tridiagonal_matrix_algorithm可以快速求解出 w \boldsymbol{w} w,得到所有点的加速度后,就可以根据(2)写出轨迹的表达式了。
示例
在python中使用三次样条曲线,可以使用现成的scipy.interpolate.CubicSpline
,当然了它不能同时定义起始和结束点的速度与加速度,参考 机器人轨迹规划——三次样条轨迹1(基于速度的求解方法)。
代码实现
这一部分的代码大家可以根据公式去实现一下,然后和python的scipy.interpolate.CubicSpline
以及 机器人轨迹规划——三次样条轨迹1(基于速度的求解方法)做一个对比,看看结果是否一致。
总结
我们在这篇文章中详细地推导了三次样条曲线地求解方法,另外我们给出了如何利用插入自由点的方法来同时定义起始结束的速度、加速度值,这在机器人轨迹规划时是十分有用的。
扩展
需要注意的是本文涉及的计算三次样条轨迹算法需要给定的已知条件是每个点的位置、时间戳以及轨迹起始、结束点的速度、加速度,这里时间戳是已知的,那么如果我们不知道要在什么时刻抵达对应的位置点,如何规划三次样条轨迹呢?这就需要计算最优的时间。
问题可以描述为,已知:
q
=
[
q
0
,
q
1
,
…
,
q
n
−
1
,
q
n
]
q
˙
0
=
v
0
,
q
˙
n
=
v
n
q
¨
0
=
a
0
,
q
˙
n
=
a
n
\begin{aligned} \boldsymbol{q} = [q_0, q_1,\dots,q_{n-1},q_{n}]\\ \dot q_0 = v_0, \quad \dot q_n = v_n\\ \ddot q_0 = a_0, \quad \dot q_n = a_n \\ \end{aligned}
q=[q0,q1,…,qn−1,qn]q˙0=v0,q˙n=vnq¨0=a0,q˙n=an
求解:
min
∑
i
=
0
n
−
1
T
i
s
.
t
.
q
˙
m
i
n
≤
q
˙
≤
q
˙
m
a
x
q
˙
m
i
n
≤
q
¨
≤
q
˙
m
a
x
\begin{aligned} &&\min \sum_{i=0}^{n-1} T_i \\ &s.t. \\ &&\dot q_{min} \leq \dot q \leq \dot q_{max} \\ &&\dot q_{min} \leq \ddot q \leq \dot q_{max} \\ \end{aligned}
s.t.mini=0∑n−1Tiq˙min≤q˙≤q˙maxq˙min≤q¨≤q˙max
上式中
T
i
T_i
Ti是每一段多项式的时间段,如果已知所有的
T
i
T_i
Ti,那么就可以累加计算出所有的时间戳
t
i
t_i
ti,从而根据前面的公式,计算出三次样条曲线。同时,计算出来的三次样条曲线需要满足速度和加速度的约束。
这个优化问题怎么求解,我们以后再详细讲述一下。