共计 1507 个字符,预计需要花费 4 分钟才能阅读完成。
背景痛点:城市复杂路况的 planning 挑战
自动驾驶的 planning 模块在高动态城市环境中常面临两个核心问题:

-
实时性不足:当遇到行人突然穿越马路这类突发场景时,传统的基于规则的决策系统需要遍历大量条件分支,导致计算延迟增加。我们在测试中发现,90% 的急刹场景中,规划延迟超过 150ms 就会显著增加碰撞风险。
-
多目标决策冲突:比如同时遇到避让行人和保持舒适性两个目标时,纯规则引擎往往通过硬编码优先级解决,但在复杂路口这类策略会导致 ” 犹豫不决 ” 的蛇形轨迹。
混合决策方案设计
架构选型对比
- 纯规则引擎:
- 优点:确定性高,调试直观
-
缺点:长尾场景覆盖成本指数级增长
-
端到端 RL:
- 优点:自适应复杂场景
- 缺点:黑箱特性导致安全验证困难
我们的混合架构采用 分层状态机 + 模型微调 设计:
sequenceDiagram
Rule Layer->>Learning Layer: 场景特征(障碍物, 路权等)
Learning Layer->>Rule Layer: 建议权重[0-1]
Rule Layer->>Cache: 查询历史决策
Cache-->>Rule Layer: 命中相似场景?
Rule Layer->>Controller: 最终轨迹指令
关键创新:场景分类缓存
- 使用 Frenet 坐标系将场景参数化为 (s,d,v) 三元组
- 通过局部敏感哈希 (LSH) 建立场景指纹
- 缓存命中时直接复用轨迹预测结果
代码实现细节
状态机切换逻辑(Python 伪代码)
class StateMachine:
def __init__(self):
self._states = {
'NORMAL': self._normal_mode,
'EMERGENCY': self._emergency_mode
}
self.current_state = 'NORMAL'
def transition(self, scenario_risk):
try:
if scenario_risk > 0.7:
self.current_state = 'EMERGENCY'
else:
self.current_state = 'NORMAL'
except Exception as e:
log_error(f"State transition failed: {str(e)}")
activate_fallback()
ROS2 轨迹缓存实现
// 创建带 TTL 的缓存区
auto cache = std::make_shared<rclcpp::Parameter>(\
"trajectory_cache_size", 100);
// 订阅预测结果
auto sub = create_subscription<PredictionMsg>(
"/prediction", 10,
[&](const PredictionMsg::SharedPtr msg) {auto key = generate_scene_hash(msg);
if (!cache.exists(key)) {cache.insert(key, msg, 500ms); // 500ms 有效期
}
});
性能验证
CARLA 仿真数据
| 方案 | 90% 延迟(ms) | 内存占用(MB) |
|---|---|---|
| 纯规则引擎 | 142 | 210 |
| 混合方案(本文) | 85 | 320(+110) |
注:额外的 110MB 来自 RL 模型热加载工作区
避坑指南
权重动态调整策略
- 初始阶段:规则引擎权重 80%
- 当累计 1000km 无干预时:逐步提升学习模块权重
- 检测到决策冲突时:立即回滚到上一稳定版本
典型 Corner Case 处理
- 传感器失效:
- 立即切换至纯规则模式
- 限速至 15km/h
-
开启双闪警示
-
V2X 高延迟:
- 采用悲观预测假设
- 在 ST 图中预留安全边际
开放问题
当 V2X 通信延迟 >200ms 时,如何保证多车之间的规划一致性?欢迎在评论区分享你的见解。
正文完
发表至: 未分类
近一天内
