Apollo自动驾驶限速模块的工程实践与性能优化

1次阅读
没有评论

共计 2269 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

从两起事故看限速模块的重要性

2018 年某 L4 级测试车在园区道路因未识别临时限速标志,以 40km/ h 撞上施工隔离墩。事后调查发现:视觉检测模块将倾斜的限速牌误识别为 80km/h,而决策系统未与高精地图限速数据做交叉验证。

Apollo 自动驾驶限速模块的工程实践与性能优化

更典型的案例发生在 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 范围

生产环境检查清单

高精地图匹配验证

  1. 使用 cyber_monitor 工具检查 /apollo/hdmap 话题的 lane.speed_limit 字段
  2. 对比实际 GPS 坐标与地图限速区域边界(使用 Apollo Studio 可视化工具)
  3. 特别注意施工区域(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%
  • 建议每月更新高精地图的限速数据版本,尤其关注学校区域时段性限速变更
正文完
 0
评论(没有评论)