Turtlebot 2e 导航之move_base
参数详解: 环境代价地图的设置
文章目录
通用代价设置costmap_common_params.yaml
costmap_common_params.yaml
整个文件定义为
max_obstacle_height: 0.60 # assume something like an arm is mounted on top of the robot
# Obstacle Cost Shaping (http://wiki.ros.org/costmap_2d/hydro/inflation)
robot_radius: 0.20 # distance a circular robot should be clear of the obstacle (kobuki: 0.18)
# footprint: [[x0, y0], [x1, y1], ... [xn, yn]] # if the robot is not circular
map_type: voxel
obstacle_layer:
enabled: true
max_obstacle_height: 0.6
origin_z: 0.0
z_resolution: 0.2
z_voxels: 2
unknown_threshold: 15
mark_threshold: 0
combination_method: 1
track_unknown_space: true #true needed for disabling global path planning through unknown space
obstacle_range: 2.5
raytrace_range: 3.0
origin_z: 0.0
z_resolution: 0.2
z_voxels: 2
publish_voxel_map: false
observation_sources: scan bump
scan:
data_type: LaserScan
topic: scan
marking: true
clearing: true
min_obstacle_height: 0.25
max_obstacle_height: 0.35
bump:
data_type: PointCloud2
topic: mobile_base/sensors/bumper_pointcloud
marking: true
clearing: false
min_obstacle_height: 0.0
max_obstacle_height: 0.15
# for debugging only, let's you see the entire voxel grid
#cost_scaling_factor and inflation_radius were now moved to the inflation_layer ns
inflation_layer:
enabled: true
cost_scaling_factor: 5.0 # exponential rate at which the obstacle cost drops off (default: 10)
inflation_radius: 0.5 # max. distance from an obstacle at which costs are incurred for planning paths.
static_layer:
enabled: true
解析(http://wiki.ros.org/costmap_2d/hydro/obstacles):
max_obstacle_height: 0.60
#传感器读数的最大有效高度,单位为 meters; 通常设置为略高于机器人的实际高度,高度是指包含机械臂打直情况下的最大高度。robot_radius: 0.20
机器人半径(圆形), kobuki是0.18mfootprint: [[x0, y0], [x1, y1], ... [xn, yn]]
当机器人非圆形时,先找机器人的旋转中心,即两个轮的中心点设置成(0,0),然后确定机器人摆放方向,x,y为每个robot几何型的每条边的每个顶点。将所有顶点都列到其中。就完成了robot的footprint。map_type: voxel
地图类型,这里为voxel
(体素地图)。另一种地图类型为costmap
(代价地图)。这两者之间的区别是前者是世界的3D表示,后者为世界的2D表示。obstacle_layer
障碍物层参数enabled
:true
#启用max_obstacle_height: 0.6
传感器读数的最大有效高度(单位:m)。 通常设置为略高于机器人的高度。 此参数设置为大于全局max_obstacle_height参数的值将会失效。 设置为小于全局max_obstacle_height的值将过滤掉传感器上大于该高度以的点。origin_z: 0.0
z原点,单位为米,仅对voxel地图z_resolution: 0.2
z分辨率,单位meters/cellz_voxels: 2
每个垂直列中的体素数目,ROS Nav功能包的默认值为10。请参考《ROS导航功能调优指南》https://github.com/teddyluo/ROSNavGuide-Chineseunknown_threshold: 15
当整列的voxel是“已知”(``known’’)的时候,含有的未知单元(“unknown”)的最大数量mark_threshold: 0
整列voxel是“自由”(“free”)的时候,含有的已标记的cell(“marked”)的最大数目。combination_method: 1
处理obstacle_laye之外的其他层传入数据的行为方式,枚举型(enum)。可能的取值有:覆盖已有值"Overwrite" (0), 取最大值"Maximum" (1), 什么也不干"Nothing" (99)。“覆盖”仅是“覆盖”其他层的数据,例如使得它们没有生效。 “取最大值”是多数时候需要的。 它提取obstacle_layer或输入数据中提供的数据的最大值。 “Nothing”根本不会改变传入的数据。 请注意,这会极大地影响costmap的行为方式,具体取决于您对track_unkown_space的设置。track_unknown_space: true
如果为false,每个像素具有两种状态之一:致命障碍(lethal)或自由(free)。 如果为true,则每个像素具有3种状态之一:致命障碍(lethal),自由(free)或未知(unknown)。obstacle_range: 2.5
将障碍物插入代价地图的最大范围,单位为 meters。raytrace_range: 3.0
从地图中扫描出障碍物的最大范围,单位为 meters 。origin_z: 0.0
z原点,单位为米,仅对voxel地图(为什么定义2次?)z_resolution: 0.2
(为什么定义2次?)z_voxels: 2
(为什么定义2次?)publish_voxel_map: false
是否发布底层的体素栅格地图,其主要用于可视化。observation_sources: scan bump
# 观察源,我们这里是激光数据(scan)和凸点数据(bump)。观察源列表以空格分割表示,定义了下面参数中每一个 <source_name> 命名空间。scan
: 观察源之一:激光数据。定义了:观察源的数据类型,发布话题,标记和添加障碍物data_type: LaserScan
观察源的数据类型:激光扫描topic: scan
发布话题为scan
marking: true
启用标记障碍物功能clearing: true
启用清除障碍物功能
注:关于Marking and Clearing:- marking和clearing参数用来表示是否需要使用传感器的实时信息来添加或清除代价地图中的障碍物信息)
- 代价地图自动订阅传感器主题并自动更新。
- 每个传感器用于标记操作(将障碍物信息插入到代价地图中),清除操作(从代价地图中删除障碍物信息)或两者操作都执行。
- 如果使用的是体素层,每一列上的障碍信息需要先进行投影转化成二维之后才能放入代价地图中。
min_obstacle_height: 0.25
传感器最低有效读数,以米为单位。通常设置为地面高度,但可以根据传感器的噪声模型设置为更高或更低。max_obstacle_height: 0.35
传感器读数的最大有效高度,以米为单位。通常设置为略大于机器人的最大高度。设置为大于全局的max_obstacle_height的值会失效。设置为小于全局max_obstacle_height将从传感器上过滤掉该高度以上的点。
bump
:观察源之二:凸点数据。定义了:观察源的数据类型,发布话题,标记和添加障碍物功能及定义传感器源数值的有效范围data_type: PointCloud2
数据类型为点云topic: mobile_base/sensors/bumper_pointcloud
Topic为mobile_base/sensors/bumper_pointcloudmarking: true
启用标记障碍物功能clearing: false
关闭清除障碍物功能min_obstacle_height: 0.0
传感器最低有效读数,以米为单位。max_obstacle_height: 0.15
传感器读数的最大有效高度,以米为单位。
inflation_layer
: 膨胀层参数enabled
: true 启用膨胀地图cost_scaling_factor: 5.0
# exponential rate at which the obstacle cost drops off (default: 10)
在膨胀期间应用于代价值的尺度因子。默认值:10。对在内接半径之外的cells、以及在内接半径之内的cells这两种不同的cells, 代价函数的计算公式为:
exp(-1.0 * cost_scaling_factor * (distance_from_obstacle - inscribed_radius)) * (costmap_2d::INSCRIBED_INFLATED_OBSTACLE - 1)
其中costmap_2d::INSCRIBED_INFLATED_OBSTACLE
当前取值为254.注意:由于cost_scaling_factor
在公式中乘以负数,因此增加该因子的值会减少它的cost。
对该效果讨论请参考《ROS导航功能调优指南》。
- inflation_radius: 0.5 # max. distance from an obstacle at which costs are incurred for planning paths.
代价地图膨胀半径,以米为单位。默认值:0.55 - static_layer: 静态地图层
- enabled: true 启用静态地图
全局代价地图的设置
全局代价地图的设置主要有两个文件:
<rosparam file="$(find turtlebot_navigation)/param/costmap_common_params.yaml" command="load" ns="global_costmap" />
<rosparam file="$(find turtlebot_navigation)/param/global_costmap_params.yaml" command="load" />
其中,
costmap_common.yaml
为costmap的通用参数设置global_costmap_params.yaml
为全局costmap的设置。
costmap_common.yaml
在前面已有介绍。这里介绍global_costmap_params.yaml
。它的定义为:
global_costmap:
global_frame: /map
robot_base_frame: /base_footprint
update_frequency: 1.0
publish_frequency: 0.5
static_map: true
transform_tolerance: 0.5
plugins:
- {name: static_layer, type: "costmap_2d::StaticLayer"}
- {name: obstacle_layer, type: "costmap_2d::VoxelLayer"}
- {name: inflation_layer, type: "costmap_2d::InflationLayer"}
解析:
global_frame: /map
全局代价地图需要在map参考坐标系下运行robot_base_frame: /base_footprint
全局代价地图使用机器人本体参考坐标系update_frequency: 1.0
全局地图信息更新的频率,单位是Hzpublish_frequency: 0.5
发布频率,用于显示(例如rviz等)static_map: true
代价地图是否需要map_server提供的地图信息进行初始化。如果不需要使用已有的地图或者map_server,最好将该参数设置为falsetransform_tolerance: 0.5
tf变换最大延时
global map引入了以下三层,经融合构成了master map,用于global planner- plugins: 插件定义
-{name: static_layer, type: "costmap_2d::StaticLayer"}
静态地图层{name: obstacle_layer, type: "costmap_2d::VoxelLayer"}
障碍地图层
这里有个疑问:为什么obstacle_layer
的类型不是普通的costmap_2d::ObstacleLayer
?Turtlebot为什么将它设置为costmap_2d::VoxelLayer
?其实在costmap_common_params.yaml
也提到了,开启bump
输入源是为了更好地可视化整个voxel层的情况,方便调试。所以这里将obstacle_layer
的地图类型设置为costmap_2d::VoxelLayer
。{name: inflation_layer, type: "costmap_2d::InflationLayer"}
膨胀地图层,用于留出足够的安全距离
局部代价地图的设置local_costmap_params.yaml
局部代价地图的设置主要有两个文件:
<rosparam file="$(find turtlebot_navigation)/param/costmap_common_params.yaml" command="load" ns="local_costmap" />
<rosparam file="$(find turtlebot_navigation)/param/local_costmap_params.yaml" command="load" />
其中,
costmap_common.yaml
为costmap的通用参数设置,costmap_common.yaml
在前面已有介绍。- `local_costmap_params.yaml’局部costmap的设置。
这里介绍`local_costmap_params.yaml’。它的定义为:
local_costmap:
global_frame: odom
robot_base_frame: /base_footprint
update_frequency: 5.0
publish_frequency: 2.0
static_map: false
rolling_window: true
width: 4.0
height: 4.0
resolution: 0.05
transform_tolerance: 0.5
plugins:
- {name: obstacle_layer, type: "costmap_2d::VoxelLayer"}
- {name: inflation_layer, type: "costmap_2d::InflationLayer"}
解析
global_frame: odom
局部代价地图使用odom
坐标系robot_base_frame: /base_footprint
机器人本体参考坐标系为/base_footprint
update_frequency: 5.0
局部地图更新频率publish_frequency: 2.0
发布显示频率static_map: false
不使用静态地图rolling_window: true
与上面static_map
相反,滚动窗口地图,保持机器人处于中心位置width: 4.0
height: 4.0
resolution: 0.05
代价地图宽(米)、高(米)和分辨率(米/格)。分辨率可以设置的与静态地图不同,但是一般情况下两者是相同的。transform_tolerance: 0.5
tf变换最大延时plugins:
启用的功能主要有:{name: obstacle_layer, type: "costmap_2d::VoxelLayer"}
障碍层{name: inflation_layer, type: "costmap_2d::InflationLayer"}
膨胀层
全局规划器的设置
一般来说,全局路径的规划插件包括:
navfn:ROS
:比较旧的代码实现了dijkstra和A*全局规划算法。global_planner
:重新实现了Dijkstra和A*全局规划算法,可以看作navfn的改进版。parrot_planner
:一种简单的算法实现全局路径规划算法。