4. 路径规划碰撞检测失效

碰撞检测失效,这问题我太熟了。说白了就是车明明看着能过去,结果规划出来的路径却撞上了障碍物——或者反过来,明明空间够大,路径却绕得离谱。我早期做项目时,被这个问题折磨了好几个通宵。今天咱们就把膨胀层参数、障碍物过滤、自车包络矩形这三个坑,一个一个说清楚。

4.1 膨胀层参数:不是越大越好

膨胀层,就是把障碍物往外“吹”一圈。很多新手觉得,膨胀半径设大点更安全。嗯,这个想法很危险。

⚠️ 常见坑:膨胀半径设得太大,狭窄通道直接堵死。设得太小,车刮蹭风险飙升。

我遇到过这样一个案例:某园区项目,路宽3.5米,车宽1.8米。工程师把膨胀半径设成了0.9米。你算算看,3.5 - 2×0.9 = 1.7米,车宽1.8米,根本过不去!结果规划器直接报“无可行路径”。

正确的做法是什么?我个人的习惯是:

  • 膨胀半径 = 车宽的一半 + 安全余量。安全余量通常取0.1~0.3米,看场景。
  • 动态调整:低速时膨胀小一点,高速时膨胀大一点。这个逻辑很直观。
  • 区分障碍物类型:静态障碍物膨胀大,动态障碍物膨胀小。行人、自行车这种,膨胀半径可以设到0.5米以上。

核心公式:

膨胀半径 = 车辆半宽 + 安全余量 + 定位误差 + 控制误差

别偷懒,每一项都要估算。定位误差0.1米,控制误差0.15米,加起来就是0.25米。加上半宽0.9米,安全余量0.2米,总共1.35米。这才靠谱。

4.2 障碍物过滤:过滤掉不该过滤的

障碍物过滤,目的是减少计算量。但过滤策略不对,就会把真正的障碍物给漏掉。

我曾经在高速场景项目里,看到同事把“距离自车超过50米的障碍物全部过滤掉”。结果呢?前方100米处有一辆静止的事故车,被过滤了。等车开到50米内再检测到,已经来不及规划避让路径了。

这里有几个原则:

  1. 距离过滤要分层:近处(0~30米)不过滤;中处(30~80米)只过滤静止障碍物;远处(80米以上)过滤所有障碍物,但保留车道线信息。
  2. 速度过滤要谨慎:别把静止障碍物当成“地面点”过滤掉。我见过有人用速度阈值0.5m/s,结果把停在路边的车全过滤了。
  3. 高度过滤要合理:低于底盘高度的障碍物可以过滤,但要注意路面起伏。有一次,一个减速带被当成地面点过滤了,结果车直接骑上去,底盘刮了。

💡 我的经验:障碍物过滤最好做成可配置的。上线前,用实车数据回放一遍,看看过滤后的障碍物是不是合理。这一步不能省。

4.3 自车包络矩形:形状不对,碰撞检测白费

自车包络矩形,就是用一个矩形框来近似表示车辆的外形。这个矩形如果画得不对,碰撞检测就是空中楼阁。

最常见的坑有两个:

  • 矩形尺寸偏小:只算了车身,没算后视镜、保险杠、备胎。我见过一个项目,矩形宽度设了1.8米,实际车宽含后视镜2.1米。结果在窄路会车时,后视镜刮了。
  • 矩形朝向不对:车辆转弯时,前后轮的轨迹不一样。包络矩形如果只跟着车头方向,车尾就会扫到路沿。

正确做法:

// 包络矩形参数
struct EnvelopeRect {
    double length_front;  // 车头到前轴距离 + 保险杠
    double length_rear;   // 后轴到车尾距离 + 备胎
    double width_half;    // 车宽一半 + 后视镜
    double height;        // 车高 + 天线
};

// 碰撞检测时,根据车辆航向角和前轮转角,计算矩形四个角点
// 注意:转弯时要考虑车辆运动学,矩形会有一个“甩尾”偏移

我个人建议,包络矩形最好用多边形而不是矩形。用6个点或8个点来描述车辆轮廓,精度会高很多。虽然计算量大了点,但现在硬件性能完全扛得住。

4.4 知识体系总览

下面这张图,把碰撞检测失效的三个核心维度串起来了。你可以对照着检查自己的代码。

碰撞检测失效三大核心维度 碰撞检测失效 膨胀层参数 半径过大堵死通道 半径过小刮蹭风险 障碍物过滤 距离过滤分层 速度/高度过滤 自车包络矩形 尺寸偏小漏算 朝向不对甩尾 解决方案:参数可配置 + 实车回放验证 膨胀半径动态调整 | 过滤策略分层 | 包络用多边形

4.5 实战避坑指南

最后,分享几个我踩过的坑,你遇到了可以直接拿来用:

⚠️ 我曾经...在高速项目里,把膨胀半径设成了固定值。结果车在匝道上,因为曲率大,膨胀后的障碍物把车道全占了。规划器直接罢工。后来改成根据曲率动态调整膨胀半径,问题解决。

💡 我建议:每次修改碰撞检测参数后,用历史数据做一次批量回放。写个脚本,自动对比修改前后的碰撞检测结果。如果发现漏检或误检,立刻排查。这个习惯帮我省了至少10次现场调试。

嗯,碰撞检测这块,说白了就是“细节决定成败”。膨胀层、障碍物过滤、包络矩形,每个参数背后都有物理意义。别偷懒,一个个算清楚,你的路径规划才能跑得稳。