[ROS2] map_server加载地图文件的三种模式

nav_msgs/OccupancyGrid中data的取值分析 关于nav_msgs/OccupancyGrid的颜色取值范围 阅读详情

map的数据类型

map话题的类型是nav_msgs::msg::OccupancyGrid。使用下面的命令可以查询该类型的数据结构。

ros2 interface show nav_msgs/msg/OccupancyGrid

nav_msgs::msg::OccupancyGrid的数据结构:

# This represents a 2-D grid map
std_msgs/Header header
        builtin_interfaces/Time stamp
                int32 sec
                uint32 nanosec
        string frame_id

# MetaData for the map
MapMetaData info
        builtin_interfaces/Time map_load_time
                int32 sec
                uint32 nanosec
        float32 resolution
        uint32 width
        uint32 height
        geometry_msgs/Pose origin
                Point position
                        float64 x
                        float64 y
                        float64 z
                Quaternion orientation
                        float64 x 0
                        float64 y 0
                        float64 z 0
                        float64 w 1

# The map data, in row-major order, starting with (0,0).
# Cell (1, 0) will be listed second, representing the next cell in the x direction.
# Cell (0, 1) will be at the index equal to info.width, followed by (1, 1).
# The values inside are application dependent, but frequently,
# 0 represents unoccupied, 1 represents definitely occupied, and
# -1 represents unknown.
int8[] data

其中data数据成员用于存储地图中的每个栅格值。nav_msgs::msg::OccupancyGrid存储的栅格值范围在[0~100]。0表示栅格未被占用,100表示栅格被占用了,而0到100之间表示被占用的程度。-1表示未知区域。

info成员变量中主要存储地图文件的一些参数。比如:地图大小,分辨率,原点等信息。

加载map的三种模式

map_server功能包支持加载三种类型的图片文件:PGM/PNG/BMP。图片中每个像素的颜色亮度值将被转化成nav_msgs::msg::OccupancyGrid类型中的栅格值,存储在data成员变量中。

加载地图有下面三种方式:

  • trinary
  • scale
  • raw

其中trinary为默认的加载方式。

地图的加载方式通常会被配置在地图文件对应的配置文件中。该配置文件的内容如下:

image: map.pgm
resolution: 0.050000
origin: [-10.000000, -10.000000, 0.000000]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.196

代码中对应的数据结构体:

struct LoadParameters
{
  std::string image_file_name;
  double resolution{0};
  std::vector<double> origin{0, 0, 0};
  double free_thresh;
  double occupied_thresh;
  MapMode mode;
  bool negate;
};

其中mode如果不在yaml文件中写明的话就会使用默认的trinary。 free_thresh和occupied_thresh是判断栅格是否被占用的阈值。

地图图片中每个像素可能有多个颜色通道。比如:RGB。像素的明暗程度值是通过求取各个颜色通道的明暗程度值得到的。像素的明暗程度值的范围在[0~1.0]。下面是代码的实现:

      auto pixel = img.pixelColor(x, y);

      std::vector<Magick::Quantum> channels = {pixel.redQuantum(), pixel.greenQuantum(),
        pixel.blueQuantum()};
      if (load_parameters.mode == MapMode::Trinary && img.matte()) {
        // To preserve existing behavior, average in alpha with color channels in Trinary mode.
        // CAREFUL. alpha is inverted from what you might expect. High = transparent, low = opaque
        channels.push_back(MaxRGB - pixel.alphaQuantum());
      }
      double sum = 0;
      for (auto c : channels) {
        sum += c;
      }
      /// on a scale from 0.0 to 1.0 how bright is the pixel?
      double shade = Magick::ColorGray::scaleQuantumToDouble(sum / channels.size());

      // If negate is true, we consider blacker pixels free, and whiter
      // pixels occupied. Otherwise, it's vice versa.
      /// on a scale from 0.0 to 1.0, how occupied is the map cell (before thresholding)?
      double occ = (load_parameters.negate ? shade : 1.0 - shade);

默认情况下,我们认为颜色越暗,栅格被占用的概率越大。颜色越亮,栅格被占用的概率越小。

但是当negate置为1时,这个逻辑就反过来了。颜色越暗,栅格被占用的概率越小。颜色越亮,栅格被占用的概率越大。

trinary模式下的栅格赋值方法

trinary模式下的判断比较简单。主要是像素的明暗程度值小于free_thresh就表示栅格没有被占用,给栅格赋0。若大于occupied_thresh就认为被占用了,给栅格赋100。在free_thresh和occupied_thresh之间就认为是状态不明,给栅格赋-1。下面是具体的代码实现:

case MapMode::Trinary:
    if (load_parameters.occupied_thresh < occ) {
    map_cell = nav2_util::OCC_GRID_OCCUPIED;
    } else if (occ < load_parameters.free_thresh) {
    map_cell = nav2_util::OCC_GRID_FREE;
    } else {
    map_cell = nav2_util::OCC_GRID_UNKNOWN;
    }

