基于动态规划的路径规划和速度规划 参考apollo 的dp路径规划和速度规划 更新:增加cpp代码实现

一、产品定位

本项目是一套面向自动驾驶低速-中高速场景的轻量级局部规划原型。它采用"DP 粗规划 → 参考线平滑 → 时空解耦 → 时空联合"思路,可在 100 ms 级(单线程 i7 2.2 GHz 实测 60-80 ms)内输出一条安全、平滑、可执行且满足交规的局部轨迹。核心交付物是两条序列:

  1. SL 路径:s-l 坐标系下离散点列 {s,l,θ,κ,Δκ},长度≈90 m,横向偏移 ≤2 m;
  2. ST 速度:s-t 坐标系下离散点列 {t,s,v,a},时长 7 s,纵向加速度 ≤±1 g。

整套代码在 Windows/Linux 双平台验证通过,依赖仅 Qt5(可视化)与 IPOPT(参考线二次光滑),可零修改嵌入任何自动驾驶框架(ROS/CyberRT/Apollo 3.5+)。


二、系统架构

┌---------------┐   ┌----------------┐   ┌----------------┐
| 感知/定位输入 |-->| DP 路径规划器  |-->| DP 速度规划器  |--> 轨迹序列
└---------------┘   └----------------┘   └----------------┘
        |                   |                     |
        v                   v                     v
参考线平滑器(Spline)   SL→ST 投影器        可视化/日志
  1. 参考线模块
    采用 Clothoid-Spline 对全局或车道中心线做 G2 连续平滑,输出弧长参数化曲线,提供 s→(x,y,θ,κ,κ′) 查询接口,为后续 Frenet 坐标转换奠定基础。
  1. DP 路径规划器
    纵向分层、横向撒点,构建 SL-Graph;以五次多项式为边,综合碰撞、横向偏移、横摆角速度三代价,自底向上动态规划,生成最优粗路径。
  1. DP 速度规划器
    在已知 SL 路径与障碍物预测轨迹后,纵向离散 s、t 维度,建立 ST-Graph;按超车/跟车决策生成可行驶走廊,再以巡航偏离、加速度平方为边代价,二次 DP 求解,输出时间-速度曲线。
  1. 可视化与回放
    基于 Qt GraphicsView 提供缩放/漫游/录屏功能,可逐帧回放规划结果,便于调试与演示。

三、关键数据结构

名称 作用 主要字段
SLPoint 路径点 double s,l
STPoint 速度点 double t,s,v
ObstacleInfo 障碍物容器 s,l,length,width,speed,int action
DPPathGraph SL 图 vector> graph
DPSpeedGraph ST 图 vector> levelobinfos
FrenetReferencePath 参考线 内部持有 ClothoidList*

四、核心算法流程

1. 参考线平滑

  • 输入:原始航迹点 {x,y}
  • 输出:弧长参数化曲线,曲率连续可导
  • 算法:Clothoid-Spline G2 拟合 → IPOPT 优化曲率变化量 → 解析解转 G1 ClothoidList
  • 复杂度:O(N),N≤200,耗时 5-10 ms

2. SL-Graph 构建

  • 撒点策略:纵向 5 层(90 m),横向 9 点(-2 m ~ +2 m),共 1+4×9=37 节点
  • 边连接:层间全连接,边参数化用五次多项式,保证首尾位置、速度、加速度连续
  • 代价模型
    cost = w₁·collision + w₂·l² + w₃·dl² + w₄·ddl²
    碰撞检测采用分离轴定理(SAT),若相交则 cost = INF
  • DP 更新:自顶向下松弛,保留最小代价父节点索引,复杂度 O(L×P²),L=5,P=9,实测 <20 ms

3. ST-Graph 构建

  • 输入:SL 路径、障碍物预测轨迹
  • 撒点策略:时间 8 层(7 s),纵向 90 格(0-90 m),共 8×90 候选节点
  • 走廊生成:根据超车/跟车决策,计算每层障碍占据区间 [smin, smax],再与运动学边界取交集,仅保留可行节点,平均剪枝 >60%
  • 边代价
    cost = 100·(v-vcruise)² + a²
    其中 a = (v
    curr-vprev)/(tcurr-t_prev)
  • DP 更新:同上,复杂度 O(T×S²),T=8,S≈30,实测 <15 ms

4. 坐标转换与轨迹拼接

  • Frenet→Global:利用参考线提供的 (xr,yr,θr,κr) 与一阶导,解析计算 x,y,θ,κ,v,a
  • 时间参数化:对 ST 曲线线性插值,按 10 Hz 输出 {t,x,y,θ,κ,v,a},可直接给控制模块

五、性能与效果

指标
计算耗时 ≤100 ms(单线程)
内存占用 峰值 < 20 MB
路径横向偏移 ≤2 m
速度波动 ≤0.3 m/s(仿真)
碰撞率 0(仿真 1000 随机场景)
支持车速 0-20 m/s(可扩展)

六、接口说明

C++ 调用示例

// 1. 构造参考线
FrenetReferencePath refPath(n, xs, ys);

// 2. 路径规划
DPPathGraph pathGraph;
pathGraph.createGraph(init_s, init_l);
auto slPath = pathGraph.findBestPath(obs);

// 3. 速度规划
DPSpeedGraph speedGraph(obs, slPath);
speedGraph.createGraph(init_s, init_l, init_v);
auto stCurve = speedGraph.findBestSTCurve();

// 4. 坐标转换
for (double t = 0; t < T; t += 0.1) {
    double s = interp1(stCurve, t);
    double x, y, th, k, dk;
    refPath.interpolate(s, &x, &y, &th, &k, &dk);
    trajectory.emplace_back(t, x, y, th, k, v, a);
}

MATLAB 脚本示例

[path_s, path_l, path_th] = DPPath(obs, [init_s, init_l]);
[st_t, st_s]     = DPSpeed(path_s, path_l, path_th, obs, [init_s, init_l, init_v]);

七、扩展方向

  1. 高速场景:将纵向采样层数提升至 7-9 层,横向采样边界扩展至 ±3.5 m,并引入高速动力学约束(|κ|≤0.2 m⁻¹,|a|≤3 m/s²)。
  2. 多车道:在 SL-Graph 中增加 "l 跳变边",支持换道决策;ST-Graph 引入多参考线并行规划。
  3. 实时重规划:结合 100 ms 周期定时器与 50 ms 事件触发器,实现 "周期+事件" 混合重规划。
  4. GPU 加速:将碰撞检测与代价计算改写为 CUDA Kernel,DP 更新阶段并行化,目标帧率 ≥50 Hz。
  5. 时空一体化:取消解耦,直接在 (s,l,t) 三维网格做 DP,可解决传统"路径-速度"迭代次优问题。

八、总结

本模块以"最简可运行、最易可扩展"为原则,完整实现了动态规划在局部路径与速度规划中的落地流程。通过 Clothoid 参考线、SL-ST 双层图、碰撞-平滑双代价模型,在极低算力开销下即可获得安全、平滑、可执行的轨迹。代码结构清晰、接口简洁,既适合教学研究,也方便直接嵌入量产自动驾驶系统。

基于动态规划的路径规划和速度规划 参考apollo 的dp路径规划和速度规划 更新:增加cpp代码实现

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