4、曲率约束原理:曲率定义与几何意义,最大曲率限制,曲率连续性要求。
各位好,我是老张。今天咱们聊聊路径规划里一个绕不开的话题——曲率约束。
说实话,我刚开始做路径规划那会儿,觉得只要路径能走通就行。结果呢?第一次实车测试,机器人原地打转,差点把货架撞翻。后来我才明白,没有曲率约束的路径,就像没有驾照的司机上路——迟早要出事。
4.1 曲率的定义与几何意义
先说说曲率到底是什么。你想想看,一条直线和一条弯道,区别在哪?
数学上,曲率 κ 定义为:
κ = 1 / R
其中 R 是曲线在该点的曲率半径。说白了,曲率就是曲线弯曲程度的度量。半径越小,曲率越大,弯越急。
举个例子:
- 直线:R = ∞,κ = 0(不弯)
- 大弯道:R = 10m,κ = 0.1(缓弯)
- 急转弯:R = 1m,κ = 1.0(急弯)
我个人习惯用这个公式来理解:曲率就是单位弧长上切线方向的变化率。你开车时方向盘转得越猛,曲率变化就越剧烈。
核心要点:曲率 κ = 1/R,单位是 1/m。数值越大,弯越急。
4.2 最大曲率限制
为什么要有最大曲率限制?
我在项目中遇到过一台AGV,设计最大曲率是 0.2(对应转弯半径 5m)。结果规划出来的路径有一段曲率到了 0.3。你猜怎么着?车子直接侧滑,差点翻车。
最大曲率限制主要来自三个方面:
| 限制来源 | 典型值 | 说明 |
|---|---|---|
| 车辆最小转弯半径 | R_min = 3~8m | 机械结构决定,改不了 |
| 轮胎摩擦系数 | μ = 0.7~0.9 | 路面湿滑时更严格 |
| 速度限制 | v_max = 2m/s | 速度越快,曲率要越小 |
嗯,这里要注意:最大曲率不是固定值。它跟速度、路面条件都有关系。我一般会留 20% 的安全余量,比如理论最大 0.25,我设成 0.2。
避坑指南:我曾经吃过一次亏,把最大曲率设得太接近极限值。结果地面有点水,车子就失控了。从那以后,我坚持留余量。
4.3 曲率连续性要求
曲率连续性,说白了就是路径不能有「急转弯」。
你想想看,开车时如果方向盘突然猛打,会怎样?乘客会前仰后合,货物可能倾倒。路径规划也一样,曲率必须平滑过渡。
曲率连续性通常分三个等级:
- C0 连续:位置连续。路径没断开,但可能有尖角。
- C1 连续:切线方向连续。路径光滑,但曲率可能突变。
- C2 连续:曲率连续。路径不仅光滑,曲率变化也平滑。
我个人习惯要求至少 C2 连续。为什么?因为 C1 连续虽然看起来光滑,但曲率突变会导致加速度突变,车子会「抖」一下。
小技巧:检查曲率连续性时,可以画曲率图。如果曲率曲线有「尖角」,说明连续性不够。我一般用三次样条插值来保证 C2 连续。
4.4 知识体系框架
下面这张图,是我自己总结的曲率约束知识体系。你看一眼,心里就有数了:
4.5 实战中的曲率处理
讲完理论,说说实际怎么用。
我一般这样处理曲率约束:
- 先算曲率:对路径采样,计算每个点的曲率值
- 再检查:看有没有超过最大曲率限制
- 最后优化:对超限区域做平滑处理
代码实现其实不复杂,核心就几步:
def check_curvature(path, max_curvature):
"""
检查路径曲率是否超限
path: 路径点列表 [(x1,y1), (x2,y2), ...]
max_curvature: 最大允许曲率
"""
violations = []
for i in range(1, len(path)-1):
# 计算三点确定的曲率
p1, p2, p3 = path[i-1], path[i], path[i+1]
curvature = compute_curvature(p1, p2, p3)
if curvature > max_curvature:
violations.append((i, curvature))
return violations
嗯,这里要注意:曲率计算对噪声很敏感。路径点稍微抖一下,曲率值可能差好几倍。我一般会先做平滑滤波,再算曲率。
经验之谈:曲率约束不是越严格越好。太严格会导致路径过于平滑,反而绕远路。我一般根据实际车辆性能来定,留 20% 余量就够了。
好了,曲率约束的原理就讲到这里。记住三点:曲率定义是基础,最大曲率是硬约束,曲率连续性是质量要求。三者缺一不可。