hector是基于优化的算法(解最小二乘问题),优缺点:不需要里程计,但对于雷达帧率要求很高40Hz,估计6自由度位姿,可以适应空中或者地面不平坦的情况。初值的选择对结果影响很大,所以要求雷达帧率较高。
此算法主要使用高斯牛顿法对帧间匹配进行优化,并且使用多分辨率的地图,避免求解陷入局部极值。
算法已有成熟带代码包,实现起来十分简单,手持激光雷达即可建图。
此处附上代码下载链接:https://github.com/tu-darmstadt-ros-pkg/hector_slam
或:https://download.csdn.net/download/ustcyr/24576276
本人使用的雷达型号是rplidar A2。
1、安装雷达驱动
sudo apt-get install ros-kinetic-rplidar-ros
2、串口配置设备绑定USB端口号、此步骤可根据需求设置,建议设置,设置完成后,不需要考虑串口号,设备即插即用。
终端输入:
lsusb
会看到如下信息
Bus 002 Device 002: ID 0bda:0411 Realtek Semiconductor Corp.
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 8087:0a2b Intel Corp.
Bus 001 Device 004: ID 04f3:0c1a Elan Microelectronics Corp.
Bus 001 Device 003: ID 04f2:b5a3 Chicony Electronics Co., Ltd
Bus 001 Device 008: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 001 Device 007: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge / myAVR mySmartUSB light
Bus 001 Device 006: ID 0bda:5411 Realtek Semiconductor Corp.
Bus 001 Device 002: ID 046d:c077 Logitech, Inc. M105 Optical Mouse
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
ID 10c4:ea60表示usb设备的ID(这个ID由芯片制造商设置,可以唯一表示该设备),若不确定自己的激光雷达的设备号,可以插拔设备查看变化的串口设备。
在/etc/udev/rules.d/下创建任意名称的规则配置文件,如:usb.rules。
sudo gedit /etc/udev/rules.d/usb.rules
加入以下代码并保存:
KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0777", SYMLINK+="lidar_usb"
此时激光雷达设备对应的串口名称为lidar_usb.
注意:此处更改之后,设备启动的launch文件也要改,com口由ttyusb0改成lidar_usb.
下载雷达官方驱动
sudo apt-get install ros-kinetic-rplidar-ros
运行雷达
roslaunch rplidar_ros view_rplidar.launch
安装hector库
sudo apt-get install ros-kinetic-hector-slam
建立hector的launch文件
<launch>
<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="base_link" />
<!-- 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="2048"/>
<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="5.5" />
<param name="output_timing" value="false" />
<param name="pub_map_scanmatch_transform" value="true" />
<!--<param name="tf_map_scanmatch_transform_frame_name" value="scanmatcher_frame" />-->
<!-- 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>
<node pkg="tf" type="static_transform_publisher" name="base_to_laser_broadcaster" args="0 0 0 0 0 0 /base_link /laser 100"/>
<node pkg="rviz" type="rviz" name="rviz"
args="-d $(find hector_slam_launch)/rviz_cfg/mapping_demo.rviz"/>
</launch>
运行此launch文件即可。
另外,此处定义了base_link到laser的tf变化,因此不用加载机器人的urdf文件,会有冲突。