仿真调试丨规划之静态障碍物绕行
本题目解析由星火计划学员肖新宇同学提供。
实验要求:
主车行驶过程中,前方监测到静态类型障碍物后借道绕行。距离目标障碍物横向距离至少保持 1.2 m,借道避障限速不得超过 5 m/s。场景图示如下所示:
障碍物横向距离
主车距离目标障碍物横向距离代码修改以及场景修改:
在现实场景中,在对前车进行绕行超车时,主车需要对前车保持一定的安全横向距离,在Apollo原始代码中提供了此参数:
我们可以在: /apollo/modules/planning/common/planning_gflags.cc文件下查看路径决策(Path Deciders)设置的一些默认参数。
部分代码如下:
我们可以在本文代码中的英文注释中找到有关于:障碍物横向缓冲(米)的英文注释,障碍物横向缓冲时用于确定路径边界的一个值,它的默认值为0.4,单位为m。
在默认情况下,主车对目标障碍物进行绕行时,主车和障碍物的横向距离为0.4m。如下图所示:
// Path DecidersDEFINE_bool(enable_skip_path_tasks, false,"skip all path tasks and use trimmed previous path");DEFINE_double(obstacle_lat_buffer, 0.4,"obstacle lateral buffer (meters) for deciding path boundaries");DEFINE_double(obstacle_lon_start_buffer, 3.0,"obstacle longitudinal start buffer (meters) for deciding ""path boundaries");DEFINE_double(obstacle_lon_end_buffer, 2.0,"obstacle longitudinal end buffer (meters) for deciding ""path boundaries");DEFINE_double(static_obstacle_speed_threshold, 0.5,"The speed threshold to decide whether an obstacle is static ""or not.");DEFINE_double(lane_borrow_max_speed, 5.0,"The speed threshold for lane-borrow");DEFINE_int32(long_term_blocking_obstacle_cycle_threshold, 3,"The cycle threshold for long-term blocking obstacle.");// Prediction PartDEFINE_double(prediction_total_time, 5.0, "Total prediction time");DEFINE_bool(align_prediction_time, false,"enable align prediction data based planning time");
默认值下的障碍物横向缓冲:此时我们会发现,主车距离障碍物太近了,需要我们通过修改配置文件的方式进行参数调整。
在配置文件中对障碍物横向缓冲的参数调整:
在默认情况下我们本地的配置文件中是没有障碍物横向缓冲:obstacle_lat_buffer的参数的,在这种情况下我们需要在:/apollo/modules/planning/conf/planning.conf的配置文件添加
--obstacle_lat_buffer=1.3 #此时的横向距离就有1.3了是大于实验所要求的1.2的横向距离的
如图所示:
此时我们可以在dreamview中查看到主车和障碍物的横向距离已经比默认情况下的的横向距离大了;但我们可以发现我们右上角的速度并不符合该实验要求。
借道避障限速
我们可以在:/apollo/modules/planning/conf/planning.conf文件下查看到:
#默认巡航速度:此时的默认巡航速度为11.18m/s(1m/s = 3.6 km/h)--default_cruise_speed=11.18
我们在超车的时候发现,我们在超车的过程中的速度并没有在我们预期的范围内,我们的解决思路如下:首先找到速度范围决策决策(speed bounds dicider) ,在阅读源码过程中可以得知,再对静态障碍物绕行的过程中,其的速度限制与static_obs_nudge_speed_ratio的值有关,于是我们可以在配置文件中找到static_obs_nudge_speed_ratio对其的值进行修改。
文件位置:/apollo/modules/planning/conf/planning_config.pb.txt
代码如下:
default_task_config: {task_type: SPEED_BOUNDS_PRIORI_DECIDERspeed_bounds_decider_config {total_time: 7.0boundary_buffer: 0.25max_centric_acceleration_limit: 2.0point_extension: 0.0lowest_speed: 2.5static_obs_nudge_speed_ratio: 0.6#默认的绕行限速的百分比dynamic_obs_nudge_speed_ratio: 0.8}}default_task_config: {task_type: SPEED_BOUNDS_FINAL_DECIDERspeed_bounds_decider_config {total_time: 7.0boundary_buffer: 0.1max_centric_acceleration_limit: 2.0point_extension: 0.0lowest_speed: 2.5static_obs_nudge_speed_ratio: 0.6#默认的绕行限速的百分比dynamic_obs_nudge_speed_ratio: 0.8}}
对于static_obs_nudge_speed_ratio的解释为:绕行限速的百分比。
0.6的意思为百分之60的默认巡航速度,大概的公式为:
限速的速度 = 默认巡航速度 * 绕行限速的百分比
# 将 static_obs_nudge_speed_ratio: 0.6改为0.1
static_obs_nudge_speed_ratio: 0.1
对于SPEED_BOUNDS_PRIORI_DECIDER以及SPEED_BOUNDS_FINAL_DECIDER的解释(个人理解):
SPEED_BOUNDS_PRIORI_DECIDER#静态障碍物绕行开始的时候SPEED_BOUNDS_FINAL_DECIDER#静态障碍物绕行的快结束的时候#然后两者组成一个绕行的范围。
再修改完之后会发现只有在绕行开始以及在绕行结束之后才会限速,如图所示:
在绕行的过程中并没有限速,如图所示:
这种原因是因为,我们可以在速度边界距测器中可以找到碰撞安全距离(collision_safety_range)默认值为1.0m,我们需要在SPEED_BOUNDS_PRIORI_DECIDER以及SPEED_BOUNDS_FINAL_DECIDER中添加collision_safety_range并修改其的值,将其的值改为1.2以上即可。
具体代码如下(可参考):
default_task_config: {task_type: SPEED_BOUNDS_PRIORI_DECIDERspeed_bounds_decider_config {total_time: 7.0boundary_buffer: 0.25max_centric_acceleration_limit: 2.0point_extension: 0.0lowest_speed: 2.5static_obs_nudge_speed_ratio: 0.1dynamic_obs_nudge_speed_ratio: 0.8collision_safety_range: 1.4}}default_task_config: {task_type: SPEED_BOUNDS_FINAL_DECIDERspeed_bounds_decider_config {total_time: 7.0boundary_buffer: 0.1max_centric_acceleration_limit: 2.0point_extension: 0.0lowest_speed: 2.5static_obs_nudge_speed_ratio: 0.1dynamic_obs_nudge_speed_ratio: 0.8collision_safety_range: 1.4}}
最后实现效果,如图所示