0x00 概述

在前面的文章中,我们介绍如何自动导航时,都是基于使用gmapping或者hector_mapping创建的地图。当然使用其他的建图方法创建的地图也可以,但是目前为止,无论使用哪种建图方法。通过激光雷达或深度摄像头建立的地图仍然是存在误差的。下面我们可以来回顾一下看看使用gmapping建立的地图,如下图所示,可以看到右侧的地图就是扫描建立的地图,与左侧的地图基本上相同。现在可以思考一下,我们有没有可能不用激光雷达来扫描建图(这个slam过程真的是挺麻烦的),因为现在基本上在设计施工时都是有设计图纸的,如果我们将这些设计图纸拿来,修改一下直接就当作导航地图来用。这样不是就省去建地图的步骤了嘛,而且地图的与实际环境100%匹配(除非施工建造时没有按照图纸来做):

0x01 创建自定义地图

在前面一篇文章10.在STDR中加载其他地图中,介绍了如何在stdr中加载自定义的地图。这张地图是从网上下载的一个两居室户型图,后来经过简单修改我们就可以在stdr中加载了。现在我们可以更进一步,可以将这张地图使用map_server加载。这样我们就可以把地图在rviz中直接加载,就可以在这张地图上进行自动导航了。下面先来看看我们上次创建的这个户型图,如下图所示:

现在我们已经可以在stdr中加载这张地图了,现在我们要将这张地图使用map_server加载。那具体如何操作呢?我们可以先来看看使用gmapping建好的地图是使用什么格式来存储的。我们可以按照它的格式来修改一下这张地图不就可以了嘛,说干咱就开始动手操作:

(1)查看gmapping创建的地图

可以看出gmapping完成后,保存的地图格式为pgm,另外有一个配套的yaml文件。现在来简单介绍下这个pgm格式的图片,可能大多数人不了解这种格式。PGM 是便携式灰度图像格式(portable graymap file format),在黑白超声图像系统中经常使用PGM格式的图像,文件的后缀名为".pgm"。PGM格式图像格式分为两类:P2和P5类型。不管是P2还是P5类型的PGM文件都由两部分组成,文件头部分和数据部分。

[文件头部分]

文件头包括的信息依次是:

1.PGM文件的格式类型(是P2还是P5);

2.图像的宽度;

3.图像的高度;

4.图像灰度值可能的最大值;

文件头的这四部分信息都是以ASCII码形式存储的,下面我们可以看看gmapping建好的地图格式是P2还是P5,如下图所示:

可以看出这里使用的是P5格式,第二行为一个注释信息。第三行416 416就是这张图片的长和宽,最后一行就是图像灰度值的最大值。

[数据部分]

数据部分记录图像每个像素的灰度值,按照图像从上到下,从左到右的顺序依次存储每个像素的灰度值,对于像素灰度值的表示P2格式和P5格式有所不同。下面来重点介绍P5格式:

P5格式图片的数据部分是从上到下,从左到右排列灰度值。每个灰度值取值为[0,Maxval],其中0表示黑色,Maxval表示白色。每个灰度值由1个或2个字节的纯二进制表示。如果最大值小于256,则为1字节。否则,它是2字节。最重要的字节是第一个。

(2)安装KolourPaint4软件

一般从网上下载的照片格式是png或jpg的,这里我介绍一种简单的方式来将这些格式转换为pgm格式。需要安装一下KolourPaint4画图工具,这个软件就跟我们常用的画图软件类似,安装软件的命令如下:

sudo apt-get install kolourpaint4

安装好该软件后,就可以来打开了,下图就是这个软件的界面:

(3)使用软件转换图片格式

使用KolourPaint软件打开png格式或jpg格式的地图软件,如下图所示:

然后使用图片另存为pgm格式,如下图所示:


最后来查看下该图片格式是否为P5:

(4)创建对应的yaml配置文件

这个yaml配置文件编写比较简单,我们按照gmapping中地图的yaml格式来修改就可以了。下面来看看自定义地图的yaml内容:

这里来简单介绍下yaml中两个参数的意义:

