共计 2238 个字符,预计需要花费 6 分钟才能阅读完成。
背景:自动驾驶赛事的技术挑战
参加 Apollo 自动驾驶赛最直接的感受是:真实道路场景的复杂程度远超实验室数据集。赛事中典型的挑战包括:

- 长尾场景处理 :比如突然横穿马路的行人、违规停放的工程车辆等低频但高风险场景
- 实时性要求 :从传感器输入到控制指令输出需控制在 100ms 以内
- 多传感器协同 :摄像头、激光雷达和毫米波雷达的数据时空对齐问题
这些挑战直接决定了我们不能简单套用传统计算机视觉方案,而需要构建更鲁棒的感知 - 决策闭环系统。
技术路线对比:传统 CV vs 端到端学习
传统计算机视觉方案
优点:
- 可解释性强,每个处理环节都可调试
- 对硬件算力要求较低
- 规则明确的情况下稳定性好
缺点:
- 特征工程依赖专家经验
- 难以应对未见过的场景
- 多模块串联导致误差累积
端到端深度学习方案
优点:
- 自动学习特征表示
- 理论上可以处理任意场景
- 单模型简化系统架构
缺点:
- 需要海量标注数据
- 黑箱特性导致调试困难
- 实时性受模型复杂度限制
在实际比赛中,我们采用了混合架构:感知层使用深度学习,决策层融合规则引擎与强化学习。这种组合在 2022 年赛事中帮助我们的团队进入了决赛圈。
核心模块实现
感知模块:Lidar 3D 目标检测
Apollo 提供的 PointPillars 算法非常适合赛事场景,以下是关键代码片段:
# Apollo 7.0+ 的感知模块初始化
from modules.perception.producer import PointPillarsDetector
detector = PointPillarsDetector(
model_path='./models/pointpillars',
preprocess_fn=preprocess.pillar_feature_net,
device='cuda:0'
)
# 处理单帧点云
def process_frame(point_cloud):
try:
# 坐标系转换 (赛事特殊要求)
pc = transform_coord(point_cloud, src='velodyne', dst='world')
# 执行检测
detections = detector(pc)
# 后处理 (NMS + 速度估计)
results = postprocess(detections)
logger.info(f'Detected {len(results)} objects')
return results
except Exception as e:
logger.error(f'Detection failed: {str(e)}')
return []
核心算法原理:
- 点云转换为柱状体特征(pillars):
$$ F_{i,j} = \frac{1}{N} \sum_{k=1}^{N} (x_k,y_k,z_k,r_k) $$ - 使用 2D CNN 处理伪图像特征
- 3D 框回归采用 SSD 架构
决策模块:混合架构设计
我们的决策系统包含三个层级:
- 行为层 :基于有限状态机(FSM)处理标准场景
- 状态包括:跟车、换道、停车等
-
转换条件来自感知结果
-
策略层 :PPO 强化学习处理复杂场景
- 状态空间:相对位置 + 速度 + 交通规则
-
奖励函数设计是关键
-
仲裁机制 :当 FSM 与 RL 输出冲突时,选择保守策略
// 状态机示例 (Apollo Cyber RT 组件)
class StateMachine : public Component {
public:
bool Proc() override {switch(current_state_) {
case CRUISE:
if (emergency_stop_) {ChangeState(EMERGENCY);
}
break;
// 其他状态处理...
}
}
};
性能优化实战
时间同步方案
多传感器数据对齐是精度提升的关键:
- 硬件同步:使用 PTP 协议对齐设备时钟
- 软件补偿:对运动物体进行线性插值
$$ x_{sync} = x_t + v \cdot \Delta t $$
TensorRT 加速
以检测模型为例,部署优化流程:
- 转换 ONNX 模型
- 构建 TensorRT 引擎
# 模型转换示例
from apollo.converter import ONNXtoTRT
converter = ONNXtoTRT(
input_model="pointpillars.onnx",
output_path="./engine",
fp16_mode=True,
max_workspace_size=1 << 30
)
converter.convert()
优化效果:
- 推理速度从 45ms 提升到 22ms
- 显存占用减少 40%
避坑指南
数据标注陷阱
赛事中我们踩过的坑:
- 激光雷达与相机标注框未统一坐标系
- 不同标注员对遮挡物体的处理标准不一致
解决方案:
- 建立标注检查工具
- 使用 Apollo 的校准工具验证
仿真与实车差异
仿真环境(如 LGSVL)中表现良好的模型,在实车测试时可能出现:
- 传感器噪声被低估
- 控制延迟被忽略
我们的应对策略:
- 在仿真中添加噪声模型
- 部署前进行延迟测试
进阶学习建议
官方资源
- Apollo 开放平台文档
- GitHub 上的感知模型仓库
经典论文
- PointPillars: Fast Encoders for Object Detection from Point Clouds
- End-to-End Learning for Self-Driving Cars (NVIDIA)
- Reinforcement Learning for Autonomous Driving (Waymo)
参加 Apollo 赛事最大的收获是认识到:自动驾驶不是单纯的算法问题,而是需要把算法、工程、测试形成闭环。建议新入场的开发者先从感知模块入手,逐步扩展到完整的自动驾驶栈。
正文完
