Turtlebot 2e 导航之 `move_base` 参数详解: 环境代价地图的设置

14 篇文章 10 订阅
13 篇文章 3 订阅

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.18m
  • footprint: [[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/cell
    • z_voxels: 2 每个垂直列中的体素数目,ROS Nav功能包的默认值为10。请参考《ROS导航功能调优指南》https://github.com/teddyluo/ROSNavGuide-Chinese
    • unknown_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_pointcloud
      • marking: 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 全局地图信息更新的频率,单位是Hz
  • publish_frequency: 0.5 发布频率,用于显示(例如rviz等)
  • static_map: true 代价地图是否需要map_server提供的地图信息进行初始化。如果不需要使用已有的地图或者map_server,最好将该参数设置为false
  • transform_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:一种简单的算法实现全局路径规划算法。
  • 4
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值