3. 曲率约束的数学建模:最大曲率约束、曲率变化率约束、基于车辆最小转弯半径的约束推导
各位同学,咱们今天聊点硬核的——曲率约束的数学建模。
说实话,我在做自动驾驶路径规划的头两年,踩过最大的坑就是「规划出来的路径看着挺顺眼,但车就是跟不上去」。后来我才明白,问题出在曲率约束上。你想想看,一辆车能转多急的弯,能多快地从直道进入弯道,这些物理限制如果不写到数学模型里,那规划出来的轨迹就是一张废纸。
好,咱们一步步来拆解。
3.1 最大曲率约束:车能转多急的弯?
先问一个最基础的问题:一辆车在某个速度下,能通过的最小转弯半径是多少?
这个问题的答案,直接决定了路径上任意一点的曲率上限。
咱们从车辆运动学模型出发。对于前轮转向的车辆,有一个经典的公式:
κ_max = tan(δ_max) / L
其中:
- κ_max:最大曲率(单位:1/m)
- δ_max:前轮最大转向角(单位:rad)
- L:轴距(单位:m)
举个例子。我参与过一个乘用车项目,轴距 L=2.8m,前轮最大转向角 δ_max=35°(约0.61 rad)。那么:
κ_max = tan(0.61) / 2.8 ≈ 0.70 / 2.8 ≈ 0.25 (1/m)
对应的最小转弯半径就是:
R_min = 1 / κ_max ≈ 4.0 m
嗯,这里要注意——这个4米是理论值。实际项目中,我一般会留20%~30%的安全余量。为什么?因为轮胎侧偏、悬架变形、路面附着系数变化,都会让实际转弯半径变大。我曾经吃过这个亏,规划出来的路径曲率刚好卡在理论极限上,结果实车测试时,车辆在高速过弯时直接推头了……
核心结论:最大曲率约束本质上就是车辆物理极限的数学表达。公式很简单,但工程应用时要留余量。
3.2 曲率变化率约束:别让方向盘「跳崖」
最大曲率约束管的是「能不能转过去」,但还有一个更隐蔽的问题——「能不能平顺地转过去」。
你想想看,如果路径上某一点曲率从0突然跳到0.2,方向盘需要在一瞬间从回正状态打到某个角度。这在物理上是不可能的。因为方向盘有转速限制,转向执行器有响应延迟。
曲率变化率约束,数学上表达为:
|dκ/ds| ≤ (dκ/ds)_max
或者用时间域表达:
|dκ/dt| ≤ (dκ/dt)_max
其中 s 是弧长,t 是时间。两者通过车速 v 关联:
dκ/dt = v · dκ/ds
我在项目中遇到过这样一个场景:某次泊车路径规划,算法只考虑了最大曲率约束,没管曲率变化率。结果路径上有一段曲率从0.1突变到0.15,虽然都在最大曲率范围内,但方向盘需要以超过执行器极限的速度转动。实车测试时,方向盘「咔咔」响了两声,然后报错了……
工程经验:曲率变化率约束的取值,通常来自转向系统的阶跃响应测试。一般乘用车的 (dκ/dt)_max 在 0.1~0.3 (1/m/s) 之间。低速泊车时可以取小一点,高速巡航时可以取大一点。
3.3 基于最小转弯半径的约束推导
好,咱们把上面两个约束统一到一个框架里。
最小转弯半径 R_min 是车辆的一个固有参数。它和最大曲率的关系是:
κ_max = 1 / R_min
但这里有个坑——R_min 并不是一个固定值。它和车速有关。为什么?因为高速时轮胎侧偏角变大,实际转弯半径会比低速时大。
我习惯用一个经验公式来拟合这个关系:
R_eff(v) = R_min · (1 + α · v²)
其中 α 是一个与轮胎特性、悬架刚度有关的系数,一般通过实车标定得到。我做过的一个项目中,α 大约在 0.002~0.005 (s²/m²) 之间。
那么,考虑车速后的最大曲率约束就是:
κ_max(v) = 1 / [R_min · (1 + α · v²)]
同时,曲率变化率约束也要考虑车速:
|dκ/dt| ≤ (dκ/dt)_max
结合 dκ/ds = (dκ/dt) / v,得到:
|dκ/ds| ≤ (dκ/dt)_max / v
你看,车速越低,允许的曲率变化率(按弧长计)就越大。这很符合直觉——低速时方向盘可以打得快一些。
注意:当车速 v → 0 时,|dκ/ds| 的上限会趋于无穷大。这在数学上没问题,但工程上要设置一个上限值,防止数值溢出。我一般会设一个硬上限,比如 5 (1/m²)。
3.4 知识体系总览
说了这么多,咱们用一张图来梳理一下整个知识结构:
3.5 工程实践中的几个坑
最后,我把自己踩过的坑总结一下,你们以后遇到了能少走弯路:
- 别把理论值当实际值用。 最小转弯半径的理论值是基于刚性轮胎假设的,实际中轮胎会侧偏,悬架会变形。我一般会在理论值基础上加20%的余量。
- 曲率变化率约束不能只看弧长域。 同样的路径,低速和高速时对转向系统的要求完全不同。一定要同时考虑时间域和弧长域。
- 标定参数α很重要。 不同轮胎、不同载荷、不同路面,α的值都不一样。我建议每个车型至少做三组标定:空载、半载、满载。
- 数值稳定性。 当车速接近0时,曲率变化率约束会变得非常宽松。但数值计算时要注意除零问题。我习惯在分母上加一个小量ε,比如1e-6。
一个小技巧:在实际代码中,我会把曲率约束封装成一个函数,输入是路径点序列和车速剖面,输出是每个点上的最大允许曲率和曲率变化率。这样路径规划模块只需要调用这个函数,不用关心底层的物理模型细节。
好,曲率约束的数学建模就讲到这里。这些公式看着简单,但真正用好它们,需要在项目中反复调试和标定。你们先消化一下,有问题随时问我。
可可精品资料库