scale模式下的栅格赋值方法

当像素的Alpha值不为0,栅格值被设定为状态不明。像素的明暗程度值小于free_thresh就表示栅格没有被占用,给栅格赋0。若大于occupied_thresh就认为被占用了,给栅格赋100。在free_thresh和occupied_thresh之间就线性转换到[0~100]之间。

case MapMode::Scale:
    if (pixel.alphaQuantum() != OpaqueOpacity) {
        map_cell = nav2_util::OCC_GRID_UNKNOWN;
    } else if (load_parameters.occupied_thresh < occ) {
        map_cell = nav2_util::OCC_GRID_OCCUPIED;
    } else if (occ < load_parameters.free_thresh) {
        map_cell = nav2_util::OCC_GRID_FREE;
    } else {
        map_cell = std::rint(
            (occ - load_parameters.free_thresh) /
            (load_parameters.occupied_thresh - load_parameters.free_thresh) * 100.0);
    }
    break;

raw模式下的栅格赋值方法

将像素的明暗程度值当成是百分比,通过下面代码描述的方式对栅格值赋值。

case MapMode::Raw: {
    double occ_percent = std::round(shade * 255);
    if (nav2_util::OCC_GRID_FREE <= occ_percent &&
    	occ_percent <= nav2_util::OCC_GRID_OCCUPIED)
    {
    	map_cell = static_cast<int8_t>(occ_percent);
    } else {
    	map_cell = nav2_util::OCC_GRID_UNKNOWN;
    }
    	break;
    

参考:

https://navigation.ros.org/tutorials/docs/navigation2_with_keepout_filter.html#prepare-filter-mask


觉得有用就点赞吧!

我是首飞,一个帮大家填坑的机器人开发攻城狮。

另外在公众号《首飞》内回复“机器人”获取精心推荐的C/C++,Python,Docker,Qt,ROS1/2等机器人行业常用技术资料。

ROS中的珊格地图——nav_msgs::OccupancyGrid 文章目录一、Rviz中的地图效果如下:二、地图数据格式三、实例代码 一、Rviz中的地图效果如下: 黑色块为障碍物,颜色较深的灰色块为危险区,颜色再浅一点的是可行区域,最浅的是未知区域(最外围的区域); 二、地图数据格式 官方数据类型解释如下: # This represents a 2-D grid map, in which each cell represents the probability of # occupancy. Header header #MetaData for the m 阅读详情

相关推荐

ros2的nav2_map_server导入地图时,rviz2显示no map received

通过add->bytopic->选择map组件。3、配置并激活map_server。

chenlin41204050的博客 6006

nav_msgs::OccupancyGrid数据格式详解

nav_msgs::OccupancyGrid数据格式详解 可以先查看一下ros官网ros官网关于nav_msgs::OccupancyGrid数据格式的解释,我应用的时候,感觉还有一些不清楚的地方,所以我自己做了个实验,大家可以参考一下我对下面参数的理解,如有问题请告知。 主要是涉及实际地图与栅格地图单位的问题,实际地图的单位一般为m,栅格地图单位为一个,有些参数没讲清楚。 以比例尺为0.5,地图栅格大小为20×20地图实际大小为10m×10m的地图的举例说明: nav_msgs::OccupancyGr

weixin_44001261的博客 1万+

ROS:gazebo创建仿真地图,turtlebot3加载仿真地图进行建图,生成yaml和pgm地图信息

ROS:gazebo创建仿真地图,turtlebot3加载仿真地图进行建图,生成yaml和pgm地图信息

weixin_44190648的博客 8665

ROS学习第四十二节——地图服务

map_server功能包中提供了两个节点: map_saver 和 map_server,前者用于将栅格地图保存到磁盘,后者读取磁盘的栅格地图并以服务的方式提供出去。sudo apt install ros--map-server。

qq_45685327的博客 4962

ros2的nav2\_map\_server导入地图时,rviz2显示no map received

1.rviz没启动好,map_server就传入/map,但是只传了一次。通过add->bytopic->选择map组件。3、配置并激活map_server。2.需要激活map_server。

lucust的博客 2709

解决ROS2中nav2_map_server与rviz2地图同步问题的实用指南

本文详细解析了ROS2中nav2_map_server与rviz2地图同步问题的核心原因,并提供了从基础到进阶的解决方案。通过手动操作流程、自动化launch文件配置以及QoS策略优化,帮助开发者有效解决'no map received'问题,提升机器人导航系统的可靠性。

android的专栏 1087

如何在ROS2-Humble 中 load map 并在Rviz中显示出来

记录在学习ros2 建图仿真时使用时不能正常加载地图系统:Ubtuun 22.04ros版本: ros2 humble。

weixin_73903802的博客 2452

全面掌握ROS2中的map_server:从地图加载到动态更新的实战指南

本文深入解析ROS2中map_server的核心功能与使用方法,涵盖地图文件格式、加载发布操作、动态更新技巧及多地图切换实践。通过实战案例和优化建议,帮助开发者全面掌握这一导航系统基石工具,提升机器人环境适应能力。

weixin_29196613的博客 324

【ROS】map_server 地图的保存和加载

在 ROS 中,想要实现导航功能,首先需要一张已建好的地图。导航系统依赖这张地图进行路径规划、定位和障碍物避让等操作。本文将讲解在使用gmapping或建图后,如何保存和加载地图。本章面向 ROS 初学者,系统地讲解地图的保存与加载流程,为后续的定位与导航功能奠定基础。本教程使用的环境是:实体 ROS 小车,Ubuntu 18.04,ROS1 Melodic如何在 ROS 中保存和加载地图ROS Wiki - map_server 官方文档。

AbaAbaxxx_的博客 2488

ROS map_server原理与实战:静态地图加载核心机制解析

在ROS机器人导航系统中,静态地图是实现可靠定位与路径规划的基础数据源。其本质是遵循nav_msgs/OccupancyGrid消息规范的栅格化空间表示,需通过标准化服务接口发布到/map话题,供AMCL、move_base等模块消费。map_server正是这一关键桥梁——它不参与建图或计算,却严格完成PGM图像解析、坐标系对齐(origin+resolution)、三态语义映射(空闲/障碍/未知)及消息封装。该机制保障了地图数据的可复用性、状态可观测性与系统解耦性,广泛应用于AGV集群部署、仓储导航、仿

huqiyes的专栏 489

【AutoDL】使用云服务器跑深度学习代码

1.算力市场 租用服务器,选择自己心仪的服务器2.镜像可以选择一些基础的镜像,社区镜像里是git上有的环境。3.上传文件在文件存储中,选择上传的区,在右边点击上传,选择自己的文件上传到云服务器中。

weixin_45768644的博客 3705

《动手学ROS2》10.6导航地图概述

《动手学ROS2》10.6导航地图概述 本系列教程作者:小鱼 公众号:鱼香ROS QQ交流群:139707339 教学视频地址:小鱼的B站 完整文档地址:鱼香ROS官网 版权声明:如非允许禁止转载与商业用途。 10.6导航地图概述 地图是对环境建模的结果,拥有地图,我们就可以在不进行任何测量的情况下来了解环境,从而完成一些比如路径规划的操作。 本节小鱼带你一起了解ROS2中地图的原理、常见格式及转换,加载方式、修改方式等基本操作。同时需要重点了解占据栅格地图(OccupancyGridMap)的概念。

生活不止眼前的苟且 4566

保姆级教程:Java调用海康SDK实现录像回放与倍速播放(附完整代码)

本文详细介绍了如何使用Java调用海康SDK实现录像回放与倍速播放功能,包括开发环境配置、设备连接、流媒体处理、倍速播放实现及性能优化等关键步骤。通过完整的代码示例和实战经验,帮助开发者快速构建智能录像回放系统,提升开发效率。

weixin_29285605的博客 357

深入解析ROS中的map_server:功能、使用方法、工作原理及地图文件格式

在机器人操作系统(ROS)生态中,map_server是一个关键的功能包,负责加载、管理和发布环境地图数据。它为机器人导航、定位与路径规划等核心功能提供基础支持。本文将详细探讨map_server的定义、功能、使用方法、工作原理以及ROS中地图文件的格式,并通过实例进行说明。map_server是ROS中的一个节点,主要用于加载预先构建的静态地图,并将其发布为ROS话题(通常为/map),供其他节点如导航栈(navigation stack)使用。

m0_73640344的博客 2606

代码实现 —— 基于 STM32 的可见光通信系统课程设计

基于STM32F103ZET6,源码如需移植,需要修改定时器捕获通道引脚,及定时器,如果你也有这个课设任务,希望对你有所帮助。

不善挽留 1万+

动态对抗Zygisk-IL2CppDumper:Unity游戏安全新策略

本文深入探讨了对抗Zygisk-IL2CppDumper攻击的Unity游戏安全新策略。通过实时内存监控、动态混淆技术和异常行为检测体系,有效防止关键代码被动态提取。文章详细介绍了内存指纹系统、运行时混淆方案和五维特征模型等实用防御手段,帮助开发者提升游戏安全性。

weixin_29325955的博客 306

ROS之map_server 源码解析

文章目录1.1 map_server1.2 map_saver1.3 附   CoppeliaSim 仿真的翻译教程已经完成,接下来计划一边更新 CoppeliaSim 实战教程,一边进行轮式机器人基础软件包的源码学习整理。按照个人习惯,先对简单的软件包 map_server 下手。源码与流程框图相互结合更容易理解,也能帮助我后期快速回顾。于是调研了一番应用在代码结构整理层面上的流程框图软件,很多人推荐了Understand,号称是高效代码静态分析的神器,一方面可以阅读代码,另一方面Butterfly还能

知不道道不知知不知道道道知的博客 4535

【异常】安装hermes-agent提示Git克隆仓库网络中断 fetch-pack: unexpected disconnect while reading sideband packet

本文分析了Git克隆仓库时出现网络中断错误的常见原因及解决方案。报错表现为连接被远程主机关闭、管道破裂或数据包意外终止,通常由网络不稳定、仓库过大或配置不当引起。提供了5种优先级排序的解决方法:1)使用浅克隆减少数据量;2)优化Git配置参数;3)切换网络或配置代理;4)检查SSH密钥设置;5)改用HTTPS方式克隆。特别推荐先尝试「浅克隆+HTTPS」组合方案快速验证,若问题持续再根据具体报错深入排查。文中包含详细的命令示例和配置说明,适合不同网络环境下的Git用户参考。

