【ROS】代价地图
- 前言
- 代价地图(Costmap)概述
- 代价地图的参数
- `costmap_common_params.yaml` 参数说明
- `costmap_common_params.yaml` 示例说明
- `global_costmap.yaml` 参数说明
- `global_costmap.yaml` 示例说明
- `local_costmap.yaml` 参数说明
- `local_costmap.yaml` 示例说明
- 在 RViz 中查看代价地图
前言
本文将介绍 ROS 导航系统中 move_base
节点的核心模块之一——代价地图(Costmap)。
代价地图以二维栅格地图的形式,对机器人所处环境中的每个区域进行“通行代价”的量化评估,也就是衡量机器人经过该区域的风险和难度。代价越高,意味着该区域越危险或越不适宜通行。
ROS 中的代价地图主要分为两类:
- 全局代价地图(Global Costmap):基于静态地图构建,覆盖整个环境范围,主要用于全局路径规划。
- 局部代价地图(Local Costmap):基于机器人实时传感器(如激光雷达)感知到的障碍物信息构建,反映当前机器人周围的动态环境,主要用于局部避障和路径微调。
我的环境:
本教程使用的环境是:实体 ROS 小车,Ubuntu 18.04,ROS1 Melodic
参考资料:
- ROS导航系统 | 代价地图 Costmap
- ROS导航系统 | 代价地图的参数设置
代价地图(Costmap)概述
关于代价地图的概念与原理,推荐参考以下视频中 0–5 分钟的内容,讲解清晰,通俗易懂:
- ROS 导航系统 | 代价地图 Costmap
代价地图的参数
ROS 中的代价地图配置通常涉及三个参数文件:
-
costmap_common_params.yaml
:
用于配置全局和局部代价地图的通用参数,如地图分辨率、机器人半径、障碍物膨胀半径等,主要影响代价地图的形状和结构。由于它同时作用于全局与局部代价地图,集中配置可避免参数冲突和重复设置。 -
global_costmap_params.yaml
:
专用于全局代价地图的配置,包含其计算范围、更新频率等参数。用于支持全局路径规划任务。 -
local_costmap_params.yaml
:
专用于局部代价地图的配置,用于定义其感知范围、更新频率等参数。支持机器人动态避障和轨迹调整。
将这三个文件合理配置,是实现稳定导航和精确路径规划的关键。
costmap_common_params.yaml
参数说明
该文件配置了代价地图的通用参数,影响机器人在地图中的碰撞判断与导航行为。以下是常用关键参数说明:
-
robot_radius
:
机器人底盘的半径。代价地图会以此为基础设置“核心不可通行区域”,确保机器人不会碰撞到障碍物。 -
inflation_radius
:
膨胀区域半径,即障碍物外围的“ 风险缓冲区 ”。距离障碍越近,通行代价越高。这个区域机器人仍可进入,但接近障碍的风险更大。
-
obstacle_range
:
表示将激光雷达检测到的多少米范围内的障碍物纳入代价地图。一般设置为激光雷达有效探测距离,或稍小一些以剔除不稳定数据。 -
raytrace_range
:
表示在该范围内的空旷区域(激光束穿过且未检测到障碍物的栅格)将被视为无障碍,并用于清除动态障碍物残留的“阴影”。 -
observation_sources
:
指定障碍物信息的来源(可为激光雷达、深度摄像头等)。名称可自定义,但需与下方对应配置保持一致。
costmap_common_params.yaml
示例说明
# 机器人本体参数
robot_radius: 0.25 # 机器人半径(单位:米),可适当设置略大以预留安全空间,避免碰撞
# 膨胀层参数
inflation_radius: 0.5 # 膨胀半径(米),用于在障碍物周围添加安全距离
# 设置过大会导致通行区域变小,设置过小则增大碰撞风险
# 障碍物层参数
obstacle_range: 6.0 # 将动态障碍物更新到局部代价地图的最大检测距离(米)
# 超过此距离(6m)的动态障碍物更新到局部代价地图中
# 一般设为激光雷达的有效探测范围
# 注意与局部代价地图显示范围无冲突,显示小于检测范围是正常的
raytrace_range: 6.0 # 清除动态障碍物的残影的光线追踪距离(米)
# 仅在该范围内(6m内)清除动态障碍物的残影
# 超出此范围的障碍物不会被自动清除
# 传感器数据源配置(可多个)
observation_sources: base_lidar head_kinect2
# 底部激光雷达传感器设置
base_lidar:
data_type: LaserScan # 传感器数据类型
topic: /scan # 订阅的话题名
marking: true # 将障碍物添加至代价地图
clearing: true # 清除障碍物残影(动态场景使用)
# 头部 Kinect2 点云传感器设置
head_kinect2:
data_type: PointCloud2 # 点云数据类型
topic: /kinect2/sd/points # 点云话题名
marking: true # 将障碍物添加至代价地图
clearing: true # 清除障碍物残影(动态场景使用)
max_obstacle_height: 1.5 # 可检测障碍物的最大高度(单位:米)
min_obstacle_height: 0.2 # 可检测障碍物的最小高度(单位:米)
global_costmap.yaml
参数说明
global_costmap
:命名空间,表示以下参数都属于全局代价地图配置。global_frame
:地图坐标系的名称,一般为"map"
。robot_base_frame
:机器人底盘坐标系的名称,通常为"base_footprint"
或"base_link"
。static_map
:是否将map_server
发布的地图作为初始静态地图。- 若为
true
,使用现有的静态地图(适用于已知环境)。 - 若为
false
,初始地图为空,需依赖动态建图机制(适用于未知环境导航任务)。
- 若为
update_frequency
:地图更新频率,即传感器观测数据更新到全局代价地图的频率(Hz)。publish_frequency
:发布频率,用于将全局代价地图发送给 RViz 等工具进行可视化的频率(Hz)。transform_tolerance
:TF 容忍时间(单位:秒),用于处理 TF 超时问题。- 如果提示
TF timeout
报错,可适当增大该值以提升鲁棒性。
- 如果提示
global_costmap.yaml
示例说明
global_costmap:
global_frame: map # 全局坐标系,通常是地图坐标系
robot_base_frame: base_footprint # 机器人基坐标系
static_map: true # 是否使用静态地图
update_frequency: 1.0 # 地图更新频率 (Hz)
publish_frequency: 1.0 # 地图发布频率 (Hz)
transform_tolerance: 1.0 # 坐标变换容忍度 (秒)
local_costmap.yaml
参数说明
local_costmap
:命名空间,表示以下参数属于局部代价地图配置。global_frame
:地图坐标系的名称,一般设置为"odom"
,用于防止障碍物跳变。robot_base_frame
:机器人底盘坐标系的名称,通常为"base_footprint"
或"base_link"
。static_map
:是否使用map_server
发布的静态地图作为初始地图。通常设置为false
,因为局部规划阶段是基于实时传感器数据(如激光雷达)生成临时地图进行规划和避障。rolling_window
:局部代价地图的范围是否随机器人移动。通常设置为true
,确保局部代价地图与机器人实时更新。width
:局部代价地图的宽度。height
:局部代价地图的高度。update_frequency
:地图更新频率(Hz),即传感器数据更新到局部代价地图的频率。通常设置为激光雷达的扫描频率,以确保实时反应。publish_frequency
:地图发布频率(Hz),即将局部代价地图发布给 RViz 等工具的频率。transform_tolerance
:TF 容忍时间(秒),用于处理 TF 超时问题。如果出现TF timeout
错误,可以适当增大该值以提升系统鲁棒性。
local_costmap.yaml
示例说明
local_costmap:
global_frame: odom # 全局坐标系,通常是里程计坐标系
robot_base_frame: base_footprint # 机器人基坐标系
static_map: false # 是否使用静态地图
rolling_window: true # 是否开启滚动窗口模式
width: 3.0 # 地图宽度 (米)
height: 3.0 # 地图高度 (米)
update_frequency: 10.0 # 地图更新频率 (Hz)
publish_frequency: 10.0 # 地图发布频率 (Hz)
transform_tolerance: 1.0 # 坐标变换容忍度 (秒)
在 RViz 中查看代价地图
在 RViz 中查看代价地图的步骤如下:
- 添加
map
显示器。 - 修改显示名称为
global_costmap
或local_costmap
,以对应全局或局部代价地图。 - 订阅话题
/move_base/global_costmap/costmap
或/move_base/local_costmap/costmap
。 - 将颜色方案(Color Scheme)设置为
costmap
,以便直观查看代价地图的效果。
这样,你就可以在 RViz 中清晰地看到代价地图的显示效果。