本篇博客主要介绍一些路径规划中常用的几何曲线,包括贝塞尔曲线(Bezier Curve),样条曲线(Spline Curve)
1、贝塞尔曲线(Bezier Curve) 1.1 定义
贝塞尔曲线最初是用于汽车主体的设计,后被广泛应用于图形设计和路径规划中。
贝塞尔曲线由首尾起始点以及中间的控制点相互作用生成,其中起始点是曲线的必经点又称为锚点,控制点的作用是用来改变曲线的曲率及形状,n个点对应 n-1阶贝塞尔曲线。
伯恩斯坦多项式(Bernstein polynomial)逼近连续函数的一系列多项式, 其公式的表达形式与bezier曲线的表达形式相辅相成,因此常用来作为bezier曲线的计算公式。
1.3 公式推导变量物理意义
B ( t ) B(t) B(t)表示 t t t时刻下的点的坐标 P 0 P_0 P0表示起点, P n P_n Pn表示终点, P i P_i Pi为控制点
值得注意的是,bezier的相关公式推导是具有强烈的递归性质的, 通过下面的公式多阶公式推导可以看出此特性
一阶贝塞尔曲线
一阶贝塞尔曲线其实就是一条线段,动图如下所示:
由此开始推导公式:
首先,根据向量计算可得,
B ( t ) = P 0 + ( P 1 − P 0 ) ∗ t , t ∈ [ 0 , 1 ] B(t) = P_0 + (P_1 - P_0) * t, t in [0, 1] B(t)=P0+(P1−P0)∗t, t∈[0,1]
变形后可得,
B ( t ) = ( 1 − t ) P 0 + t P 1 , t ∈ [ 0 , 1 ] B(t) = (1 - t)P_0 + t P_1, t in [0, 1] B(t)=(1−t)P0+tP1, t∈[0,1]
上述公式描述了一个连续点构成的直线线段
二阶贝塞尔曲线
二阶贝塞尔曲线是一个抛物线,动图如下图所示:
其中, P 0 ′ P_0' P0′表示图中绿色直线的左端点,即线段 P 0 P 1 → overrightarrow{ P_0 P_1} P0P1 上的点;
P 1 ′ P_1' P1′表示图中绿色直线的右端点,即线段 P 1 P 2 → overrightarrow{ P_1 P_2} P1P2 上的点
利用一阶贝塞尔曲线公式可得:
P 0 ′ = ( 1 − t ) P 0 + t P 1 P_0' = (1-t)P_0 + tP_1 P0′=(1−t)P0+tP1
P 1 ′ = ( 1 − t ) P 1 + t P 2 P_1' = (1-t)P_1 + tP_2 P1′=(1−t)P1+tP2
$
begin{align*}
B(t) &= P_0’ + (P_1’ - P_0’)t
&= (1-t)P_0’ + tP_1’
&= (1-t)^2 P_0 + 2(1-t)t P_1 + t^2 P_2 , t in [0, 1]
end{align}
$
三阶贝塞尔曲线
三阶贝塞尔曲线是同样是可以利用上述递归性质进行推演。二阶贝塞尔是通过将控制点之间再采点的方式实现一阶降阶,三阶贝塞尔曲线的构造则是通过将控制点之间采点先降阶为二阶贝塞尔再进一步降阶为一阶的过程。
公式为:
B ( t ) = ( 1 − t ) 3 P 0 + 3 P 1 t ( 1 − t ) 2 + 3 P 2 t 2 ( 1 − t ) + P 3 t 3 , t ∈ [ 0 , 1 ] B(t) = (1 - t)^3 P_0 + 3 P_1 t (1-t)^2 + 3P_2 t^2(1-t) + P_3t^3, t in [0, 1] B(t)=(1−t)3P0+3P1t(1−t)2+3P2t2(1−t)+P3t3, t∈[0,1]
由以上三阶贝塞尔的公式推导可得出结论,高阶的贝塞尔曲线也可以通过不断递归直至一阶得出最终公式。
P i k = { P i k = 0 ( 1 − t ) P i k − 1 + t P i + 1 k − 1 k = 1 , 2 , 3... , n ; i = 0 , 1 , . . . , n − k P_i^k=left{ begin{aligned} P_i && k = 0 \ (1-t)P_i^{k-1} + tP_{i+1}^{k-1} && k=1,2,3...,n; i = 0, 1, ..., n-k end{aligned} right、 Pik={Pi(1−t)Pik−1+tPi+1k−1k=0k=1,2,3...,n; i=0,1,...,n−k
伯恩斯坦多项式(Bernstein polynomial)逼近连续函数的一系列多项式, 其公式的表达形式与bezier曲线的表达形式相辅相成,因此常用来作为bezier曲线的计算公式。
B n ( t ) = ∑ i = 0 n ( B i , n ( t ) ∗ P i ) = ∑ i = 0 n C i k t i ( 1 − t ) n − i ∗ P i begin{aligned} B_n(t) &= sum_{i = 0} ^n (B_{i,n}(t) * P_i) \ &= sum_{i = 0}^nC_i^kt^i (1-t)^{n-i} * P_i end{aligned} Bn(t)=i=0∑n(Bi,n(t)∗Pi)=i=0∑nCikti(1−t)n−i∗Pi
譬如上述的三阶贝塞尔曲线系数则可以表示为:
B 0 , 3 ( t ) = ( 1 − t ) 3 ; B 1 , 3 ( t ) = 3 t ( 1 − t ) 2 ; B 2 , 3 ( t ) = 3 t 2 ( 1 − t ) ; B 3 , 3 ( t ) = t 3 ; begin{aligned} B_{0,3}(t) &= (1-t)^3; \ B_{1,3}(t) &= 3t(1-t)^2; \ B_{2,3}(t) &= 3t^2(1-t); \ B_{3,3}(t) &= t^3; end{aligned} B0,3(t)B1,3(t)B2,3(t)B3,3(t)=(1−t)3;=3t(1−t)2;=3t2(1−t);=t3;
这里主要介绍一些路径规划中会用到的特性:
1.6 曲率连续与相切连续贝塞尔曲线始终包含在所有控制点的最下凸包中。因此我们常可以通过规定控制点的最小凸包来限制贝塞尔曲线的范围贝塞尔曲线在t=0 以及t =1时的导数与此处的直线段导数相同。此性质可以利用在贝塞尔曲线的拼接上,当拼接点为三点一线的中间点时,即可以保证两端贝塞尔曲线的导数连续。
曲线的连续定义与种类
位置连续:连曲线的端点相接触切线连续:两曲线相接部分的斜率相同曲率连续:两曲线的接触点的曲率相同,且具有相同的方向
连续性的介次:曲率连续>相切连续>位置连续,阶次高的连续性取决于阶次低的连续性
没有位置连续,则不可能切线连续,没有切线连续,则没有曲率连续。位置连续是零阶次的连续,一般称为G0连续或c0连续,切线连续是一阶连续,称为G1连续或C1连续,曲率连续是二阶连续,一般称为 G2或C2连续
参考链接:
https://blog.csdn.net/tianhai110/article/details/2203572