4. 贝塞尔曲线:数学原理、凸包性质与轨迹生成
贝塞尔曲线这东西,说实话,在机器人轨迹规划里太常用了。我最早接触它是在做机械臂的路径平滑时,那时候用简单的直线插补,机器人走起来一顿一顿的,换了贝塞尔曲线之后,整个运动就顺滑多了。
今天我们就把它彻底讲透。从数学原理到工程实现,我会把我在项目中踩过的坑也一并告诉你。
4.1 贝塞尔曲线的数学原理
贝塞尔曲线的核心思想很简单:用一组控制点来定义一条曲线。它不要求曲线通过所有控制点,只要求曲线在起点和终点处精确通过,中间的点用来“拉”曲线。
数学上,n阶贝塞尔曲线的公式长这样:
B(t) = Σᵢ₌₀ⁿ C(n, i) * (1-t)ⁿ⁻ⁱ * tⁱ * Pᵢ
其中 t 在 [0, 1] 之间变化,C(n, i) 是组合数,Pᵢ 是第 i 个控制点。
看着有点复杂?我换个说法。你想想看,t=0 时,曲线在第一个控制点;t=1 时,曲线在最后一个控制点。中间的过程,就是这些控制点按权重混合的结果。
实际工程中,最常用的是三阶贝塞尔曲线(4个控制点)。为什么?因为二阶曲线太简单,高阶曲线计算量又大,三阶刚好平衡。
核心要点: 三阶贝塞尔曲线的公式可以简化为:
B(t) = (1-t)³P₀ + 3(1-t)²tP₁ + 3(1-t)t²P₂ + t³P₃
这个公式我建议你记下来,写代码时经常用到。
4.2 凸包性质:为什么它这么重要?
贝塞尔曲线有一个非常漂亮的几何性质——凸包性质。说白了就是:整条曲线一定被包含在所有控制点围成的凸多边形内部。
为什么会这样?因为公式里的系数 (1-t)ⁿ⁻ⁱ * tⁱ 都是非负的,而且加起来等于1。这本质上是一个凸组合。
这个性质在轨迹规划里太有用了。举个例子:
- 避障验证: 只要所有控制点都在安全区域内,整条曲线就一定安全。不需要逐点检查。
- 速度约束: 控制点的位置范围直接决定了曲线的位置范围,方便做运动学约束。
- 碰撞检测: 我曾在项目中用这个性质快速过滤掉明显不可行的轨迹,省了不少计算量。
我的经验: 做AGV路径规划时,我会先用凸包性质快速判断轨迹是否可能撞到障碍物。如果控制点的凸包已经和障碍物相交,那这条曲线就不用算了,直接换一组控制点。
4.3 轨迹生成:从理论到代码
理论说完了,我们来点实际的。怎么用贝塞尔曲线生成一条平滑轨迹?
基本步骤就三步:
- 确定控制点: 根据起点、终点和中间路径点,设计控制点位置。
- 参数化采样: 在 t ∈ [0, 1] 上均匀采样,计算每个 t 对应的曲线点。
- 生成轨迹: 把采样点按顺序连接,就得到了一条平滑轨迹。
下面是一个三阶贝塞尔曲线的生成代码:
def bezier_curve(p0, p1, p2, p3, num_points=100):
"""
生成三阶贝塞尔曲线
p0, p1, p2, p3: 控制点,每个点是 [x, y] 或 [x, y, theta]
num_points: 采样点数
"""
t = np.linspace(0, 1, num_points)
# 计算曲线点
curve = np.zeros((num_points, 2))
for i in range(num_points):
ti = t[i]
curve[i] = (1-ti)**3 * p0 + \
3*(1-ti)**2*ti * p1 + \
3*(1-ti)*ti**2 * p2 + \
ti**3 * p3
return curve
这段代码我用了很多年了。注意一点:采样点数 num_points 要根据实际需求调整。做路径规划时100个点够用,但做高精度跟踪时可能需要500个以上。
4.4 避坑指南与工程技巧
嗯,这里要注意几个容易踩坑的地方:
我曾经踩过的坑:
- 控制点间距不均匀: 如果控制点分布太不均匀,曲线会出现“打结”现象。我建议控制点之间的欧氏距离尽量相等。
- t 的均匀采样不等于弧长均匀: 贝塞尔曲线的参数 t 和实际弧长不是线性关系。如果要求速度均匀,需要做弧长参数化。
- 高阶曲线不稳定: 超过5阶的贝塞尔曲线容易出现振荡。我一般只用三阶或四阶,实在需要复杂形状就分段拼接。
还有一个实用技巧:如果你想让曲线更贴近某个中间点,可以把那个点设成控制点,然后调整它的权重。说白了就是调整控制点的位置,让曲线“偏向”它。
4.5 知识体系总览
下面这张图是我自己整理的贝塞尔曲线知识结构,方便你快速回顾:
4.6 总结一下
贝塞尔曲线在轨迹平滑中的价值,说白了就是:用少量控制点生成一条数学上光滑、几何上可控的曲线。凸包性质让我们能快速做安全性验证,三阶公式让我们能高效计算。
我个人习惯在项目中先用贝塞尔曲线做粗规划,再用样条曲线做精调。这样既保证了效率,又兼顾了精度。你可以在自己的代码里试试看,从三阶贝塞尔曲线开始,慢慢摸索出适合自己的参数。
小提示: 如果你想让曲线在起点和终点处的切线方向可控,可以调整 P₁ 和 P₂ 的位置。P₀P₁ 的方向决定了起点切线,P₂P₃ 的方向决定了终点切线。这个技巧在做机械臂末端执行器姿态控制时特别有用。
可可精品资料库