《ROS理论与实践》学习笔记机器人SLAM建图

Posted Sakurazzy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《ROS理论与实践》学习笔记机器人SLAM建图相关的知识,希望对你有一定的参考价值。

在学习《ROS理论与实践》课程时,记录了学习过程中的编程练习,课后作业以及发现的问题,后续会对尚未解决的问题继续分析并更新,纯小白,仅供参考。
本次学习笔记关于课程中的第八讲:机器人SLAM建图 。主要学习了SLAM原理、ROS机器人与数据结构、常用SLAM功能包应用。


课程内容

常用SLAM功能包应用

首先对课程代码包进行编译,出现以下错误:

$ qmake: could not exec '/usr/lib/x86_64-linux-gnu/qt4/bin/qmake': No such file or directory

原因是没有安装qt4-qmake功能包,解决方法:

$ sudo apt-get install qt4-qmake

再次编译又出现以下问题:

$ CMake Error at /usr/share/cmake-3.10/Modules/FindQt4.cmake:628 (message):
  Could NOT find QtCore.

原因是CMake找不到QT4,解决方法:

$ sudo apt install cmake gcc g++ qt{4,5}-qmake libqt4-dev

再次编译又出现以下问题:

$ Could not find a package configuration file provided by "move_base_msgs"

原因是缺少move_base_msgs这个消息,来自navigation功能包,解决方法:

$ sudo apt-get install ros-melodic-navigation

gmapping

1.简介
gmapping功能包是最常用的slam功能包应用之一,需要机器人提供深度信息、IMU信息和里程计信息,基于激光雷达,使用了OpenSlam开源算法,输出的地图话题为:nav_msgs/OccupancyGrid
2.功能包安装

$ sudo apt-get install ros-melodic-gmapping

在这里插入图片描述
3.启动例程(激光雷达):

$ roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
$ roslaunch mbot_navigation gmapping_demo.launch
$ roslaunch mbot_teleop mbot_teleop.launch

4.保存地图:

$ rosrun map_server map_saver -f cloister_gmapping

地图将会保存为yaml配置文件和pgm图片文件
实际运行效果:
在这里插入图片描述在这里插入图片描述
5.启动例程(Kinect):

$ roslaunch mbot_gazebo mbot_kinect_nav_gazebo.launch
$ roslaunch mbot_navigation gmapping_demo.launch
$ roslaunch mbot_teleop mbot_teleop.launch

使用Kincet会产生机器人位置跳变的情况,尤其是在缺少特征点的情况下

hector

1.简介
hector也是最常用的slam功能包应用之一,相比于gmapping不需要里程计信息
2.安装hector_slam

$ git clone https://github.com/tu-darmstadt-rps-pkg/hector_slam.git

在这里插入图片描述2.启动例程

$ roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
$ roslaunch mbot_navigation hector_demo.launch
$ roslaunch mbot_teleop mbot_teleop.launch

在这里插入图片描述

如果在转弯时速度过快,使用hector容易出现上图这样的打滑现象,这是因为hector仅使用深度信息

cartographer

1.简介
cartographer基于图网络的优化方法,在计算资源有限的情况下,实时获取相对较高精度的2D地图,来自谷歌开源
2.安装功能包

$ sudo apt-get install ros-melodic-cartographer-*

2.启动例程

$ roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
$ roslaunch mbot_navigation cartographer_demo.launch
$ roslaunch mbot_teleop mbot_teleop.launch

3.保存地图

$ rosservice call /finish_trajectory 0
$ rosservice call /write_state "{filename:'${HOME}/mymap.pbstream'}"
$ rosrun cartographer_ros cartographer_pbstream_to_ros_map -map_filestem=${HOME}/mymap -pbstream_filename=${HOME}/mymap.pbstream -resolution=0.05

在这里插入图片描述

rtabmap

1.简介
rtabmap用于三维建图
2.功能包安装

$ sudo apt-get install ros-melodic-rtabmap-ros

2.启动例程

$ roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
$ roslaunch mbot_navigation rtabmap_demo.launch
$ roslaunch mbot_teleop mbot_teleop.launch

