6.在STDR中配置planner路径规划器参数
0x00 为何需要路径规划?
现在我们已经可以构建当前环境地图,可以实现机器⼈在当前地图中的定位。那接下来就可以在地图上给定⽬标点,开始规划路径控制机器⼈移动过去,这样就可以完成在已知地图中进⾏⾃动导航的任务了。在已知地图中进⾏路径规划可以举⼀个很形象的例⼦,⼤家在公园⾥游玩时,经常需要找特定的游玩地点。例如想要寻找熊猫馆,那么就需要在公园提供的游览地图中⾸先找⾃⼰的定位在公园地图的哪⼀点上,然后开始寻找熊猫馆,这样我们就可以在当前地点和⽬标地点之间⾃⼰找到⼀条全局路径了,⼀般我们寻找的路径都是找最近的路径。这就好⽐是利⽤了dijkstra算法。有了全局路径还不⾏,因为我们在⾏动过程中,还会有各种障碍物出现在我们规划的路径上,那么我们就需要再规划⾃⼰的局部路径来暂时性的避开障碍物,规划的局部路径要尽可能的服从于全局路径。这样我们的全局路径就好⽐长远⽬标,局部路径好⽐短期⽬标。把⼀个个短期⽬标都实现了,那么实现全局⽬标就是必然的事了。
0x01 配置move_ba参数
前⾯介绍配置代价地图相关的参数时就应注意到,我们若配置路径规划参数那么⾸先就需要先配置⼀下
move_ba相关的参数,因为在move_ba中有多种路径规划器算法可选,我们需要告诉move_ba路径规划器使⽤哪种算法。⼀般来说,全局路径的规划插件包括:
navfn:ROS中⽐较旧的代码实现了dijkstra和A*全局规划算法。
global_planner:重新实现了Dijkstra和A*全局规划算法,可以看作navfn的改进版。
parrot_planner:⼀种简单的算法实现全局路径规划算法。
局部路径的规划插件包括:
ba_local_planner:实现了Trajectory Rollout和DWA两种局部规划算法。
dwa_local_planner:实现了DWA局部规划算法,可以看作是ba_local_planner的改进版本。
当前上⾯这些插件只是官⽅实现的,我们也可以来实现⾃⼰的规划算法,以插件的形式包含进move_ba,这样就可以来改进这些路径规划算法了。我们可以根据move_ba的launch⽂件来看看也就明⽩配置哪个⽂件了:
我们在stdr_move_ba下的config⽬录中创建move_ba_params.yaml,配置⽂件内容如下:
#FileName: move_ba_params.yaml
#Copyright: 2016-2018 ROS⼩课堂vin
#Author: corvin
#Description:
# move_ba软件包的通⽤配置参数,现在依次解释每个参数意义:
# shutdown_costmaps:当move_ba在不活动状态时,是否关掉costmap.
# controller_frequency:向底盘控制移动话题cmd_vel发送命令的频率.
# controller_patience:在空间清理操作执⾏前,控制器花多长时间等有效控制下发.
# planner_frequency:全局规划操作的执⾏频率.如果设置为0.0,则全局规划器仅
# 在接收到新的⽬标点或者局部规划器报告路径堵塞时才会重新执⾏规划操作.
# planner_patience:在空间清理操作执⾏前,留给规划器多长时间来找出⼀条有效规划.
# oscillation_timeout:执⾏修复机制前,允许振荡的时长.
# oscillation_distance:来回运动在多⼤距离以上不会被认为是振荡.
# ba_local_planner:指定⽤于move_ba的局部规划器插件名称.
# ba_global_planner:指定⽤于move_ba的全局规划器插件名称.
#History:
# 20180726: initial this comment.
#
复句shutdown_costmaps: fal
controller_frequency: 5.0
controller_frequency: 5.0
controller_patience: 3.0
planner_frequency: 1.0
planner_patience: 5.0
oscillation_timeout: 8.0
oscillation_distance: 0.3
ba_local_planner: "dwa_local_planner/DWAPlannerROS"
冬虫夏草作用
ba_global_planner: "global_planner/GlobalPlanner"
下⾯来依次解释下各参数的意义:
shutdown_costmaps:当move_ba在不活动状态时,是否关掉costmap.
controller_frequency:向底盘控制移动话题cmd_vel发送命令的频率.
controller_patience:在空间清理操作执⾏前,控制器花多长时间等有效控制下发.
planner_frequency:全局规划操作的执⾏频率.如果设置为0.0,则全局规划器仅在接收到新的⽬标点或者局部规划器报告路径堵塞时才会重新执⾏规划操作.
一带一路有哪些国家planner_patience:在空间清理操作执⾏前,留给规划器多长时间来找出⼀条有效规划.
oscillation_timeout:执⾏修复机制前,允许振荡的时长.
oscillation_distance:来回运动在多⼤距离以上不会被认为是振荡.
ba_local_planner:指定⽤于move_ba的局部规划器名称.
ba_global_planner:指定⽤于move_ba的全局规划器插件名称.
0x02 配置全局路径参数
我们在进⾏全局路径规划时,需要由外部来告知⽬标点。同时还需要知道全局代价地图,因为在路径规划时需要避开代价⾼的危险区域,不然规划的路径就撞到墙上了。
我们这⾥仍然只需要配置好global_planner规划器的参数即可。我们在stdr_move_ba的config⽬录中创建
global_planner_params.yaml⽂件,⽂件内容如下:
GlobalPlanner:
allow_unknown: fal
default_tolerance: 0.2
visualize_potential: fal
u_dijkstra: true
u_quadratic: true
u_grid_path: fal
old_navfn_behavior: fal
lethal_cost: 253
neutral_cost: 50
cost_factor: 3.0
publish_potential: true
orientation_mode: 0
orientation_window_size: 1
附庸风雅什么意思下⾯来依次解释下各参数意义:
allow_unknown:是否允许规划器规划穿过未知区域的路径,只设计该参数为true还不⾏,还要在costmap_commons_params.yaml中设置track_unknown_space参数也为true才⾏。
default_tolerance:当设置的⽬的地被障碍物占据时,需要以该参数为半径寻找到最近的点作为新⽬的地点.
visualize_potential:是否显⽰从PointCloud2计算得到的势区域.
u_dijkstra:设置为true,将使⽤dijkstra算法,否则使⽤A*算法.
u_quadratic:设置为true,将使⽤⼆次函数近似函数,否则使⽤更加简单的计算⽅式,这样节省硬
陆徵祥件计算资源.
u_grid_path:如果设置为true,则会规划⼀条沿着⽹格边界的路径,偏向于直线穿越⽹格,否则将使⽤梯度下降算法,路径更为光滑点.
old_navfn_behavior:若在某些情况下,想让global_planner完全复制navfn的功能,那就设置为true,但是需要注意navfn是⾮常旧的ROS系统中使⽤的,现在已经都⽤global_planner代替navfn了,所以不建议设置为true.
lethal_cost:致命代价值,默认是设置为253,可以动态来配置该参数.
neutral_cost:中等代价值,默认设置是50,可以动态配置该参数.
cost_factor:代价地图与每个代价值相乘的因⼦.
publish_potential:是否发布costmap的势函数.
orientation_mode:如何设置每个点的⽅向(None = 0,Forward = 1,Interpolate = 2,ForwardThenInterpolate = 3,Backward = 4,Leftward = 5,Rightward = 6)(可动态重新配置)
orientation_window_size:根据orientation_mode指定的位置积分来得到使⽤窗⼝的⽅向.默认值1,可以动态重新配置.
怦然一震0x03 配置局部路径规划参数
局部路径规划参数相当重要,因为它是直接控制机器⼈的移动底盘运动的插件,它负责来向移动底盘的/cmd_vel话题中发布控制命令。机器⼈移动的效果好不好,这个局部路径规划可是影响最⼤的。
在这⾥我们使⽤dwa_local_planner,它是⼀个能够驱动底盘移动的控制器,该控制器连接了路径规划器和机器⼈.使⽤地图,规划器产⽣从起点到⽬标点的运动轨迹,在移动时,规划器在机器⼈周围产⽣⼀个函数,⽤⽹格地图表⽰。控制器的⼯作就是利⽤这个函数来确定发送给机器⼈的速度dx, dy, dtheta
DWA算法的基本思想
1.在机器⼈控制空间离散采样(dx, dy, dtheta)
2.对每⼀个采样的速度进⾏前向模拟,看看在当前状态下,使⽤该采样速度移动⼀⼩段时间后会发⽣什么.
3.评价前向模拟得到的每个轨迹,是否接近障碍物,是否接近⽬标,是否接近全局路径以及速度等等.舍弃⾮法路径
4.选择得分最⾼的路径,发送对应的速度给底座
DWA与Trajectory Rollout的区别主要是在机器⼈的控制空间采样差异.Trajectory Rollout采样点来源于整个前向模拟阶段所有可⽤速度集合,⽽DWA采样点仅仅来源于⼀个模拟步骤中的可⽤速度集合.这意味着相⽐之下DWA是⼀种更加有效算法,因为其使⽤了更⼩采样空间;然⽽对于低加速度的机器⼈来说可能Trajectory Rollout更好, 因为DWA不能对常加速度做前向模拟。
我们需要在stdr_move_ba下的config⽬录中创建dwa_local_planner_params.yaml⽂件,该配置⽂件的内容如下:
DWAPlannerROS:
# Robot Configuration Parameters - stdr robot
acc_lim_x: 0.3 # maximum is theoretically 2.0
acc_lim_y: 0.0 # diff drive robot
acc_lim_th: 0.3
老人看手机max_trans_vel: 0.3 #choo slightly less than the ba's capability
min_trans_vel: 0.1 #this is the min trans velocity when there is negligible rotational velocity
max_vel_x: 0.3
min_vel_x: -0.1
max_vel_y: 0.0 #diff drive robot,don't need t vel_y
min_vel_y: 0.0
max_rot_vel: 0.5 #choo slightly less than the ba's capability
min_rot_vel: 0.1 #this is the min angular velocity when there is negligible translational velocity
# Goal Tolerance Parameters
yaw_goal_tolerance: 0.1 # 0.1 rad = 5.7 degree
xy_goal_tolerance: 0.12
latch_xy_goal_tolerance: fal
# Forward Simulation Parameters
sim_time: 2.0 # 1.7
sim_granularity: 0.025
vx_samples: 6 # default 3
vy_samples: 1 # diff drive robot, there is only one sample
vth_samples: 20 # 20
controller_frequency: 5.0
# Trajectory Scoring Parameters
path_distance_bias: 90.0 # 32.0
goal_distance_bias: 24.0 # 24.0
occdist_scale: 0.3 # 0.01
forward_point_distance: 0.325 # 0.325
stop_time_buffer: 0.2 # 0.2
scaling_speed: 0.20 # 0.25
max_scaling_factor: 0.2 # 0.2
publish_cost_grid: fal
# Oscillation Prevention Parameters
oscillation_ret_dist: 0.05 # default 0.05
# Global Plan Parameters
prune_plan: fal
下⾯来依次解释下各参数的意义:
acc_lim_x:x⽅向的加速度绝对值
acc_lim_y:y⽅向的加速度绝对值,该值只有全向移动的机器⼈才需配置.
acc_lim_th:旋转加速度的绝对值.
max_trans_vel:平移速度最⼤值绝对值
min_trans_vel:平移速度最⼩值的绝对值
max_vel_x:x⽅向最⼤速度的绝对值
min_vel_x:x⽅向最⼩值绝对值,如果为负值表⽰可以后退.
max_vel_y:y⽅向最⼤速度的绝对值.
min_vel_y:y⽅向最⼩速度的绝对值.
max_rot_vel:最⼤旋转速度的绝对值.有你的快乐
min_rot_vel:最⼩旋转速度的绝对值.
yaw_goal_tolerance:到达⽬标点时偏⾏⾓允许的误差,单位弧度.
xy_goal_tolerance:到达⽬标点时,在xy平⾯内与⽬标点的距离误差.
latch_xy_goal_tolerance:设置为true,如果到达容错距离内,机器⼈就会原地旋转,即使转动是会跑出容错距离外.
sim_time:向前仿真轨迹的时间.
sim_granularity:步长,轨迹上采样点之间的距离,轨迹上点的密集程度.
vx_samples:x⽅向速度空间的采样点数.
vy_samples:y⽅向速度空间采样点数.
vth_samples:旋转⽅向的速度空间采样点数.
controller_frequency:发送给底盘控制移动指令的频率.
path_distance_bias:定义控制器与给定路径接近程度的权重.
goal_distance_bias:定义控制器与局部⽬标点的接近程度的权重.
occdist_scale:定义控制器躲避障碍物的程度.
stop_time_buffer:为防⽌碰撞,机器⼈必须提前停⽌的时间长度.
scaling_speed:启动机器⼈底盘的速度.
max_scaling_factor:最⼤缩放参数.
publish_cost_grid:是否发布规划器在规划路径时的代价⽹格.如果设置为true,那么就会在~/cost_cloud话题上发布
nsor_msgs/PointCloud2类型消息.
oscillation_ret_dist:机器⼈运动多远距离才会重置振荡标记.
prune_plan:机器⼈前进是是否清除⾝后1m外的轨迹.
0x04 查看路径规划效果
在上图中蓝⾊的路径是全局路径规划器使⽤dijkstra算法来计算得到的路径。在机器⼈前⾯有⼀⼩段红⾊的路径就是局部路径规划器使⽤dwa计算得到的局部路径,⽽在局部代价地图中有⼀段黄⾊的路径。
它与全局的蓝⾊路径重叠在⼀起,这个就是局部路径规划器发布出来的跟踪的全局路径,因为在规划局部路径时的就是需要参考全局路径的,规划到达⽬的地路径的⼤⽅向不能错了,不能⾃⼰规划⼀个局部路径却偏离了⽬标点。
下⾯来查看下全局路径规划器的话题列表:
下⾯查看局部路径规划器发布的话题列表:
0x05 ⾃动导航效果演⽰
现在我们基本上已经把⾃动导航相关的参数都配置好了,现在就可以来看看导航效果了,如下图所⽰:
1532940925573191.gif
通过上⾯动图可以得知,我们是在Rviz中的2D Nav Goal来选择导航⽬标点的: