ROS学习记录:SLAM软件包Hector_Mapping

前言

了解尝试使用Hector_Mapping软件包

一、搜索进入ROS Index

在这里插入图片描述

二、搜索hector_mapping

在这里插入图片描述

三、选择noetic的版本

在这里插入图片描述

四、进入Website

在这里插入图片描述

五、订阅的话题中,一个是scan话题,就是获取激光雷达数据的话题

在这里插入图片描述

六、另一个话题是syscommand话题,主要用来接收reset这类重新建图的指令

在这里插入图片描述

七、再看看它发布的话题,第一个是map_metadata,发布的是地图数据

在这里插入图片描述

1 、点进去看看是些什么数据,第一个是地图的加载时间

在这里插入图片描述

2 、第二个是地图分辨率

在这里插入图片描述

3 、地图的宽和高

在这里插入图片描述

4 、 地图的原点坐标

在这里插入图片描述

八、map话题发布的是地图栅格数据

在这里插入图片描述

九、这个话题的原始机器人定位信息

在这里插入图片描述

十、这个话题是校正后的机器人定位信息

在这里插入图片描述

十一、安装并使用Hector_Mapping

1、输入sudo apt install ros-noetic-hector-mapping进行安装

在这里插入图片描述

2、输入cd catkin_ws1,进入工作空间

在这里插入图片描述

3、输入source ./devel/setup.bash,设置ROS的环境变量,以便在当前的终端窗口中正确运行ROS软件包。

在这里插入图片描述

4、输入roslaunch wpr_simulation wpb_stage_slam.launch,运行机器人和仿真环境

在这里插入图片描述

5、对终端进行分屏,输入 rosrun hector_mapping hector_mapping运行SLAM节点,回车后SLAM的功能已经在运作了,我们用RViz窗口来查看输出的地图

在这里插入图片描述

6、对终端再进行分屏,输入rosrun rviz rviz

在这里插入图片描述

7、在打开的RViz界面,进行添加机器人模型

在这里插入图片描述

8、再添加激光雷达的扫描测距点

在这里插入图片描述

9、选择话题/scan

在这里插入图片描述

10、将测距点改大一点,size改成0.03,方便看清

在这里插入图片描述

11、添加Map地图

在这里插入图片描述

12、设置地图的话题名称/map

在这里插入图片描述

13、机器人脚下出现的即为当前位置扫描的第一帧地图

在这里插入图片描述

14、把RViz和机器人仿真窗口并排显示,方便观察

在这里插入图片描述

15、对终端再进行分屏,输入rosrun rqt_robot_steering rqt_robot_steering打开机器人速度控制器

在这里插入图片描述

16、把这个往前拖动,机器人就会往前走,下面的条是控制机器人转弯,我们需要控制机器人移动,让它把地图给扫描完

在这里插入图片描述

17、达到这样,就成功把地图建出来了

在这里插入图片描述

