前面两篇文章进行了激光雷达的测试和三维点云转二维,这里就可以进行slam建图了,我们这里采用hector_slam包进行建图。
1,安装hector_slam
cd ~/catkin_ws/src
git clone https://github.com/tu-darmstadt-ros-pkg/hector_slam
cd ~/catkin_ws
catkin_make
2,修改tutorial.launch文件
cd ~/catkin_ws/src/hector_slam/hector_slam_launch/launch
gedit tutorial.launch
将原来的文件改为如下:
<?xml version="1.0"?>
<launch>
<arg name="geotiff_map_file_path" default="$(find hector_geotiff)/maps"/>
<param name="/use_sim_time" value="false"/>
<node pkg="rviz" type="rviz" name="rviz"
args="-d $(find hector_slam_launch)/rviz_cfg/mapping_demo.rviz"/>
<include file="$(find hector_mapping)/launch/mapping_default.launch"/>
<include file="$(find hector_geotiff)/launch/geotiff_mapper.launch">
<arg name="trajectory_source_frame_name" value="scanmatcher_frame"/>
<arg name="map_file_path" value="$(arg geotiff_map_file_path)"/>
</include>
<node pkg="tf" type="static_transform_publisher" name="map_to_odom" args="0.0 0.0 0.0 0 0 0.0 /odom /base_link 10"/>
<node pkg="tf" type="static_transform_publisher" name="base_frame_laser" args="0 0 0 0 0 0 /base_link /laser 10"/>
</launch>
主要做了两点修改:
- 将
<param name="/use_sim_time" value="false"/>
中的true改为false; - 添加了两个tf变换坐标。
3,修改mapping_default.launch文件
上一步骤中修改了tf坐标的名称,这里也需要在对应的地方那个修改。如下:
cd ~/catkin_ws/src/hector_slam/hector_mapping/launch
gedit mapping_default.launch
修改如下:
<arg name="base_frame" default="base_link"/>
<arg name="odom_frame" default="base_link"/>
4,修改rslidar中的frame_id
由于hector_slam从激光雷达处订阅的frame_id为laser, 而激光雷达发布的frame_id为rslidar,因此需要对rslidar中的源码进行修改,并重新编译。如下:
#源码位置
cd ~/catkin_ws/src/ros_rslidar/rslidar_driver/src
gedit rsdriver.cpp
将private_nh.param("frame_id", config_.frame_id, std::string("rslidar"));
中的rslidar改为laser
#重新编译rslidar_ros
cd ~/catkin_ws/src
catkin_make
5,创建slam.launch文件
cd ~/catkin_ws/src/ros_rslidar/rslidar_pointcloud/launch
gedit slam.launch
在创建的空文本中输入如下:
<launch>
<include file="$(find rslidar_pointcloud)/launch/rs_lidar_16.launch" />
<include file="$(find pointcloud_to_laserscan)/launch/point_to_scan.launch" />
<include file="$(find hector_slam_launch)/launch/tutorial.launch" />
</launch>
第一个是启动激光雷达,第二个是将三维point转换为二维scan,第三个是执行hector_slam功能。
这里需要注意的是,第一个和第三个都启动了rviz,需要将第一个launch文件中的rviz注释掉。如下:
cd ~/catkin_ws/src/ros_rslidar/rslidar_pointcloud/launch
gedit rs_lidar_16.launch
rviz注释掉:
<!-- <node name="rviz" pkg="rviz" type="rviz" args="-d $(find rslidar_pointcloud)/rviz_cfg/rslidar.rviz" /> -->
7,启动slam.launch 文件
roslaunch rslidar_pointcloud slam.launch
正常的话便会显示如下,手持雷达平稳移动,便会对周围的环境进行建图:
看下节点流程图rqt_graph
,如下: