move_base参数配置

move_base使用前需要配置一些参数:运行成本、机器人半径、到达目标位置的距离,机器人移动的速度等,这些参数由以下几个配置文件中:
base_local_planner_params.yaml,costmap_common_params.yaml,global_costmap_params.yaml,local_costmap_params.yaml其各个参数的作用如下:

base_local_planner负责把上层规划器计算的速度指令发送给移动基座。我们需要根据我们的机器人的规格来设置一些配置选项,以便开始运行。打开一个名为base_local_planner_params.yaml的文件,并粘贴以下文本:

1、base_local_planner_params.yaml

controller_frequency: 3.0 #控制器的频率,当用move_base时,可以只设置controller_frequency参数,可以放心的忽略它
recovery_behavior_enabled: false
clearing_rotation_allowed: false

TrajectoryPlannerROS:
   max_vel_x: 0.5 #方向最大速度的绝对值
   min_vel_x: 0.1 #x方向最小值绝对值,如果为负值表示可以后退
   max_vel_y: 0.0 # y方向最大速度的绝对值
   min_vel_y: 0.0 #方向最小速度的绝对值.
   max_vel_theta: 1.0 #基座允许的最大角速度,单位 radians/sec 
   min_vel_theta: -1.0 #基座允许的最小角速度,单位 radians/sec 
   min_in_place_vel_theta: 0.4 #原地旋转时,基座允许的最小角速度,单位 radians/sec
   escape_vel: -0.1 #表示机器人的逃离速度,即背向相反方向行走速度,单位为 meters/sec,该值必需设为负值,但若设置为正值,机器人会在执行逃离操作时向前移动。
   acc_lim_x: 1.5 #方向的加速度绝对值
   acc_lim_y: 0.0  # y方向的加速度绝对值,该值只有全向移动的机器人才需配置
   acc_lim_theta: 1.2 #旋转加速度的绝对值.

   holonomic_robot: false
   yaw_goal_tolerance: 0.1 # about 6 degrees 表示当到达目标时控制器的偏航/旋转误差
   xy_goal_tolerance: 0.05  # 5 cm 到到达目标时,控制器在X Y的位置误差
   #latch_xy_goal_tolerance如果目标误差被锁定,若机器人达到目标XY位置,它将旋转到位,即使误差没有达到,也会做旋转
   latch_xy_goal_tolerance: false  
   pdist_scale: 0.8 #控制器距离给定的路径有多近的加权值
   gdist_scale: 0.4 #控制器试图达到局部目标,或者是控制速度的加权值
   meter_scoring: true 
   #假设goal_distance and path_distance以米为单位被表示,gdist_scale和pdist_scale参数是否呈现
   

   heading_lookahead: 0.325 #在原地旋转轨迹得分不同时,单位米中向前走多远
   heading_scoring: false #是否是基于机器人朝向路径还是它的距离来自路径的得分
   heading_scoring_timestep: 0.8 #当用机器人heading to the path进行模拟路径时的得分
   occdist_scale: 0.05 #控制器避障的好坏的加权值
   oscillation_reset_dist: 0.05 #
   publish_cost_grid_pc: false #当规划时,规划器是否发布成本网格。
   #当为true时,sensor_msgs/PointCloud2 在/cost_cloud的topic上可用。
   #将得分参数考虑,每个点云表示成本网格并且具有每个单独的得分函数单元,以及对每个单元的总成本。
   
   prune_plan: true #当机器人沿着路径走时,是否要耗尽路径。如果为true,机器人移动过的1米时,点将会在计划中消失

   sim_time: 1.0 #轨迹模拟时间
   sim_granularity: 0.05 #步长,轨迹上采样点之间的距离,轨迹上点的密集程度
   angular_sim_granularity: 0.1 #给定轨迹两点之间的间隔角度
   vx_samples: 8 #x方向速度空间的采样点数
   vy_samples: 0  #y方向速度空间采样点数.
   vtheta_samples: 20 #旋转方向的速度空间采样点数
   dwa: true  #是否用DWA模式
   simple_attractor: false

pdist_scale 和gdist_scale 这两个参数在base_local_planner_params是非常重要的参数,要理解这两个参数,设想一下两个极端情况,pdist_scale很大,gdist_scale很小,这时候小车会不动,因为所有规划出的局部路径都将导致离开全局路径,小车还不如停在原地不动,得分高;如果pdist_scale很小,gdist_scale很大,这时候小车将朝着局部目标点(如果全局目标点在局部规划范围外,局部目标点就是全局路径在局部规划范围外的第一个点)或者全局目标点跑,完全不照全局路径走;这时候有个不好的影响是,狭窄通道或者避障转不过弯,因为局部路径规划给出的路径全部都是朝着目标走,而朝着目标走的局部路径都被障碍物挡住了,因此全部被否决,小车原地转圈。因此实际中还是应当将pdist_scale取得大一点,gdist_scale取得小一点。rbx1建议pdist为0.8,gdist为0.4。本人在实验过程中发现pdist与gdist的比值\frac{pdist}{gdist}\approx 2的范围内取值比较合理

