下午好,亲爱的读者们。 在
上一篇文章中,我讨论了两种针对深度相机设计的SLAM算法:rtabmap和RGBD-SLAM。 然后,我们仅尝试绘制该地区的地图。 在本文中,我将讨论使用rtabmap算法对机器人进行定位和导航的可能性。 请有兴趣的人在猫下。
rtabmap中的本地化以及rviz中的可视化
首先,如果ROS主服务器未运行,请运行它:
roscore
运行相机的驱动程序:
roslaunch freenect_launch freenect.launch depth_registration:=true
运行rtabmap以在rviz中可视化地构建地图并删除旧地图:
roslaunch rtabmap_ros rtabmap.launch rtabmap_args:="--delete_db_on_start" rtabmapviz:=false rviz:=true
完成地图构建过程后,我们使用Ctrl + C退出程序以保存地图并在本地化模式下重新启动rtabmap:
roslaunch rtabmap_ros rtabmap.launch localization:=true rtabmapviz:=false rviz:=true

为了在rviz中显示地图,您需要单击MapCloud显示屏上“下载地图”项中的复选标记:


将相机移动到rviz中机器人在地图上的位置。 之后,将发布坐标系/地图→/ odom之间的转换。

使用以Turtlebot为例的rtabmap构建地图和导航
可以在Turtlebot机器人模拟器上尝试使用rtabmap方法进行地图构建和机器人本地化。 Rtabmap为此提供了特殊的程序包。 有关其他信息,请提供指向材料
来源的链接。 首先,安装必要的软件包:
sudo apt-get install ros-<ros_version>-turtlebot-bringup ros-<ros_version>-turtlebot-navigation ros-<ros_version>-rtabmap-ros
默认情况下,使用OpenNI2驱动程序,该驱动程序在3dsensor.launch文件(TURTLEBOT_3D_SENSOR = asus_xtion_pro)中指定。 在实验中,我使用了Microsoft Kinect相机。 让我们在变量TURTLEBOT_3D_SENSOR中为其安装驱动程序:
echo 'export TURTLEBOT_3D_SENSOR=kinect' >> ~/.bashrc source ~/.bashrc
现在,我们将在rtabmap_ros中使用Turtlebot模拟器的特殊软件包开始构建地图:
roslaunch turtlebot_bringup minimal.launch roslaunch rtabmap_ros demo_turtlebot_mapping.launch args:="--delete_db_on_start" rgbd_odometry:=true roslaunch rtabmap_ros demo_turtlebot_rviz.launch
我们将在rviz窗口中看到:

现在,从Kinect相机中看到点云:

您应该看到一个二维地图,一个三维地图,以及导航所需的一些其他主题输出。 另外,标准的rviz显示和用于rtabmap的其他特定显示(本地地图,全局地图,Rtabmap云)在左侧的显示面板中显示。

让我们在太空中移动相机,过一会儿我们将看到:

默认情况下,每次运行demo_turtlebot_rviz.launch时,rtabmap都会使用相同的数据库。 要删除旧地图并重新开始构建地图(从头开始),您可以手动删除文件〜/ .ros / rtabmap.db中保存的数据库,或者运行带有参数args的demo_turtlebot_rviz.launch:=“-delete_db_on_start”。
运行地图构建而不删除数据库:
roslaunch rtabmap_ros demo_turtlebot_mapping.launch
构建地图后,结果将如下所示:

使用Turtlebot进行本地化
现在,我们有了一个映射,该映射保存在数据库中的〜/ .ros / rtabmap.db文件中。 在具有本地化的本地化模式下重新启动demo_turtlebot_mapping.launch:= true:
roslaunch rtabmap_ros demo_turtlebot_mapping.launch rgbd_odometry:=true localization:=true
我们将看到以下图片:

将Kinect移到一边。 一旦检测到回路(回路闭合),机器人将确定其新位置:

成功的环路检测将需要一些时间,因此请耐心等待。
它的工作速度非常快:
Turtlebot的独立导航
现在已经创建了地图,您可以尝试使用导航堆栈在已知地图上进行脱机导航。 为此,只需在rviz中为机器人指示地图上的当前目标,即可在离线模式下朝该方向移动。 导航堆栈将处理其他所有内容。 首先,只需点击rviz中的2D Nav目标按钮

并通过在地图上的任意位置单击来指示目标

通过为其选择主题“ / move_base / current_goal”来添加姿势显示,并通过选择主题“ / move_base / NavfnROS / plan”来添加路径显示。 您应该看到计划的路径(地图上的绿线)和设定的目标,并用红色箭头指示:

move_base软件包负责控制机器人朝向目标。 它将向主题/ mobile_base /命令/速度发布诸如geometry_msgs / Twist之类的运动命令:
rostopic echo /mobile_base/commands/velocity
有关使用导航堆栈的更多信息,请参见官方turtlebot_navigation页面上的
教程 。 还有一个在您自己的机器人上使用rtabmap的
教程 。
因此,这次我们能够将机器人定位在预先构建的地图上,并学习了如何为机器人设置目标,以便使其可以离线运行。 祝您在实验中一切顺利,很快见到您!