首页 > 其他分享 >ROS2机器人导航Nav2超详细保姆级教程之四大服务器

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

时间:2023-07-24 10:44:11浏览次数:46  
标签:教程 动作 插件 路径 控制器 FollowPath Nav2 服务器 ROS2

导航服务器

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

    // Call the DWB controller to follow the path

    // ...

 

    // Send feedback and result to the client

    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官网)

标签:教程,动作,插件,路径,控制器,FollowPath,Nav2,服务器,ROS2
From: https://www.cnblogs.com/bbguhdm/p/17576615.html

相关文章

  • Java 诊断工具 Arthas 常见命令(超详细实战教程)
    基本概念  云原生这么多微服务,当然需要一个诊断利器来排查问题。  Arthas是阿里开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。Arthas支持JDK6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的Tab......
  • Shell编程教程 - 字符串变量表达式
    1.字符串变量表达式基本比较示例脚本-`string_comparison.sh`字符串长度检查示例脚本-`string_length.sh`逻辑运算符连接表达式示例脚本-`logical_operators.sh`2.执行示例脚本3.结论大树哥个人信息本教程将向你介绍Shell脚本中字符串变量表达式的使用。我们将学习如何......
  • Node.js下载安装教程
    一、下载安装包1、百度网盘自提链接:链接:https://pan.baidu.com/s/1Bbw895MtUgjlfZylPHCCxw 提取码:x89v 2、进入官网下载https://nodejs.org/zh-cn/download/选择对应版本,我这里选的windows64位版本 二、安装程序1、双击下载好的安装包,出现这个界面点【next】2、选......
  • Python教程(5)——Python的第一个程序
    python的环境以及IDE都准备好之后,我们就可以开始Python之旅了。Python的第一个程序通常是打印输出"Hello,World!",非常简单。以下是一个示例:print("Hello,World!")运行python代码首先必须明白python是一门动态语言,也就没有所谓的编译过程,也就是直接运行。那么要如何运行pytho......
  • 很全面的 Docker 教程,从入门到精通
    docker不是一个值得投入的领域,它解决的问题是Unix系统最初设计的一个疏忽。从一个不会用docker的小白,自己一步一步的摸索,中间也踩过许多坑。但任然,坚持从哪里跌倒就从哪里爬起来。不求感动自己,但求人生无悔。 1容器简介1.1什么是Linux容器1.2容器不就是虚拟化吗1.3容器发......
  • 超详细图文教程:3DS Max 中创建低多边形游戏长剑模型
    推荐:NSDT场景编辑器助你快速搭建可二次开发的3D应用场景在此,由两部分组成的教程的第一部分中,我将向您展示如何:对剑柄进行建模剑的护手模型剑刃建模1.如何制作剑柄步骤1在本教程中使用正交视图。要更改视图,请单击视口上任意位置的鼠标中键或屏幕左上角的小按钮。步骤......
  • arthas 使用教程
    https://blog.csdn.net/qq_19524879/article/details/126116050简介Arthas是Alibaba开源的Java诊断工具,动态跟踪Java代码;实时监控JVM状态,可以在不中断程序执行的情况下轻松完成JVM相关问题排查工作。支持JDK6+,支持Linux/Mac/Windows。这个工具真的很好用,而且入门超简单,十......
  • Archlinux+Windows 双系统安装教程(UEFI)2023七月
    前言之前的随笔本人提到过等有时间后写一篇关于manjaro与windows双系统安装的教程,但由于“这样那样的原因”,本人已不再使用manjaro,本人已经切换到archlinux的环境下,故本次的教程将主角换成了archlinux。你需要具备的一些素质1.能够自主地阅读官方文档.,按照本人的教程不代表你......
  • win10+python3.8+Anaconda3+cuda10.2+cudnn7.6+pytorch安装教程
    版本问题很重要,为了这个版本,真的吐血版!!!其他链接1.cuda10.2+cudnn7.6安装和测试的方法2.彻底卸载Anaconda3.新建的虚拟环境总是在c盘怎么解决1.安装Anaconda3在Anaconda安装的过程中,比较容易出错的环节是环境变量的配置,所以大家在配置环境变量的时候,要细心一些①安装......
  • 2023年的Clion内建立多个子项目(保姆级教程)
    目录下载插件C/C++SingleFileExecution项目操作其他操作下载插件C/C++SingleFileExecution项目操作1.新建项目-->如图所示操作.2.选择项目右键-->选择New-->选择Directly(新建文件夹).3.选择新建C/C++的文本.4.会出现黄色提示框,选择c文本右键看到插......