ROS导航系列(二):move_base的相关参数配置说明

move_bse作为navigation的核心node,通过插件提供完整的导航服务。其主要包括两大部分:定位AMCL模块和nav_core模块。

本文主要分析move_base的配置文件,从而从宏观上对move_base整个功能包有清晰的了解,明白接下来的章节中提到的global plannercostmap_2dlocal_planner到底再说什么。
接下来我们使用turtlebot3的配置文件做说明。

一、launch文件

首先是启动名为turtlebot3_navigation的launch文件。

<launch>
  <!-- Arguments -->
  <arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/>
  <arg name="map_file" default="$(find turtlebot3_navigation)/maps/map.yaml"/>
  <arg name="open_rviz" default="true"/>
  <arg name="move_forward_only" default="false"/>

  <!-- Turtlebot3 -->
  <include file="$(find turtlebot3_bringup)/launch/turtlebot3_remote.launch">
    <arg name="model" value="$(arg model)" />
  </include>

  <!-- Map server -->
  <node pkg="map_server" name="map_server" type="map_server" args="$(arg map_file)"/>

  <!-- AMCL -->
  <include file="$(find turtlebot3_navigation)/launch/amcl.launch"/>

  <!-- move_base -->
  <include file="$(find turtlebot3_navigation)/launch/move_base.launch">
    <arg name="model" value="$(arg model)" />
    <arg name="move_forward_only" value="$(arg move_forward_only)"/>
  </include>

  <!-- rviz -->
  <group if="$(arg open_rviz)">
    <node pkg="rviz" type="rviz" name="rviz" required="true"
          args="-d $(find turtlebot3_navigation)/rviz/turtlebot3_navigation.rviz"/>
  </group>
</launch>

其中分别启动AMCL和move_base关键节点来构成整个navigation_stack

接下来,我们详细查看下move_base的launch文件内容:

<launch>
  <!-- Arguments -->
  <arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/>
  <arg name="cmd_vel_topic" default="/cmd_vel" />
  <arg name="odom_topic" default="odom" />
  <arg name="move_forward_only" default="false"/>

  <!-- move_base -->
  <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
    <param name="base_local_planner" value="dwa_local_planner/DWAPlannerROS" />
    <rosparam file="$(find turtlebot3_navigation)/param/costmap_common_params_$(arg model).yaml" command="load" ns="global_costmap" />
    <rosparam file="$(find turtlebot3_navigation)/param/costmap_common_params_$(arg model).yaml" command="load" ns="local_costmap" />
    <rosparam file="$(find turtlebot3_navigation)/param/local_costmap_params.yaml" command="load" />
    <rosparam file="$(find turtlebot3_navigation)/param/global_costmap_params.yaml" command="load" />
    <rosparam file="$(find turtlebot3_navigation)/param/move_base_params.yaml" command="load" />
    <rosparam file="$(find turtlebot3_navigation)/param/dwa_local_planner_params_$(arg model).yaml" command="load" />
    <remap from="cmd_vel" to="$(arg cmd_vel_topic)"/>
    <remap from="odom" to="$(arg odom_topic)"/>
    <param name="DWAPlannerROS/min_vel_x" value="0.0" if="$(arg move_forward_only)" />
  </node>
</launch>

在move_base的node节点中,包含了很多参数配置。首先,指定使用dwa_local_planner作为 局部路径规划的插件。然后通过rosparam分别将代价地图、move_base、dwa的参数加载进来。

二、参数详解

move_base_params

关于插件的学习,可以详见link

首先来看move_base本身需要设置的参数:

shutdown_costmaps: false
controller_frequency: 10.0
planner_patience: 5.0
controller_patience: 15.0
conservative_reset_dist: 3.0
planner_frequency: 5.0
oscillation_timeout: 10.0
oscillation_distance: 0.2

conservative_reset_dist的含义是:清理costmap的范围,单位为m
oscillation_distance: 配合timeout的含义就是,10s内超过0.2m范围内的运动才不算陷入局部震荡

按道理说,其实我们可以把yaml文件外面的base_local_planner参数放在一起:

base_local_planner: "dwa_local_planner/DWAPlannerROS"

同样,turtlebot3中没有设置使用哪种全局路径规划器,其默认使用navfn,如果想用global_planner,我们可以做如下设定:

base_global_planner: "global_planner/GlobalPlanner" #alternatives:navfn/NavfnROS, global_planner/GlobalPlanner, carrot_planner/CarrotPlanner

但是我测试的时候发现,只有使用<param>标签写在move_base节点下,才能按照我们指定的插件载入对应的规划器。

这个问题我也没弄明白。

此外,机器人的恢复行为,也需要使用参数在该yaml文件中指定。默认的恢复行为顺序如下图所示:

在这里插入图片描述
所有的nav_core可以选择配置的插件包括:

在这里插入图片描述

代价地图

代价地图的相关设置,分别为global_costmaplocal_costmap共有的costmap参数:costmap_common_param.yaml,然后分别为各自的costmap设置对应的参数。

首来看common_param中的相关参数内容:

obstacle_range: 3.0
raytrace_range: 3.5

footprint: [[-0.105, -0.105], [-0.105, 0.105], [0.041, 0.105], [0.041, -0.105]]
#robot_radius: 0.105

inflation_radius: 1.0
cost_scaling_factor: 3.0

map_type: costmap
observation_sources: scan
scan: {
    
    sensor_frame: base_scan, data_type: LaserScan, topic: scan, marking: true, clearing: true}

global_costmap中的参数:

global_costmap:
  global_frame: map
  robot_base_frame: base_footprint

  update_frequency: 10.0
  publish_frequency: 10.0
  transform_tolerance: 0.5

  static_map: true

local_costmap中的参数:

local_costmap:
  global_frame: odom
  robot_base_frame: base_footprint

  update_frequency: 10.0
  publish_frequency: 10.0
  transform_tolerance: 0.5

  static_map: false
  rolling_window: true
  width: 3
  height: 3
  resolution: 0.05

为保证文章的结构性,关于参数具体含义,如何配置具体参数,参数如何影响代价地图的表现等这些内容,我把他放在这里:link

planner

其他load进来的param,通常会根据自己设定的全局路径规划和局部路径规划来提供对应的参数。这些参数的设定,对planner规划器最终的表现效果有很大的影响,比如DWA的权重分配。我们后续教程会分别针对全局/局部路径规划展开详细的描述。其中会详细介绍两个功能包:

  • 全局路径规划器:global_planner
  • 局部轨迹规划器:teb_planner

当然,他们对应的参数,我们会详细说明的,这里就不再多说。

三、总结

在配置move_base节点的时候,无非就是在为如下的五部分三大块(地图、恢复行为、规划器)提供对应的参数。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/allenhsu6/article/details/113028155