奶爸的编程之路,也就一周冷个三天 1422

ros2如何加载自己建的静态地图在rviz2中显示

rviz2不能显示,加载创建好的静态地图map,无法订阅map话题,显示No map received

m0_65304012的博客 5071

Python调用CANoe(2)(测试模块配置)

本节内容在Python和CANoe的数据交互(1)的基础认知上,继续探索Python如何加载TestSetup,以及运行tse测试文件

蚂蚁小兵 1万+

AgentScope深入分析-ReActAgent

ReActAgent 是 AgentScope 框架中最核心的智能体实现,它完美诠释了"推理-行动"(Reasoning-Acting)循环的精髓。本文将深入分析 ReActAgent 的类继承关系、核心执行流程,以及状态管理、钩子机制、实时介入等关键技术点。通过阅读本文,你会理解智能体如何与模型交互、如何执行工具、如何处理中断,以及这些机制背后的设计考量。模块化:通过组合不同的组件(模型、格式化器、工具集、记忆)来构建智能体透明性:所有关键流程都对开发者可见,可以精确控制可扩展性。

842

ROS学习笔记之导航实现02_地图保存和读取

上一节我们已经实现通过gmapping的构建地图并在rviz中显示了地图,不过,上一节中地图数据是保存在内存中的,当节点关闭时,数据也会被一并释放,我们需要将栅格地图序列化到的磁盘以持久化存储,后期还要通过反序列化读取磁盘的地图数据再执行后续操作。在ROS中,地图数据的序列化与反序列化可以通过 map_server 功能包实现。 1.map_server简介 map_server功能包中提供了两个节点: map_saver 和 map_server,前者用于将栅格地图保存到磁盘,后者读取磁盘的栅格地图并