<think>好的,我现在需要帮助用户解决在ROShector_mapping软件包中更改生成地图名称的问题。首先,我得回顾一下自己之前对ROShector_mapping的了解。Hector_mapping是一个基于激光雷达的SLAM算法,通常用于创建二维环境地图。生成的地图名称默认可能是“map”或者其他固定名称,用户希望自定义这个名称,可能为了同时运行多个地图或者区分不同场景的地图。 接下来,我需要确定用户的问题具体涉及哪些方面。在ROS中,节点通常通过参数服务器获取参数,所以更改地图名称可能需要修改相关的参数。根据之前的引用内容,用户提到需要在代码中添加两行来读取YAML文件中的参数,这可能涉及到动态调整参数或者从配置文件中读取。 首先,我应该检查hector_mapping的启动文件或参数配置文件。常见的做法是在启动文件(.launch)中设置参数,或者在YAML配置文件中定义参数,然后在节点启动时加载这些参数。用户提到在YAML文件中定义参数,并在源代码中读取这些参数,所以可能需要修改hector_mapping的源代码来读取新的地图名称参数。 不过,修改源代码并不是最佳实践,特别是如果软件包是第三方维护的。应该优先考虑通过启动文件或参数重映射来更改地图名称。例如,在启动文件中使用<param>标签设置相关参数,或者使用<remap>来重映射话题名称。 但hector_mapping生成的地图通常通过话题发布,比如地图话题可能是/map,而地图的元数据可能通过/map_metadata发布。用户可能希望更改这些话题的名称,从而间接改变保存地图时的默认名称。因此,使用ROS的remap功能可能是一个解决方案。例如,在启动文件中将/map重命名为自定义名称,这样保存地图时使用的名称也会相应改变。 如果用户需要更直接地修改生成地图的文件名,可能需要查看hector_mapping中保存地图的相关代码。通常,保存地图是通过调用map_server的map_saver工具,这个工具默认订阅/map话题,并保存为map.yaml和map.pgm。因此,如果用户更改了订阅的地图话题名称,也需要在保存地图时指定新的话题名称。例如,运行map_saver时使用map:=/custom_map_name命令。 不过,用户的问题更可能是在生成地图时,自动保存的文件名如何更改,而不仅仅是重映射话题。这时候可能需要修改hector_mapping节点中发布地图话题的名称,或者找到相关的参数来设置地图名称。 查阅hector_mapping的文档或源码,寻找是否存在参数可以直接设置地图名称。例如,可能存在一个参数如map_frame_id或map_topic,默认值为"map",用户可以通过设置这个参数为自定义值来改变生成的地图名称。 假设在hector_mapping的参数中,有一个参数叫做map_frame_id,控制着地图的坐标系名称,而地图话题名称可能基于这个参数。因此,在启动文件中设置该参数即可更改地图名称。例如: <param name="map_frame" value="custom_map_name" /> 或者,在YAML配置文件中定义该参数,然后在启动文件中加载该配置文件。 如果通过参数设置无法实现,可能需要修改hector_mapping的源代码,找到发布地图话题的部分,将话题名称改为从参数服务器读取的值。例如,在源码中找到发布话题的代码行,将其替换为从参数获取的变量,然后在启动文件中设置该参数。 例如,在geometric.cpp中添加类似以下的代码: ros::param::param<std::string>("map_topic_name", map_topic, "map"); 然后发布者使用map_topic作为话题名称。 不过,用户之前提到的引用中,提到在源代码中添加两行来读取YAML文件中的参数,这可能是指类似的操作。因此,可能需要用户修改hector_mapping的源代码,添加相应的参数读取逻辑,然后重新编译软件包。 总结可能的解决步骤: 1. 通过重映射话题名称:在启动文件中使用<remap>标签将/map重命名为自定义名称,这样保存地图时指定新的话题名称即可。 2. 查找hector_mapping是否存在现成的参数用于设置地图名称,例如map_frame或map_topic参数,通过设置这些参数来更改。 3. 如果不存在,则修改hector_mapping的源代码,使其从参数服务器读取地图名称,然后重新编译。 4. 保存地图时使用map_saver工具,并指定新的话题名称,例如:rosrun map_server map_saver -f custom_map_name map:=/custom_map_topic 需要验证这些步骤的正确性,可能需要查阅hector_mapping的官方文档或源码,确认参数和发布的话题名称之间的关系。例如,查看hector_mapping的launch文件示例,是否有参数设置地图框架或话题名称。 例如,在hector_mapping的launch文件中,可能存在如下参数: <param name="map_frame" value="map" /> 将其更改为: <param name="map_frame" value="custom_map" /> 可能会影响地图的坐标系名称,进而影响保存时的文件名。或者,可能需要同时更改发布的话题名称和坐标系名称。 另一个考虑是,当使用map_saver保存地图时,默认的文件名是基于当前时间戳生成的,但用户可能希望指定固定的名称。这可以通过在保存时指定文件名来实现,例如: rosrun map_server map_saver -f custom_name 这会生成custom_name.yaml和custom_name.pgm文件。因此,用户可能不需要修改hector_mapping本身,只需在保存地图时指定名称即可。但用户的问题可能是在hector_mapping生成过程中地图的名称,而不是保存时的文件名,需要进一步明确。 如果用户希望hector_mapping节点内部使用自定义的地图名称(例如,用于日志或内部标识),则需要修改源代码。否则,如果只是保存地图时的文件名,则使用map_saver的-f参数即可。 根据用户提供的引用内容,他们可能已经修改了YAML配置文件,并在源代码中添加了读取参数的代码。因此,可能需要指导用户如何在hector_mapping的参数中设置地图名称,例如通过YAML文件或启动文件参数。 例如,在YAML文件中添加: hector_mapping: map_topic: "custom_map" map_frame: "custom_map" 然后在启动文件中加载该YAML文件: <rosparam command="load" file="$(find hector_mapping)/config/custom_params.yaml" /> 这样,hector_mapping节点会读取这些参数,并将发布的话题名称改为custom_map。 最后,需要确保回答结构清晰,分步骤说明可能的解决方法,并引用相关的参考资料(如用户提供的引用[^1]),说明修改参数的方法。</think>在ROS的`hector_mapping`软件包中更改生成地图的名称,可以通过以下步骤实现: --- ### **方法1:通过话题重映射(无需修改源码)** 1. **在启动文件中重映射地图话题** 修改`.launch`文件,将默认的`/map`话题重命名为自定义名称(例如`/custom_map`): ```xml <node pkg="hector_mapping" type="hector_mapping" name="hector_mapping" output="screen"> <!-- 其他参数 --> <remap from="map" to="custom_map" /> </node> ``` 保存地图时需指定话题名称: ```bash rosrun map_server map_saver -f custom_map_name map:=/custom_map ``` --- ### **方法2:修改参数(依赖软件包支持)** 1. **检查`hector_mapping`是否支持地图名称参数** 某些版本可能支持通过参数设置地图名称。例如,在启动文件中尝试设置: ```xml <param name="map_frame" value="custom_map" /> ``` 或通过YAML配置文件加载参数: ```yaml hector_mapping: map_frame: "custom_map" ``` --- ### **方法3:修改源码(需重新编译)** 1. **在源码中读取自定义参数** 找到发布地图话题的代码(通常在`hector_mapping`的`hector_mapping_node.cpp`或类似文件中),修改为从参数服务器读取名称: ```cpp std::string map_topic; ros::param::param<std::string>("~map_topic", map_topic, "map"); // 默认值"map" pub_map_ = nh_.advertise<nav_msgs::OccupancyGrid>(map_topic, 1); ``` 2. **在启动文件中传递参数** ```xml <param name="map_topic" value="custom_map" /> ``` --- ### **验证与保存地图** - 查看当前话题列表: ```bash rostopic list | grep map ``` - 保存地图时指定自定义名称: ```bash rosrun map_server map_saver -f output_name map:=/custom_map ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

熊猫 .

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

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

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

打赏作者

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

抵扣说明:

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

余额充值