ROS2机器人导航Nav2超详细保姆级教程之四大服务器

发布时间 2023-07-24 10:53:34作者: 头怎么还不秃啊

导航服务器

规划器和控制器是导航任务的核心。恢复器用于使机器人摆脱不良状态或尝试处理各种形式的问题,以使系统具有容错能力。平滑器可用于进一步提高规划路径的质量。在本节中,将分析有关它们的一般概念及其在Nav2项目中的用途。

规划器、恢复器、平滑器和控制器服务器。

Nav2中的四个动作服务器是规划器、行为器、平滑器和控制器服务器。

这些动作服务器用于托管算法插件的地图,以完成各种任务。它们还托管算法插件用于计算其输出的环境表示。

规划器、平滑器和控制器服务器将在运行时配置要使用的算法的名称(别名)和类型。这些类型是已注册的pluginlib名称,名称是任务的别名。例如,使用名称FollowPath的DWB控制器,因为它遵循参考路径。在这种情况下,那么DWB的所有参数都将放置在该命名空间中,例如FollowPath.<param>。

这三个服务器然后暴露一个与它们的任务相对应的动作接口。当行为树对应的BT节点被触发时,它将调用动作服务器来处理其任务。服务器内部的动作服务器回调将通过其名称(例如FollowPath)调用所选算法,该名称映射到特定算法。这允许用户将行为树中使用的算法抽象为算法类。以下是一个例子:

假设正在使用一个基于 ROS 的机器人系统,并且已经配置了一个行为树,其中包含一个名为 FollowPath 的 BT 节点。当该节点被触发时,它将调用动作服务器并使用 FollowPath 作为名称来处理其任务。

下面是一个简单的行为树定义,它包含一个名为 FollowPath 的 BT 节点:

复制代码
<root main_tree_to_execute="MainTree">

  <BehaviorTree ID="MainTree">

    <Action ID="FollowPath" name="FollowPath"/>

  </BehaviorTree></root>
复制代码

 

在这个例子中,当行为树执行时,它将触发 FollowPath 节点。该节点将调用动作服务器并使用 FollowPath 作为名称来处理其任务。

下面是一个简单的动作服务器实现,它接收来自 FollowPath 节点的动作目标,并调用 DWB 控制器来处理该任务:

复制代码
#include <ros/ros.h>#include <actionlib/server/simple_action_server.h>#include <my_robot_msgs/FollowPathAction.h>

class FollowPathAction {protected:

  ros::NodeHandle nh_;

  actionlib::SimpleActionServer<my_robot_msgs::FollowPathAction> as_;

  std::string action_name_;

public:

  FollowPathAction(std::string name) :

    as_(nh_, name, boost::bind(&FollowPathAction::executeCB, this, _1), false),

    action_name_(name) {

    as_.start();

  }

 

  void executeCB(const my_robot_msgs::FollowPathGoalConstPtr &goal) {

    // 调用DWB控制器来跟随路径

    // ...

 

    // 将反馈和结果发送给客户端。

    my_robot_msgs::FollowPathFeedback feedback;

    my_robot_msgs::FollowPathResult result;

    as_.publishFeedback(feedback);

    as_.setSucceeded(result);

  }

};

int main(int argc, char** argv) {

  ros::init(argc, argv, "follow_path");

  FollowPathAction follow_path("FollowPath");

  ros::spin();

  return 0;

}
复制代码

 

在这个例子中,动作服务器接收来自 FollowPath 节点的动作目标,并调用 DWB 控制器来处理该任务。DWB 控制器会根据参考路径和机器人当前的状态,搜索速度空间以确定安全且可行的速度命令。然后,它会将速度命令发送给机器人的底盘,使机器人沿着参考路径移动。当任务完成后,它会向客户端发送反馈和结果。

以上代码定义了一个简单的行为树,FollowPath.<param>格式用于访问和设置与 FollowPath 相关联的参数。它通常用在 ROS 参数文件或动态重配置文件中,而不是在行为树定义中。这些参数将被存储在与 FollowPath 相关联的命名空间中,并可以在运行时被 DWB 控制器访问和使用。

例如,可以在 ROS 参数文件中使用 FollowPath.<param> 格式来设置 DWB 控制器的参数,如下所示:

复制代码
# ROS parameter file

FollowPath:

  controller_frequency: 20.0

  min_vel_x: 0.1

  max_vel_x: 0.5

  min_vel_theta: -1.0

  max_vel_theta: 1.0
复制代码

 

在这个例子中,我们使用 FollowPath.<param> 格式来设置 DWB 控制器的一些参数,例如控制器频率、最小和最大线速度以及最小和最大角速度。这些参数将被存储在与 FollowPath 相关联的命名空间中,并可以在运行时被 DWB 控制器访问和使用。

 

你可以拥有N个插件控制器来跟随路径、与充电器对接、避免动态障碍物或与工具接口。在同一服务器中拥有所有这些插件允许用户使用单个环境表示对象,这是昂贵的复制。

对于行为服务器,每个行为也包含它们自己的名称,但是每个插件也将暴露它自己的特殊动作服务器。这样做是因为可能创建的各种行为动作太多,无法共享一个简单的接口。行为服务器还包含一个到本地代价地图的代价地图订阅者,从控制器服务器实时接收更新,以计算其任务。我们这样做是为了避免拥有多个本地代价地图实例,这些实例在复制时计算成本很高。

或者,由于BT节点是调用操作的简单插件,因此可以创建新的BT节点来调用其他具有其他动作类型的动作服务器。建议尽可能始终使用提供的服务器。如果由于插件或动作接口需要新服务器,则可以使用框架维持该服务器。新服务器应使用新类型和插件接口,类似于提供的服务器。需要创建一个新的BT节点插件来调用新动作服务器--但是通过广泛使用服务器和插件,在Nav2仓库本身不需要分叉或修改。

如果你想要使用不同于提供的服务器的动作类型,你可以创建一个新的行为树(BT)节点来调用其他动作服务器。例如,假设你想要使用一个不同于提供的服务器的新动作类型来完成某个任务。你可以创建一个新的BT节点插件,该插件调用一个新的动作服务器,该服务器使用新类型和插件接口。创建完后,将其添加到你的行为树中,这样你就可以在不修改Nav2仓库本身的情况下,通过使用新的BT节点插件和动作服务器来完成你想要的任务。

 

规划器

规划器的任务是计算一条路径来完成某个目标函数。根据术语和所选算法,路径也可以称为路线。两个典型的例子是计算到达目标的计划(例如,从当前位置到目标)或完全覆盖(例如,计划覆盖所有自由空间)。规划器将能够访问全局环境表示和缓冲到其中的传感器数据。规划器可以编写为具有以下功能的工具:

计算最短路径

计算完全覆盖路径

沿稀疏或预定义路线计算路径

在Nav2中,规划器的一般任务是计算从当前姿态到目标姿态的有效且可能最优的路径。然而,许多类别的计划和路线(完全覆盖路径、沿稀疏或预定义路线的路径等)都是受支持的。

 

控制器

控制器,也称为ROS 1中的本地规划器,是我们遵循全局计算路径或完成局部任务的方式。控制器将能够访问局部环境表示,以尝试计算底座可行的控制力。许多控制器将机器人向前投影到空间中,并在每次更新迭代时计算一条局部可行的路径。控制器可以编写为具有以下功能的工具:

跟随一条路径

使用里程计框架中的检测器与充电站对接控制器根据检测到的里程计信息计算出一种控制策略,使机器人能够安全地与充电站对接

登上电梯控制器计算出一种能让机器人安全进入电梯的策略,需要控制器能够处理电梯门的开关、电梯运动等相关的因素

与某个工具的接口控制器计算出一种控制策略,使机器人能够安全地接近工具并使用它来完成特定的任务,例如机器人需要使用机械臂夹取一个物体时,机械臂就是一个工具,控制器需要计算出一种控制策略,协调机器人和机械臂之间的动作

在Nav2中,控制器的一般任务是计算有效的控制力来遵循全局计划。然而,存在许多类别的控制器和局部规划器。这个项目的目标是所有控制器算法都可以作为这个服务器中的插件,用于常见的研究和工业任务。

恢复器

恢复器是容错系统的主要组成部分。恢复的目标是处理系统的未知或故障条件,并自主处理它们。例如,感知系统中的故障可能导致环境表示中充满虚假障碍物。然后会触发清除代价地图的恢复,以允许机器人移动。

另一个例子是,如果机器人由于动态障碍物或控制不良而卡住。如果允许,后退或原地旋转可以让机器人从不良位置移动到可以成功导航的自由空间。

最后,在完全失败的情况下,可以实现一种恢复来呼叫操作员寻求帮助。这可以通过电子邮件、短信、Slack、Matrix等方式完成。

重要的是要注意,恢复器可以容纳任何行为来共享对昂贵资源(如代价地图或TF缓冲区)的访问,而不仅仅是恢复行为。每个都可以有自己的API。恢复器可以容纳多种不同的行为,这些行为可以共享对计算成本较高的资源的访问。例如,代价地图和TF缓冲区是两种计算成本较高的资源,它们需要大量的计算能力来维护。通过在恢复器容纳多种不同的行为,这些行为可以共享对这些资源的访问,从而避免了重复计算和内存浪费。这意味着,你可以在恢复器中定义多种不同的行为,这些行为可以根据需要使用代价地图或TF缓冲区等资源。由于这些资源是在行为服务器中共享的,因此每个行为都可以快速访问它们,而无需重新计算或复制数据。

 

平滑器

由于规划器搜索的路径的最优性标准通常比现实情况降低,因此额外的路径优化通常是有益的。为此引入了平滑器,通常负责减少路径的粗糙度和平滑突然旋转,但也负责增加与障碍物和高成本区域的距离,因为平滑器可以访问全局环境表示。

使用单独的平滑器而不是作为规划器一部分包含的平滑器是有益的,当将不同的规划器与不同的平滑器结合使用或需要对平滑进行特定控制时,例如仅平滑路径的特定部分。

在Nav2中,平滑器的一般任务是接收一条路径并返回其改进版本。然而,对于不同的输入路径,改进的标准和获取它们的方法存在不同,为在此服务器中注册多种平滑器创造了空间。

 

参考文献 Navigation Concepts — Navigation 2 1.0.0 documentation (ros.org) ——(Nav2官网)