ROS Navigation之map_server完全详解_ros mapsaver-程序员宅基地

技术标签: ROS Navigation源码完全详解  ROS地图  map_saver  ROS Navigation  Cartographer保存地图  map_server  

0. 写在最前面

建议收藏:
本文持续更新地址:https://haoqchen.site/2018/11/27/map_server/

本文将介绍自己在看ROS的Navigation stack中的map_server包源代码时的一些理解。作者的ROS版本是indigo,map_server版本是1.12.13。如有错误,欢迎在评论中指正。

左侧专栏还在更新其他Navigation包源码解读哦,关注一波?

如果觉得写得还不错,就请收藏一下啦~~~后续想把整个Navigation看了。

1. package.xml与CMakeLists.txt

package介绍中说,mapserver提供了一个ROS节点,该节点通过一个ROS Service来提供地图数据,同时提供了一个命令行程序来动态地将生成的地图保存到文件中。其依赖一些库,特别需要注意的是sdl-image(用来加载地图图片)yaml-cpp(配置中用到挺多yaml文件的)tf

CMakeLists中定义生成以下:

  • image_loader动态库,详见第2章
  • map_server可执行程序,详见第3章
  • map_saver可执行程序,详见第4章
  • 其余是test和安装的步骤,不是重点就不看了

2. image_loader动态库

其实就是封装了一下SDL_image的功能写了一个loadMapFromFile函数。函数参数中会传进来地图的分辨率[meters/pixel]、occ_th(超过该值的像素为占据,归一化值)、free_th(低于为自由,归一化值)、origin(图像左下角的2D坐标,x、y、yaw,yaw是逆时针)。处理后最终将图片封装成nav_msgs::GetMap::Response*结构。

该结构有三种表示方法。分别是Trinary,即占据(像素用100表示),free(像素用0表示)、不明(像素用-1表示);Scale,占据与free与三值一样,但是不明变成了(0,100);Raw,所有像素用[0, 255]表示。

3. map_server可执行程序

调用形式:
map_server <map.yaml>,其中map.yaml是map_saver中生成的地图描述文件,包括了resolution、图片名、原点信息、阈值等。
除此之外也可以像下面这样调用,但不建议:
map_server <map> <resolution>。map是图片名字,这样子直接跳过了描述文件,不建议。

主要流程:

  1. 在main函数中定义了一个MapServer对象。在该对象的构造函数中,通过描述文件和ROS参数服务器获得地图相应参数后,调用[image_loader动态库][image_loader动态库]中的loadMapFromFile函数将地图加载到私有成员nav_msgs::GetMap::Response map_resp_中。

  2. 然后提供一个名为static_map的服务,回调函数是MapServer::mapCallback。关于ROS服务器和客户端是什么,不懂的可以看ROS教程编写简单的服务器和客户端 (C++)。该服务器做的就是将地图map_resp_深拷贝给客户端。amcl中就是通过这个服务获得地图的

  3. 接着发布一个内容为nav_msgs::MapMetaData,名为map_metadata的话题。

time map_load_time
float32 resolution
uint32 width
uint32 height
geometry_msgs/Pose origin

nav_msgs::MapMetaData的信息如上,应该只是一些地图的基本信息,查找了一下,基本没人订阅这个话题,除了一个test。

  1. 最后发布一个内容为nav_msgs::OccupancyGrid,名为map的话题,并将加载到的map_resp_.map发布上去。
std_msgs/Header header
nav_msgs/MapMetaData info
int8[] data

nav_msgs::OccupancyGrid的信息如上。就是地图了。查了一下发现,GMapping中也会往map这个话题发布消息。除了一些test节点,目前只发现amcl中有在一定条件下订阅map这个话题。然而据我了解,amcl中实际也没有订阅话题,而是直接通过上述的服务器来获得地图的。

4. map_saver可执行程序

调用形式:
map_saver [-f <mapname>] [ROS remapping args]",比如想将GMapping中生成的地图保存下来,可以:
rosrun map_server map_saver -f ~/robot_ws/map/gmapping

main函数中定义了一个MapGenerator类对象,该类初始化之后订阅map话题。在订阅的回调函数中,将订阅得到的map按照一定格式保存到当地的.pgm文件,同时将地图信息保存到对应的.yaml文件中。

需要注意的是,如果你是想保存Cartographer生成的地图,是需要对源代码做一些修改的。因为Cartographer的map格式跟GMapping中的格式不太一样。具体不一样如下:

point type GMapping value Cartographer value
free 0 0-N
occupied 100 M-100
unknown -1 -1 & N-M

我按照这个不同对map_server包做了一些修改,详情看github:https://github.com/HaoQChen/map_server。如果觉得有用,记得star一下哦。

参考


喜欢我的文章的话Star一下呗Star

版权声明:本文为白夜行的狼原创文章,未经允许不得以任何形式转载

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013834525/article/details/84622496

智能推荐

断言NSAssert()和NSParameterAssert区别和用处_nsassert 没有终止app-程序员宅基地

文章浏览阅读719次。NSAssert和assert是断言,主要的差别是assert在断言失败的时候只是简单的终止程序,而NSAssert会报告出错误信息并且打印出来.所以尽管的使用NSAssert,可以不去使用assert.iOS中用的最多的是两对断言, NSAssert/NSCAssert 和 NSParameterAssert/NSCparameterAssert. 要知道他们的区别,我们先来看看他们_nsassert 没有终止app

