简介
hector_mapping是一种在没有里程计的slam方法,也可以在显示pitch/roll运动平台上使用。它利用了现代激光雷达系统的高更新率,如Hokuyo UTM-30LX,并在传感器的扫描速率下提供2D姿态估计(UTM-30LX为40Hz)。虽然该系统不提供显式闭环功能,但对于许多现实世界的场景来说,它足够准确。该系统已成功用于无人地面机器人,无人地面车辆,手持测绘设备和四旋翼无人机的记录数据。
相关论文:A flexible and scalable SLAM system with full 3D motion estimation
传送门:论文下载直达
功能包介绍
1.0 订阅的话题
0. scan (sensor_msgs/LaserScan) 必要的雷达扫描数据
1. <scan frame> → base_frame 必要的TF
2. syscommand (std_msgs/String) 系统命令。如果字符串等于"reset",则地图和机器人姿势被重置到初始状态
1.1 发布的主题及服务及TF
话题
0. map_metadata (nav_msgs/MapMetaData) 地图的元数据
1. map (nav_msgs/OccupancyGrid) 地图数据,该数据被锁存并定期更新
2. slam_out_pose (geometry_msgs/PoseStamped) 无协方差的机器人姿态估计
3. poseupdate (geometry_msgs/PoseWithCovarianceStamped) 机器人姿态估计带有高斯估计不确定性
服务
0. dynamic_map (nav_msgs/GetMap) 请求后以得到地图数据
1. reset_map (std_srvs/Trigger) 调用此服务以重置地图,hector重建全新的地图。注意,不会重启机器人的姿势,将从最后记录的姿势重新启动
2. pause_mapping (std_srvs/SetBool) 调用此服务来停止/开始处理激光扫描
3. restart_mapping_with_new_pose (hector_mapping/ResetMapping) 调用这个服务来重置地图,机器人的姿势,并恢复映射(如果暂停)
TF
0. map → odom 构建的地图坐标系到里程计坐标系的变换
1.3 整体框图
配置使用
2.0 二进制安装
sudo apt-get install ros-<ros版本>-hector-slam
如
sudo apt install ros-noetic-hector-slam
2.1 launch文件配置
launch文件配置
<launch>
<node pkg = "hector_mapping" type="hector_mapping" name="hector_mapping" output="screen">
<param name="scan_topic" value="scan"/>
<!-- frame name config -->
<param name="map_frame" value="map" /> <!-- 地图参考系名称 -->
<param name="base_frame" value="base_footprint" /> <!-- 基参考系名称 -->
<param name="odom_frame" value="odom" /> <!-- 里程计参考系名称 -->
<!-- TF -->
<param name="use_tf_scan_transformation" value="true"/>
<param name="use_tf_pose_start_estimate" value="false"/>
<!-- map config -->
<param name="map_resolution" value="0.05"/> <!-- 默认值0.025,地图分辨率(m) -->
<param name="map_size" value="2048"/> <!-- 默认值1024,正方形地图边长栅格数目 -->
<param name="map_start_x" value="0.5"/> <!-- 默认值0.5为居中,x轴上,map参考系的原点上相对于栅格地图的位置 -->
<param name="map_start_y" value="0.5" /> <!-- 默认值0.5为居中,y轴上,map参考系的原点上相对于栅格地图的位置 -->
<param name="map_multi_res_levels" value="2" /> <!-- 默认值3,地图多分辨率栅格级别的数量 -->
<param name="map_update_distance_thresh" value="0.4"/> <!-- 默认值0.4,每移动此长度(m)后进行地图的更新 -->
<param name="map_update_angle_thresh" value="0.06"/> <!-- 默认值0.9,每旋转此角度(rad)后进行地图的更新 -->
<param name="update_factor_free" value="0.4"/> <!-- 默认值0.4,地图更新调整关于自由单元,范围[0.0. 1.0],0.5意味着不改变 -->
<param name="update_factor_occupied" value="0.9" /> <!-- 默认值0.9,地图更新调整关于占用单元,范围[0.0. 1.0],0.5意味着不改变 -->
<!-- laser config -->
<param name="laser_min_dist" value="0.4" /> <!-- 默认值0.4,系统使用的雷达扫描点的最小距离(m),即扫面点小于此值时被忽略 -->
<param name="laser_max_dist" value="5.5" /> <!-- 默认值30.0,系统使用的雷达扫描点的最大距离(m),即扫面点大于此值时被忽略 -->
<param name="laser_z_min_value" value="-1.0" /> <!-- 默认值-1.0,系统使用的雷达扫描点相对于雷达参考系的最小高度(m),即扫面点小于此值时被忽略 -->
<param name="laser_z_max_value" value="1.0" /> <!-- 默认值1.0,系统使用的雷达扫描点相对于雷达参考系的最大高度(m),即扫面点大于此值时被忽略 -->
<!-- pub config -->
<param name="advertise_map_service" value="true"/>
<param name="map_pub_period" value="2.0" /> <!-- 默认值2.0,map发布的周期(s) -->
<param name="pub_map_odom_transform" value="true"/> <!-- 默认值true,决定系统是否发布 map-odom 的TF -->
<param name="pub_map_scanmatch_transform" value="true" /> <!-- 默认值true,决定系统是否发布 scanmatcher-map 的TF,参考系名称由“tf_map_scanmatch_transform_frame_name”参数确定。 -->
<param name="output_timing" value="false" /> <!-- 默认值false,决定是否通过ROS_INFO输出每次雷达扫描处理的时序信息 -->
<param name="scan_subscriber_queue_size" value="5"/> <!-- 默认值5,scan订阅的队列大小,如果将日志文件以比实时速度更快的速度播放到hector_mapping,则应置为较高的值(如50) -->
<!-- other config -->
<param name="tf_map_scanmatch_transform_frame_name" value="scanmatcher_frame"/> <!-- 默认值scanmatcher_frame,参数使用见其他参数配置 -->
</node>
</launch>
注意事项
后面遇到在补充吧