3. 曲线曲率详解:曲率的定义与几何意义,曲率半径,曲率计算实例
各位同学好,今天我们聊聊曲率。说实话,曲率这个概念在路径规划里太重要了。我当年刚入行时,总觉得曲率是个纯数学概念,跟工程实践关系不大。直到有一次,我设计的一条AGV路径在转弯处把货物甩出去了……嗯,从那以后,我再也不敢小看曲率了。
3.1 曲率的定义——到底在描述什么?
曲率,说白了就是描述曲线“弯曲程度”的物理量。你想想看,一条直线和一条圆弧,哪个更弯?当然是圆弧。那圆弧半径越小,是不是越弯?对,曲率就是量化这个“弯”的程度。
数学上,曲率 κ(kappa)的定义是:
κ = |dθ / ds|
其中 dθ 是切线方向角的变化量,ds 是弧长微元。这个公式的意思是:单位弧长上,切线方向转过的角度有多大。
我个人习惯把这个公式记成“单位路程上的方向变化率”。方向变化越快,曲率越大,弯就越急。
核心理解:曲率 = 方向角对弧长的导数。直线曲率为0,圆曲率为常数。
3.2 曲率的几何意义——半径的倒数
这里有个非常直观的几何解释:曲率等于曲率半径的倒数。
κ = 1 / R
R 就是曲率半径。什么意思呢?想象一下,曲线在某一点附近,可以用一个最贴合的圆来近似。这个圆的半径就是曲率半径 R。圆越小,R 越小,曲率 κ 越大。
我在项目中遇到过这样一个场景:规划一条通过狭窄通道的路径,曲率半径必须大于车辆的最小转弯半径。如果曲率半径小于车辆转弯半径,车就拐不过去。说白了,这就是曲率约束的工程意义。
实用技巧:检查路径是否可通行,直接看曲率半径是否大于车辆最小转弯半径。如果曲率半径太小,就得重新规划或平滑处理。
3.3 曲率半径的计算公式
对于参数化曲线,曲率半径的计算公式如下:
如果曲线由参数方程 r(t) = (x(t), y(t)) 给出,那么:
κ = |x'y'' - x''y'| / (x'² + y'²)^(3/2)
其中 x' = dx/dt, x'' = d²x/dt²,y' 和 y'' 同理。
这个公式看着复杂,其实很好记。分子是叉积的绝对值,分母是速度模长的三次方。我当年学这个公式时,老师教了个口诀:“叉积模长除速度立方”。嗯,挺管用的。
对于显式函数 y = f(x),公式可以简化为:
κ = |y''| / (1 + y'²)^(3/2)
这个形式更常用,尤其是在处理地形高程数据时。
注意:分母不能为零。如果速度为零(即曲线退化为点),曲率无定义。实际计算中要避免这种情况。
3.4 曲率计算实例——手把手带你算一遍
光说不练假把式。我们来看一个具体例子。
例:计算抛物线 y = x² 在 x = 0 和 x = 1 处的曲率。
解:
首先,y' = 2x,y'' = 2。
代入公式:
κ = |2| / (1 + (2x)²)^(3/2) = 2 / (1 + 4x²)^(3/2)
在 x = 0 处:
κ = 2 / (1 + 0)^(3/2) = 2
曲率半径 R = 1/κ = 0.5。说明在顶点处,抛物线弯得最厉害。
在 x = 1 处:
κ = 2 / (1 + 4)^(3/2) = 2 / 5^(3/2) = 2 / (5√5) ≈ 0.179
曲率半径 R ≈ 5.59。说明离顶点越远,曲线越平缓。
这个结果很符合直觉。抛物线顶点最尖,曲率最大;两侧越来越平,曲率越来越小。
关键结论:曲率反映了曲线的局部弯曲程度。顶点处曲率最大,曲率半径最小。
3.5 曲率在路径规划中的应用
曲率在路径规划中主要用来做两件事:
- 路径可行性检查:检查路径上各点的曲率是否超过车辆或机器人的最大允许曲率。
- 路径平滑优化:通过调整控制点,使路径的曲率变化连续且不超过约束。
我曾经处理过一个自动泊车项目。车辆的最小转弯半径是4米,对应的最大曲率是0.25。规划出的路径在某个点曲率达到了0.3,车根本拐不过去。后来我用了样条插值,把曲率降到了0.2以下,问题就解决了。
这里有个避坑指南:不要只看曲率大小,还要看曲率变化率。曲率突变会导致车辆急转向,乘坐体验极差。我见过一个案例,路径曲率虽然都在约束内,但曲率变化率太大,乘客晕车了……
工程建议:路径规划时,不仅要约束曲率上限,还要约束曲率变化率上限。一般建议曲率变化率不超过0.1/m²。
3.6 曲率计算代码示例
最后,给一段Python代码,方便大家直接使用:
import numpy as np
def compute_curvature(x, y):
"""
计算离散点的曲率
x, y: 路径点坐标数组
返回: 各点的曲率数组
"""
dx = np.gradient(x)
dy = np.gradient(y)
ddx = np.gradient(dx)
ddy = np.gradient(dy)
# 曲率公式
curvature = np.abs(dx * ddy - dy * ddx) / (dx**2 + dy**2)**1.5
# 处理分母为零的情况
curvature[np.isnan(curvature)] = 0
curvature[np.isinf(curvature)] = 0
return curvature
# 示例:抛物线 y = x^2
x = np.linspace(-2, 2, 100)
y = x**2
curv = compute_curvature(x, y)
print("最大曲率:", np.max(curv))
这段代码我用了很多年,简单可靠。注意 np.gradient 用的是中心差分,精度还不错。
好了,曲率的内容就讲到这里。记住:曲率是路径规划的灵魂参数,理解它、用好它,你的路径才能既安全又舒适。
本章小结:
- 曲率 = 方向角对弧长的导数 = 曲率半径的倒数
- 曲率半径 R = 1/κ,反映曲线局部弯曲程度
- 计算公式:κ = |x'y'' - x''y'| / (x'² + y'²)^(3/2)
- 工程应用:路径可行性检查、曲率约束平滑
- 避坑:不仅要看曲率大小,还要看曲率变化率