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

这篇具有很好参考价值的文章主要介绍了ROS学习第四十二节——地图服务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

https://download.csdn.net/download/qq_45685327/87721374

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

1.map_server简介

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

map_server安装前面也有介绍,命令如下:

sudo apt install ros-<ROS版本>-map-server

2.map_server使用之地图保存节点(map_saver)

2.1map_saver节点说明

订阅的topic:

map(nav_msgs/OccupancyGrid)

  • 订阅此话题用于生成地图文件。

2.2地图保存launch文件

地图保存的语法比较简单,编写一个launch文件,内容如下:

nav02_map_save.launch

<launch>
    <arg name="filename" value="$(find mycar_nav)/map/nav" />
    <node name="map_save" pkg="map_server" type="map_saver" args="-f $(arg filename)" />
</launch>

其中 mymap 是指地图的保存路径以及保存的文件名称。

SLAM建图完毕后,执行该launch文件即可。

source ./devel/setup.bash
roslaunch nav_demo nav02_map_save.launch

mapserver发布地图服务,ROS,学习,机器人,自动驾驶

mapserver发布地图服务,ROS,学习,机器人,自动驾驶

2.3保存结果解释2.3

xxx.pgm 本质是一张图片,直接使用图片查看程序即可打开。

xxx.yaml 保存的是地图的元数据信息,用于描述图片,内容格式如下:

#声明地图图片资源的路径
image: /home/xiaoming/demo2/src/nav_demo/map/nav.pgm
# 地图刻度尺单位是 米每像素
resolution: 0.050000
# 地图位姿(相对于rviz中的原点的位姿)
origin: [-50.000000, -50.000000, 0.000000]
# 占用阈值
negate: 0
# 空闲阈值
occupied_thresh: 0.65
# 取反
free_thresh: 0.196

解释:

  • image:被描述的图片资源路径,可以是绝对路径也可以是相对路径。

  • resolution: 图片分片率(单位: m/像素)。

  • origin: 地图中左下像素的二维姿势,为(x,y,偏航),偏航为逆时针旋转(偏航= 0表示无旋转)。

  • occupied_thresh: 占用概率大于此阈值的像素被视为完全占用。

  • free_thresh: 占用率小于此阈值的像素被视为完全空闲。

  • negate: 是否应该颠倒白色/黑色自由/占用的语义。

map_server 中障碍物计算规则:

  1. 地图中的每一个像素取值在 [0,255] 之间,白色为 255,黑色为 0,该值设为 x;
  2. map_server 会将像素值作为判断是否是障碍物的依据,首先计算比例: p = (255 - x) / 255.0,白色为0,黑色为1(negate为true,则p = x / 255.0);
  3. 根据步骤2计算的比例判断是否是障碍物,如果 p > occupied_thresh 那么视为障碍物,如果 p < free_thresh 那么视为无物。

备注:

  • 图片也可以根据需求编辑。

3.map_server使用之地图服务(map_server)

3.1map_server节点说明

发布的话题

map_metadata(nav_msgs / MapMetaData)

  • 发布地图元数据。

map(nav_msgs / OccupancyGrid)

  • 地图数据。

服务

static_map(nav_msgs / GetMap)

  • 通过此服务获取地图。

参数

〜frame_id(字符串,默认值:“map”)

  • 地图坐标系。

3.2地图读取

通过 map_server 的 map_server 节点可以读取栅格地图数据,编写 launch 文件如下:

nav03_map_server.launch

<launch>
    <!-- 设置地图的配置文件 -->
    <arg name="map" default="nav.yaml" />
    <!-- 运行地图服务器,并且加载设置的地图-->
    <node name="map_server" pkg="map_server" type="map_server" args="$(find mycar_nav)/map/$(arg map)"/>
</launch>

其中参数是地图描述文件的资源路径,执行该launch文件,该节点会发布话题:map(nav_msgs/OccupancyGrid)

3.3地图显示

首先运行刚刚编写的launch文件,发布地图文件的话题

roslaunch nav_demo nav03_map_server.launch

mapserver发布地图服务,ROS,学习,机器人,自动驾驶

在 rviz 中使用 map 组件可以显示栅格地图:

经过尝试,发现没有/map话题,找到的方案是关闭一下roscore,再启动,然后在启动launch文件

roscore
roslaunch nav_demo nav03_map_server.launch
rostopic list
rviz

