2、道路边界约束:什么是道路边界?边界约束的数学表达(不等式约束)

各位同学,咱们今天聊一个在路径规划里绕不开的话题——道路边界约束。

说实话,我刚开始做自动驾驶那会儿,觉得路径规划嘛,不就是让车从A点走到B点?后来发现,真正难的不是怎么走,而是怎么在道路的“框框”里走。这个“框框”,就是道路边界。

2.1 什么是道路边界?

道路边界,说白了就是车辆可以行驶的合法区域。它由左右两侧的物理边界或虚拟边界构成。

你想想看,一条城市道路,左边是路沿石,右边是双黄线,中间才是车能走的地方。这个“中间”就是我们的可行域。

我在项目中遇到过一种情况:高精地图给的道路边界是“理想状态”的,但实际路上有施工锥桶、临时停车、甚至掉下来的树枝。这时候,道路边界就变成了动态的、局部的约束。嗯,这里要特别注意。

道路边界的本质: 将车辆的可行空间从无限大压缩到有限区域内,保证车辆不驶出道路、不碰撞障碍物。

道路边界通常分为两类:

  • 硬边界: 物理存在的,比如路沿、护栏、墙壁。车碰上去就是事故。
  • 软边界: 规则定义的,比如车道线、禁止变道区域。压线可能扣分,但不一定撞车。

我个人习惯把软边界叫做“建议性约束”,硬边界叫“强制性约束”。规划时,对硬边界要留安全余量,对软边界可以稍微“擦边”通过。

2.2 边界约束的数学表达

好,咱们来点硬核的。道路边界在数学上怎么描述?

最常见的表达方式是不等式约束。什么意思?就是给车辆的横向位置(通常用 y 表示)加上一个上下限。

假设车辆在道路上的横向位置为 y(s),其中 s 是沿道路的纵向距离。那么道路边界约束可以写成:

y_left(s) ≤ y(s) ≤ y_right(s)

其中:

  • y_left(s) 是左侧边界在 s 处的横向坐标
  • y_right(s) 是右侧边界在 s 处的横向坐标

这看起来简单,但实际工程中坑很多。我曾经在一条弯道上吃过亏——地图给的边界是直线插值的,但实际道路是曲线,结果规划出来的轨迹差点蹭到路沿。后来我学乖了,边界一定要用曲线拟合,不能简单线性插值。

我的小技巧: 在弯道处,对边界点做三次样条插值,比线性插值平滑得多,也安全得多。

2.3 更完整的约束形式

除了横向位置,我们还需要考虑车辆宽度。你不能把车当成一个点来处理,对吧?

假设车辆宽度为 w,那么车辆中心点 y(s) 的约束要缩进半个车宽:

y_left(s) + w/2 ≤ y(s) ≤ y_right(s) - w/2

这个缩进量,我建议至少留 0.3米的安全余量。为什么?因为定位有误差、控制有偏差、车辆有侧倾。我在某次测试中,就因为没留这个余量,后视镜差点刮到护栏。从那以后,我的代码里永远多写一行:

// 安全余量
const double SAFETY_MARGIN = 0.3;  // 单位:米
y_min = y_left + w/2 + SAFETY_MARGIN;
y_max = y_right - w/2 - SAFETY_MARGIN;

2.4 边界约束的矩阵形式

在优化问题中,我们通常把多个约束写成矩阵形式。假设轨迹有 N 个离散点,每个点都有横向位置 y_i,那么:

y_min_i ≤ y_i ≤ y_max_i,  i = 1, 2, ..., N

写成矩阵就是:

[ I ] * y ≤ y_max
[-I ] * y ≤ -y_min

其中 I 是单位矩阵,y 是所有 y_i 组成的向量。

这种形式在二次规划(QP)求解器中非常常见。说白了,就是把“车不能出界”这件事,翻译成求解器能懂的数学语言。

注意: 边界约束是硬约束,必须满足。如果求解器告诉你无解,那说明你的边界设置有问题,或者轨迹本身就不存在。这时候不要硬算,先检查边界数据。

2.5 知识体系图

下面我用一张图来总结本章的核心逻辑:

道路边界约束知识体系 道路边界 硬边界(物理) 软边界(规则) 不等式约束 y_left ≤ y ≤ y_right 考虑车宽 + 安全余量 y_left + w/2 + margin ≤ y 工程实现:矩阵形式 → QP求解器 [I]y ≤ y_max, [-I]y ≤ -y_min

2.6 本章小结

道路边界约束,说白了就是给轨迹画个“安全区”。

  • 边界分硬边界和软边界,处理方式不同
  • 数学上是不等式约束,形式简单但细节多
  • 一定要考虑车宽和安全余量,别把车当质点
  • 矩阵形式方便求解器处理,是工程落地的关键

我记得刚入行时,总觉得边界约束是“小事”,后来被现实教育了——边界约束没处理好,轨迹就是废的。希望各位同学能重视这个看似简单、实则坑多的知识点。

可可精品资料库