ROS及SLAM进阶教程(八)Gmapping的turtlebot实现和Gazebo仿真实现
Gmapping包提供了基于激光雷达的SLAM的方法,你可以通过一个移动机器人的激光雷达数据和位置数据来创建一个2D的栅格地图。
For more information, please click wiki tutorial
安装雷达驱动和gmapping
- 下载驱动包,一般将雷达驱动安装在~/catkin/src/中:
$ git clone https://github.com/robopeak/rplidar_ros.git
# 以及三个源码包
$ git clone https://github.com/ros-perception/slam_gmapping
$ git clone https://github.com/ros-perception/openslam_gmapping
$ git clone https://github.com/ros-planning/navigation.git
或者通过直接安装的方式
$ apt-cache search ros-kinetic #查看可用的软件包列表
$ sudo apt-get install ros-kinetic-slam-gmapping
$ sudo apt-get install ros-kinetic-openslam-gmapping
$ sudo apt-get install ros-kinetic-navigation
- 编译包
$ cd ..
$ catkin_make
- 硬件连接,将rplidar通过usb与pc相连
- 查看usb的接口号
$ ls /dev/ttyUSB*
例如,返回 ttyusb0,要注意的是有的数据线只有充电功能,不能传输数据,如果查找不到应该首先更换数据线,查找到ttyusb0的话则设置为:
$ sudo chmod 666 /dev/ttyUSB0
- 打开两个新的终端,进行测试
$ roscore #第一个终端
$ cd ~/catkin_ws
$ source devel/setup.bash
$ roslaunch rplidar_ros view_rplidar.launch
Note
:如果出现以下错误
[rplidarNode-1] process has died [pid 18250, exit code 255, cmd....
该问题出现的原因是 rplidar 没有获取数据造成的,很可能的原因是 USB 接口的编号错误,rplidar 应该接到 USB 0 上,可以通过 ls /dev/ttyUSB* 检查设备所链接的 USB 接口编号。
解决方法
:拔下其他 USB 设备先将 rplidar 连接上去,再接其他设备,这样可以保证 rplidar 位于 USB0 接口上。
制作雷达驱动文件
首先要创建rplidar的串口别名。
确认 idVendor 和 idProduct,ID 后面的部分idVendor:idProduct
$ lsusb
# 输出结果包含:
Bus 001 Device 006: ID 10c4:ea60
新建 /etc/udev/rules.d/rplidar.rules 文件,内容如下:(别名为 rplidar,实际名称为:/dev/rplidar)
$ sudo gedit /etc/udev/rules.d/rplidar.rules
#复制以下内容
KERNEL=="ttyUSB*", ATTRS{
idVendor}=="10c4", ATTRS{
idProduct}=="ea60", MODE:="0666",
GROUP:="dialout", SYMLINK+="rplidar"
增加当前用户对串口的默认访问权限:
$ sudo usermod -a -G dialout 用户名
使 UDEV 配置生效:(使串口的默认访问权限生效,需要重启机器)
$ sudo service udev reload
$ sudo service udev restart
修改好串口名后,我们制作雷达驱动文。
复制 rplidar.launch 到 rplidar-laser.launch,并增加 TF 定义:
$ roscd turtlebot_navigation
$ mkdir -p laser/driver
$ sudo cp ~/turtlebot_ws/src/rplidar_ros/launch/rplidar.launch laser/driver/rplidar_laser.launch
打开 rplidar_laser.launch,并修改
$ rosed turtlebot_navigation rplidar_laser.launch
检查 frame_id 是否指定为 laser
<param name="frame_id" type="string" value="laser"/>
检查端口:
<param name="serial_port" type="string" value="/dev/rplidar"/>
设置好别名,或直接端口/dev/ttyUSB0。
增加TF:
<node pkg="tf" type="static_transform_publisher" name="base_to_laser" args="0.0 0.0 0.18 0 0.0
0.0 base_link laser 100"/>
修 改 为 args="0.0 0.0 0.18 0 0.0 0.0"
为 自 己 的 实 际 安 装 位 置 。 这六个值分别表示:x y z yaw pitch roll
这里我假设底盘的中心点为 0,雷达放在机器人托盘中心位置,X 为 0,高度为18CM,Z 为 0.18m。TF 的单位使用米的,测量单位是 CM
完整代码如下:
<launch>
<node name="