导航包使用代价地图存储有关障碍物的信息,为了正确执行此操作,我们需要为costmaps指定应该监听传感器主题和更新频率。我们创建一个名为costmap_common_params.yaml的文件,如下所示:

2、costmap_common_params.yaml 

obstacle_range: 2.5 #设置机器人检测障碍物的最大距离
raytrace_range: 3.0 #设置机器人检测自由空间的最大范围
#footprint: [[0.175, 0.175], [0.175, -0.175], [-0.175, -0.175], [-0.175, 0.175]]  
#footprint参数用来设置机器人在二维地图上的占用面积,参数以机器人的中心作为坐标原点
#footprint_inflation: 0.01
robot_radius: 0.175  #如果机器人外观是圆形的则需要设置该参数,footprint参数就不用设置
inflation_radius: 0.1  #这个参数表示机器人路径规划应与机器人保持0.1m以上的安全距离
max_obstacle_height: 0.6  #这两个参数用于描述障碍物的最大高度和最小高度
min_obstacle_height: 0.0
observation_sources: scan  
scan: {data_type: LaserScan, topic: /scan, marking: true, clearing: true, expected_update_rate: 0}
#observation_sources参数列出了代价地图所需要的所有传感器信息,scan表示传感器参考系的名称
#data_type为表示激光数据使用消息类型,topic表示传感器发布的话题名称
#marking和clearing参数用来表示是否需要使用传感器的实时信息来添加或清除代价地图中的障碍物信息

 footprint: [[0.175, 0.175], [0.175, -0.175], [-0.175, -0.175], [-0.175, 0.175]]在列表中的每一个坐标代表机器人的边上的一点,机器人中心设为[0,0],测量单位是米。这在机器人周长上的点要不按照顺时针排列,要不按照逆时针排列,这个参数设定是与机器人中心为参照,所谓的机器人中心是以机器人旋转中心坐标为参照,一般而言机器人的选择中心为base_link或base_footprint。footprint和robot_radius参数只需要设置一个即可,一般机器人为圆形的只需要设置robot_radius参数,而footprint则不需要设置。

move_base参数配置_第1张图片

inflation_radius: 0.1  #这个参数表示机器人路径规划应与机器人保持0.1m以上的安全距离,inflation_radius参数很重要会影响move_base路径规划,假设设定为0.1那么机器人在路径规划时所规划出来的线路至少与障碍物保持0.1m以上的距离,那设定这个参数值一般要大于机器人的半径,如果小于机器人的半径则机器人在行驶过程中容易碰到障碍物,如果太大在避障过程中遇到比较狭小的空间机器人会出现原地旋转过不了障碍物。将膨胀半径系数,机器人针对相同的障碍物获取的所有路径都保持距离障碍物。如果机器人不能很好地通过窄门或其它狭窄的地方,则稍微减小这个值,相反地,如果机器人不断地撞到东西,则尝试增大这个值。

obstacle_range: 2.5
raytrace_range: 3.0

 这些参数设置了代价地图中的障碍物信息的阈值。 "obstacle_range" 参数确定最大范围传感器读数,这将导致障碍物被放入代价地图中。在这里,我们把它设置在2.5米,这意味着机器人只会更新其地图包含距离移动基座2.5米以内的障碍物的信息。“raytrace_range”参数确定了用于清除指定范围外的空间。将其设置为3.0米,这意味着机器人将尝试清除3米外的空间。

footprint: [[x0, y0], [x1, y1], ... [xn, yn]]
#robot_radius: ir_of_robot
inflation_radius: 0.55

在这里,我们设置机器人的占用面积或机器人的半径是圆形。在指定占地面积的情况下,假设机器人的中心处于(0.0,0.0),并且支持顺时针和逆时针规格。我们还将设定代价地图的膨胀半径。膨胀半径应设定为在代价地图的与障碍物保持安全的最大距离。例如,将膨胀半径设定为0.55米,意味着机器人针对相同的障碍物获取的所有路径都保持距离障碍物0.55米或更远。

observation_sources: laser_scan_sensor point_cloud_sensor

 “observe_sources”传感器源参数定义把信息传递给代价地图的传感器列表,以空格分隔每个传感器,每个传感器分别定义。

