1. 课程导入

NOA(Navigate on Autopilot,领航辅助驾驶)并不是单一算法模块的堆叠,而是一套从传感器输入到车辆控制输出、贯穿感知、预测、规划、控制全链路的系统工程。本课程的目标,是帮助学习者建立"一体化"的工程视角:理解各模块之间的接口契约、时序约束与误差传播关系,从而具备独立设计、调试和优化 NOA 系统的能力。

核心命题:NOA 的竞争力不取决于某个模块的"最强",而取决于整条链路在真实场景下的"最稳"。感知的漏检会被预测放大,预测的偏差会被规划放大,规划的抖动会被控制放大——一体化工程就是管理这条误差放大链。

一、学习目标

完成本课程后,学习者应达到以下能力目标:

  • 架构层:能画出 NOA 从传感器到执行器的完整数据流,说明各模块的输入输出、频率与坐标系约定。
  • 算法层:掌握 BEV 感知、多目标跟踪、轨迹预测、行为决策、路径/速度规划、横纵向控制的基本原理与典型方法。
  • 工程层:理解模块间接口设计、时间同步、坐标系变换、消息中间件(如 ROS 2 / DDS / SOME/IP)的选型与调优。
  • 数据层:能设计闭环数据链路,包括数据采集、自动标注、场景挖掘、仿真回放与影子模式验证。
  • 评测层:能定义并计算关键指标,如接管率 MPI、碰撞率、舒适度 jerk、规划一致性等。

二、核心概念

在进入细节之前,需要先统一几个贯穿全课程的概念:

  • BEV(Bird's Eye View):将多相机、激光雷达、毫米波雷达的观测统一投影到自车坐标系下的俯视栅格或查询空间,是当前感知主流的中间表示。
  • Occupancy / 占据栅格:用体素或栅格描述空间是否被占用,弥补检测框对异形障碍物表达不足的问题。
  • 轨迹预测(Prediction):输出周围交通参与者未来数秒的多模态轨迹及其概率,是规划的直接输入。
  • 行为决策(Decision):在语义层选择"跟车、换道、让行、超车"等意图,输出离散或半连续的行为指令。
  • 运动规划(Planning):在行为约束下生成满足动力学、舒适性与安全性的时空轨迹。
  • 闭环(Closed Loop):感知—预测—规划—控制—车辆—环境形成反馈回路,任何模块的时延都会影响闭环稳定性。

三、整体框架

下图给出 NOA 一体化工程的典型分层框架。左侧为车载实时链路,右侧为数据与仿真闭环,二者通过数据回灌与影子模式相互支撑。

NOA 感知预测规划一体化工程框架 车载实时链路 传感器层 相机 / LiDAR 毫米波 / IMU / GNSS 感知 BEV / Occupancy 检测 / 跟踪 / 融合 预测 多模态轨迹 意图 / 概率 规划 行为决策 路径 / 速度规划 控制 横向 / 纵向 MPC / PID 车辆 执行器 底盘 / 转向 闭环反馈:车辆状态 / 环境变化 → 传感器 数据与仿真闭环 数据采集 路测 / 影子模式 场景挖掘 Corner Case 提取 自动标注 4D 真值 / 离线融合 仿真回放 SIL / HIL / VIL 模型训练 / 回归验证 → 感知与预测 评测与指标 MPI / 碰撞率 / jerk 关键工程约束 • 端到端时延预算:感知 ≤ 100 ms,预测 ≤ 50 ms,规划 ≤ 50 ms,控制 ≤ 20 ms • 坐标系一致性:传感器 → 自车 → 世界坐标,标定误差直接放大为规划偏差 • 安全兜底:规划输出需经安全校验与降级策略,异常时回退至 MRM(最小风险机动)

四、典型行业应用场景

NOA 的能力边界由场景定义。下表列出当前量产与研发中的主要场景及其对一体化链路的核心挑战:

场景 感知挑战 预测挑战 规划挑战
高速巡航与自动变道 远距小目标检测、匝道曲率 相邻车道车辆意图判别 变道时机与舒适性权衡
城市路口通行 遮挡、异形障碍物、Occupancy 多车交互博弈、行人意图 无保护左转、让行决策
拥堵跟车 近距离截断、静止目标 加塞车辆轨迹突变 启停平顺性、jerk 控制
施工与锥桶区域 非标准目标、临时车道线 锥桶引导路径推断 窄通道通过、避让余量
雨雾夜间 传感器退化、信噪比下降 不确定性建模 降级策略与速度保守化

五、常见误区与复盘

误区一:把 NOA 当成"感知 + 规划"两个独立模块。实际上预测是连接二者的桥梁,缺少预测或预测质量差,规划只能做保守的"反应式"避障,无法实现类人驾驶。
误区二:只关注算法精度,忽略时延与同步。感知输出延迟 50 ms,在 120 km/h 下车辆已前进约 1.7 m,若规划未做时延补偿,轨迹将系统性滞后。
复盘建议:建立"场景—模块—指标"三维归因表。每次接管或异常,先定位是感知漏检、预测误判、规划保守还是控制抖动,再针对性优化,避免全链路盲目调参。

六、工程实践中的接口约定示例

一体化工程的第一步是定义清晰的接口。以下是一个典型的模块间消息定义片段,用于说明感知到预测的数据契约:

# 感知输出 → 预测输入(伪代码)
PerceptionOutput:
  timestamp: 1234567890.123      # 传感器时间戳,单位秒
  frame_id: "ego"                # 自车坐标系
  objects:
    - id: 1024
      type: "vehicle"
      pose: [x, y, z, yaw]       # 位置与朝向
      size: [l, w, h]
      velocity: [vx, vy]         # 自车坐标系下速度
      covariance: [3x3]          # 位置不确定性
      history: [...]             # 历史轨迹,用于预测
  occupancy_grid:
    resolution: 0.2              # 米/格
    range: [-40, 40, -40, 40]    # x_min, x_max, y_min, y_max

# 预测输出 → 规划输入
PredictionOutput:
  timestamp: 1234567890.173      # 与感知时间戳对齐
  predictions:
    - id: 1024
      modes:
        - trajectory: [[x,y,t], ...]   # 未来 5 s 轨迹点
          probability: 0.72
        - trajectory: [[x,y,t], ...]
          probability: 0.28