3.查看见图结果

$ rtabmap-databaseViewer ~/.ros/rtabmap.db

本讲作业

1.在Gazebo中构建一个用于建图和导航的虚拟环境

Building Editor工具的具体用法在之前提过,在这里直接创建了如下的world,命名为ch9_myroom
在这里插入图片描述

2.将自己构建的机器人模型放置到虚拟环境中,使用gmapping和hector功能包实现SLAM地图构建

需要将激光雷达加入到自己构建的xacro模型中,这里贴出了新增的代码:

 <xacro:include filename="$(find mybot_description)/urdf/sensors/lidar_gazebo.xacro" />
 
 <xacro:property name="lidar_offset_x" value="0.1" />
 <xacro:property name="lidar_offset_y" value="0" />
 <xacro:property name="lidar_offset_z" value="0.06" />
 
 <!-- lidar -->
 <joint name="lidar_joint" type="fixed">
     <origin xyz="${lidar_offset_x} ${lidar_offset_y} ${lidar_offset_z}" rpy="0 0 0" />
     <parent link="base_link"/>
     <child link="laser_link"/>
 </joint>

 <xacro:rplidar prefix="laser"/>

启动刚创建的world文件并且把自己的模型放进去:

<launch>

    <!-- 设置launch文件的参数 -->
    <arg name="world_name" value="$(find mybot_gazebo)/worlds/ch9_myroom.world"/>
    <arg name="paused" default="false"/>
    <arg name="use_sim_time" default="true"/>
    <arg name="gui" default="true"/>
    <arg name="headless" default="false"/>
    <arg name="debug" default="false"/>

    <!-- 运行gazebo仿真环境 -->
    <include file="$(find gazebo_ros)/launch/empty_world.launch">
        <arg name="world_name" value="$(arg world_name)" />
        <arg name="debug" value="$(arg debug)" />
        <arg name="gui" value="$(arg gui)" />
        <arg name="paused" value="$(arg paused)"/>
        <arg name="use_sim_time" value="$(arg use_sim_time)"/>
        <arg name="headless" value="$(arg headless)"/>
    </include>

    <!-- 加载机器人模型描述参数 -->
    <param name="robot_description" command="$(find xacro)/xacro --inorder '$(find mybot_description)/urdf/nmybot_all_gazebo.xacro'" /> 

    <!-- 运行joint_state_publisher节点,发布机器人的关节状态  -->
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node> 

    <!-- 运行robot_state_publisher节点,发布tf  -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"  output="screen" >
        <param name="publish_frequency" type="double" value="50.0" />
    </node>

    <!-- 在gazebo中加载机器人模型-->
    <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
          args="-urdf -model mrobot -param robot_description"/> 

</launch>

启动课程代码包中关于gmapping的launch文件,主要是启动了gmapping功能包中的slam_gmapping节点,并对节点作了参数配置,然后启动rviz做可视化
最后启动键盘控制节点,让机器人运动一周,得到如下图结果
在这里插入图片描述
可以看到gmapping建图结果还是比较准确的

下图是使用hector功能包完成的建图结果
在这里插入图片描述使用hector功能包完成建图任务,不需要里程计信息,所以相对gmapping会出现打滑的现象,尤其地图边缘会出现误差,但总体上完成了建图任务。


结语

本讲主要学习了SLAM原理、ROS机器人与数据结构、常用SLAM功能包应用,了解四种常用的建图方法,最后通过自己建立world模型并进行建图的作业,加深了印象。

以上是关于《ROS理论与实践》学习笔记机器人SLAM建图的主要内容,如果未能解决你的问题,请参考以下文章

SLAM建图导航信息(仿真)

《ROS理论与实践》学习笔记机器人语音交互

《ROS理论与实践》学习笔记机器人语音交互

《ROS理论与实践》学习笔记机器人自主导航

《ROS理论与实践》学习笔记机器人自主导航

SLAM+语音机器人DIY系列:SLAM建图与自主避障导航——3.ros-navigation机器人自主避障导航