image:要加载的地图,这里的路径可以写绝对路径也可以写相对路径。这里由于pgm图片和yaml文件都放在同一个文件夹中,所以就可以直接写home.pgm,不用加其他路径了。

resolution:将图片解析成多少实际距离,从file命令中得知,图片分辨率为761721。这里0.015意思是:米/像素,这样就可以计算出这个地图表示的实际大小为:7610.015=11.415米,7210.015=10.815米。这就表示地图为11.410.8=123平米的大小。

0x02 编写launch文件

现在已经将自定义的图片格式修改为pgm格式了,对应的yaml配置文件也编写好了。下面我们就可以来编写对应测试的launch文件,下面首先来看看用来加载地图的launch文件load_home_map.launch

<!--
Copyright: 2016-2019 ROS小课堂 www.corvin.cn
Author: corvin
Description: 该启动文件用于加载自定义的home地图,这样就可以进行自动导航了.
History:     20190102: initial this file.
-->
<launch>   <!-- load home map -->   <node pkg="map_server" type="map_server" name="stdr_load_home_map" args="$(find stdr_navigation)/maps/home.yaml">     <remap from="map" to="/amcl/map" />   </node>
</launch>

下面来看看最后用来最终测试用的launch文件home_map_nav.launch:

<!--
Copyright: 2016-2019 ROS小课堂 www.corvin.cn
Author: corvin
Description: STDR simulator robot auto navigation with amcl and move base packages.     load home_map to test.
History:     20190102: 加载home_map地图进行自动导航测试.
-->
<launch>   <!-- load stdr simulator with robot0 -->   <include file="$(find stdr_launchers)/launch/home_map_robot_gui.launch" />   <!-- startup move_base node -->   <include file="$(find stdr_move_base)/launch/stdr_move_base.launch" />   <!-- load home map -->   <include file="$(find stdr_navigation)/launch/load_home_map.launch" /><!-- startup amcl node -->   <include file="$(find stdr_amcl)/launch/home_map_amcl.launch" />
</launch>

其实这里所有的代码都已经提交到stdr_ws代码仓库中,如果你已经下载了本代码的话,就可以在本地直接拉取最新代码。不过目前我的代码都是优先往kinetic分支上提交,indigo分支会逐渐放弃维护。

0x03 测试查看效果

要想开始测试,我们首先需要启动上面编写的launch文件,使用如下命令来启动测试:

roslaunch stdr_navigation home_map_nav.launch


下面通过动图来查看导航效果,我们可以直接在Rviz中使用“2D Nav Goal”功能来选取导航的目的地:

0x04 References

[1]. corvin_zhang. 10.在STDR中加载其他地图. http://www.corvin.cn/1047.html

[2]. Netpbm. PGM Format Specification. http://netpbm.sourceforge.net/doc/pgm.html

[3]. 编号1993. Python pgm解析和格式转换. https://blog.csdn.net/u012005313/article/details/83685584

[4]. suonikeyinsu. ppm\pgm格式. https://www.cnblogs.com/black-mamba/p/6755295.html

