1. 动态规划在自动驾驶中的核心价值
停车场直角弯道和高速避障场景,本质上都是自动驾驶路径规划中的典型挑战。动态规划(Dynamic Programming, DP)作为经典的优化算法,在Apollo自动驾驶系统中被创新性地应用于解决这类问题。其核心优势在于将复杂问题分解为相互关联的子问题,通过递推求解全局最优解。
传统动态规划在机器人路径规划中早有应用,但自动驾驶场景的特殊性在于:
- 车辆运动学约束(如最小转弯半径)
- 实时性要求(通常需在50-100ms内完成计算)
- 动态环境(移动障碍物、突发状况)
Apollo团队对经典DP算法进行了三项关键改进:
- 状态空间压缩:用横向偏移量替代二维坐标
- 代价函数工程:多目标加权融合
- 计算量控制:滑动窗口+自适应采样
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 路径规划中的DP实现细节
2.1 横向位移采样策略
Apollo的dp_poly_path_optimizer采用五次多项式连接采样点,相比工业界常用的三次多项式,在数学上具有显著优势:
| 多项式阶数 | 连续性保证 | 平滑性表现 | 计算复杂度 |
|---|---|---|---|
| 三次 | 位置+速度 | 转向突变 | O(n³) |
| 五次 | 位置到加速度 | 转向平滑 | O(n⁵) |
采样间隔设置为0.3米是基于大量实测数据得出的平衡点:
- 小于0.2米会导致计算量剧增
- 大于0.5米可能漏检障碍物
- 0.3米恰好是标准车道线宽度的1/4
python复制def sample_lateral_offset(self, curr_s):
# 获取当前道路边界
lateral_bounds = self.road_graph.get_lateral_bounds(curr_s)
# 在边界内均匀采样5个点
return np.linspace(lateral_bounds[0], lateral_bounds[1], num=5)
2.2 路径代价函数设计
路径评分采用多指标加权融合,每个指标都经过归一化处理:
-
障碍物距离代价:
- 使用S型函数转换距离:cost = 1 / (1 + e^(k*(d-d₀)))
- 其中k=2.0,d₀=1.5m(安全阈值)
-
曲率变化代价:
math复制\kappa_{cost} = \sum_{i=1}^{n-1} |\kappa_{i+1} - \kappa_i|^2 -
参考线偏离代价:
- 车道中心线权重最高
- 允许偏离但非线性递增
实际调试中发现,当曲率权重超过0.4时,车辆会出现"画龙"现象。最终采用的权重分配:
- 安全:0.55
- 舒适:0.3
- 效率:0.15
3. 速度规划中的DP优化技巧
3.1 ST图网格化处理
将时间-距离二维空间离散化为网格时,Apollo采用动态分辨率策略:
| 场景类型 | 时间分辨率 | 距离分辨率 |
|---|---|---|
| 正常跟车 | 0.3s | 0.5m |
| 紧急制动 | 0.1s | 0.2m |
| 路口通过 | 0.5s | 1.0m |
代价函数计算示例:
cpp复制double SpeedCost::Calculate(const STPoint& point) const {
double obstacle_cost = obstacle_map_->GetObstacleCost(point);
double accel_cost = std::abs(CalculateAcceleration(point));
return 0.6*obstacle_cost + 0.3*accel_cost + 0.1*CalculateJerkCost(point);
}
3.2 加速度与加加速度限制
为避免乘客不适,Apollo设置了严格的动力学约束:
-
纵向加速度:
- 正常范围:±2.0 m/s²
- 紧急制动:-3.5 m/s²(触发安全带预紧)
-
加加速度(Jerk):
math复制J_{max} = \begin{cases} 1.5 m/s³ & \text{(舒适模式)} \\ 3.0 m/s³ & \text{(运动模式)} \end{cases}
实测数据显示,当加速度权重超过0.35时,乘客晕车概率增加42%。这解释了代价函数中0.3的取值依据。
4. 工程实践中的挑战与解决方案
4.1 维度灾难应对
Apollo采用三种关键技术控制计算复杂度:
-
状态空间降维:
- 路径规划:二维→横向一维
- 速度规划:三维→ST二维
-
滑动窗口优化:
- 仅计算未来3秒轨迹
- 窗口重叠率30%
-
自适应采样:
python复制def get_sample_density(env_complexity): base = 5 # 基础采样数 return base + int(env_complexity * 3)
4.2 典型故障案例分析
2022年某次测试中出现的"蛇形走位"问题,暴露了固定采样间隔的缺陷。事后改进方案:
-
环境复杂度评估:
- 障碍物密度
- 曲率变化率
- 能见度条件
-
动态调整策略:
- 城市道路:采样间隔0.2-0.4m
- 高速公路:采样间隔0.5-1.0m
- 停车场:采样间隔0.1-0.2m
改进后,相同场景下的路径规划成功率从83%提升至97%。
5. 参数调试经验分享
5.1 权重系数调优
通过正交试验法确定最优参数组合:
-
设计L9(3⁴)正交表
-
选取四个关键参数:
- 安全权重
- 舒适权重
- 效率权重
- 采样密度
-
评估指标:
- 规划成功率
- 乘客舒适度评分
- 计算耗时
最终得到帕累托最优解集,不同场景选用不同配置。
5.2 实车调试技巧
-
数据记录:
- 保存每次规划的输入输出
- 记录车辆实际执行偏差
-
回放分析:
bash复制
cyber_recorder play -f dp_planning.record -k /planning/debug -
参数热更新:
python复制rosparam set /dp_planner/weights/safety 0.55
建议先在仿真环境(如LGSVL)完成90%调试,再进入封闭场地实测。