ProGuard对java jar包实现混淆加密_proguard混淆jar包-程序员宅基地

文章浏览阅读1.9w次。随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)转自:http://blog.csdn.net/xinke0802/article/details/45438749 Java代码编译后生成的.class 中包含有源代码中的所有信息(不包括注释),..._proguard混淆jar包

ubuntu查看系统信息命令_ubuntu chakanxitongdaili-程序员宅基地

文章浏览阅读7.3k次,点赞4次,收藏8次。今天因老板要求,需要查看服务器中的配置信息,但是对ubuntu命令不是很熟悉,所以就网上进行的查阅,顺便做些笔记查看处理核信息 cat /proc/cpuinfo |grep “model name” && cat /proc/cpuinfo |grep “physical id” Linux下可以在/proc/cpuinfo中看到每个cpu的详细信息,此命令是在/proc/cpuinfo文件_ubuntu chakanxitongdaili

HTML侧边栏菜单_html sidebar-程序员宅基地

文章浏览阅读1.3w次,点赞11次,收藏48次。HTML侧边栏菜单用div做一个侧边菜单栏样式,没有导航功能,还没学会,大家不要介意。HTML:<div class="sidebar"> <div class="tab" id="cate0"><i class="reorder"></i> 全部教程</div> <div class="design" id=..._html sidebar

stm32 sd_bsp sd-程序员宅基地

文章浏览阅读355次。SD初始化-> SD擦除数据->SD写数据->SD读数据-> SD读写数据比较。1. sd初始化BSP_SD_Init(); 1.1BSP_SD_MspInit CLK,引脚,DMA初始化 1.2HAL_SD_Init 1.2.1SDIO_Init SD功能初..._bsp sd

解决 Navicat for Mysql连接mysql出现10038问题_linux mysql 本地可登陆但是navicate连接不上 10038-程序员宅基地

文章浏览阅读6w次,点赞2次,收藏10次。连接设备是腾讯云的Linux服务器,自己安装的PHP5.6,Apache2.4,mysql5.6 连接工具是Navicat for Mysql11.1.13对Navicat的新建数据库进行配置后,在点连接测试的时候总是提示10038错误,一直进不去数据库,自己在服务器中上传一个PHP连接数据库的文件,测试,服务器内部可以正常访问mysql,用了win的cmd dos窗口测_linux mysql 本地可登陆但是navicate连接不上 10038

随便推点

flinkx测试环境搭建_flinx-程序员宅基地

文章浏览阅读1.8k次。flinkx是袋鼠云基于flink开发的数据同步服务,其核心实现采用插件加载模式(和datax基本一致)实现多常见的适配。一,安装flink1,下载flink的压缩包(根据flinkx的版本下载flinx)2,解压文件3,配置文件配置在flink的安装目录下的conf下修改master、slaves、flink-conf.yaml三个文件注:windows环境安装flink的相关问题##需要在flink-conf.yaml配置文件中配置如下几个值,不然启动时回报错(值大小根据自己的电脑配置调_flinx

web漏洞“小迪安全课堂笔记”SQL注入_小迪安全sql注入笔记-程序员宅基地

文章浏览阅读3.1k次,点赞5次,收藏27次。提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、SQL注入是什么?注入原理二、使用步骤1.引入库2.读入数据总结参考资料前言提示:这里可以添加本文要记录的大概内容:sql注入,总结以下。提示:以下是本篇文章正文内容,下面案例可供参考一、SQL注入是什么?SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据._小迪安全sql注入笔记

编译错误:invalid types ‘int[int]‘ for array subscrip-markdown编辑器_invalid types"int[int]-程序员宅基地

文章浏览阅读5.6k次,点赞7次,收藏5次。遇到报错invalid types ‘int[int]’ for array subscrip注意:可能是数组名和常量名重复定义了比如 int a; int a[];_invalid types"int[int]

Qtopia2 编译过程错误总结与解决方法_qsizepolicy::qsizepolicy(int) is private within-程序员宅基地

文章浏览阅读2.6k次。环境:s3c6410 Ubantu9.10 arm-linux-gcc-3.4.5(s3c6410交叉编译器) gcc version 4.4.1(PC linux编译器版本) 本节主要讲述 s3c6010 上的Qtopia2.2.0 的编译方法。 PC版本,qvfb运行的Qtopia2.2.0 的编译 也可以参考。 PC环境:Ubantu9.10 开发板:s3c_qsizepolicy::qsizepolicy(int) is private within

温度植被干旱指数(TVDI)_tvdi指数-程序员宅基地

文章浏览阅读1.9w次,点赞7次,收藏54次。一、研究背景 近几年来我国持续发生干旱,严重影响我国农业发展,给我国国民经济带来巨大损失。为防范旱灾而进行的土壤水分监测一直是人们关心的问题。遥感技术具有宏观、快速、动态、经济的特点,可以代替常规的监测方法,实现大面积、动态监测。因此,近几年来利用遥感的进行干旱监测是一个研究和应用的热点。作为同时与归一化植被指数(NDVI)和地表温度(LST)相关的温度植被干旱指数(TVDI)可_tvdi指数

python中的猴子补丁Monkey Patch_monkey.patch_all threaded-程序员宅基地

文章浏览阅读323次。什么是猴子补丁the term monkey patch only refers to dynamic modifications of a class or module at runtime, motivated by the intent to patch existing third-party code as a workaround to a bug or feature which..._monkey.patch_all threaded

推荐文章

热门文章

相关标签