移动机器人在环境中获取障碍物的具体位置、房间的内部轮廓等信息都是非常必要的,这些信息是机器人创建地图、进行导航的基础数据。考虑成本,入手了一个SLAMTEC公司的低成本二维激光雷达RpLidar A1进行初步的学习,它可以最快10hz的频率检测360度范围内的障碍物信息,最远检测距离12米,适合室内移动机器人使用。本文讲解如何使用它感知周围环境。
一、准备工作
1、安装ros对应驱动功能包rplidar
sudo apt install ros-melodic-rplidar-ros
2、硬件连接
接好连接线并插到usb口上,激光雷达会开始旋转。
检查激光雷达是否被正常识别:
lsusb|grep Cygnal
二、测试激光雷达
1、启动激光node节点
roscore
rosrun rplidar_ros rplidarNode
[ INFO] [1593424905.411970119]: RPLIDAR running on ROS package rplidar_ros. SDK Version:1.7.0
RPLIDAR S/N: CCE39A87C5E392D5A5E492F85C36316B
[ INFO] [1593424907.918969787]: Firmware Ver: 1.25
[ INFO] [1593424907.919051349]: Hardware Rev: 5
[ INFO] [1593424907.920679886]: RPLidar health status : 0
2、查看激光雷达topic输出的数据
# 查看topic
rostopic list -v|grep scan
* /scan [sensor_msgs/LaserScan] 1 publisher
# 查看输出数据格式定义
rosmsg show sensor_msgs/LaserScan
std_msgs/Header header
uint32 seq
time stamp
string frame_id
float32 angle_min
float32 angle_max
float32 angle_increment
float32 time_increment
float32 scan_time
float32 range_min
float32 range_max
float32[] ranges
float32[] intensities
# 输出topic内容
rostopic echo /scan
三、激光数据可视化
# 使用rplidar功能包在rviz中查看激光雷达数据(frame=laser、RPLidarLaserScan Topic=/scan)
roslaunch rplidar_ros view_rplidar.launch
四、使用激光雷达进行SLAM定位建图
SLAM(Simultaneous Localization and Mapping 实时定位与建图)可以简单的理解为机器人在未知环境中从一个未知位置开始移动,移动过程中根据位置估计和地图进行自身定位,同时生成增量式地图,以实现机器人在未知环境中的自主定位和导航。
要完成机器人的slam和自主导航,机器人首先要有感知周围环境的能力,尤其要有感知深度(即距离)信息的能力,激光雷达(价格贵)、双目摄像头(标定较为复杂、运算量大)、RGB-D摄像头(视野窄、盲区大、噪声大)都具备探测深度的能力。
目前slam有较多的开源实现,例如gmapping、hector_slam、cartographer、rgbdslam、orb_slam、move_base、amcl等。本文不详细讨论slam的算法实现,先教会大家怎么使用这些开源库,在后续文章中再深入学习。
# 依赖包
sudo apt install ros-melodic-fake-localization ros-melodic-map-server ros-melodic-hector-slam ros-melodic-gmapping ros-melodic-slam-gmapping ros-melodic-open-karto ros-melodic-slam-karto
# 编辑slam launch
cd /opt/ros/melodic/share/rplidar_ros/launch/
sudo vim hectormapping.launch #不需要里程计数据,只根据激光信息即可构建地图
<launch>
<node pkg="tf" type="static_transform_publisher" name="link1_broadcaster" args="1 0 0 0 0 0 base_link laser 100" />
<node pkg="hector_mapping" type="hector_mapping" name="hector_height_mapping" output="screen">
<param name="scan_topic" value="scan" />
<param name="base_frame" value="base_link" />
<param name="odom_frame" value="base_link" />
<param name="output_timing" value="false"/>
<param name="advertise_map_service" value="true"/>
<param name="use_tf_scan_transformation" value="true"/>
<param name="use_tf_pose_start_estimate" value="false"/>
<param name="pub_map_odom_transform" value="true"/>
<param name="map_with_known_poses" value="false"/>
<param name="map_pub_period" value="0.5"/>
<param name="update_factor_free" value="0.45"/>
<param name="map_update_distance_thresh" value="0.02"/>
<param name="map_update_angle_thresh" value="0.1"/>
<param name="map_resolution" value="0.05"/>
<param name="map_size" value="1024"/>
<param name="map_start_x" value="0.5"/>
<param name="map_start_y" value="0.5"/>
node>
launch>
# 编辑view slam launch
sudo vim view_slam.launch
<launch>
<include file="$(find rplidar_ros)/launch/rplidar.launch" />
<include file="$(find rplidar_ros)/launch/hectormapping.launch" />
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find rplidar_ros)/rviz/slam.rviz" />
launch>
# 测试hector slam并通过rviz展示
roslaunch rplidar_ros view_slam.launch
手持rplidar雷达绕着屋子大概转了转,构建出的地图:(map topic是hector_mapping发布的地图珊格数据)
可以看到建出来的地图效果不太好,这里有个原因是手拿着雷达移动时高度和角度都不稳定,下一步我们把它固定到小车上。
五、坦克小车SLAM建图
1、安装到树莓派
为了方便在小车上使用,我们需要把相关环境安装到树莓派上。
# 安装rplidar、hector、gmapping源码包
cd ~/ros_catkin_ws
rosinstall_generator desktop rosserial rplidar_ros hector_slam gmapping slam_gmapping --rosdistro melodic --deps --wet-only --tar > melodic-desktop-wet.rosinstall
wstool merge -t src melodic-desktop-wet.rosinstall
wstool update -t src
rosdep install -y --from-paths src --ignore-src --rosdistro melodic -r --os=debian:$(lsb_release -cs)
sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/melodic
# 测试rplidar
roslaunch rplidar_ros view_rplidar.launch
*注:树莓派USB电流问题:
树莓派USB输出电流是1200mA,rplidar的启动电源电流需要1500mA,所以热插拔会导致系统重启,所以一定先关机再插拔rplidar。
2、构建地图并保存
# 测试slam
roslaunch rplidar_ros view_slam.launch
好了,本文就讲到这里,下一篇我们让小车脱离数据线的束缚,构建完整的地图并进行路径规划和避障。
yan 7.12 22:08