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 知识体系图
下面我用一张图来总结本章的核心逻辑:
2.6 本章小结
道路边界约束,说白了就是给轨迹画个“安全区”。
- 边界分硬边界和软边界,处理方式不同
- 数学上是不等式约束,形式简单但细节多
- 一定要考虑车宽和安全余量,别把车当质点
- 矩阵形式方便求解器处理,是工程落地的关键
我记得刚入行时,总觉得边界约束是“小事”,后来被现实教育了——边界约束没处理好,轨迹就是废的。希望各位同学能重视这个看似简单、实则坑多的知识点。