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

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

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

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

roscore
roslaunch nav_demo nav03_map_server.launch
rostopic list
rviz

 打开rviz,添加map组件

订阅/map话题


另请参考:

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 错误:无法启动类型为[map_server/map_server]的点:map_server。 这个错误通常是由于ROS环境变量没有正确设置或者缺少必要的ROS软件包导致的。您可以尝试以下步骤来解决这个问题: 1. 确保您已经正确安装了map_server软件包。您可以使用以下命令来检查: ``` rospack find map_server ``` 如果返回的路径存在,则说明map_server软件包已经正确安装。 2. 确保您已经正确设置了ROS环境变量。您可以使用以下命令来检查: ``` echo $ROS_PACKAGE_PATH ``` 如果返回的路径包含了map_server软件包的路径,则说明ROS环境变量已经正确设置。 3. 如果以上两个步骤都没有解决问题,您可以尝试重新编译map_server软件包。您可以使用以下命令来重新编译: ``` cd <map_server_package_directory> catkin_make ``` 其中,<map_server_package_directory>是map_server软件包的路径。 如果您仍然无法解决问题,请尝试在ROS论坛或者ROS官方文档中寻求帮助。 ### 回答2: 这个错误出现在ROS环境中,表明无法启动“map_server”的点类型。map_server是一个ROS点,用来将地图文件发布到ROS系统中。而出现这种错误的原因通常有以下几种可能: 1. 没有正确安装map_server包:在ROS系统中,每个包都包含了一些点或者其他的功能模块。如果没有安装map_server包,那么就无法启动该点类型。因此,你需要确保已经正确安装了map_server。 2. 没有在ROS环境中加载map_server包:即使你已经安装了map_server包,但是如果没有在ROS环境中加载该包,系统也无法启动该点类型。所以你需要通过修改bashrc文件或进行其他的设置来加载map_server包。 3. 地图文件路径错误:当你要使用map_server发布地图文件时,需要指定正确的地图文件路径。如果路径错误,也会引起无法启动该点类型的错误。 要解决这个问题,你可以采用以下几种方法: 1. 确认安装和加载map_server包以及其他相关的ROS包。 2. 检查地图文件路径是否正确,保证地图文件存在并可以被正确访问。 3. 在ROS环境中运行“rospack find”命令来查找map_server包的安装路径,并在调用点时使用绝对路径。 4. 删除ROS环境中的缓存文件,然后再次尝试启动点。 总之,这是一个比较常见的ROS错误,引起错误的原因有很多,需要仔细排查才能解决。将上述方法逐一尝试,应该能够成功启动map_server点。 ### 回答3: “error: cannot launch node of type [map_server/map_server]: map_server”的错误通常意味着ROS无法启动map_server点。map_server点是ROS中一个非常重要的软件,它用于创建和管理地图,但是由于某些原因,它无法启动。 出现这种错误的主要原因之一是因为map_server软件包没有正确安装或者安装错误。要解决这个问题,需要重新安装map_server软件包。可以使用以下命令安装: sudo apt-get install ros-<distro>-map-server 请将“<distro>”替换为您正在使用的ROS发行版的名称。例如,对于ROS Kinetic,应该运行: sudo apt-get install ros-kinetic-map-server 如果在安装期间遇到任何问题,请检查ROS软件包路径是否正确设置。 另一个可能的原因是由于权限问题或者在启动时未正确设置ROS环境变量。在这种情况下,您可以尝试更改map_server点的权限或重新配置ROS环境变量,确保所有参数正确设置。这通常可以通过重启终端解决,或者重新启动ROS。 总之,出现“error: cannot launch node of type [map_server/map_server]: map_server”的错误通常是由于map_server软件包安装错误或ROS环境变量设置错误导致的,我们可以通过重新安装软件包或重新设置ROS环境变量来解决它。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值