4、决策规划安全:行为预测的不确定性、路径规划的碰撞检测、安全冗余策略

决策规划这块,说实话,是自动驾驶系统里最让我头疼的部分。你想想看,感知模块告诉你前面有个障碍物,定位模块告诉你车在哪,但最终车怎么走,全靠决策规划来拍板。我参与过的几个项目里,出过问题的环节,十有八九都跟决策规划的安全设计有关。

今天咱们就聊三个核心点:行为预测的不确定性怎么处理、路径规划的碰撞检测怎么做、以及安全冗余策略怎么落地。嗯,这些都是我在实际项目中踩过坑的地方。

4.1 行为预测的不确定性

行为预测,说白了就是猜别人要干嘛。但问题是——猜,就一定有错的时候。

我记得有一次路测,我们的车预测旁边那辆卡车会直行,结果它突然变道了。还好我们的安全策略兜住了,不然就出大事了。从那以后,我对预测模块的输出就多留了个心眼。

核心观点:预测结果必须带置信度,不能只给一个“最可能”的结果。

我个人习惯的做法是,把预测结果分成三层:

  • 最可能轨迹:概率最高的行为,用于正常规划
  • 次可能轨迹:概率较低但不可忽略的行为,用于安全校验
  • 极端情况:概率极低但后果严重的行为,用于紧急策略

为什么会这样分?因为你在路上开车,不能只盯着最可能的情况。你想想看,如果只按最可能轨迹来规划,一旦对方不按套路出牌,你就没有回旋余地了。

我曾经在项目中吃过这个亏。当时预测模块只输出了一条轨迹,结果对方车辆突然刹车,我们的车差点追尾。后来我强制要求预测模块必须输出至少3条候选轨迹,每条带概率值。这才把问题解决。

避坑指南:我曾经见过团队把预测置信度设得太高,结果导致规划模块过于激进。建议把预测的不确定性显式传递给规划模块,让规划层自己决定怎么权衡。

4.2 路径规划的碰撞检测

路径规划里的碰撞检测,不是简单的“有没有撞上”的问题。你得考虑时间维度、空间维度、还有各种边界情况。

我常用的碰撞检测方法有三种:

方法 适用场景 缺点
包围盒法 低速、简单场景 精度低,容易误报
多边形碰撞检测 中高速、复杂场景 计算量大
时空联合检测 动态障碍物密集场景 实现复杂

我个人建议,别只用一种方法。我在项目里是这么做的:先用包围盒法做快速筛选,把明显没问题的路径过滤掉。剩下的候选路径,再用多边形碰撞检测做精细判断。如果场景特别复杂,比如十字路口,那就得上时空联合检测。

这里有个关键点——碰撞检测不能只看当前帧。你得往前看几秒。我习惯的做法是,把未来3秒的轨迹都算出来,每0.1秒做一次碰撞检测。这样能提前发现潜在风险。

警告:千万别忽略自车尺寸的膨胀系数。我曾经遇到过,因为没考虑后视镜的宽度,导致路径规划出来的路线离障碍物太近,实际通过时差点刮到。建议把自车轮廓向外膨胀0.3米作为安全边界。

代码实现上,我一般这么写碰撞检测的核心逻辑:

def check_collision(trajectory, obstacles, ego_vehicle):
    """
    检查轨迹是否与障碍物碰撞
    trajectory: 未来N步的轨迹点
    obstacles: 障碍物列表,每个障碍物包含位置、形状、速度
    ego_vehicle: 自车模型,包含尺寸和膨胀系数
    """
    for t, pose in enumerate(trajectory):
        # 计算自车在t时刻的包围盒
        ego_box = get_ego_bounding_box(pose, ego_vehicle)
        
        for obs in obstacles:
            # 预测障碍物在t时刻的位置
            obs_pos = predict_obstacle_position(obs, t)
            obs_box = get_obstacle_bounding_box(obs_pos, obs)
            
            # 检测两个包围盒是否相交
            if check_box_intersection(ego_box, obs_box):
                return True, t, obs  # 发生碰撞,返回碰撞时刻和障碍物
    
    return False, None, None  # 安全

这段代码看着简单,但实际项目里要考虑的东西多得多。比如障碍物的形状不规则怎么办?自车在转弯时包围盒怎么变化?这些细节都得处理好。

4.3 安全冗余策略

安全冗余,说白了就是“万一主系统挂了,还有备胎”。但备胎不是随便备的,你得想清楚备什么、怎么备、什么时候切。

我参与过的一个项目里,决策规划模块挂了,结果车直接停在路中间。虽然没出事故,但后面的车差点追尾。从那以后,我对冗余策略就特别上心。

我个人习惯把安全冗余分成三个层次:

  1. 算法级冗余:同一个功能用不同算法实现。比如路径规划,主算法用A*,备算法用RRT*。两个算法同时跑,结果不一致时触发安全机制。
  2. 模块级冗余:关键模块做双备份。比如行为预测模块,主模块用深度学习模型,备模块用规则模型。主模块挂了,备模块立刻顶上。
  3. 系统级冗余:整个决策规划系统有独立备份。比如主系统用高算力平台,备份系统用低算力平台,只做最基本的紧急避障和靠边停车。

关键设计原则:冗余系统之间必须独立,不能有共享的故障点。我曾经见过一个设计,主系统和备份系统共用同一个电源模块,结果电源一坏,两个系统同时失效。这种冗余等于没有。

你想想看,什么时候该切换?我建议用“心跳检测+结果校验”的双重机制:

  • 心跳检测:主系统每100ms发一次心跳信号,连续3次没收到,立刻切备份
  • 结果校验:主系统输出的规划结果,如果连续2次超出安全边界(比如加速度太大、离障碍物太近),也触发切换

嗯,这里要注意。切换的时候不能太生硬。我见过一个项目,切换时方向盘突然打到底,把乘客吓一跳。正确的做法是,切换时做平滑过渡,比如用0.5秒的时间把控制权从主系统转移到备份系统。

避坑指南:我曾经在项目中遇到一个问题——备份系统长期不工作,结果真正需要它的时候,它已经“睡死”了。建议定期让备份系统做自检,比如每10分钟跑一次模拟场景,确保它随时能顶上。

最后说一句,安全冗余不是越多越好。冗余多了,系统复杂度上去了,反而可能引入新的故障点。我个人的经验是,抓住三个最关键的环节做冗余就够了:行为预测、路径规划、控制指令生成。其他的环节,做好监控和降级策略就行。

好了,决策规划安全这块就聊到这儿。记住一句话:预测要留余地,碰撞检测要提前,冗余要独立可靠。做到这三点,你的决策规划系统就能扛住大部分突发情况了。