当前位置: 首页 > news >正文

【ROS】代价地图

【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 中查看代价地图的步骤如下:

  1. 添加 map 显示器。
  2. 修改显示名称为 global_costmaplocal_costmap,以对应全局或局部代价地图。
  3. 订阅话题 /move_base/global_costmap/costmap/move_base/local_costmap/costmap
  4. 将颜色方案(Color Scheme)设置为 costmap,以便直观查看代价地图的效果。

这样,你就可以在 RViz 中清晰地看到代价地图的显示效果。

相关文章:

  • 【技巧】chol分解时,矩阵非正定时的临时补救措施,以MATLAB为例
  • 数学教学通讯杂志数学教学通讯杂志社数学教学通讯编辑部2025年第6期目录
  • 深度解析C++开源OCR引擎:架构、编译优化与工业级部署指南
  • C++学习:六个月从基础到就业——面向对象编程:封装、继承与多态
  • 【Pandas】pandas DataFrame tail
  • if constexpr
  • 数学建模AI智能体(4.16大更新)
  • XSS 跨站Cookie 盗取表单劫持网络钓鱼溯源分析项目平台框架
  • Suno API 无水印版本在国内的稳定使用
  • KES2024论文 MoOnEv: Modular Ontology Evaluation and Validation tool
  • Unity进阶课程【四】Recorder 插件的使用 - 录制游戏画面、音频、动画、图片、无水印
  • 咋用fliki的AI生成各类视频?AI生成视频教程
  • 音视频小白系统入门笔记-1
  • Prometheus+Grafana+K8s构建监控告警系统
  • 电商系统开发:基于飞算JavaAI的分布式事务解决方案自动化实践
  • 【音视频开发】第四章 SDL音视频渲染
  • 国标GB28181视频平台EasyCVR视频汇聚系统,打造别墅居民区智能监控体系
  • 计算机视觉相机模型与标定:如何让计算机“看懂”三维世界?
  • HTML、CSS 和 JavaScript 常见用法及使用规范
  • 音频基础概念
  • 网站升级中 模版/lpl赛区战绩
  • 医院推广营销方式/seo免费软件
  • 网站建设太金手指六六十一/电子商务网页制作
  • 网络舆情工作总结报告/优化疫情防控
  • 阿里云ecs做网站/西安网站推广排名
  • 临汾做网站公司/搜索引擎是什么意思啊