4. 速度约束的数学表达:线性不等式约束、非线性约束、凸约束与非凸约束
速度约束,说白了就是告诉自动驾驶系统:“你最快只能跑这么快,最慢不能低于这个值。” 听起来简单,但真要写成数学公式,让计算机去理解,这里面的门道可不少。
我个人习惯把速度约束分成两大类来理解:一类是“直来直去”的约束,另一类是“弯弯绕绕”的约束。前者对应线性不等式,后者对应非线性。而凸与非凸,则是从优化求解的难度角度去划分的。咱们一个一个来拆解。
4.1 线性不等式约束:最直白的“限速牌”
线性不等式约束,就是那种“速度不能超过某个固定值”的约束。你想想看,城市道路限速60 km/h,这就是一个典型的线性不等式。
数学上写出来很简单:
v_min ≤ v ≤ v_max
其中 v 是车辆的速度,v_min 和 v_max 是常数。在优化问题里,这种约束写成矩阵形式就是:
A * v ≤ b
这里的 A 和 b 都是已知的常数矩阵和向量。为什么叫“线性”?因为速度 v 的系数都是常数,没有 v² 或者 sin(v) 这种复杂项。
关键点:线性不等式约束的可行域是一个凸集。什么意思?就是任意两个可行速度点连成的线段,上面的每一个点也都是可行的。这个性质对优化求解非常友好。
我在项目中遇到过一个问题:有人把所有的限速都当成线性约束来处理,结果在弯道场景下出了问题。为什么?因为弯道限速其实跟曲率有关,而曲率本身不是线性的。嗯,这里要注意,线性约束只适用于那些与车辆状态无关的固定限速。
4.2 非线性约束:弯道、湿滑路面与动态限速
非线性约束就复杂多了。它通常跟车辆的状态、道路的几何形状、甚至天气条件有关。
举个例子,弯道限速。车辆在弯道中能安全通过的最大速度,取决于弯道的曲率 κ 和路面摩擦系数 μ:
v_max ≤ sqrt(μ * g / |κ|)
这里面有开方,有除法,还有曲率 κ 这个变量。曲率本身又是道路位置的函数,可能是非线性的。这就构成了一个典型的非线性约束。
再比如,跟车场景下的速度约束。前车突然刹车,你的速度必须满足:
v_ego ≤ v_lead + sqrt(2 * a_max * d_safe)
这里面有平方根,有前车速度 v_lead,还有安全距离 d_safe。这些变量之间不是简单的线性关系。
我的经验:处理非线性约束时,我建议先画个图。把约束的边界画出来,看看它长什么样。是凸的还是非凸的?这直接决定了你用什么求解器。
4.3 凸约束 vs 非凸约束:求解难度的分水岭
凸约束和非凸约束的区别,说白了就是“好解”和“难解”的区别。
凸约束:可行域是凸集。线性不等式约束是凸的,某些非线性约束(比如上面提到的弯道限速,在特定条件下)也是凸的。凸约束的好处是:局部最优解就是全局最优解。你不用担心陷入局部陷阱。
非凸约束:可行域不是凸集。比如,某些避障场景下的速度约束,或者带有“禁止速度区间”的约束(速度不能落在 [20, 30] km/h 这个区间内)。非凸约束的优化问题,求解起来要麻烦得多,通常需要全局优化算法或者启发式方法。
| 约束类型 | 数学形式 | 凸性 | 求解难度 | 典型场景 |
|---|---|---|---|---|
| 线性不等式 | v_min ≤ v ≤ v_max | 凸 | 容易 | 固定限速路段 |
| 非线性(凸) | v ≤ sqrt(μ*g/|κ|) | 凸(特定条件下) | 中等 | 弯道限速 |
| 非线性(非凸) | v ∉ [20, 30] | 非凸 | 困难 | 禁止速度区间 |
避坑指南:我曾经把一个非凸约束当成凸约束来处理,用了标准的二次规划求解器。结果求解器一直报错,或者给出明显不合理的解。后来才发现,问题出在约束的非凸性上。从那以后,我每次建模都会先检查约束的凸性。
4.4 知识体系:速度约束的分类与关系
下面这张图,是我自己总结的速度约束分类体系。它把线性/非线性、凸/非凸这四类约束的关系,以及它们在实际场景中的应用,都串在了一起。
从这张图可以看得很清楚:线性不等式约束一定是凸的,而非线性约束则可能是凸的,也可能是非凸的。我个人习惯在建模初期,先判断约束的凸性,再决定用哪种优化算法。
4.5 实际建模中的选择策略
在实际项目中,我一般遵循这样的策略:
- 优先使用线性约束:如果问题允许,尽量把约束简化成线性形式。求解速度快,稳定性好。
- 非线性约束尽量凸化:通过变量替换或松弛,把非凸约束转化为凸约束。比如,用 v² 代替 v,有时候就能把非凸问题变成凸问题。
- 实在不行再用非凸优化:如果约束天生就是非凸的,那就得用全局优化算法了。但要做好心理准备,求解时间可能会长很多。
一个小技巧:当你面对一个复杂的非线性约束时,先问问自己:“这个约束能不能分段线性化?” 如果能,那就把它拆成几个线性约束的组合。虽然约束数量变多了,但求解难度会大幅下降。
好了,关于速度约束的数学表达,咱们就聊到这里。记住一句话:约束越简单,求解越轻松;约束越复杂,效果可能越好,但代价也越大。怎么取舍,就看你的具体需求了。