weixin_51067502的博客 1万+

微信小程序 - error_msg:net::ERR_CONNECTION_RESET“(“errno“:600001,“errMsg“:“uploadFile:fail errcode:-101)

"errno":600001,"errMsg":"uploadFile:fail errcode:-101 cronet_error_code:-101 error_msg:net::ERR_CONNECTION_RESET"微信小程序,微信小程序wx.uploadFile报错,uniapp微信小程序uni.uploadFile上传文件报错,微信小程序调用wx.uploadFile返回错误ERR_CONNECTION_RESET,如何解决这个问题,上传图片出现报错,小程序上传视频报错,上传文件出现报错,如何

🏆 前端领域优质创作者 5417

【ROS2机器人入门到实战】地图文件介绍

OccupancyGrid由一个.yaml格式的元数据文件,和.pgm图片格式的地图数据文件组成。从上节课建图后保存的文件也可以看出。不是说占据栅格地图每个栅格都有一个概率吗?为什么看不出来?立方体内和圆柱体内和墙之外的区域为什么是灰色的?一个栅格对应到图片上其实是一个像素,每一个像素的值在0-255之间,所以将像素值和占据率之间的映射即可,而像素值反应到图像上就是颜色的深浅,1.2图对应的像素颜色如下:建图的时候物体内和墙之外的区域机器人并没有探索到,没有数据参考就认为其值是未知的。除了。

生活不止眼前的苟且 4144

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

map_server地图保存

map_server地图保存roslaunch启动map_server命令行启动map_server 根据map_server中 roslaunch启动map_server <launch> <node pkg="map_server" type="map_saver" name="map_saver1" args="-f PATH_TO_YOUR_FILE/mymap" ou...

sylin211的博客 8549

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

上一篇: [ROS2] 动手实践Costmap新特性
下一篇: Docker简明使用指南
首飞爱玩机器人
博客等级 码龄14年 6990粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

首飞爱玩机器人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值