ROS自定义地图(CAD、手绘等)相关推荐

  1. 自定义View进阶-手绘地图(二)

    前一篇说到了使用自定义ViewGroup实现手绘地图,没看过的可以移步,因为本篇会用到上一篇的部分内容 自定义View-手绘地图(一) 和前一篇一样,实现图片的操作经过同样的操作.onMeasure, ...

  2. 小程序地图覆盖手绘地图的解决方法

     引言 手绘地图顾名思义就是手工绘制的地图,比普通的地图更有观赏性和生动性,通过把特定的地点绘制出来,兼具实用和纪念性,同时更加具有可看性.一般在旅游景点有很多这种纸质版手绘地图.比如这种: 问题 如 ...

  3. WebGIS——OpenLayers 3 地图叠加自定义卫星/航拍/手绘地图(任意瓦片图)

    使用OpenLayers 3 第一步 首先创建Html文件的结构,在body中放入一个Div作为地图显示的容器,调整其宽度高度使其全屏显示 html页结构如下,其中id为map的div为显示地图的容器 ...

  4. H5手绘地图(自定义栅格图层)踩坑

    手绘地图简介 手绘地图顾名思义就是手工绘制的地图,比普通的地图更有观赏性和生动性,通过把特定的地点绘制出来,兼具实用和纪念性,同时更加具有可看性.一般在旅游景点有很多这种纸质版手绘地图.比如这种: 前 ...

  5. 使用leaflet插件绘制手绘地图h5

    手绘地图简介: 手绘地图顾名思义就是手工绘制的地图,比普通的地图更有观赏性和生动性,通过把特定的地点绘制出来,兼具实用和纪念性,同时更加具有可看性. 前期开发准备: 手绘地图绘制. 需要一个专门做手绘 ...

  6. 手绘地图制作的关键点之“图层覆盖”

    前面介绍了<景区手绘地图(电子地图.智慧导览系统)如何制作>以及<景区手绘地图的绘制流程>,接下来介绍一些手绘地图制作的关键点. 手绘地图最关键的一点,就是把手绘地图准确的覆盖 ...

  7. 手绘地图深度解析:类型、风格、功能、价值、制作流程、智慧导览

    本文概要:文本尝试系统性.多角度.全方位的介绍一下现在流行的手绘地图系统. 作者:轻轻的烟雾(z281099678) 一.手绘地图定义 什么是手绘地图?或者说,手绘地图到底是什么样的? 手绘地图首先是 ...

  8. 手绘地图如何制作为电子地图实现智慧导览系统之切割瓦片图

    此系列文章主要简述一下如何把手绘地图的静态图片文件制作成为动态的电子地图,进而实现智慧导览. 因为手绘地图是一张静态的图片文件,而且往往很大,因此要转为手绘地图,才更方便用户查看.那么到底如何才能实现 ...

  9. Android View与SurfaceView的手绘板制作

    最近学习了如何使用View与SurfaceView制作简单的手绘板,在此做个小结. 自定义VIew实现手绘板: 首先是使用View来实现手绘板: package com.app.superxlcr.m ...

最新文章

  1. 输出区间内素数的c语言程序,1137C/C++经典程序训练7---求某个范围内的所有素数...
  2. 探索Julia(part14)--学生得分描述性统计案例
  3. 小菜鸡进阶之路.文件操作遇到坑
  4. uri=/struts-tags 出错
  5. qt判断读入的字符串是否含有英文_重复的子字符串
  6. 一个完整的项目流程图_工程建设项目史上最完整的全流程图,必收藏备用!
  7. 被全球 iPhone 用户讨伐 49 天后,苹果终于为 iOS 带来手动关闭降频功能!
  8. 《Go程序设计语言》- 第10章:包和go工具
  9. php+检测是否是手机浏览器,php检测是否是移动设备的浏览器
  10. Oracle11g 体系结构
  11. Stetman读paper小记:Backdoor Learning: A Survey(Yiming Li, Yong Jiang, Zhifeng Li, Shu-Tao Xia)
  12. 网站被黑 怎么检测代码含有后门
  13. 好看的女孩男生拍照姿势大全
  14. 利用ffmpeg实现Windows音视频录制
  15. js唤醒facebook与line的分享
  16. ps – report process status
  17. 霍常亮教你开发淘宝客app第3节
  18. element-ui 下拉菜单带搜索框示例(亲测可用)
  19. WiFi吞吐量的测试
  20. 线性代数计算器C语言程序,新手作品:行列式计算C语言版

热门文章

  1. bootstrap禁用点击空白处关闭模态框
  2. 平台服务器测试3—接口测试工具实现
  3. 基于SOA的体系架构设计
  4. 自动发现_清华发布首个自动图学习框架,或有助于蛋白质建模和新药发现
  5. PTA学生成绩排序-C语言详解
  6. python如何创建模块教程_Python创建模块及模块导入的方法
  7. C语言学习之购房从银行贷了一笔款d,准备每月还款额为p,月利率为r,计算多少月能还清。
  8. Cloud 学习笔记10.MapReduce 容错
  9. 使用solr的完整流程
  10. 从入门到放弃,.net构建博客系统(二):依赖注入