【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
目前建图的方法一般有视觉建图和激光建图两种。其中激光建图,又可以分成hector、gmapping、cartographer这几种。要说最简单的建图方法,那还真是非hector莫属。因为hector建图的话,本身需要的数据类型非常少,只需要lidar的输入数据即可,不再需要其他的数据。当然,hector建图也有自己的缺点,比如说长走廊,就不太合适hector。当然我们这里只是为了演示hector的使用方法,可以先暂时不用考虑hector的缺点。
之前我们运行的环境时wpb_simple.launch,这是一个开放的环境。周围没有什么阻挡物,不太适合建图。因此,我们需要重新构建一个环境,即wpb_stage_slam.launch,这样输入roslaunch wpr_simulation wpb_stage_slam.launch,就可以看到这样的一个场景,

之前因为我们执行过./install_for_noetic.sh,所以这里其实已经安装了hector建图工具。所以,此时只需要执行rosrun hector_mapping hector_mapping即可。这个程序没有界面,只有一串信息打印,
- feixiaoxing@feixiaoxing-VirtualBox:~/Desktop/catkin_ws$ rosrun hector_mapping hector_mapping
- HectorSM map lvl 0: cellLength: 0.025 res x:1024 res y: 1024
- HectorSM map lvl 1: cellLength: 0.05 res x:512 res y: 512
- HectorSM map lvl 2: cellLength: 0.1 res x:256 res y: 256
- [ INFO] [1695888755.513829820]: HectorSM p_base_frame_: base_link
- [ INFO] [1695888755.514334898]: HectorSM p_map_frame_: map
- [ INFO] [1695888755.514401831]: HectorSM p_odom_frame_: odom
- [ INFO] [1695888755.514438917]: HectorSM p_scan_topic_: scan
- [ INFO] [1695888755.514475273]: HectorSM p_use_tf_scan_transformation_: true
- [ INFO] [1695888755.514511768]: HectorSM p_pub_map_odom_transform_: true
- [ INFO] [1695888755.514548172]: HectorSM p_scan_subscriber_queue_size_: 5
- [ INFO] [1695888755.514585010]: HectorSM p_map_pub_period_: 2.000000
- [ INFO] [1695888755.514621462]: HectorSM p_update_factor_free_: 0.400000
- [ INFO] [1695888755.514657209]: HectorSM p_update_factor_occupied_: 0.900000
- [ INFO] [1695888755.514692564]: HectorSM p_map_update_distance_threshold_: 0.400000
- [ INFO] [1695888755.514727980]: HectorSM p_map_update_angle_threshold_: 0.900000
- [ INFO] [1695888755.514765486]: HectorSM p_laser_z_min_value_: -1.000000
- [ INFO] [1695888755.514817751]: HectorSM p_laser_z_max_value_: 1.000000
虽然小车还没有移动,但是这个时候已经可以看到一点建图的效果。输入rosrun rviz rviz,通过添加RobotModel和Map,订阅/map话题,就可以看到这样的建图效果,

当前小车还没有移动功能。需要我们输入rosrun rqt_robot_steering rqt_robot_steering,通过速度和角度控制,就可以让小车开始移动起来了,最好让小车走完所有可以行走的空间。

移动小车的目的还是为了建图。通过移动小车,这样激光可以扫描到所有的空间,也就可以实现完整的建图过程了。

所有这一切都做好之后,就可以用map_server保存地图了。直接输入rosrun map_server map_saver即可。不出意外,我们会先看到这样的打印,
- feixiaoxing@feixiaoxing-VirtualBox:~/Desktop/catkin_ws$ rosrun map_server map_saver
- [ INFO] [1695889679.741268757]: Waiting for the map
- [ INFO] [1695889680.082678456, 1022.812000000]: Received a 1024 X 1024 map @ 0.025 m/pix
- [ INFO] [1695889680.098000854, 1022.821000000]: Writing map occupancy data to map.pgm
- [ INFO] [1695889680.164918813, 1022.856000000]: Writing map occupancy data to map.yaml
- [ INFO] [1695889680.165438028, 1022.856000000]: Done
等待一会之后,ls一下,可以看到多了两个文件,
- feixiaoxing@feixiaoxing-VirtualBox:~/Desktop/catkin_ws$ ls -l
- total 1044
- drwxrwxr-x 11 feixiaoxing feixiaoxing 4096 9月 27 09:57 build
- drwxrwxr-x 5 feixiaoxing feixiaoxing 4096 9月 26 14:56 devel
- -rw-rw-r-- 1 feixiaoxing feixiaoxing 1048630 9月 28 16:28 map.pgm
- -rw-rw-r-- 1 feixiaoxing feixiaoxing 131 9月 28 16:28 map.yaml
- drwxrwxr-x 5 feixiaoxing feixiaoxing 4096 9月 24 13:45 src
这多出来的文件,一个叫map.pgm,一个叫map.yaml。从大小来看,map.pgm就是地图文件数据,可以用gimp打开。而map.yaml是配置文件,内容如下所示,
- image: map.pgm
- resolution: 0.025000
- origin: [-12.812499, -12.812499, 0.000000]
- negate: 0
- occupied_thresh: 0.65
- free_thresh: 0.196
将pgm文件拷贝到windows平台,用gimp软件打开,就可以看到这个地图信息,其实就是一张图片,这就是我们要的地图数据。

注:
没有安装hector的同学可以通过sudo apt-get install ros-noetic-hector-slam安装。