星火自动驾驶大赛赛事集锦--障碍物绕行场景
障碍物绕行
场景描述:
主车在城市道路行驶时,当遇到前方的故障车辆,为了保证行驶安全应及时减速并绕行,确保与障碍物之间的横向距离至少为1米。
场景图示:
实验步骤:
1、启动仿真环境
启动dreamview并观察默认代码下车辆通过施工区域的仿真效果。
(1)在终端中,执行DreamView启动指令,执行成功后,打开浏览器输入(http://localhost:8888/)进入dremview中。
aem bootstrap start --plus
当出现如下,即表示dreamview启动成功了。
(2)左侧导航栏打开Mode Setting面板,模式选择PnC Mode,操作选择Scenario_sim,进入仿真模式。
2、车辆故障绕行实验流程:
车辆故障绕行配置参数同步
输入全局配置参数同步指令,系统将自动将全局配置参数复制到profile的default目录中,然后就可以在profile目录上轻松修改配置参数。
buildtool profile config init --package planning --profile=default
使用default目录这份配置
# 使用名字叫default的这份配置aem profile use default
选择障碍物绕行:
原始配置仿真:
修改全局配置参数:
在工作apollo_workspace工作目录找到profiles/default/modules/planning/planning_component配置文件,调整绕行横向缓冲配置参数,达到我们期望路径规划效果。
(1) 修改profiles/default/modules/planning/planning_base/conf/planning.conf配置文件,添加obstacle_lat_buffer 参数
在全局配置参数中添加绕行横向缓冲配置参数:
#添加配置参数--obstacle_lat_buffer=1.5
因每个人调应调整过的参数可能不同,具体详细请关注技术详解
修改之后保存代码后进行仿真。
修改之后保存代码后进行仿真。
(2)修改好代码参数后,保存这个文件,在Module Controller中重启planning模块(必须步骤)
(3)重新选择绕行距离配置实践,观察速度和调整前有何变化
技术详解:
障碍物横向距离
主车距离目标障碍物横向距离代码修改以及场景修改:
在现实场景中,在对前车进行绕行超车时,主车需要对前车保持一定的安全横向距离,在Apollo原始代码中提供了此参数:
我们可以在:modules/planning/planning_base/common/planning_gflags.cc文件下查看路径决策(Path Deciders)设置的一些默认参数。
部分代码如下:
我们可以在本文代码中的英文注释中找到有关于:障碍物横向缓冲(米)的英文注释,障碍物横向缓冲时用于确定路径边界的一个值,它的默认值为0.4,单位为m。
在默认情况下,主车对目标障碍物进行绕行时,主车和障碍物的横向距离为0.4m。如下图所示:
DEFINE_double(obstacle_lat_buffer, 0.4,"obstacle lateral buffer (meters) for deciding path boundaries");
找到相应配置参数的源码使用位置位置,可通过vscode的搜素功能实现:
使用配置参数的源码
/*这段代码主要用于对障碍物进行排序,以便后续的路径规划。它会遍历障碍物列表,仅处理在路径规划范围内且在车辆前方的障碍物。然后,将每个障碍物的感知 SL 边界拆分为两个边界,一个在 start_s 处,另一个在 end_s 处,并将它们添加到 sorted_obstacles 中。最后,根据这些边界的位置进行排序,以确保它们按照一定顺序排列。FLAGS_obstacle_lat_buffer 在这段代码中的作用是调整障碍物的横向边界,以考虑其横向尺寸,从而影响路径规划的安全性和效果。*/std::vector<ObstacleEdge> PathBoundsDeciderUtil::SortObstaclesForSweepLine(const IndexedList<std::string, Obstacle>& indexed_obstacles,const SLState& init_sl_state) {std::vector<ObstacleEdge> sorted_obstacles;// Go through every obstacle and preprocess it.for (const auto* obstacle : indexed_obstacles.Items()) {// Only focus on those within-scope obstacles.if (!IsWithinPathDeciderScopeObstacle(*obstacle)) {continue;}// Only focus on obstacles that are ahead of ADC.if (obstacle->PerceptionSLBoundary().end_s() < init_sl_state.first[0]) {continue;}// Decompose each obstacle's rectangle into two edges: one at// start_s; the other at end_s.const auto obstacle_sl = obstacle->PerceptionSLBoundary();sorted_obstacles.emplace_back(1, obstacle_sl.start_s() - FLAGS_obstacle_lon_start_buffer,obstacle_sl.start_l() - FLAGS_obstacle_lat_buffer,obstacle_sl.end_l() + FLAGS_obstacle_lat_buffer, obstacle->Id());sorted_obstacles.emplace_back(0, obstacle_sl.end_s() + FLAGS_obstacle_lon_end_buffer,obstacle_sl.start_l() - FLAGS_obstacle_lat_buffer,obstacle_sl.end_l() + FLAGS_obstacle_lat_buffer, obstacle->Id());}// Sort.std::sort(sorted_obstacles.begin(), sorted_obstacles.end(),[](const ObstacleEdge& lhs, const ObstacleEdge& rhs) {if (std::get<1>(lhs) != std::get<1>(rhs)) {return std::get<1>(lhs) < std::get<1>(rhs);} else {return std::get<0>(lhs) > std::get<0>(rhs);}});return sorted_obstacles;}
该函数被GetBoundaryFromStaticObstacles递归调用,这个递归调用的目的是在路径上的每个路径点检查是否有障碍物进入或离开了路径。在路径点之间的迭代过程中,函数会根据障碍物的位置和方向来更新路径的边界信息。
因此我们可以设置障碍物的横向缓冲距离来调整车辆遇到障碍物的绕行距离
在配置文件中对障碍物横向缓冲的参数调整:
在默认情况下我们本地的配置文件中是没有障碍物横向缓冲:obstacle_lat_buffer的参数的,在这种情况下我们需要在:、
在profiles/default/modules/planning/planning_base/conf/planning.conf的配置文件添加
--obstacle_lat_buffer=1.3
如图所示:
此时我们可以在dreamview中查看到主车和障碍物的横向距离已经比默认情况下的的横向距离大了,且满足了我们的场景要求;