前言:
Apollo (阿波罗)是一个开放的、完整的、安全的平台,将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统,快速搭建一套属于自己的自动驾驶系统。Apollo 自动驾驶开放平台为开发者提供了丰富的车辆、硬件选择,强大的环境感知、高精定位、路径规划、车辆控制等自动驾驶软件能力以及高精地图、仿真、数据流水线等自动驾驶云服务,帮助开发者从 0 到 1 快速搭建一套自动驾驶系统。
本系列文章将记录笔者在调试Apollo决策规划算法Planning模块的所见所思所想,不仅会分析决策规划算法具体的代码逻辑,还会使用Vscode对Apollo决策规划算法进行断点调试,从而揭示关键变量的数据结构以及取值。
最近很多粉丝问在apollo规划算法planning模块中,如何才能对运动的障碍物进行绕行。动态障碍物的绕行在量产项目中是一个很大的话题,需要很复杂的逻辑与场景去解决。
这里先不讨论量产解法,提供一种在apollo的仿真环境中动态障碍物绕行的解决思路。先上动态障碍物绕行视频:
Apollo规划决策算法仿真调试(4):动态障碍物绕行
如果对Apollo规划决策算法仿真调试感兴趣,想了解规划算法的实施细节,可以持续关注系列文章:
Apollo规划决策算法仿真调试(1): 使用Vscode断点调试apollo的方法
Apollo规划决策算法仿真调试(2):使用bazel 编译自定义代码模块_
Apollo规划决策算法仿真调试(3):ReferenceLineProvider参考线生成流程
Apollo Planning决策规划算法代码详细解析 (5):规划算法流程介绍
Apollo Planning决策规划算法代码详细解析 (14):SPEED_BOUNDS_PRIORI_DECIDER
自动驾驶算法详解(1) : Apollo路径规划 Piecewise Jerk Path Optimizer的python实现
自动驾驶算法详解(5): 贝塞尔曲线进行路径规划的python实现
后续更多的算法细节调试过程在csdn专栏进行更新,有需要的可以订阅:
1、动态障碍物绕行分析:
2、PathLaneBorrowDecider分析
需要进入借道场景才可以触发绕行功能。
3、PathBoundsDecider分析:
可以看到经过PathBoundsDecider计算后,总共形成3个pathBoundary,分别是fallback、regular、right-forward
相关代码如下:
// Update the path boundary into the reference_line_info.
std::vector<std::pair<double, double>> regular_path_bound_pair;
for (size_t i = 0; i < regular_path_bound.size(); ++i) {
regular_path_bound_pair.emplace_back(std::get<1>(regular_path_bound[i]),
std::get<2>(regular_path_bound[i]));
}
candidate_path_boundaries.emplace_back(std::get<0>(regular_path_bound[0]),
kPathBoundsDeciderResolution,
regular_path_bound_pair);
std::string path_label = "";
switch (lane_borrow_info) {
case LaneBorrowInfo::LEFT_BORROW:
path_label = "left";
break;
case LaneBorrowInfo::RIGHT_BORROW:
path_label = "right";
break;
default:
path_label = "self";
// exist_self_path_bound = true;
// regular_self_path_bound = regular_path_bound;
break;
}
// RecordDebugInfo(regular_path_bound, "", reference_line_info);
candidate_path_boundaries.back().set_label(
absl::StrCat("regular/", path_label, "/", borrow_lane_type));
candidate_path_boundaries.back().set_blocking_obstacle_id(
blocking_obstacle_id);
}
4、PathAssessmentDecider分析
PathAssessmentDecider中进行路径选择,排序前:
排序后:
5、最终选择的路径
可以看到,最终选择的路径是向右借道的路径。
路径如下:
6、最终结果如下: