移动机器人路径规划(4)——贝塞尔、b样条曲线

贝塞尔曲线

直线段表示

现在假设只有两个点P0,P1,如何确定这一条曲线?根据中学所学的两点确定一条直线我们可以很轻松的得到连接这两个点的一条直线即所求曲线。

但是在计算中如何得到这一条直线?因为本身计算机是个离散系统,并不能表示连续,所谓连续其实也只是很多个密集的离散点组成,用以下数学表达式进行表示:

Px=P0+(P1-P0)t=(1-t)P0+tP1,t[0,1];

Here,t=P0Px/P0P1

实际上这就是一次的贝塞尔曲线的表达式。之所以为称为一次,是因为式中t的最高幂次为1。对于式子的不同理解可以为,(1−t)为P0权重,t为P1权重,权重越大,越靠近对应的点。

抛物线三切线定理

问题来到三个点,即如果知道三个点P0,P1,P2,且P0,P2为端点,那么如何确定一条曲线呢?如何使用前述把P1当作控制点的思路来解决这个问题呢?即没必要所有点都处在最终确定的曲线上,是否可以参考上面两点情况下,使用权重或是比例参数t来确定一条曲线呢?

现在的目的就是,使用三点确定任意一点Px,且最终由无数个Px点形成的曲线连续可导。依据上面两点坐标下确定曲线任意点的思路。先将三个点划分为两组,即和P0P1和P1P2。对于两组点,分别使用上面结论,那么在参数t下,两组分别确定了两个任意点,记为PiPj,也即:

Pi=(1-t)P0+tP1,t[0,1];

Pj=(1-t)P1+tP2,t[0,1];

对于Pi和Pj在用一次这个公式即:

Px=(1-t)Pi+tPj,t[0,1];

并且,P0Pi/P0P1=P1Pj/P1P2=PjPx/PiPj=t

将其化简可得:Px=(1-t)2P0+2t(1-t)P1+t2P2。该结果,就是二次的贝塞尔曲线。同样二次的含义在于,t的最高幂次为2。

通用公式

B样条曲线

对于一个复杂弯曲的曲线,我们希望使用一个贝塞尔曲线来插值获得目标曲线,为此我们可以通过增加控制点来进行插值。但目标曲线越复杂,需要的控制点就越多,而贝塞尔曲线幂次=控制点个数-1,即需要的计算也越复杂。该方法虽然可行,但是不明智的,低效率的。

因此对于复杂曲线,一般做法是,使用三次贝塞尔曲线(常用次)一段一段地拼接成目标曲线,如果使用这种方法,确保最终整体曲线c1连续的条件是在连接点出两侧的斜率相等,即连接点和其两侧控制点共线。

但是对于单一的贝塞尔曲线,改变其中一个控制点,那么整条曲线都会随之改变。那么为了达到改变其中一个控制点只会改变其中一段曲线的目的,再次引入B样条的概念。

生成曲线,本质上就是在控制点前增加一个权重,然后累加即可。那么B样条中权重是如何计算的呢?先介绍几个概念,容易混淆的概念:

控制点:也就是控制曲线的点,等价于贝塞尔函数的控制点,通过控制点可以控制曲线形状。假设有n+1个控制点P0,P1,P2,⋯ ,Pn

节点:这个跟控制点没有关系,而是人为地将目标曲线分为若干个部分,其目的就是尽量使得各个部分有所影响但也有一定独立性,这也是为什么B样条中,有时一个控制点的改变,不会很大影响到整条曲线,而只影响到局部的原因,这是区别于贝塞尔曲线的一点。节点划分影响到权重计算,可以预想到的是,实现局部性的影响的原理应该是在生成某区间内的点时,某些控制点前的权重值会为0,即对该点没有贡献,所以才有上述特点。假设划分了m+1个节点t0,t1,⋯ ,tm,将曲线分成了m段

次与阶:次的概念就是贝塞尔中次的概念,即权重中t的最高幂次。而阶=次+1。这里只需要知道次这个概念即可。假设我们用k表示次,即k次。

下面用下图这个实例来进行说明,共n+1=5个控制点,n=4,节点规定为m+1=10个,m=9,即t0,t1,⋯ ,t9,该节点将要生成的目标曲线分为了9份,这里的t取值一般为0-1的一系列非递减数。如0代表起始位置,1代表末位置,0.5代表一半的位置。t0,t1,⋯,t9组成的序列,叫做节点表。次为k。实际上有个必须要满足的关系式为m=n+k+1,即k=m−n−1=4。

目的就是获取最终样条曲线,根据前述,也即是获得任意点的坐标值,即t∈[0,1]时,获得一系列的点,这些点最终组成了目标曲线。这些点的坐标可以表示为各控制点Pi与其权重Wi的乘积再累加,即:

B(t)=i=0∑n​Wi​Pi

针对上面实例,我们现在的目标是获取5个控制点P0,P1,P2,P3,P4对应的5个权重值B0,4 B1,4 B2,4 B3,4  B4,4

我们的目标是获得右侧五个值,这里k的取值假设是不知道的(虽然是4),大可当作不知道。表中bi,k代表含义跟Bi,k是一样的,因为不是我们需要的最终值,而是需要求解的中间递推值,所以用小写表示。对于B样条权重,其是根据节点来计算,理论上,m+1个节点,可以得到如表所示的,每个k对应9(m=9)个b值,但我们最终只需要5个值,所以就需要对应规则限制。B样条获取5个权重值过程和规则如下:

1.k=0时,即0次时,如果t∈[tj,tj+1],那么规定bj,0=1其余都为0。如t∈[t2,t3]就有如下结果:

2.k=1时,bj,1取值与低一次的相邻两节点相关,即与0次同域两端的节点相关。即bj,1求解与bj,0,bj+1,0相关,如b1,1就是依据b1,0,b2,0求得。求解关系形式为:

bj,1​=A(t) bj,0​+B(t) bj+1,0

其中,A(t)=(t-tj)/(tj+k-tj),B(t)=(tj+k+1-t)/(tj+k+1-tj+1)

以图标箭头形式表示可得以下图:

重复以上的过程,不断进行迭代进行求解,可得最终的权重系数:

该图表表示的是在t取值在[t2,t3]范围时,求得的5个控制点对应的权重Bj,4(基函数),最终结果B0,4,B1,4,B2,4都为非0值,且是关于t的四次函数,B3,4,B4,4为0。也就是说,本例中,[t2,t3]区间的曲线上点不受第四和第五个控制点变化的影响。

最终求得5个控制点对应的权重后,即可得到每时刻对应的位置:

B(t)=B0,4​P0​+B1,4​P1​+⋯+B4,4P5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值