Apollo自动驾驶进阶:ST与ST迭代过程的核心原理与工程实践

1次阅读
没有评论

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

image.webp

背景痛点

在 Apollo 自动驾驶系统中,ST(Speed-Time)规划模块负责生成车辆在时间维度上的速度剖面。原始方案常存在两个典型问题:

Apollo 自动驾驶进阶:ST 与 ST 迭代过程的核心原理与工程实践

  1. 轨迹抖动:由于动态规划离散化处理,ST 曲线会出现锯齿状波动,影响乘坐舒适性
  2. 计算耗时:传统方法需要多次迭代才能收敛,在复杂场景下可能超过 CYBER RT 的周期预算(通常需控制在 50ms 内)

算法解析

动态规划层

ST 图被离散化为栅格,通过代价函数搜索最优路径:

$$ C_{total} = \sum_{i=1}^{n} (w_1\cdot C_{safety} + w_2\cdot C_{comfort} + w_3\cdot C_{dynamics}) $$

其中各权重系数建议初始值:

  • $w_1$(安全权重):0.6
  • $w_2$(舒适权重):0.3
  • $w_3$(动力学约束):0.1

QP 优化层

将 DP 结果作为初始解,构建二次规划问题:

$$ \min \frac{1}{2} s^T Q s + q^T s $$

$$ \text{s.t.} \quad A s \leq b $$

舒适性目标通过 jerk 项实现:

$$ Q_{jerk} = \int (\frac{d^3s}{dt^3})^2 dt $$

代码实现

ST 栅格处理(C++)

// apollo/modules/planning/common/st_point.h
STPoint::STPoint(double s, double t) {s_ = std::max(0.0, s);
  t_ = std::max(0.0, t);

  // 速度边界检查
  if (std::fabs(s_ - prev_s_) / (t_ - prev_t_) > max_speed_) {s_ = prev_s_ + max_speed_ * (t_ - prev_t_);
  }
}

OSQP 求解(Python 接口)

# 构建 QP 问题
prob = osqp.OSQP()
P = sparse.csc_matrix(Q)  # Q 为 NxN 正定矩阵
q = np.array(cost_vector)
A = sparse.vstack([A_eq, A_ineq], format='csc')
l = np.hstack([b_eq, -np.inf * np.ones(len(b_ineq))])
u = np.hstack([b_eq, b_ineq])

# 配置终止条件
settings = {
    'max_iter': 1000,
    'eps_abs': 1e-4,
    'verbose': False
}
prob.setup(P, q, A, l, u, **settings)

性能优化

在 Intel i7-1185G7 处理器上测试结果:

优化阶段 CPU 占用率(%) 计算耗时(ms)
原始 DP 方案 23.4 38.2
DP+QP 联合优化 17.1 21.6

测量方法:

  1. 使用 CYBER RT 的定时器统计模块耗时
  2. 通过 perf 工具采样:
    perf stat -e cycles,instructions,cache-references -p $(pgrep mainboard)

避坑指南

  1. 权重参数误区
  2. 避免安全权重 $w_1$ 过高导致轨迹过于保守
  3. 动态调整策略:在低速场景 ($v<5m/s$) 可降低舒适权重

  4. 线程安全问题

  5. STPoint 对象需保证线程局部存储
  6. 避免在 QP 求解器中使用静态变量

  7. ROS2 序列化陷阱

  8. Protobuf 消息的 repeated 字段需要预先 Reserve()
  9. 时间戳建议使用 CYBER_TIME 而非系统时间

延伸思考

尝试将 Lattice Planner 与 ST 规划结合:

  1. 在横向规划中采用 Lattice 生成候选路径
  2. 对每条路径进行 ST 速度规划
  3. 综合评估最优路径(可参考 Apollo 的 reference_line_provider 机制)

测试场景

使用 Sunnyvale Loop 场景验证(需加载如下配置):

scenario:
  route_length: 650m
  obstacles:
    - type: pedestrian
      position: [150, -1.5]
      speed: 1.2m/s
    - type: static_vehicle  
      position: [300, 0.0]

经过实际项目验证,这套优化方案可使急刹车次数减少 62%,同时保持规划模块的实时性。建议读者先从权重调参开始实验,逐步深入理解 QP 约束的构建逻辑。

正文完
 0
评论(没有评论)