基于动态规划的路径与速度规划:Apollo的DP算法实现及C++代码更新
·
基于动态规划的路径规划和速度规划 参考apollo 的dp路径规划和速度规划 更新:增加cpp代码实现
一、产品定位
本项目是一套面向自动驾驶低速-中高速场景的轻量级局部规划原型。它采用"DP 粗规划 → 参考线平滑 → 时空解耦 → 时空联合"思路,可在 100 ms 级(单线程 i7 2.2 GHz 实测 60-80 ms)内输出一条安全、平滑、可执行且满足交规的局部轨迹。核心交付物是两条序列:
- SL 路径:s-l 坐标系下离散点列
{s,l,θ,κ,Δκ},长度≈90 m,横向偏移 ≤2 m; - 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 投影器 可视化/日志
- 参考线模块
采用 Clothoid-Spline 对全局或车道中心线做 G2 连续平滑,输出弧长参数化曲线,提供 s→(x,y,θ,κ,κ′) 查询接口,为后续 Frenet 坐标转换奠定基础。
- DP 路径规划器
纵向分层、横向撒点,构建 SL-Graph;以五次多项式为边,综合碰撞、横向偏移、横摆角速度三代价,自底向上动态规划,生成最优粗路径。
- DP 速度规划器
在已知 SL 路径与障碍物预测轨迹后,纵向离散 s、t 维度,建立 ST-Graph;按超车/跟车决策生成可行驶走廊,再以巡航偏离、加速度平方为边代价,二次 DP 求解,输出时间-速度曲线。
- 可视化与回放
基于 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 = (vcurr-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]);
七、扩展方向
- 高速场景:将纵向采样层数提升至 7-9 层,横向采样边界扩展至 ±3.5 m,并引入高速动力学约束(|κ|≤0.2 m⁻¹,|a|≤3 m/s²)。
- 多车道:在 SL-Graph 中增加 "l 跳变边",支持换道决策;ST-Graph 引入多参考线并行规划。
- 实时重规划:结合 100 ms 周期定时器与 50 ms 事件触发器,实现 "周期+事件" 混合重规划。
- GPU 加速:将碰撞检测与代价计算改写为 CUDA Kernel,DP 更新阶段并行化,目标帧率 ≥50 Hz。
- 时空一体化:取消解耦,直接在 (s,l,t) 三维网格做 DP,可解决传统"路径-速度"迭代次优问题。
八、总结
本模块以"最简可运行、最易可扩展"为原则,完整实现了动态规划在局部路径与速度规划中的落地流程。通过 Clothoid 参考线、SL-ST 双层图、碰撞-平滑双代价模型,在极低算力开销下即可获得安全、平滑、可执行的轨迹。代码结构清晰、接口简洁,既适合教学研究,也方便直接嵌入量产自动驾驶系统。

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




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



所有评论(0)