《ROS理论与实践》学习笔记机器人SLAM建图
Posted Sakurazzy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《ROS理论与实践》学习笔记机器人SLAM建图相关的知识,希望对你有一定的参考价值。
《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++ qt4,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建图的主要内容,如果未能解决你的问题,请参考以下文章