一、说明
如何建立ROS2的导航地图?在ROS2的服务器中,其中有一个地图服务器,该服务器与参数服务器类同,当外界节点请求的时候,将新的地图导入导航系统中。注意,这里新的地图就是因为场景足够大时,一张地图覆盖不了物理场景,于是让不同地图的拼接辗转导入。
在本教程中,我将向您展示如何使用命令行在运行时加载新地图。我们将使用 ROS 2。本教程的用例是一个需要在多层建筑的楼层之间导航的机器人。
更新:有一种新方法可以在运行时加载新地图进行导航。您可以使用 Nav 2 Simple Commander API 提供的changeMap() 方法。
二、导航系统简介
ROS 2的Navigation是一种导航系统,能够让机器人在未知环境中自主导航。Navigation系统由一组相关的节点和工具组成,包括:
-
AMCL (Adaptive Monte Carlo Localization):用于机器人在已知地图上进行自我定位,以便机器人能够知道自己在环境中的位置。
-
Costmap2D:用于构建环境地图并计算机器人的移动代价。Costmap2D将感应器数据聚合为高分辨率地图,并将不同类型的代价与不同类型的障碍物关联起来。
-
Move Base:用于规划机器人的运动轨迹以达到目标位置。Move Base使用AMCL的定位信息和Costmap2D的代价信息来规划机器人的运动轨迹。
-
RViz:用于可视化地图、机器人和导航路径等信息,以便用户可以更好地理解机器人的行为。
Navigation系统的主要目标是让机器人能够在未知环境中自主导航。它可以被应用在各种机器人应用中,比如清洁机器人、无人驾驶车辆、配送机器人等。
三、环境要求
3.1 基本要求
- 安装在 Ubuntu Linux 20.04 或更高版本。ROS 2 Foxy Fitzroy。我使用的是 ROS 2 humble,这是目前 ROS 2 的最新版本。
- 已经安装了navigation和nav2
- 安装slam-box:
- 您已经创建了 ROS 2 工作区。我们的工作空间的名称是“dev_ws”,代表“开发工作空间”。
- 您拥有 Python 3.7 或更高版本。
3.2 知识准备
- (可选)您已经完成了前文《ROS 2 导航堆栈终极指南》。
Ultimate Guide to the ROS 2 Navigation Stack.
- 您的 ~/dev_ws/src 文件夹中有一个名为two_wheeled_robot 的包,我在这篇文章中设置了该包。如果你有另一个包裹,那就没问题了。
- (可选)您知道如何使用 ROS 2 将世界文件加载到 Gazebo 中。
(文选) how to load a world file into Gazebo using ROS 2.
- 您可以在我的 Google 云端硬盘上找到本文的文件。
参考地址( t here on my Google Drive. )
3.3 技术路线
假设您有一个在 ROS 2 上运行的客房服务机器人。该机器人正在医院的 5 楼周围移动。
5楼的一名医院病人吃完饭,把机器人召唤到自己的房间,让机器人把脏盘子搬到酒店咖啡厅的厨房。假设酒店的咖啡厅位于大楼的二楼。
我们希望我们的机器人能够从医院 5 楼 –> 电梯 –> 医院咖啡厅(二楼)进行导航。
- 执行多层导航的过程可能如下所示:
- 导航至患者房间
- 收拾脏盘子
- 导航至电梯门
- 按向下按钮
- 等待电梯打开
- 进入电梯
- 按电梯按钮到二楼
- 等待电梯到达二楼
- 退出电梯
- 加载二楼医院咖啡厅的新地图
让我们看看如何执行:通过打开一个新的终端窗口并输入以下内容来加载医院世界:
cd ~/dev_ws/
ros2 launch two_wheeled_robot hospital_world_v1.launch.py
医院五楼是这样的:
现在,假设机器人已完成我之前发布的列表中的步骤 1-10。现在咖啡馆所在的位置是二楼。
让我们加载咖啡馆的地图。我们需要对 LoadMap 服务进行 ROS 2 服务调用。当您想要请求-响应交互时,ROS 2 服务可以很好地工作。
让我们看看我们有哪些服务。
ros2 service list
我们还可以使用以下命令来查看每个服务的类型。
ros2 service list -t
我们可以看到我们有一个名为 /map_server/load_map 的服务。我们来看看服务类型。
ros2 service type /map_server/load_map
结果是:
nav2_msgs/srv/LoadMap
让我们看看该服务的输入参数的结构。
ros2 interface show nav2_msgs/srv/LoadMap
您将看到变量字符串map_url。由于这是在-之上,所以这块是请求结构。 - 下面的所有内容都是响应结构。
对于ros2服务调用,-之上的所有内容都是调用服务所需的参数。
现在我们需要调用 /map_server/load_map 服务。语法如下:
ros2 service call <service_name> <service_type> <arguments>
下面所有这些都是一个命令。
ros2 service call /map_server/load_map nav2_msgs/srv/LoadMap "{map_url: /home/focalfossa/dev_ws/src/two_wheeled_robot/maps/cafe_world/cafe_world.yaml}"
...其中cafe_world.yaml 是新的地图文件。请注意,您需要提供地图文件的完整路径。
这是运行命令后 RViz 的样子。
您可以进入 RViz 并取消选中本地成本图。
接待台的轮廓是由于机器人仍在Gazebo内的医院世界中,因此其全局成本图正在相应更新。
下面是 Gazebo 中咖啡馆世界的实际样子。你会看到上面的新地图来自这个咖啡馆世界。
这就是使用 ROS 2 在运行时加载新地图的方式。就是这样。
五、后记
有许多基本的知识交代的还是不够,期望在另开几个文档,全面系统说清楚。