Gmapping+amcl的turtlebot实现和Gazebo仿真实现


Gmapping包提供了基于激光雷达的SLAM的方法,你可以通过一个移动机器人的激光雷达数据和位置数据来创建一个2D的栅格地图。

For more information, please click wiki tutorial

安装雷达驱动和gmapping

  1. 下载驱动包,一般将雷达驱动安装在~/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
  1. 编译包
$ cd ..
$ catkin_make
  1. 硬件连接,将rplidar通过usb与pc相连
  2. 查看usb的接口号
$ ls /dev/ttyUSB*

例如,返回 ttyusb0,要注意的是有的数据线只有充电功能,不能传输数据,如果查找不到应该首先更换数据线,查找到ttyusb0的话则设置为:

$ sudo chmod 666 /dev/ttyUSB0
  1. 打开两个新的终端,进行测试
$ 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="rplidarNode" pkg="rplidar_ros" type="rplidarNode"
output="screen">
<param name="serial_port" type="string" value="/dev/rplidar"/>
<param name="serial_baudrate" type="int" value="115200"/>
<param name="frame_id" type="string" value="laser"/>
<param name="inverted" type="bool" value="false"/>
<param name="angle_compensate" type="bool" value="true"/></node>
<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"/>
</launch>

增加 rplidar_gmapping_demo.launch 文件,用于启动 gmapping

$ roscd turtlebot_navigation
$ touch launch/rplidar_gmapping_demo.launch
$ rosed launch/rplidar_gmapping_demo.launch

输入内容:

<launch>
<!-- Define laser type-->
<arg name="laser_type" default="rplidar" />
<!-- laser driver -->
<include file="$(find turtlebot_navigation)/laser/driver/$(arg laser_type)_laser.launch" />
<!-- Gmapping -->
<arg name="custom_gmapping_launch_file" default="$(find
turtlebot_navigation)/launch/includes/gmapping/$(arg laser_type)_gmapping.launch.xml"/>
<include file="$(arg custom_gmapping_launch_file)"/>
<!-- Move base -->
<include file="$(find turtlebot_navigation)/launch/includes/move_base.launch.xml"/></launch>

设置 laser_type 为 rplidar.
增加 rplidar_gmapping.launch.xml 文件,执行 gmapping 建图

$ roscd turtlebot_navigation
$ touch launch/includes/gmapping/rplidar_gmapping.launch.xml
$ rosed launch/includes/gmapping/rplidar_gmapping.launch.xml

输入内容

<launch>
<arg name="scan_topic" default="scan" />
<arg name="base_frame" default="base_footprint"/>
<arg name="odom_frame" default="odom"/>
<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">
<param name="base_frame" value="$(arg base_frame)"/>
<param name="odom_frame" value="$(arg odom_frame)"/>
<param name="map_update_interval" value="0.01"/>
<param name="maxUrange" value="4.0"/>
<param name="maxRange" value="5.0"/>
<param name="sigma" value="0.05"/>
<param name="kernelSize" value="3"/>
<param name="lstep" value="0.05"/>
<param name="astep" value="0.05"/>
<param name="iterations" value="5"/>
<param name="lsigma" value="0.075"/>
<param name="ogain" value="3.0"/>
<param name="lskip" value="0"/>
<param name="minimumScore" value="30"/>
<param name="srr" value="0.01"/>
<param name="srt" value="0.02"/>
<param name="str" value="0.01"/>
<param name="stt" value="0.02"/>
<param name="linearUpdate" value="0.05"/>
<param name="angularUpdate" value="0.0436"/>
<param name="temporalUpdate" value="-1.0"/>
<param name="resampleThreshold" value="0.5"/>
<param name="particles" value="8"/>
<!--
<param name="xmin" value="-50.0"/>
<param name="ymin" value="-50.0"/>
<param name="xmax" value="50.0"/>
<param name="ymax" value="50.0"/>
make the starting size small for the benefit of the Android client's memory...-->
<param name="xmin" value="-1.0"/>
<param name="ymin" value="-1.0"/>
<param name="xmax" value="1.0"/>
<param name="ymax" value="1.0"/>
<param name="delta" value="0.05"/>
<param name="llsamplerange" value="0.01"/>
<param name="llsamplestep" value="0.01"/>
<param name="lasamplerange" value="0.005"/>
<param name="lasamplestep" value="0.005"/>
<remap from="scan" to="$(arg scan_topic)"/>
</node>
</launch>

以上,所有文件配置和安装完毕。

测试激光雷达 gmapping 构建地图

新开端口,打开 roscore

$ roscore

开新端口,启动turtlebot

$ roslaunch turtlebot_bringup minimal.launch

新开端口,启动 gmapping,用于构建地图

$ roslaunch turtlebot_navigation rplidar_gmapping_demo.launch

新开端口,启动键盘操作 Turtlebot

$ roslaunch turtlebot_teleop keyboard_teleop.launch

新开端口,启动 rviz,实时查看建图情况

$ roslaunch turtlebot_rviz_launchers view_navigation.launch

在通过调整机器人位姿构建好完整地图后结束并保存地图,新开端口并建立目录保存地图

$ mkdir -p ~/map
$ rosrun map_server map_saver -f ~/map/rplidar_gmapping
$ ls ~/map #查看内容,包含 rplidar_gmapping.pgm rplidar_gmapping.yaml

查看地图,已经生成 rplidar_gmapping.pgm 文件,可以用图像浏览器(gimp, eog, gthumb, 等等)打开查看。

利用地图进行amcl导航

$ roslaunch turtlebot_bringup minimal.launch
$ roslaunch turtlebot_navigation rplidar_amcl_demo.launch
map_file:=/home/用户名/map/carto_map_1.yaml

也可打开rplidar_amcl_demo.launch文件,修改地图文件固定地图,则无需上述命令后缀。
如果你看到 odom received! 说明已经正常运行。如果你收到一个警告:Waiting on transform…,先重启 minimal.launch,重新启动rplidar_amcl_demo.lauch。您可能需要尝试重新启动几次。同时,关闭 Kobuki 并重启。
turtlebot 成功运行,在工作站运行:

$ roslaunch turtlebot_rviz_launchers view_navigation.launch --screen

常见问题 ,rviz不显示地图数据,这种情况可能是/home/shall/catkin_ws/src/turtlebot_apps/turtlebot_navigation/laser/driver 中 的rplidar_laser.launch 文件没有添加 tf 节点相关的信息,并且需要根据雷达所在位置设定相应的参数;

Gazebo下的实现

建图

$ roscore
$ roslaunch turtlebot_gazebo turtlebot_world.launch
$ roslaunch turtlebot_gazebo gmapping_demo.launch
$ roslaunch turtlebot_teleop keyboard_teleop.launch
$ roslaunch turtlebot_rviz_launchers view_navigation.launch

导航

启动 Gazebo
$ roslaunch turtlebot_gazebo turtlebot_world.launch
启动导航演示
$ roslaunch turtlebot_gazebo amcl_demo.launch
启动 Rviz
$ roslaunch turtlebot_rviz_launchers view_navigation.launch
启动自制运行脚本或其他控制方式
$ python ~/helloworld/turtlebot/goforward_and_avoid_obstacle.py

Note:

Gmapping的运算效果不如cartographer,如果你追求高精度建图的效果,请选用合适的雷达并调整参数使用cartographer方法。如果只是进行SLAM算法测试,那么使用Gmapping是最好的选择。

以上是关于在Turtlebot下及Gazebo下gmapping+amcl的实现。后续还会介绍基于多机器人编队的避障算法
码字不易,喜欢的话请点赞收藏关注哦,您的支持是博主最大的动力。

博主有两年多ROS的使用经验,目前仍在不停研究中。本系列ROS及SLAM进阶教程将涵盖ROS的进阶功能使用、机器人SLAM及导航的设计及研究等领域,持续不断更新中。如果大家有相关问题或发现作者漏洞欢迎私戳,同时欢迎关注收藏。
同时欢迎关注博主Git:
https://github.com/LiHongbo97

  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RedGlass_lee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值