3. B样条基函数:德布尔-考克斯递推公式、基函数性质、基函数图形可视化

各位同学,咱们今天聊B样条曲线最核心的零件——基函数。

说实话,我刚入行那会儿,看到B样条的公式就头大。一堆下标、一堆递推,感觉像在看天书。后来在项目里被坑过几次,才真正明白这东西到底在干什么。今天我就把当年踩过的坑和总结的经验,一次性讲清楚。

3.1 德布尔-考克斯递推公式

B样条基函数怎么算?靠的就是德布尔-考克斯递推公式。说白了,这是一个从0阶开始,一层一层往上搭积木的过程。

先看0阶基函数,最简单:

N_{i,0}(u) = 1, 如果 u_i ≤ u < u_{i+1}
N_{i,0}(u) = 0, 其他情况

嗯,就是个分段常函数。在某个节点区间里是1,出去就是0。

高阶的怎么来?靠下面这个递推:

N_{i,p}(u) = (u - u_i)/(u_{i+p} - u_i) * N_{i,p-1}(u) 
           + (u_{i+p+1} - u)/(u_{i+p+1} - u_{i+1}) * N_{i+1,p-1}(u)

看着复杂?我教你个记忆方法:左边系数乘左边项,右边系数乘右边项。系数就是当前参数u到节点距离的比例。

我的小技巧: 写代码实现时,我习惯用一个二维数组来存所有阶次的基函数值。先算0阶,再算1阶,一层层往上。千万别递归调用,效率太低了。

3.2 基函数的重要性质

这些性质不是摆设,是咱们做轨迹规划时天天用的。我挑几个最关键的讲。

3.2.1 局部支撑性

每个基函数只在局部区间非零。具体来说,N_{i,p}(u)只在[u_i, u_{i+p+1})这个区间里不为0。这意味着什么?你移动一个控制点,只影响曲线的一小段。我在做机械臂轨迹微调时,这个性质帮了大忙——改一个点,不用重新算整条曲线。

3.2.2 权性

对于任意u,所有同阶基函数加起来等于1:

∑ N_{i,p}(u) = 1

这个性质保证了曲线的凸包性。说白了,曲线不会跑出控制点围成的多边形外面。做避障规划时,我经常利用这个性质做快速碰撞检测。

3.2.3 连续性

在节点处,p阶B样条基函数具有C^{p-1}连续性。举个例子,3阶(p=3)的基函数,在节点处二阶导数连续。这对轨迹规划太重要了——加速度连续意味着运动平滑,不会产生冲击

我曾经踩过的坑: 有一次做高速码垛机器人轨迹,用了2阶B样条,结果在节点处加速度突变,机器人抖得厉害。后来换成3阶,问题就解决了。所以,做高速运动规划,至少用3阶

3.3 基函数图形可视化

光讲公式太抽象,咱们画个图看看。下面是一个3阶B样条基函数的可视化,节点向量取[0,0,0,1,2,3,4,4,4]。

3阶B样条基函数 (p=3) u₀=0 u₁=1 u₂=2 u₃=3 u₄=4 0 0.5 1.0 N₀,₃ N₁,₃ N₂,₃ N₃,₃ 图例 N₀,₃ N₁,₃ N₂,₃ N₃,₃

从图上你能看出什么?

  • 每个基函数只覆盖4个节点区间(因为p=3,覆盖p+1=4个区间)。这就是局部支撑性的直观体现。
  • 在节点处,基函数值不为0。注意看u=1,2,3这些位置,曲线是连续的。
  • 所有曲线加起来等于1。你可以在任意u位置竖着切一刀,看看各条曲线的高度之和是不是1。

核心要点:

  • 德布尔-考克斯递推:从0阶开始,逐阶向上计算
  • 局部支撑性:每个基函数只影响局部区域
  • 权性:所有基函数之和恒为1
  • 连续性:p阶基函数具有C^{p-1}连续性
  • 实际应用:做轨迹规划至少用3阶,保证加速度连续

好了,基函数这块就讲到这里。记住,基函数是B样条曲线的灵魂。你把它搞明白了,后面控制点、节点向量、曲线求值这些,都是水到渠成的事。


公众号:蓝海资料掘金营,微信deep3321