即时定位与建图(Simultaneous localization and mapping, SLAM)主要用于解决机器人在未知环境运动时的定位与地图构建问题。SLAM分为激光SLAM和视觉SLAM两个方向的技术,本专栏主要涉及激光SLAM。
通常,激光SLAM系统通过对环境中获取的点云数据信息的匹配比对,计算激光雷达相对运动的距离和姿态的改变来完成定位
激光SLAM系统主要由
五个模块构成。
gmapping
是ROS开源社区中较为常用且比较成熟的SLAM算法之一,gmapping
可以根据移动机器人里程计数据和激光雷达数据来绘制二维的栅格地图——gmapping
要求机器人有里程计和激光雷达。
gmapping
功能包中的核心节点是slam_gmapping
,订阅了
tf (tf/tfMessage)
:用于雷达、底盘与里程计之间的坐标变换scan(sensor_msgs/LaserScan)
:用于获取SLAM所需的雷达信息发布了
map_metadata(nav_msgs/MapMetaData)
:地图元数据,该消息会更新
map(nav_msgs/OccupancyGrid)
:地图栅格数据
以上两项可参考第1节
entropy(std_msgs/Float64)
:机器人姿态分布熵估计,值越大,不确定性越大
安装gmapping
,否则会报错RROR: cannot launch node of type [gmapping/slam_gmapping]: gmapping
sudo apt install ros-noetic-gmapping
安装dwa-local-planner
,否则会报错ROS Failed to create the dwa_local_planner/DWAPlannerROS planner
sudo apt install ros-noetic-dwa-local-planner
接下来按下面步骤依次输入终端命令
roslaunch turtlebot3_gazebo turtlebot3_world.launch
roslaunch turtlebot3_slam turtlebot3_slam.launch
下面提供两种建图方法:
键盘控制
启动键盘控制
roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
自主建图
如果不想键盘控制,也可以自主建图
roslaunch turtlebot3_gazebo turtlebot3_simulation.launch
建图结束后按第1节的方式保存地图。
这里采用ROS从入门到精通2-2:机器人3D物理仿真——Gazebo搭建的场景。类比turtlebot3_world.launch
的结构,将其中的地图改成自己的场景即可,核心部分如下所示
<arg name="world" default="$(find slam_demo)/worlds/warehouse.world" />
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(arg world)"/>
<arg name="paused" value="false"/>
<arg name="use_sim_time" value="true"/>
<arg name="gui" value="true"/>
<arg name="headless" value="false"/>
<arg name="recording" value="false"/>
<arg name="debug" value="false"/>
include>
<node pkg="gazebo_ros" type="spawn_model" name="spawn_urdf" args="-urdf -model turtlebot3_$(arg model) -x $(arg x_pos) -y $(arg y_pos) -z $(arg z_pos) -param robot_description" />
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find slam_demo)/rviz/navigation.rviz" output="screen"/>
<node name="key_control" pkg="slam_demo" type="key_control" respawn="false" output="screen"/>
<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="log">
<param name="maxRange" value="10"/>
<param name="xmin" value="-12"/>
<param name="ymin" value="-12"/>
<param name="xmax" value="12"/>
<param name="ymax" value="12"/>
<param name="delta" value="0.05"/>
<param name="particles" value="4"/>
<param name="temporalUpdate" value="1.0"/>
<param name="angularUpdate" value="0.3"/>
<param name="linearUpdate" value="0.3"/>
<param name="map_update_interval" value="2.0"/>
node>
本文的完整工程代码联系下方博主名片获取
更多精彩专栏: