目录

0 专栏介绍1 什么是B样条曲线?2 基函数的de Boor递推式3 B样条曲线基本概念图解4 节点生成公式

0 专栏介绍

附C++/Python/Matlab全套代码课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。

详情:图解自动驾驶中的运动规划(Motion Planning),附几十种规划算法

1 什么是B样条曲线?

为了解决贝塞尔曲线无法局部修正、控制性减弱、曲线次数过高、不易拼接的缺陷,引入B样条曲线(B-Spline)。对贝塞尔曲线不了解的同学请看曲线生成 | 图解贝塞尔曲线生成原理(附ROS C++/Python/Matlab仿真)

B样条曲线是一种用于表示和描绘曲线的数学工具,它在计算机图形学、计算机辅助设计、计算机动画和数值分析等领域得到广泛应用。其名称中的B代表了基本(basis),而样条则是在各个领域中广泛应用的一种绘制曲线的技术,例如计算机图形学、物理学模拟、金融和经济分析等。在计算机图形学中,样条通常用于创建平滑的曲线和曲面,以便在三维场景中呈现出更真实的效果。在物理学模拟中,样条可用于描述物体的运动轨迹和变形过程。

B样条曲线的性质包括平滑性、局部控制性、递归计算和多项式插值。通过调整控制点的位置、权重和节点序列,可以改变B样条曲线的形状,从而实现对曲线的精确控制。B样条曲线常用于描述自然曲线和复杂曲线,如汽车外形、飞机机翼、艺术造型等。在计算机图形学中,B样条曲线可以用来生成圆滑的曲线路径,进行形状建模和渲染,以及实现动画效果等。

在运动规划中,B样条曲线也是一种很强大的曲线生成和轨迹优化工具,接下来介绍其基本原理。

2 基函数的de Boor递推式

B样条曲线的核心是具有局部性的基函数(Basic function)——当改变一个控制节点时,只会变动该点旁边有限段曲线(样条曲线则需要重新计算整条曲线,因为它由一组控制点唯一确定),而非“牵一发动全身”。如图所示给出了B样条与贝塞尔曲线基函数的区别。

采用Cox-de Boor递推定义B样条曲线的基函数

N

i

,

k

(

t

)

=

t

t

i

t

i

+

k

t

i

N

i

,

k

1

(

t

)

+

t

i

+

k

+

1

t

t

i

+

k

+

1

t

i

+

1

N

i

+

1

,

k

1

(

t

)

N_{i,k}\left( t \right) =\frac{t-t_i}{t_{i+k}-t_i}N_{i,k-1}\left( t \right) +\frac{t_{i+k+1}-t}{t_{i+k+1}-t_{i+1}}N_{i+1,k-1}\left( t \right)

Ni,k​(t)=ti+k​−ti​t−ti​​Ni,k−1​(t)+ti+k+1​−ti+1​ti+k+1​−t​Ni+1,k−1​(t)

其中

N

i

,

k

(

t

)

N_{i,k}\left( t \right)

Ni,k​(t)称为第

i

i

i个控制节点的

k

k

k次(

k

+

1

k+1

k+1阶)B样条基函数,

i

=

0

,

1

,

,

n

1

i=0,1,\cdots ,n-1

i=0,1,⋯,n−1,

k

1

k\geqslant 1

k⩾1且规定

0

/

0

=

0

{{0}/{0}}=0

0/0=0。特别地,有

N

i

,

0

(

t

)

=