laser_scan_sensor: {sensor_frame: frame_name, data_type: LaserScan, topic: topic_name, marking: true, clearing: true}

 设置上述传感器源observation_sources的传感器信息。以laser_scan_sensor作为例子,应将“frame_name”参数设置为传感器坐标系的名称,“data_type”参数应根据话题使用的消息设置为LaserScan或PointCloud,并将“topic_name”设置为传感器发布数据的话题。“marking”和“clearing”参数确定传感器是否向代价地图添加障碍物信息或从代价地图中清除障碍物信息,或者同时都做。

创建一个文件,用于存储特定于全局代价地图的配置选项,打开一个带有global_costmap_params.yaml文件的编辑器,并粘贴到以下文本中:

3、global_costmap_params.yaml

global_costmap:
   global_frame: map #用来表示全局代价地图需要在哪个参考系下运行
   robot_base_frame: base_footprint #用来表示代价地图可以参考的机器人本体的坐标系
   update_frequency: 1.0 #用来决定全局地图信息更新的频率
   publish_frequency: 1.0 #用于设置代价地图发布可视化信息的频率,单位是 Hz
   static_map: true #用来决定代价地图是否需要根据map_server提供的地图信息进行初始化
   #如果不需要使用已有的地图或者map_server最好将该参数设置为false
   
   rolling_window: false #用来设置在机器人移动过程中是否需要滚动窗口,以保持机器人处于中心位置
   resolution: 0.01
   transform_tolerance: 1.0 #坐标系间的转换可以忍受的最大延时
   map_type: costmap

“global_frame”参数定义了代价地图应该运行的坐标系,在这种情况下,我们将选择/map坐标系。“robot_base_frame”参数定义了代价地图应该为机器人的基座的坐标系。“update_frequency”参数决定了代价地图更新的频率(以Hz为单位)。该“static_map”参数确定是否由map_server提供的地图服务来进行代价地图的初始化。如果您没有使用现有的地图或地图服务器,请将static_map参数设置为false。 

创建一个文件,它将存储特定于本地代价地图的配置选项。打开一个带有文件local_costmap_params.yaml的编辑器并粘贴到以下文本中:

4、local_costmap_params.yaml

local_costmap:
   global_frame: map #用来表示全局代价地图需要在哪个参考系下运行
   robot_base_frame: base_footprint #用来表示代价地图可以参考的机器人本体的坐标系
   update_frequency: 3.0 #用来决定局部代价地图信息更新的频率
   publish_frequency: 1.0 #用于设置局部代价地图发布可视化信息的频率,单位是 Hz
   static_map: true #局部代价地图一般不设置为静态地图,因为需要检测是否在机器人附近有新增的动态障碍物
   rolling_window: false #用来设置在机器人移动过程中是否需要滚动窗口,以保持机器人处于中心位置
   width: 6.0
   height: 6.0
   resolution: 0.01
   #width、height、resolution用于设置代价地图的长(米)、高(米)和分辨率(米/格)。虽然分辨率设置的与静态地图的不同
   #但是一般情况下两者是相同
   transform_tolerance: 1.0 #局部代价地图中的坐标系之间转换的最大可忍受延时

“global_frame”,“robot_base_frame”,“update_frequency”和“static_map”参数与上述“全局代价地图配置”部分中描述的相同。“publish_frequency”参数确定代价地图发布可视化信息的速率(以Hz为单位)。将“rolling_window”参数设置为true意味着当机器人移动时,保持机器人在本地代价地图中心。“宽度”,“高度”和“分辨率”参数设置本地代价地图的宽度(米),高度(米)和分辨率(米/单元格)。请注意,这个网格的分辨率与静态地图的分辨率不同,但大多数时候我们倾向设置为相同值。 

update_frequency:该参数决定了代价地图更新的频率(以Hz为单位)。根据传感器数据,全局地图更新的频率,这个数值越大,你的计算机的CPU负担会越重,特别对于全局地图,通常设定一个相对较小、在1.0到5.0之间的值。

global_costmap_params.yaml与local_costmap_params.yaml文件中static_map参数与rolling_window参数设定也很重要,一般如果没有使用静态地图static_map参数应设置为false,rolling_window设置为true。如果使用静态地图static_map参数才设置为true,在使用过程中要注意static_map与rolling_window设置的值为相反。static_map参数确定是否由map_server提供的地图服务来进行代价地图的初始化。如果您没有使用现有的地图或地图服务器,请将static_map参数设置为false。当本地地图需要根据传感器数据动态更新的时候,我们通常会把这个参数设为false。一般我们并不希望局部地图使用静态的地图,因为这不利于我们的局部避障所以局部地图static_map设为fasle,

 

 

你可能感兴趣的:(ROS,SLAM,move_base)