共计 2269 个字符,预计需要花费 6 分钟才能阅读完成。
从两起事故看限速模块的重要性
2018 年某 L4 级测试车在园区道路因未识别临时限速标志,以 40km/ h 撞上施工隔离墩。事后调查发现:视觉检测模块将倾斜的限速牌误识别为 80km/h,而决策系统未与高精地图限速数据做交叉验证。

更典型的案例发生在 2020 年,某量产车型在隧道入口因 GPS 信号丢失,导致定位偏移至相邻高架道路(限速差 30km/h),引发紧急制动。这两个案例暴露出:
- 多源限速数据冲突处理机制缺失
- 传感器降级时的限速回退策略不完善
Apollo 限速模块的三层架构解析
1. 决策层(Decision Layer)
接收来自高精地图(HD Map)、交通标志检测(Traffic Sign Detection)和 V2X 的限速信息,输出基于 Frenet Frame 的纵向速度建议值。关键处理逻辑:
- 地图限速数据通过
/apollo/hdmap话题发布 - 动态限速标志物坐标转换到 SL 坐标系
- 使用 R -Tree 加速空间查询
2. 融合层(Fusion Layer)
采用基于置信度(Confidence Score)的加权融合算法:
// apollo/modules/planning/conf/speed_limit_config.pb.cc
message SpeedLimitConfig {optional double camera_weight = 1 [default = 0.7];
optional double v2x_weight = 2 [default = 0.8];
optional double hdmap_weight = 3 [default = 1.0]; // 高精地图最高权重
}
3. 执行层(Execution Layer)
通过 PID 控制器将速度指令转化为油门 / 刹车信号,特别注意:
- 在弯道(Curvature > 0.1)自动触发 10% 的限速降幅
- 雨天模式(Rain Mode)下采用渐进式限速调整
核心算法实现
滑动窗口滤波(Sliding Window Filter)
// apollo/modules/planning/common/speed_limit_decider.cc
void SpeedLimitDecider::SmoothSpeedLimit() {
constexpr int kWindowSize = 5; // 经过测试的最佳窗口值
std::deque<double> history;
for (const auto& limit : raw_limits_) {history.push_back(limit);
if (history.size() > kWindowSize) {history.pop_front();
}
// 剔除异常值(超过 3σ 原则)auto [mean, stddev] = ComputeStats(history);
if (std::abs(limit - mean) > 3 * stddev) {continue;}
smoothed_limits_.push_back(std::accumulate(history.begin(), history.end(), 0.0) / history.size());
}
}
Protobuf 消息定义
// apollo/modules/planning/proto/speed_limit.proto
message SpeedLimit {
optional double speed_limit = 1; // m/s
optional Source source = 2;
enum Source {
HD_MAP = 1;
TRAFFIC_SIGN = 2;
V2X = 3;
DECISION = 4; // 人工接管时生效
}
optional double confidence = 3; // [0-1]
}
性能优化实践
滑动窗口大小对 CPU 的影响
| Window Size | CPU Usage (%) | 延迟(ms) |
|---|---|---|
| 3 | 12.3 | 8.2 |
| 5 | 15.1 | 9.7 |
| 10 | 22.4 | 14.5 |
测试环境:Intel i7-1185G7 @ 3.0GHz,Ubuntu 18.04
CAN 总线优先级设置
在 /apollo/canbus/chassis.proto 中定义:
message Chassis {optional int32 canbus_priority = 10 [default = 3];
// 0- 应急指令 1- 安全类 2- 控制类 3- 状态类
}
最佳实践:
- 限速指令建议设为优先级 1
- 与 AEB(Autonomous Emergency Braking)系统共用 CAN ID 范围
生产环境检查清单
高精地图匹配验证
- 使用
cyber_monitor工具检查/apollo/hdmap话题的lane.speed_limit字段 - 对比实际 GPS 坐标与地图限速区域边界(使用 Apollo Studio 可视化工具)
- 特别注意施工区域(Construction Zone)的临时覆盖关系
紧急制动场景策略
- 当碰撞时间(TTC)<2s 时,立即切换为静态最大减速度限速
- 在
/apollo/modules/control/conf/control_conf.pb.txt中配置:
emergency_brake {
max_deceleration: 6.0 // m/s²
override_duration: 2.0 // 秒
}
经验总结
在三个城市的 RoboTaxi 车队实测表明:经过优化的限速模块将误触发率从 1.2 次 / 千公里降低到 0.3 次 / 千公里。特别提醒开发者注意:
- 在隧道等 GNSS 拒止环境,需要增加 IMU 航位推算(Dead Reckoning)作为备用校验源
- 当检测到轮胎打滑(通过轮速传感器差异判断)时,应当动态下调限速值 20%
- 建议每月更新高精地图的限速数据版本,尤其关注学校区域时段性限速变更
正文完
