【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        目前建图的方法一般有视觉建图和激光建图两种。其中激光建图,又可以分成hector、gmapping、cartographer这几种。要说最简单的建图方法,那还真是非hector莫属。因为hector建图的话,本身需要的数据类型非常少,只需要lidar的输入数据即可,不再需要其他的数据。当然,hector建图也有自己的缺点,比如说长走廊,就不太合适hector。当然我们这里只是为了演示hector的使用方法,可以先暂时不用考虑hector的缺点。

1、构建一个虚拟场景

        之前我们运行的环境时wpb_simple.launch,这是一个开放的环境。周围没有什么阻挡物,不太适合建图。因此,我们需要重新构建一个环境,即wpb_stage_slam.launch,这样输入roslaunch wpr_simulation wpb_stage_slam.launch,就可以看到这样的一个场景,

2、运行hector程序

        之前因为我们执行过./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

3、利用rviz查看建图效果

        虽然小车还没有移动,但是这个时候已经可以看到一点建图的效果。输入rosrun rviz rviz,通过添加RobotModel和Map,订阅/map话题,就可以看到这样的建图效果,

4、移动小车,构建完整的小车地图

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

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

    

5、保存地图

        所有这一切都做好之后,就可以用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安装。如果是希望可以重复建图,那么通过rosbag命令把数据记录下来,方便下次建图使用。而如果自己的文件格式不是rosbag,那么就需要自己写一个node,把对应的lidar数据发布出来。注意,此外还要配置hector的launch文件,其中base_link到laser_frame的转换最为重要,

<launch>

	<!-- Hector SLAM-->
    <node pkg="hector_mapping" type="hector_mapping" name="hector_mapping">
		<param name="map_frame" value="map" />
		<param name="base_frame" value="base_link" />
		<param name="odom_frame" value="base_link" />

		<param name="map_resolution" value="0.05"/>
		<param name="map_size" value="2048"/>


		<param name="update_factor_free" value="0.4"/>
		<param name="update_factor_occupied" value="0.7" /> 

		<param name="map_update_distance_thresh" value="0.5" />
        <param name="map_update_angle_thresh" value="0.5" />
        <param name="map_pub_period" value="0.2" />
		
    </node>
	<node pkg="tf" type="static_transform_publisher" name="base_to_laser_broadcaster" args="0 0 0 0 0 0 /base_link /laser_frame 100"/>

</launch>

        如果需要显示lidar数据,可以选择添加LaserScan,继续选择/scan这个topic就可以。开始建图后添加LaseScan,显示的大小设置为0.05。再进一步,如果还想看小车的坐标的话,可以添加一个TF即可。

更多推荐