B-spline and Bezier Curve
介绍一下robotics运动规划方向的B样条曲线与贝塞尔曲线相关知识。
0728:TODO,节点向量如何得到?
- 贝塞尔曲线,B-样条,非均匀有理B样条梳理
- 曲线篇: 贝塞尔曲线
- Animated Bézier Curves
- Bézier curve Wikipedia,建议看维基百科上的图片
- 详解样条曲线(上)(包含贝塞尔曲线)
1. Bezier, 贝塞尔曲线
Bézier curves can be used in robotics to produce trajectories of an end-effector due to the virtue of the control polygon’s ability to give a clear indication of whether the path is colliding with any nearby obstacle or object.[30] Furthermore, joint space trajectories can be accurately differentiated using Bézier curves. Consequently, the derivatives of joint space trajectories are used in the calculation of the dynamics and control effort (torque profiles) of the robotic manipulator.[30]
1.1 贝塞尔曲线的定义
m
m
m次贝塞尔曲线定义为:
b
(
u
)
=
∑
j
=
0
m
B
j
m
(
u
)
p
j
0
≤
u
≤
1
{\bf b}(u) = \sum_{j=0}^{m}B_j^m(u){\bf p}_j \quad 0 \leq u \leq 1
b(u)=j=0∑mBjm(u)pj0≤u≤1
其中, p j {\bf p}_j pj 为控制点,基函数 B j m ( u ) B_j^m(u) Bjm(u) 为 m m m 次伯恩斯坦多项式,定义为:
B j m ( u ) = m ! j ! ( m − j ) ! u j ( 1 − u ) m − j B_j^m(u)=\frac{m!}{j!(m-j)!}u^j(1-u)^{m-j} Bjm(u)=j!(m−j)!m!uj(1−u)m−j
且 j = 0 , . . . , m j=0,...,m j=0,...,m,给定 m + 1 m+1 m+1个控制点,得到 m m m阶贝塞尔曲线;贝塞尔曲线的阶数与控制点的个数相关。
下图为四个控制点情况下的Cubic Bezier curve:
1.2 贝塞尔曲线的导数
m
m
m次贝塞尔曲线的导数为
m
−
1
m-1
m−1次贝塞尔曲线,定义为:
b
(
1
)
(
u
)
=
m
∑
i
=
0
m
−
1
B
i
m
−
1
(
u
)
(
p
i
+
1
−
p
i
)
{\bf b}^{(1)}(u)=m\sum_{i=0}^{m-1}B_i^{m-1}(u)({\bf p}_{i+1}-{\bf p}_i)
b(1)(u)=mi=0∑m−1Bim−1(u)(pi+1−pi)
特别地,贝塞尔曲线端点处的 k k k阶导数只取决于此端点前的 k + 1 k+1 k+1个控制点,如端点处的一阶导数为:
p ( 1 ) ( 0 ) = m ( p 1 − p 0 ) , p ( 1 ) ( 1 ) = m ( p m − p m − 1 ) {\bf p}^{(1)}(0)=m({\bf p}_1 - {\bf p}_0), \quad {\bf p}^{(1)}(1)=m({\bf p_m}-{\bf p}_{m-1}) p(1)(0)=m(p1−p0),p(1)(1)=m(pm−pm−1)
端点处的二阶导数为:
p ( 2 ) ( 0 ) = m ( m − 1 ) ( p 0 − 2 p 1 + p 2 ) , p ( 2 ) ( 1 ) = m ( m − 1 ) ( p m − 2 p m − 1 + p m − 2 ) {\bf p}^{(2)}(0)=m(m-1)({\bf p}_0 - 2{\bf p}_1 + {\bf p}_2), \quad {\bf p}^{(2)}(1)=m(m-1)({\bf p}_m - 2{\bf p}_{m-1} + {\bf p}_{m-2}) p(2)(0)=m(m−1)(p0−2p1+p2),p(2)(1)=m(m−1)(pm−2pm−1+pm−2)
其余各阶导数也可以由上式推出。
1.3 贝塞尔曲线的性质
贝塞尔曲线的性质有:
- 凸包特性:由控制点构成的控制多边形逼近样条曲线的形状,曲线完全包含在其控制点形成的凸包中
- 终点插值特性:即一段贝塞尔曲线初始于第0个控制点,终止于第m个也就是最后一个控制点,并且不会经过其他控制点(除非所有控制点共线),公式表示为 p 0 = b ( 0 ) {\bf p}_0={\bf b}(0) p0=b(0)和 p m = b ( 1 ) {\bf p}_m={\bf b}(1) pm=b(1)
- 固定时间间隔特性:每一条贝塞尔曲线总是定义在固定时间间隔 t ∈ [ 0 , 1 ] t\in[0,1] t∈[0,1]上
- p 0 {\bf p}_0 p0处的切线方向平行于 p 0 {\bf p}_0 p0与 p 1 {\bf p}_1 p1连线的方向, p m {\bf p}_m pm处的切线方向平行于 p m {\bf p}_m pm与 p m − 1 {\bf p}_{m-1} pm−1连线的方向
- 速端曲线(Hodograph):贝塞尔曲线对时间的一阶微分得到的仍然是贝塞尔曲线,新的控制点可以有原始曲线的控制点表示, p i ( 1 ) = m ( p i + 1 − p i ) {\bf p}^{(1)}_i=m({\bf p}_{i+1}-{\bf p}_i) pi(1)=m(pi+1−pi);注,速端曲线代表物体的向量运动
1.4 贝塞尔曲线与多项式的转换
贝塞尔曲线与标准多项式的转换:
b
(
u
)
=
∑
i
=
0
m
a
i
u
i
{\bf b}(u)=\sum_{i=0}^{m}{\bf a}_i u^i
b(u)=i=0∑maiui
其中,系数
a
i
{\bf a}_i
ai为:
a i = m ! ( m − i ) ! ∑ j = 0 i ( − 1 ) i + j j ! ( i − j ) ! p j {\bf a}_i=\frac{m!}{(m-i)!}\sum_{j=0}^{i}\frac{(-1)^{i+j}}{j!(i-j)!}{\bf p}_j ai=(m−i)!m!j=0∑ij!(i−j)!(−1)i+jpj
例,
m
=
3
m=3
m=3时,贝塞尔曲线的形式为:
b
(
u
)
=
(
1
−
u
)
3
p
0
+
3
u
(
1
−
u
)
2
p
1
+
3
u
2
(
1
−
u
)
p
2
+
u
3
p
3
{\bf b}(u)=(1-u)^3{\bf p}_0+3u(1-u)^2{\bf p}_1+3u^2(1-u){\bf p}_2+u^3{\bf p}_3
b(u)=(1−u)3p0+3u(1−u)2p1+3u2(1−u)p2+u3p3
2. B-Spline B样条函数
样条曲线为分段多项式函数,一种有效计算样条的方法是基于B样条,也就是基础样条;这个名称的又来是因为一般样条可通过适量的B样条基函数
[
B
j
p
(
u
)
]
[B_j^p(u)]
[Bjp(u)]的线性组合获得,即:
s
(
u
)
=
∑
j
=
0
m
p
j
B
j
p
(
u
)
u
m
i
n
≤
u
≤
u
m
a
x
{\bf s}(u)=\sum_{j=0}^m{\bf p}_jB_j^p(u) \quad u_{min}\leq u\leq u_{max}
s(u)=j=0∑mpjBjp(u)umin≤u≤umax
其中,系数
p
j
(
j
=
0
,
.
.
.
,
m
)
{\bf p}_j(j=0,...,m)
pj(j=0,...,m) 称为控制点,在运动规划中,这些控制点一般由前端搜索得到。其定义与贝塞尔曲线的定义基本一致,B样条曲线是贝塞尔曲线的一般化,不同之处在于当有
m
+
1
m+1
m+1个控制点时,贝塞尔曲线为
m
m
m次,而B样条曲线为
[
2
,
m
]
[2,m]
[2,m]次。
2.1 B样条基函数
设
u
=
[
u
0
,
.
.
.
,
u
n
−
k
n
o
t
]
{\bf u}=[u_0, ..., u_{n-knot}]
u=[u0,...,un−knot]为节点向量(注意,此处为节点向量而不是控制点,控制点使用
p
p
p定义),且
u
{\bf u}
u不递减,
u
j
≤
u
j
+
1
u_j \leq u_{j+1}
uj≤uj+1,(可以想到,这样的节点向量,或参数向量设计,与实际中的时间不谋而合,因此也可以利用B样条的这一特点进行时间分配)则第
j
j
j个控制点的
p
p
p次B样条函数的递归形式如下:
B
j
0
(
u
)
=
{
1
,
u
j
≤
u
≤
u
j
+
1
0
,
e
l
s
e
B_j^0(u)=\begin{cases}1, \quad u_j \leq u\leq u_{j+1}\\ 0, \quad {\text else} \end{cases}
Bj0(u)={1,uj≤u≤uj+10,else
B j p ( u ) = u − u j u j + p − u j B j p − 1 ( u ) + u j + p + 1 − u u j + p + 1 − u j + 1 B j + 1 p − 1 ( u ) B_j^p(u)=\frac{u-u_j}{u_{j+p}-u_j}B_j^{p-1}(u)+\frac{u_{j+p+1}-u}{u_{j+p+1}-u_{j+1}}B_{j+1}^{p-1}(u) Bjp(u)=uj+p−uju−ujBjp−1(u)+uj+p+1−uj+1uj+p+1−uBj+1p−1(u)
其中:
- (1) B j p ( u ) B_j^p(u) Bjp(u)是分段多项式,其中$\forall u\in [u_{min},u_{max}] ,且 ,且 ,且B_j^p(u)$非负
- (2) 在区间 u ∈ [ u j , u j + p + 1 ) u\in[u_j,u_{j+p+1}) u∈[uj,uj+p+1)之外, B j p ( u ) = 0 B_j^p(u)=0 Bjp(u)=0;也就是说,调整 B j p ( u ) B_j^p(u) Bjp(u),其影响仅产生在对应的区间上,而不会对全局空间造成影响,可以称为局部支撑作用,这对轨迹replan有很大帮助
- (3) 区间 [ u i , u i + 1 ) [u_i,u_{i+1}) [ui,ui+1)称为第 i i i节点区间,区间长度可能为0,此时区间重合;这是因为节点 u u u有可能是相同的值,而断点则一定是不同的值,断点是一组不同的节点值
(4) B样条基函数归一化如下(权和性,权重的和为1):
∑ j = 0 m B j p ( u ) = 1 , ∀ u ∈ [ u 0 , u n k n o t ] \sum_{j=0}^{m}B_j^p(u)=1, \quad \forall u \in [u_0, u_{n_{knot}}] j=0∑mBjp(u)=1,∀u∈[u0,unknot]
(5) 在每个节点区间 [ u i , u i + 1 ) [u_i,u_{i+1}) [ui,ui+1)内,最多 p + 1 p+1 p+1个基函数 B j p B_j^p Bjp不为零,即 B i − p p , . . . , B i p B_{i-p}^p,...,B_i^p Bi−pp,...,Bip不为零;
可以看出,任何一个基函数,追根溯源的最底层都是 B j 0 B_j^0 Bj0,非1即0;之后再经过截断三角形的传播,得到最后的基函数;当然,任意一个基函数只有在其对应的有定义域的区间才有意义,否则为零。
一个简单的截断三角形构造如下:
B
0
0
B
0
1
B
1
0
B
0
2
B
1
1
B
0
3
B
0
2
B
1
2
B
0
4
B
2
1
B
1
3
B
0
3
B
2
2
B
3
1
B
0
4
\begin{matrix} B_0^0\\ &B_0^1\\ B_1^0 & & B_0^2\\ & B_1^1 & &B_0^3\\ B_0^2 & & B_1^2 & & B_0^4\\ & B_2^1 & & B_1^3\\ B_0^3 & & B_2^2\\ & B_3^1\\ B_0^4 \end{matrix}
B00B10B02B03B04B01B11B21B31B02B12B22B03B13B04
由左至右,根据三角形位置和迭代公式求得每一个基函数的表达式(或值)。
2.2 B样条的定义和性质
假设B样条是由非均匀节点向量(大小为 n k n o t n_{knot} nknot)定义的:
u = [ u m i n , . . . , u m i n , u p + 1 , . . . , u n k n o t − p − 1 , u m a x , . . . , u m a x ] {\bf u}=[u_{min},...,u_{min},u_{p+1},...,u_{n_{knot}-p-1},u_{max},...,u_{max}] u=[umin,...,umin,up+1,...,unknot−p−1,umax,...,umax]
有 p + 1 p+1 p+1个 u m i n u_{min} umin和 u m a x u_{max} umax,则 p p p次B样条曲线定义为:
s ( u ) = ∑ j = 0 m p j B j p ( u ) {\bf s}(u)=\sum_{j=0}^m {\bf p}_jB_j^p(u) s(u)=j=0∑mpjBjp(u)
其中, p j ( j = 0 , . . . , m ) {\bf p}_j(j=0,...,m) pj(j=0,...,m)为控制点,控制点组成了控制多边形,因此,要表示一条B样条曲线,需要有:
- B样条曲线次数,整数 p p p,(不是阶数)
- 节点向量 u \bf u u
- s ( u ) {\bf s}(u) s(u)的系数,控制点 P = [ p 0 , p 1 , . . . , p m − 1 , p m ] {\bf P}=[{\bf p}_0, {\bf p}_1,...,{\bf p}_{m-1},{\bf p}_m] P=[p0,p1,...,pm−1,pm]
所以对于 m + 1 m+1 m+1个控制点,其 p p p次B样条曲线所需的节点向量个数为 1 + m + p 1+m+p 1+m+p个,会将区间划分成 m + p m+p m+p段。
n k n o t = 1 + m + p n_{knot}=1+m+p nknot=1+m+p
即样条曲线的次数 p p p,控制点的数量 m + 1 m+1 m+1与节点的数量 n k n o t + 1 n_{knot}+1 nknot+1之间存在上述关系。注意,样条的阶数=次数+1
B样条曲线有利于生成轨迹,其性质有:
- s ( u ) {\bf s}(u) s(u)在节点区间内是无限可微的,且在多重节点 k k k处 p − k p-k p−k次连续可微
- 样条曲线的次数 p p p,控制点的数量 m + 1 m+1 m+1与节点的数量 n k n o t + 1 n_{knot}+1 nknot+1之间存在 n k n o t = 1 + m + p n_{knot}=1+m+p nknot=1+m+p
- 端点插值特性: s ( u m i n ) = p 0 {\bf s}(u_{min})={\bf p}_0 s(umin)=p0且 s ( u m a x ) = p m {\bf s}(u_{max})={\bf p}_m s(umax)=pm
- 该曲线在仿射变换(平移,旋转,缩放,剪切)下不变,可以通过将其应用于控制点来应用于 s ( u ) {\bf s}(u) s(u)
- 局部修改:控制点 p j {\bf p}_j pj的变化只在区间 [ u j , u j + p + 1 ] [u_j,u_{j+p+1}] [uj,uj+p+1]上修改 s ( u ) {\bf s}(u) s(u)
- 通过在节点处使用变换,B样条曲线可以实时缩放;如果假设有 u ′ = λ u {\bf u'}=\lambda {\bf u} u′=λu,则该 u ′ {\bf u'} u′的B样条的 i i i次导数将被缩放为 1 / λ i 1/\lambda^i 1/λi;若 λ = 2 \lambda=2 λ=2,则新B样条的速度是原始样条的 1 / 2 1/2 1/2,加速度是原始样条的 1 / 4 1/4 1/4
2.3 B样条曲线的导数
有B样条曲线 s ( u ) {\bf s}(u) s(u)的非均匀节点向量:
u = [ u m i n , . . . , u m i n , u p + 1 , . . . , u n k n o t − p − 1 , u m a x , . . . , u m a x ] {\bf u}=[u_{min},...,u_{min},u_{p+1},...,u_{n_{knot}-p-1},u_{max},...,u_{max}] u=[umin,...,umin,up+1,...,unknot−p−1,umax,...,umax]
其一阶导数,即对时间取一次微分为:
s ( 1 ) ( u ) = ∑ j = 0 m B j p ( 1 ) ( u ) p j u ∈ [ u m i n , u m a x ] {\bf s}^{(1)}(u)=\sum_{j=0}^{m}B_j^{p(1)}(u){\bf p}_j \quad u\in[u_{min}, u_{max}] s(1)(u)=j=0∑mBjp(1)(u)pju∈[umin,umax]
其中,B样条基函数的一阶导数为:
B j p ( 1 ) ( u ) = p u j + p − u j B j p − 1 ( u ) − p u j + p + 1 − u j + 1 B j + 1 p − 1 ( u ) B_j^{p(1)}(u)=\frac{p}{u_{j+p}-u_j}B_j^{p-1}(u)-\frac{p}{u_{j+p+1}-u_{j+1}}B_{j+1}^{p-1}(u) Bjp(1)(u)=uj+p−ujpBjp−1(u)−uj+p+1−uj+1pBj+1p−1(u)
求一次导之后新的节点向量为:
u ′ = [ u m i n , . . . , u m i n , u p + 1 , . . . , u n k n o t − p − 1 , u m a x , . . . , u m a x ] {\bf u'}=[u_{min},...,u_{min},u_{p+1},...,u_{n_{knot}-p-1},u_{max},...,u_{max}] u′=[umin,...,umin,up+1,...,unknot−p−1,umax,...,umax]
与求导之前不同的是, u m i n u_{min} umin与 u m a x u_{max} umax在节点向量中的个数均由 p + 1 p+1 p+1变为 p p p个。
同时,控制点 q j {\bf q}_j qj也需要更新为:
q j = p p j + 1 − p j u j + p + 1 − u j + 1 {\bf q}_j=p \frac{{\bf p}_{j+1}-{\bf p}_j}{u_{j+p+1}-u_{j+1}} qj=puj+p+1−uj+1pj+1−pj
2.4 B样条曲线的求解
对于某固定值的自变量
u
ˉ
\bar u
uˉ,可以通过仅考虑在包含其的第
i
i
i个节点区间,计算不为零的
p
+
1
p+1
p+1个基函数,来计算B样条曲线。
s
(
u
ˉ
)
=
∑
j
=
i
−
p
i
p
j
B
j
p
(
u
ˉ
)
{\bf s}(\bar u)=\sum_{j=i-p}^{i}{\bf p}_jB_j^p(\bar u)
s(uˉ)=j=i−p∑ipjBjp(uˉ)
- 找到 u ˉ \bar u uˉ所属的区间索引 i i i,即 [ u i , u i + 1 ) [u_i,u_{i+1}) [ui,ui+1)
- 给定 i i i,计算 u ˉ \bar u uˉ处的基函数
- 通过上式计算 s ( u ˉ ) {\bf s}(\bar u) s(uˉ)
一道求解的例题:
现有 m + 1 = 7 m+1=7 m+1=7个控制点, n k n o t + 1 = 11 n_{knot}+1=11 nknot+1=11个节点向量,且 u = 1.5 u=1.5 u=1.5,求其基函数。
P = [ p 0 , . . . , p m ] = [ 1 2 3 4 5 6 7 2 3 − 3 4 5 − 5 − 6 ] {\bf P}=[{\bf p_0},...,{\bf p}_m]=\begin{bmatrix} 1 & 2 & 3 & 4 & 5 & 6 & 7\\ 2 & 3 & -3 & 4 & 5 & -5 & -6 \end{bmatrix} P=[p0,...,pm]=[12233−344556−57−6]
节点向量 u = [ 0 , 0 , 0 , 0 , 1 , 2 , 4 , 7 , 7 , 7 , 7 ] {\bf u}=[0,0,0,0,1,2,4,7,7,7,7] u=[0,0,0,0,1,2,4,7,7,7,7],已知 u = 1.5 u=1.5 u=1.5,首先判断出其所属区间为 [ 1 , 2 ) [1,2) [1,2),即 [ u 4 , u 5 ) [u_4,u_5) [u4,u5);
由于 B 7 3 ( u ) B_7^3(u) B73(u)在 [ u 7 , u 11 ] [u_7, u_{11}] [u7,u11]以为为0,且 u 11 u_{11} u11已经不存在,因此只需考虑 B j 3 ( u ) B_j^3(u) Bj3(u), j = 0 , . . . , 6 j=0,...,6 j=0,...,6;
对于 B 0 3 ( u ) B_0^3(u) B03(u),其在 [ u 0 , u 4 ) [u_0,u_4) [u0,u4)以外的区域为0,因此不做考虑, B 6 3 ( u ) B_6^3(u) B63(u)同理;
因此只需计算 B j 3 ( u ) B_j^3(u) Bj3(u), j = 1 , 2 , 3 , 4 j=1,2,3,4 j=1,2,3,4;
对于 B 1 3 ( u ) B_1^3(u) B13(u),根据截断三角形,需要从 B 1 0 B_1^0 B10到 B 4 0 B_4^0 B40开始从左向右计算;这四个基函数中仅 B 4 0 ( u ) B_4^0(u) B40(u)在 [ u 4 , u 5 ) [u_4,u_5) [u4,u5)上为1,其余全为0;
进而计算
B
3
1
(
u
)
B_3^1(u)
B31(u):
B
3
1
(
u
)
=
0
+
u
5
−
u
u
5
−
u
4
B
4
0
(
u
)
=
2
−
u
B_3^1(u)=0+\frac{u_5-u}{u_5-u_4}B_4^0(u)=2-u
B31(u)=0+u5−u4u5−uB40(u)=2−u
继续递归,计算
B
2
2
(
u
)
B_2^2(u)
B22(u):
B
2
2
(
u
)
=
0
+
u
5
−
u
u
5
−
u
3
B
3
1
(
u
)
=
(
2
−
u
)
2
2
B_2^2(u)=0+\frac{u_5-u}{u_5-u_3}B_3^1(u)=\frac{(2-u)^2}{2}
B22(u)=0+u5−u3u5−uB31(u)=2(2−u)2
继续递归,计算
B
1
3
(
u
)
B_1^3(u)
B13(u):
B
1
3
(
u
)
=
0
+
u
5
−
u
u
5
−
u
2
B
2
2
(
u
)
=
(
2
−
u
)
3
4
B_1^3(u)=0+\frac{u_5-u}{u_5-u_2}B_2^2(u)=\frac{(2-u)^3}{4}
B13(u)=0+u5−u2u5−uB22(u)=4(2−u)3
代入得到
B
1
3
=
0.0313
,
B
2
3
=
0.5885
,
B
3
3
=
0.3733
,
B
4
3
=
0.0069
B_1^3=0.0313,B_2^3=0.5885,B_3^3=0.3733,B_4^3=0.0069
B13=0.0313,B23=0.5885,B33=0.3733,B43=0.0069,代入下式:
s
(
u
)
=
∑
j
=
0
m
p
j
B
j
p
(
u
)
{\bf s}(u)=\sum_{j=0}^m {\bf p}_jB_j^p(u)
s(u)=j=0∑mpjBjp(u)
得到
s
(
u
=
1.5
)
=
[
3.3245
,
−
0.1753
]
{\bf s}(u=1.5)=[3.3245,-0.1753]
s(u=1.5)=[3.3245,−0.1753];如果将
u
u
u看作时间,则该点即为时间为1.5时,轨迹的位置。