mapserver发布地图服务,ROS,学习,机器人,自动驾驶

 打开rviz,添加map组件

订阅/map话题

mapserver发布地图服务,ROS,学习,机器人,自动驾驶


另请参考:文章来源地址https://www.toymoban.com/news/detail-654833.html

  • map_server - ROS Wiki

到了这里,关于ROS学习第四十二节——地图服务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux学习第二十二节-网卡IP设置

    1. 修改网卡IP地址 方式一:通过修改 网卡配置文件 修改 网卡配置文件位置: /etc/sysconfig/network-scripts/网卡名 #ifconfig   表示用于显示和设置网卡的参数 #ip addr   表示用于显示和设置网卡的参数   #systemctl restart network 表示重启网络 #ifup 网卡名 表示启动该网卡设备 #ifdown 网卡

    2024年02月17日
    浏览(61)
  • 学习java第四十三天

    Spring AOP 相关术语 (1)切面(Aspect):切面是通知和切点的结合。通知和切点共同定义了切面的全部内容。 (2)连接点(Join point):指方法,在Spring AOP中,一个连接点总是代表一个方法的执行。连接点是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时

    2024年04月15日
    浏览(49)
  • 学习java第四十一天

    Spring MVC 运行流程: 第一步:发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求HandlerMapping查找 Handler( 可以根据xml配置、注解进行查找) 第三步:处理器映射器HandlerMapping向前端控制器返回Handler 第四步:前端控制器调用处理器适配器去执行Handler 第五步:处理

    2024年04月13日
    浏览(45)
  • 学习JAVA打卡第四十二天

    正则表达式及字符串的替换与分解 ⑴正则表达式 正则表达式是string对象的字符序列,该字符序列中含有具有特殊意义的字符,这些特殊字符称作正则表达式的元字符。  注:由于“   ”代表任何一个字符,所以在正则表达式中如果想使用普通意义的点字符必须使用[.]或5

    2024年02月11日
    浏览(39)
  • 学习JAVA打卡第四十九天

    Random类 尽管可以使用math类调用static方法random()返回一个0~1之间的随机数。(包括0.0但不包括0.1),即随机数的取值范围是[0.0,1.0]的左闭右开区间。 例如,下列代码得到1~100之间的随机数(包括1和100)  使用Random类的如下构造方法:  创建random对象,其中第一个构造方法

    2024年02月10日
    浏览(42)
  • 学习JAVA打卡第四十一天

    字符串与字符数组、字节数组 ⑴字符串与字符数组 String类的构造方法String(char a[])和String(char a[]),int offset,int length,分别用数组a中的全部字符和部分字符创建string对象。 String类也提供将string对象的字符序列存放到数组中的方法: Public void getChars(int start,int.end,char c [],i

    2024年02月11日
    浏览(48)
  • 学习JAVA打卡第四十五天

    StringBuffer类 StringBuffer对象 String对象的字符序列是不可修改的,也就是说,String对象的字符序列的字符不能被修改、删除,即String对象的实体是不可以再发生变化,例如:对于  StringBuffer有三个构造方法: ⑴StringBuffer(); ⑵StringBuffer(int Size); ⑶StringBuffer(String s);

    2024年02月11日
    浏览(41)
  • 学习JAVA打卡第四十六天

    Date和Calendar类 Date类 ⑴使用无参数构造方法 使用Date 类的无参数构造方法创建的对象可以获取本机的当前日期和时间,例如: Date nowtime =new Date(); ⑵使用带参数的构造方法 计算机系统将其自身的时间的设“公元”设置在1970年1月1日零时可(格林威治时间),可以根据这个

    2024年02月11日
    浏览(50)
  • 【正点原子STM32连载】 第四十二章 DS18B20数字温度传感器实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

    1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html# 本章,我们将介绍STM32F103如何读取外部温度传感器的温度,来得到较为准确的环境温度。我们将学习

    2024年02月04日
    浏览(56)
  • 【从零开始学习JAVA | 第四十五篇】反射

    目录 前言: ​反射:  使用反射的步骤: 1.获取阶段: 2.使用阶段: 反射的应用场景: 使用反射的优缺点: 总结: Java中的反射是一项强大而灵活的功能,它允许程序在运行时 动态地获取、操作和利用类的信息 。通过反射,我们可以在运行时检查和修改类的属性、调用类

    2024年02月13日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包