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   ← 这不是凸约束

凸化处理,说白了就是把非凸约束「掰直」。常用的方法有:

  1. 线性化:在参考点附近做泰勒展开,只保留一阶项
  2. 松弛:把等式约束放宽成不等式
  3. 变量替换:用新的变量代替非线性组合

我举个具体的例子。车辆的运动学约束中,有这样一个非线性项:

v * sin(θ) = dy/dt

这玩意儿是非凸的。怎么处理?一种方法是假设航向角变化很小,用 sin(θ) ≈ θ 近似:

v * θ ≈ dy/dt

嗯,这当然有误差,但在低速场景下完全够用。如果你追求更高精度,可以用序列凸规划(SCP),每次迭代都在当前解附近线性化。

💡 小技巧: 凸化处理时,尽量保持约束的几何意义。比如把「车辆不能超出道路」线性化为「车辆中心点不能超出缩进后的边界」,这样即使近似,物理意义也清晰。

4.4 知识体系总览

下面这张图是我自己整理的,把边界约束的建模流程串起来了:

边界约束数学建模流程 物理边界 → 不等式约束 车道边界、障碍物距离、速度限制、加速度限制 约束类型选择 硬约束:安全相关(必须满足) 软约束:舒适/效率(加惩罚项) 约束凸化处理 线性化 | 松弛 | 变量替换 | 序列凸规划(SCP) 凸优化问题 → 可求解的轨迹

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
  • 硬约束保安全,软约束保可行,两者搭配使用
  • 凸化处理是让求解器能高效工作的关键步骤
  • 实际工程中,约束的数值尺度和离散化精度同样重要

好了,这一节的内容就到这儿。约束建模这块,说白了就是「把现实世界的规则翻译成数学语言,再让计算机去求解」。多动手写代码,多跑实验,慢慢就有感觉了。

可可精品资料库