续接上一篇文章:【工作】四足机器狗-云深处绝影X20-三维雷达数据转单线雷达数据-pointcloud_to_laserscan-CSDN博客
前面已经拿到了多线激光雷达构建的ROS下的单线激光雷达扫描数据,在此基础上可采用2D SLAM方法构建栅格地图,解决三维点云地图转换栅格地图效果极差的问题。
本文首先采用gmapping slam,但后续了解到没有里程计数据,故使用Hector SLAM,只需要激光扫描数据,具体的见ROS官方链接:hector_mapping - ROS Wiki
但其实使用gmapping也可以,odometry信息可以通过一个ROS包激光点云匹配的方式实现,在此备忘: laser_scan_matcher 功能包 laser_scan_matcher - ROS Wiki
本文硬件平台,四足机器狗:
运行环境:
1、Ubuntu16.04
2、ROS kinetic
准备工作:
1、确保Hector SLAM源码已安装
sudo apt-get install ros-kinetic-hetor-slam
2、我直接在前文创建的pointcloud_to_laserscan的工作空间下,编写launch文件
命名为hector.launch,具体内容如下:
<launch>
<!-- start hector_mapping node -->
<node pkg = "hector_mapping" type="hector_mapping" name="hector_mapping" output="screen">
<!-- Frame names -->
<param name="pub_map_odom_transform" value="true"/>
<param name="map_frame" value="map" />
<param name="base_frame" value="base_link" />
<param name="odom_frame" value="odom" />
<!-- Tf use -->
<param name="use_tf_scan_transformation" value="true"/>
<param name="use_tf_pose_start_estimate" value="false"/>
<!-- Map size / start point -->
<param name="map_resolution" value="0.05"/>
<param name="map_size" value="8192"/>
<param name="map_start_x" value="0.5"/>
<param name="map_start_y" value="0.5" />
<param name="laser_z_min_value" value = "-1.0" />
<param name="laser_z_max_value" value = "1.0" />
<param name="map_multi_res_levels" value="2" />
<param name="map_pub_period" value="2" />
<param name="laser_min_dist" value="0.4" />
<param name="laser_max_dist" value="30.0" />
<param name="output_timing" value="false" />
<param name="pub_map_scanmatch_transform" value="true" />
<!-- Map update parameters -->
<param name="update_factor_free" value="0.4"/>
<param name="update_factor_occupied" value="0.7" />
<param name="map_update_distance_thresh" value="0.2"/>
<param name="map_update_angle_thresh" value="0.06" />
<!-- Advertising config -->
<param name="advertise_map_service" value="true"/>
<param name="scan_subscriber_queue_size" value="5"/>
<param name="scan_topic" value="scan"/>
</node>
<!-- transform between base_link and odom/laser -->
<node pkg="tf" type="static_transform_publisher" name="baselink_to_laser" args="0 0 0 0 0 0 /base_link /laser 100" />
<node pkg="tf" type="static_transform_publisher" name="map_to_odom" args="0 0 0 0 0 0 /odom /base_link 100" />
<!-- start rviz -->
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find hector_slam_launch)/rviz_cfg/mapping_demo.rviz"/>
</launch>
另外, RoboSense速腾聚创雷达的frame id是rslidar,所以要修改laser为rslidar,才能正常运行,上述launch文件修改部分为:
<!-- transform between base_link and odom/laser -->
<node pkg="tf" type="static_transform_publisher" name="baselink_to_laser" args="0 0 0 0 0 0 /base_link /rslidar 100" />
<node pkg="tf" type="static_transform_publisher" name="map_to_odom" args="0 0 0 0 0 0 /odom /base_link 100" />
开始工作:
1、打开终端,输入以下命令启动四足机器狗激光雷达以及IMU等数据传感器:
cd ~/mapping_nav_scripts
./rslidar_imu.sh
2、打开终端输入以下命令启动pointcloud_to_laserscan功能包,构建单线激光雷达数据:
cd到工作空间并source
roslaunch pointcloud_to_laserscan point_to_scan.launch
3、打开终端输入以下命令启动Hector SLAM
cd到工作空间并source
roslaunch pointcloud_to_laserscan hector.launch
由于目前房间过道被占用,只建立了此房间的一部分地图,经测试可用:
(后续再补上室内全图)
由此可见直接通过3D LiDAR建立的栅格地图相比三维点云地图转化而成的效果大大改善,也不需要通过软件人工的修改。
对比三维点云地图转化而成的栅格地图:
至此,建立了后续导航navigation可用的栅格地图。
后面将基于此,完成导航工作。