4. 边界约束的数学建模:不等式约束、软约束与硬约束、约束的凸化处理
各位同学,咱们今天聊聊约束。说实话,在自动驾驶轨迹规划里,约束这东西就像交通规则——没有不行,太死板也不行。我刚开始做规划的时候,总觉得约束越多越安全,结果生成出来的轨迹要么是急刹车,要么是原地打转。后来才明白,约束的数学建模,本质上是在「安全」和「可行性」之间找平衡。
4.1 不等式约束:把物理边界翻译成数学语言
先看最简单的场景。你的车要在车道内行驶,左右不能压线。这个物理限制怎么变成数学公式?
假设车道中心线是参考线,车的位置用横向偏移 d 表示。那么左边界就是 d ≤ d_left,右边界是 d ≥ d_right。合起来就是:
d_right ≤ d ≤ d_left
嗯,这就是最基础的不等式约束。但实际项目中,边界不是死的。我记得有一次在高速场景,车道宽度是3.5米,但旁边有辆大货车压线行驶,实际可用空间只有2米。这时候你不能死板地用车道边界,得动态调整。
所以,不等式约束的一般形式是:
g(x) ≤ 0
其中 x 是状态变量(位置、速度、加速度等),g(x) 是约束函数。比如速度约束:
v_min ≤ v ≤ v_max → v - v_max ≤ 0 且 v_min - v ≤ 0
你想想看,所有物理边界都可以写成这种形式。但问题来了——如果约束太紧,优化问题可能无解。这时候就需要引入「软约束」的概念。
4.2 硬约束 vs 软约束:什么时候该妥协?
硬约束,就是必须满足的条件。比如障碍物边界——你总不能穿过去吧?
软约束,则是「尽量满足,但实在不行可以稍微违反」。比如舒适性约束,加速度不能太大,但紧急情况下稍微超一点也能接受。
我在项目中遇到过这样一个案例:在狭窄的城区道路,两侧都是停着的车,中间只有2.8米宽。如果硬约束要求车辆必须保持在车道中心±0.2米内,那根本无解。后来我把横向偏移的约束改成软约束,加上惩罚项,轨迹就顺利生成了。
数学上,软约束的实现方式是在目标函数里加惩罚项:
min J(x) + ρ * max(0, g(x))
其中 ρ 是惩罚系数。系数越大,越接近硬约束。我个人的习惯是:
- 安全相关(碰撞、道路边界)→ 硬约束
- 舒适相关(加速度、 jerk)→ 软约束
- 效率相关(速度、时间)→ 软约束
4.3 约束的凸化处理:让求解器不再头疼
好了,现在约束有了,但优化求解器不一定买账。为什么?因为非凸约束会让求解器陷入局部最优,甚至直接罢工。
举个例子,道路边界约束本身是凸的(线性不等式),但如果你考虑车辆的运动学模型,比如最小转弯半径,约束就变成非凸的了。
非凸约束长什么样?
sin(θ) ≥ 0.5 ← 这不是凸约束
凸化处理,说白了就是把非凸约束「掰直」。常用的方法有:
- 线性化:在参考点附近做泰勒展开,只保留一阶项
- 松弛:把等式约束放宽成不等式
- 变量替换:用新的变量代替非线性组合
我举个具体的例子。车辆的运动学约束中,有这样一个非线性项:
v * sin(θ) = dy/dt
这玩意儿是非凸的。怎么处理?一种方法是假设航向角变化很小,用 sin(θ) ≈ θ 近似:
v * θ ≈ dy/dt
嗯,这当然有误差,但在低速场景下完全够用。如果你追求更高精度,可以用序列凸规划(SCP),每次迭代都在当前解附近线性化。
4.4 知识体系总览
下面这张图是我自己整理的,把边界约束的建模流程串起来了:
4.5 实战中的避坑指南
最后分享几个我踩过的坑:
- 约束冲突:有时候两个约束会打架。比如「速度不能超过10m/s」和「必须在5秒内到达终点」,如果终点距离80米,这两个约束就矛盾了。解决办法是检查约束的一致性,或者把其中一个设成软约束。
- 数值尺度:位置约束是米级(0~100),加速度约束是0.1级(-3~3),放到同一个优化问题里,如果不归一化,求解器会偏向大尺度的约束。我习惯把所有约束归一化到 [0,1] 区间。
- 离散化精度:时间步长取0.1秒还是0.01秒?步长太大,约束可能被跳过;步长太小,计算量爆炸。我一般根据场景动态调整——直道用0.2秒,弯道用0.05秒。
核心要点回顾:
- 不等式约束是边界约束的基础形式,写成 g(x) ≤ 0
- 硬约束保安全,软约束保可行,两者搭配使用
- 凸化处理是让求解器能高效工作的关键步骤
- 实际工程中,约束的数值尺度和离散化精度同样重要
好了,这一节的内容就到这儿。约束建模这块,说白了就是「把现实世界的规则翻译成数学语言,再让计算机去求解」。多动手写代码,多跑实验,慢慢就有感觉了。