{

1

,

t

[

t

i

,

t

i

+

1

)

0

,

o

t

h

e

r

w

i

s

e

N_{i,0}\left( t \right) =\begin{cases} 1,t\in \left[ t_i,t_{i+1} \right)\\ 0,\mathrm{otherwise}\\\end{cases}

Ni,0​(t)={1,t∈[ti​,ti+1​)0,otherwise​

即高次B样条基函数为若干低次B样条基函数的线性组合。

N

i

,

k

(

t

)

N_{i,k}\left( t \right)

Ni,k​(t)的次数

k

k

k与控制节点的个数

n

n

n无关,因此B样条曲线自由度更大——允许定义多个控制点而不用担心曲线次数过高导致计算困难。

3 B样条曲线基本概念图解

B样条曲线定义为用基函数加权的控制节点

P

(

t

)

=

i

=

0

n

1

p

i

N

i

,

k

(

t

)

,

t

[

t

k

,

t

n

)

\boldsymbol{P}\left( t \right) =\sum_{i=0}^{n-1}{\boldsymbol{p}_iN_{i,k}\left( t \right)}, t\in \left[ t_k,t_n \right)

P(t)=i=0∑n−1​pi​Ni,k​(t),t∈[tk​,tn​)

其中

T

=

{

t

0

,

t

1

,

,

t

m

1

}

T=\left\{ t_0,t_1,\cdots ,t_{m-1} \right\}

T={t0​,t1​,⋯,tm−1​}是一个一维单调非递减序列,称为节点向量(knot vector),其中的元素

t

i

t_i

ti​称为节点(knot),区间

[

t

i

,

t

i

+

1

)

\left[ t_i,t_{i+1} \right)

[ti​,ti+1​)称为第

i

i

i个节点区间(knot range),节点在样条曲线上的映射

P

(

t

i

)

\boldsymbol{P}\left( t_i \right)

P(ti​)称为曲节点(knot point)。

在节点向量中,若某节点

t

i

t_i

ti​出现

l

l

l次,则称

t

i

t_i

ti​是重复度为

l

l

l的多重节点,否则为简单节点。与贝塞尔曲线不同,仅当B样条曲线首末节点重复度为

k

+

1

k+1

k+1时,曲线本身才穿过首末控制点。

接下来分析B样条曲线的局部支撑性。基函数

N

i

,

k

(

t

)

N_{i,k}\left( t \right)

Ni,k​(t)在区间

[

t

i

,

t

i

+

k

+

1

]

\left[ t_i,t_{i+k+1} \right]

[ti​,ti+k+1​]上非零,因为该区间上总存在不为零的零阶基函数

N

i

,

0

N_{i,0}

Ni,0​,该区间称为支撑区间,对应样条曲线上的区段称为支撑曲线。由于

N

i

,

k

(

t

)

N_{i,k}\left( t \right)

Ni,k​(t)直接与控制节点

p

i

\boldsymbol{p}_i

pi​相乘,所以

p

i

\boldsymbol{p}_i

pi​只影响其支撑区间

[

t

i

,

t

i

+

k

+

1

]

\left[ t_i,t_{i+k+1} \right]

[ti​,ti+k+1​]上对应支撑曲线的形状。所以B样条曲线也可视为若干段贝塞尔曲线的拼接,是贝塞尔曲线的推广,相邻贝塞尔曲线间存在若干重合节点,保留了对称性、几何不变性、变差伸缩性等优良特性。

为使每个控制节点都有合法的支撑区间与之匹配,节点数量应满足

m

=

n

+

k

+

1

m=n+k+1

m=n+k+1

B样条曲线的次数指基函数多项式的最高次数,阶数则可视为控制节点

p

i

\boldsymbol{p}_i

pi​所影响的节点数。当节点区间

[

t

i

,

t

i

+

1

)

\left[ t_i,t_{i+1} \right)

[ti​,ti+1​)上的非零

k

k

k次基函数达到最大数量

k

+

1

k+1

k+1个时,令其满足

j

=

i

k

i

N

j

,

k

=

1

\sum_{j=i-k}^i{N_{j,k}}=1

j=i−k∑i​Nj,k​=1

称为基函数的加权性质。显然,对于

k

k

k次基函数,节点区间

[

t

0

,

t

k

)

\left[ t_0,t_k \right)

[t0​,tk​)与

[

t

n

,

t

n

+

k

)

\left[ t_n,t_{n+k} \right)

[tn​,tn+k​)上的非零基函数不足

k

+

1

k+1

k+1个,它们的加权和不为零,在这些区间计算B样条曲线会导致错误,因此B样条曲线定义在区间

[

t

k

,

t

n

)

\left[ t_k,t_n \right)

[tk​,tn​)上。如图所示是关于B样条曲线定义区间的实例说明。

4 节点生成公式

B样条曲线由控制节点与节点向量唯一确定,通过改变节点向量中节点的分布特征,可以构造不同类型的B样条曲线

均匀B样条曲线(Uniform B-Spline Curve) 节点向量中的节点沿数轴方向等距离均匀分布,所有节点区间等距,即

t

i

+

1

t

i

=

c

o

n

s

t

>

0

,

i

=

0

,

1

,

,

n

+

k

t_{i+1}-t_i=\mathrm{const}>0, i=0,1,\cdots ,n+k

ti+1​−ti​=const>0,i=0,1,⋯,n+k 准均匀B样条曲线(quasi-Uniform B-Spline Curve) 节点向量中的首末节点重复度为

k

+

1

k+1

k+1,其余节点沿数轴方向等距均匀分布且重复度为1。可以证明该情况下,当

k

=

n

k=n

k=n时,B样条基函数

N

i

,

k

(

t

)

N_{i,k}\left( t \right)

Ni,k​(t)退化为伯恩斯坦多项式,即B样条曲线退化为贝塞尔曲线。 非均匀B样条曲线(non-Uniform B-Spline Curve) 节点向量任意分布

节点生成通常有两种方法:

均匀法

{

t

0

=

t

1

=

=

t

k

=

0

t

k

+

i

=

i

n

k

+

1

,

i

=

1

,

2

,

,

n

k

1

t

n

=

t

n

+

1

=

=

t

n

+

k

=

1

\begin{cases} t_0=t_1=\cdots =t_k=0\\ t_{k+i}=\frac{i}{n-k+1}, i=1,2,\cdots ,n-k-1\\ t_n=t_{n+1}=\cdots =t_{n+k}=1\\\end{cases}

⎧​t0​=t1​=⋯=tk​=0tk+i​=n−k+1i​,i=1,2,⋯,n−k−1tn​=tn+1​=⋯=tn+k​=1​ 该方法不依赖于参数选择。De Boor法

{

t

0

=

t

1

=

=

t

k

=

0

t

k

+

i

=

1

k

j

=

i

i

+

k

1

u

j

,

i

=

1

,

2

,

,

n

k

1

t

n

=

t

n

+

1

=

=

t

n

+

k

=

1

\begin{cases} t_0=t_1=\cdots =t_k=0\\ t_{k+i}=\frac{1}{k}\sum_{j=i}^{i+k-1}{u_j}, i=1,2,\cdots ,n-k-1\\ t_n=t_{n+1}=\cdots =t_{n+k}=1\\\end{cases}

⎧​t0​=t1​=⋯=tk​=0tk+i​=k1​∑j=ii+k−1​uj​,i=1,2,⋯,n−k−1tn​=tn+1​=⋯=tn+k​=1​ 该方法对选择的参数进行窗口平滑。

曲线生成 | 图解B样条曲线生成原理(附ROS C++/Python/Matlab仿真)将继续介绍B样条曲线的计算算法——近似和插值应用,并给出代码实现。

 更多精彩专栏:

《ROS从入门到精通》《Pytorch深度学习实战》《机器学习强基计划》《运动规划实战精讲》…

源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系

好文阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: