2. 自动驾驶系统基础

自动驾驶系统并不是一个“端到端黑盒”就能完全解释的工程对象。即便在端到端模型逐渐流行的今天,量产系统仍然普遍采用分层解耦的架构:感知负责回答“周围有什么”,预测负责回答“它们接下来会怎么动”,规划负责回答“我该怎么走”,控制负责回答“如何把规划变成方向盘、油门和刹车的具体动作”。理解这条数据流,是理解 Hard Case 从何而来、又该被归到哪一层去闭环的前提。

一、四大模块的核心职责

感知模块把传感器原始数据转换为结构化环境描述。摄像头提供语义与纹理,激光雷达提供精确三维几何,毫米波雷达提供速度与穿透能力,IMU/轮速/GNSS 提供自车状态。感知输出通常包括:障碍物列表(位置、尺寸、朝向、速度)、车道线与路沿、可行驶区域、交通标志与信号灯状态、以及自车定位结果。感知的核心难点在于遮挡、截断、远距离小目标、恶劣天气与传感器不一致。

预测模块接收感知输出的动态障碍物,推断其未来数秒的轨迹分布。它要处理交互博弈(如加塞、汇入)、意图不确定性(是否变道、是否让行)以及多模态未来(可能左转也可能直行)。预测输出往往是多条带概率的轨迹,而非单一确定轨迹。

规划模块结合预测结果、地图、交规与自车状态,生成一条安全、舒适、合法的行驶轨迹。它通常分为全局路由、行为决策(变道/跟车/让行)和局部轨迹优化三层。规划要在“安全”与“通行效率”之间做权衡,是 Hard Case 最集中的战场。

控制模块把规划轨迹转化为横纵向控制指令,通过 PID、MPC 等控制器输出转向角、加速度与制动压力,并处理执行器延迟、标定误差与车辆动力学非线性。

二、数据流与系统架构

四个模块以流水线方式串联,同时存在大量反馈回路:控制的实际执行结果会影响自车状态,进而影响感知与预测的输入;规划若发现轨迹不可行,也会回退请求重新决策。下图展示了这一数据流与 Hard Case 的典型落点。

自动驾驶系统数据流与 Hard Case 落点 传感器输入 摄像头 / 激光雷达 毫米波雷达 / IMU / GNSS 感知 检测 / 分割 / 定位 障碍物与车道线 预测 意图 / 多模态轨迹 交互博弈 规划 路由 / 决策 / 轨迹优化 安全与效率权衡 控制 横纵向控制 转向 / 油门 / 制动 车辆执行 底盘 / 转向 / 制动 自车状态反馈 状态反馈 Hard Case 典型落点 感知类 遮挡 / 截断 / 逆光 传感器不一致 预测类 加塞 / 鬼探头 意图突变 规划类 博弈僵持 / 窄道 交规冲突 控制类 抖动 / 超调 / 延迟 执行器饱和

三、Hard Case 在架构中的位置

Hard Case 不是某一层的专属问题,而是数据流中某个环节的输出与预期发生显著偏差的场景。定位 Hard Case 的第一步,就是判断它发生在哪一层:

  • 感知层 Hard Case:目标漏检、误检、位置跳变、车道线断裂。典型如隧道出口逆光、大车遮挡下的行人、雨夜反光。
  • 预测层 Hard Case:他车行为与预测分布严重不符,如静止车辆突然开门、旁车连续变道、行人折返。
  • 规划层 Hard Case:轨迹不可行、决策犹豫、博弈僵持、违反交规或舒适性骤降。
  • 控制层 Hard Case:跟踪误差大、执行抖动、响应延迟导致的安全距离不足。
判断 Hard Case 归属时,不要只看“最终表现”。一次急刹可能源于控制标定,也可能源于预测误判,还可能源于感知漏检。必须沿数据流逐层回溯,找到最早出现偏差的模块。

四、案例:一次“鬼探头”的逐层回溯

假设车辆在城市道路以 40 km/h 行驶,右侧公交车停靠,突然一名行人从公交车前方横穿,车辆紧急制动。复盘时可按数据流逐层检查:

  1. 感知:行人是否在遮挡解除后的第一帧被检出?检测框是否稳定?
  2. 预测:行人轨迹是否被预测为横穿?概率是否足够高?
  3. 规划:是否提前减速?制动决策是否过晚?
  4. 控制:制动指令是否及时执行?减速度是否达到预期?

若感知在遮挡解除后 200 ms 才检出,则 Hard Case 主因在感知;若感知及时但预测未给出横穿意图,则主因在预测;若前两者正常而规划未减速,则主因在规划。这种分层归因是闭环工程的核心方法。

五、常见误区与复盘要点

误区 表现 正确做法
只看最终表现归因 急刹就改控制参数 沿数据流逐层回溯,定位最早偏差
把 Hard Case 当单点 bug 修一个场景,同类问题反复出现 抽象为场景族,批量挖掘与回归
忽略模块间耦合 感知抖动被预测放大 关注接口稳定性与置信度传递
缺少统一数据回放 无法复现,争论不休 建立带时间戳的全链路数据闭环

六、数据闭环中的关键接口

为了让 Hard Case 可挖掘、可复现、可回归,系统需要保留关键中间结果。典型接口数据包括:

perception:
  objects: [{id, type, pose, velocity, confidence}]
  lanes: [{id, points, confidence}]
prediction:
  trajectories: [{id, modes: [{prob, points}]}]
planning:
  decision: {behavior, target_speed, trajectory}
control:
  cmd: {steer, accel, brake}
  feedback: {actual_steer, actual_accel, timestamp}

这些接口不仅是模块间的契约,也是 Hard Case 挖掘的数据金矿。只有把每一层的输入输出都记录下来,才能在复盘时回答“偏差从哪一层开始”。

Hard Case 挖掘的本质,是在分层架构中找到“预期”与“实际”之间的偏差层,并用可复现的数据把它固定下来,形成回归用例。理解感知、预测、规划、控制的数据流,就是理解 Hard Case 从何而来、又该回到哪里去闭环。