5 ROS2中的SLAM环境建图
全面介绍ROS(Robot Operating System)的使用,包括基础概念、安装配置、编程技巧以及在机器人开发中的实际应用。通过本课程的学习,学生将掌握基于ROS的机器人软件开发能力,并能够利用ROS进行机器人的感知、决策和控制。
ROS2中的SLAM环境建图
实验介绍
SLAM(Simultaneous Localization and Mapping,即同时定位与地图构建)技术是机器人自主导航和智能环境感知的核心技术之一。ROS2(Robot Operating System 2)作为新一代机器人操作系统,提供了丰富的工具和库来支持SLAM技术的实现。本实验旨在通过ROS2平台,利用SLAM Toolbox这一强大的开源工具包,实现环境地图的构建。
在本实验中,我们将学习如何在ROS2环境中安装和配置SLAM Toolbox,以及如何通过仿真环境模拟机器人的运动,利用激光雷达等传感器数据进行环境感知和地图构建。通过本实验,学生将能够掌握ROS2中的SLAM建图技术,包括SLAM Toolbox的安装与配置、仿真环境的搭建、SLAM节点的启动与参数设置、以及地图的构建与保存等关键步骤。
实验过程
在ROS2的官方教程中,推荐使用SLAMToolbox来替代ROS1的Hector Mapping 和Gmapping等建图软件包。SLAM Toolbox是由工程师 Steve Macenski 在 Simbe Robotics 公司就职期间构建的一套2DSLAM 开源项目。该项目具备如下功能。
1)根据激光雷达数据创建环境地图,并能将地图数据进行保存。
2)可以在没有先验地图的情况下启动“激光雷达里程计”模式,进行机器人定位,并且支持局部的回环闭合操作,可大幅修正累积误差。
3)采用局部地图和后端优化的工作方式,可以在建图过程中持续对拼接误差进行修正,不像 Hector Mapping 和 Gmapping 那样只是简单的覆盖,所以建图质量大幅提升。
4)支持在建图结束后,从停止的地方继续建图。
5)除了保存最终地图,还可以对建图过程中的局部地图进行序列化保存,使得再次建图时继续优化地图成为可能。
6)支持同步和异步两种建图模式。
7)附带RViz2插件,可以在RViz2中对建图过程中的数据进行图形化操作
在 Humble 版本的 ROS2中安装相关软件包的指令如下。
sudo apt install ros-humble-slam-toolbox
仿真环境实现SLAM 建图
下面介绍如何在仿真环境中使用SLAM Toolbox进行SLAM 建图。为了观察建图的过程还会启动 RViz2,以实时显示建图的进展情况,建图时的数据流向如下图所示。
SLAM Toolbox 的启动
SLAM Toolbox的启动比较简单,只需要启动sam_toolbox软件包里的建图节点,配置
好相关参数,就可以启动建图了。下面通过编写一个Launch 文件来启动SLAM Toolbox。首先在工作空间中创建一个软件包。打开一个新的终端窗口,输人如下指令进入工作空间。
cd ~/ros2_ws/src
然后用如下指令创建一个名为“slam_pkg”的软件包
ros2 pkg create slam_pkg
接下来在这个软件包中实现SLAM建图功能,具体操作步骤如下
1.编写 Launch 文件代码
先创建建图用的 Launch文件。在VSCode 中找到[slam_pkg]软件包用鼠标右键单击它,在弹出的快捷菜单中选择[新建文件夹]。将新的文件夹命名为“launch”,用鼠标右键单击[launch]文件夹,在弹出的快捷菜单中选择[新建文件],将新的文件命名为“slam.launch.py”。
下面编写这个 Launch 文件,其内容如下。
import os
from launch import LaunchDescription
from launch_ros.actions import Node
from ament_index_python.packages import get_package_share_directory
def generate_launch_description():
slam_params = {
"use_sim_time": True,
"base_frame": "base_footprint",
"odom_frame": "odom",
"map_frame": "map"
}
slam_cmd = Node(
package="slam_toolbox",
executable="sync_slam_toolbox_node",
parameters=[slam_params]
)
rviz_file = os.path.join(get_package_share_directory('wpr_simulation2'), 'rviz', 'slam.rviz')
rviz_cmd = Node(
package='rviz2',
executable='rviz2',
name='rviz2',
arguments=['-d', rviz_file]
)
ld = LaunchDescription()
ld.add_action(slam_cmd)
ld.add_action(rviz_cmd)
return ld
上述内容可以从 wpr_simulation2 的例程文件中找到。如果编译报错,可以与 wpr_simulation2 \demo_launch\7_slam.launch.py 文件中的代码进行比对。
文件编写完毕后,需要进行保存。保存成功后,编辑界面文件名后面的圆点符号会变成一个叉符号。
2.设置安装规则
Launch 文件编写完成后,还需要为其设置安装规则,才能将其安装到最终执行的目录中。安装规则写在 slam_pkg的CMakeLists.txt文件中。在 VSCode 中打开这个文件,添加如下内容。
install(
DIRECTORY
launch
DESTINATION
share/${PROJECT_NAME})
这些内容可以从 wpr_simulation2 的例程文件中找到。如果编译报错,可以与 wpr_simdlation2\demo_cmakelists\7_slam.txt 文件中的代码进行比对。
上述规则添加完毕后,一定要保存文件,否则规则无法生效。
3.编译软件包
修改完上述文件后,打开终端窗口。执行如下指令,进入工作空间
cd ~/ros2_ws
然后执行如下指令,对工作空间中的所有软件包进行编译
colcon build
仿真环境建图
下面运行刚才编写的Launch 文件。在运行前,确认已经按照之前下载了wpr_simulation2仿真项目。然后,先加载当前工作空间中的环境设置。保持终端的当前路径依然在工作空间目录ros2_ws中,然后执行如下指令。
source install/setup.bash
然后,启动带有机器人的仿真环境,执行如下指令。
ros2 launch wpr_simulation2 robocup_home.launch.py
这时会启动仿真环境,如下图所示,这是一个RoboCup@Home 家庭服务机器人比赛的仿真场景,下面将在这个场景中进行SLAM 建图。
运行刚才编写的启动SLAM Toolbox的Launch文件。在 Terminator 终端中按组合键[Ctrl+Shift+O],将终端分为上、下两个子窗口。在新的终端窗口中执行如下指令,加载工作空间的环境设置。
source install/setup.bash
然后执行如下指令,运行刚才编写的 Launch 文件
ros2 launch slam_pkg slam.launch.py
执行这个 Launch 文件后,会弹出一个 RViz2 窗口,如下图所示。
在这个窗口中可以看到机器人周围的地面变成了深灰色,而机器人脚下则出现一片白色图案,这个图案是由很多条线段叠加而成的,这些线段是机器人本体中心地面投影与每一个激光雷达红色障碍点的连线,也就是测距激光飞行的轨迹,表示这条线段路过的轨迹没有检测到障碍物。
SLAM 启动后,还需要控制机器人在环境中移动,把场景地图全都扫描出来。这里使用一个wpr_ simulation2 中的键盘控制节点。在 Terminator 终端中,再次按组合键[Ctrl+Shift+O],这时会分出第3个命令行窗口。在第3个窗口中执行如下指令,加载工作空间环境设置。
source install/setup.bash
然后执行如下指令,启动键盘控制节点
ros2 run wpr_simulation2 keyboard_vel_cmd
保持 Terminator 终端窗口位于所有窗口的前边,且第3个窗口的标题栏为红色。这样才能让键盘控制节点始终能够接收到键盘按下的信号。按键盘上的对应按键,就可以控制机器人移动。
用键盘控制机器人移动时,只需要按一下按键就可以让机器人沿着对应方向移动、不需要一直按着不放。必要的时候使用[Space]键刹车。机器人在场景里巡游遍之后,就可以看到建好的地图了。
地图的保存
地图建好以后,可以将地图保存成文件。后面的导航实验会加载这些地图文件,作为路经规划和自身定位的依据。保持Terminator 终端的第3个窗口标题为红色按键盘上的[X]键,退出键盘控制程序,
然后执行如下指令,在当前路径下创建两个地图文件
ros2 run nav2_map_server map_saver_cli -f map
这样会在终端窗口的当前路径(~/ros2_ws)下创建两个地图文件:map.pgm和map.yaml,如下图 所示。
SLAM Toolbox 的参数设置
除了上面例子的几个参数,SLAM Toolbox还提供了大量的参数可供设置。具体的参数列表可以参考https://github.com/SteveMacenski/slam_toolbox或 https://gitee. com/s-robotslam toolbox .
在上述网页最下方的“Configuration”段落,列出了SLAM Toolbox的所有参数,每个参数后面还有一段简单的参数描述。可以根据需要选取相应的参数,填写到slam.launch.py中进行参数设置。
例如,设置地图更新间隔参数map_update_interval的具体操作步骤如下。
在slam_pkg 软件包的 slam.launch.py文件中为字典 slam_params 添加一个参数,参数名为“map_update_interval”,数值为1.0,表示机器人每移动1.0m 就更新一次地图。
修改完 slam.launch.py后,要保存文件,否则新参数无法生效。然后对 slam_pkg 进行编译,激活 CMakelists.txt 中的安装规则,将新的 slam.launch.py 文件安装到执行目录中在终端执行如下指令。
cd ~/ros2_ws
colcon build
运行修改后的 slam.launch.py。按照前面的步骤,在Terminator的3个子窗口重新执行如下指令。
source install/setup.bash
ros2 launch wpr_simulation2 robocup_home.launch.py
source install/setup.bash
ros2 launch slam_pkg slam.launch.py
source install/setup.bash
ros2 run wpr_simulation2 keyboard_vel_cmd
用键盘控制机器人在仿真环境里建图,注意观察地图刷新频率的变化
实验总结
通过本次实验,我们成功地在ROS2环境中实现了SLAM环境建图。在实验过程中,我们首先学习了如何在ROS2中安装和配置SLAM Toolbox,这是实现SLAM建图的关键一步。随后,我们利用仿真环境模拟了机器人的运动,并通过激光雷达等传感器数据进行了环境感知。在实验过程中,我们深刻体会到了SLAM算法的重要性,它能够在未知环境中实时构建地图,并同时确定机器人的位置。SLAM Toolbox作为ROS2中的一款优秀开源工具包,提供了丰富的功能和参数设置,使得我们可以根据实际需求进行灵活的配置和优化。通过本次实验,我们不仅掌握了ROS2中的SLAM建图技术,还提高了对机器人自主导航和智能环境感知的理解。同时,我们也学会了如何编写Launch文件来启动SLAM节点和RViz2可视化工具,以及如何设置参数和保存地图等实用技能。
过程中,我们深刻体会到了SLAM算法的重要性,它能够在未知环境中实时构建地图,并同时确定机器人的位置。SLAM Toolbox作为ROS2中的一款优秀开源工具包,提供了丰富的功能和参数设置,使得我们可以根据实际需求进行灵活的配置和优化。通过本次实验,我们不仅掌握了ROS2中的SLAM建图技术,还提高了对机器人自主导航和智能环境感知的理解。同时,我们也学会了如何编写Launch文件来启动SLAM节点和RViz2可视化工具,以及如何设置参数和保存地图等实用技能。
更多推荐
所有评论(0)