使用旋转垫片控制器

概述

本教程将讨论如何设置机器人以使用``RotationShimController``来帮助创建直观、原地旋转的行为,以便在追踪路径时起到辅助作用。本教程的目标是向读者解释控制器的价值,如何进行配置,如何与主控制器进行配置,并最后给出一个使用示例。

在开始本教程之前,强烈建议完成 开始使用,特别是如果您对ROS和Nav2不熟悉的话。要求是安装最新版本的Nav2 / ROS 2,并包含此软件包。

什么是旋转垫片控制器?

这是由于TEB和DWB中的一些问题而开发的,但适用于您希望具有旋转行为的任何其他控制器插件类型。TEB 的行为倾向于通过小的转弯将机器人扭转,或者当路径的起始朝向与当前朝向非常不同时,以一种令人惊讶的方式进行,这是由于弹性带方法。DWB 可以被调节为具有任何类型的行为,但通常将其调节为出色的路径跟踪器也会使其在远离头部的新路径上的平滑过渡能力不够理想-总是存在权衡。给予TEB和DWB更好的起点以开始跟踪路径将显著简化控制器的调节,并为旁观者创造更直观的结果。

请注意,并不需要与**任何**插件一起使用。许多用户在不使用该控制器的情况下也能取得很好的效果,但如果机器人在开始追踪路径(或其他任务)之前需要进行原地旋转,使用该控制器可能会有优势。

“nav2_rotation_shim_controller”将检查与机器人和新接收的路径之间的大致方向差异。如果在一个阈值内,它将将请求传递给“primary_controller”来执行任务。如果超出阈值,该控制器将原地旋转机器人朝向该路径方向。一旦在容差范围内,它将从此旋转适配器控制器转移到主要控制器插件上执行控制。此时,机器人的主要插件将接管控制权,以平稳地过渡到任务。

RotationShimController 最适用于以下情况:

  • 能够原地旋转的机器人,如差分驱动和全向驱动机器人。

  • 在开始跟踪一个与机器人当前朝向显著不同的新路径时,或者在为任务调整控制器时,进行原地旋转的首选。

  • 使用非运动学可行的规划器,如 NavFn、Theta* 或 Smac 2D(可行的规划器如 Smac Hybrid-A* 和 State Lattice 将从机器人的实际起始方向开始搜索,不需要旋转,因为它们的路径在物理约束下是可行的)。

注解

规则纯追踪已内置此功能,因此不需要与RPP配对。然而,它适用于所有其他插件。有关当前控制器插件的完整列表,请参阅 导航插件

配置旋转垫片控制器

该控制器是一个*shim*,因为它位于主控制器插件和控制器服务器之间。它接收命令并对其进行预处理以旋转到指定的航向,一旦满足该条件,就将执行控制转交给主插件-充当简单的传递通道。

因此,它的配置与任何其他插件的配置非常相似。在下面的代码块中,您可以看到我们将``RotationShimController``作为控制器服务器中路径追踪的插件添加进去了。您还可以看到我们通过下面的内部参数``angular_dist_threshold``到``max_angular_accel``对其进行了配置。

controller_server:
  ros__parameters:
    use_sim_time: True
    controller_frequency: 20.0
    min_x_velocity_threshold: 0.001
    min_y_velocity_threshold: 0.5
    min_theta_velocity_threshold: 0.001
    progress_checker_plugins: ["progress_checker"] # progress_checker_plugin: "progress_checker" For Humble and older
    goal_checker_plugins: ["goal_checker"]
    controller_plugins: ["FollowPath"]
    progress_checker:
      plugin: "nav2_controller::SimpleProgressChecker"
      required_movement_radius: 0.5
      movement_time_allowance: 10.0
    goal_checker:
      plugin: "nav2_controller::SimpleGoalChecker"
      xy_goal_tolerance: 0.25
      yaw_goal_tolerance: 0.25
      stateful: True
    FollowPath:
      plugin: "nav2_rotation_shim_controller::RotationShimController"
      angular_dist_threshold: 0.785
      forward_sampling_distance: 0.5
      rotate_to_heading_angular_vel: 1.8
      max_angular_accel: 3.2
      simulate_ahead_time: 1.0

旋转shim控制器非常简单,只有几个参数用于规定其应被激活的条件。

  • angular_dist_threshold:机器人当前航向与近似路径航向之间的角度距离(以弧度表示),以触发旋转行为。一旦机器人处于此阈值内,控制权将移交给主要控制器插件。

  • forward_sampling_distance: 离机器人一定距离(以米为单位),选择路径上的一点来近似路径的起始航向。这类似于“前瞻”点。

  • rotate_to_heading_angular_vel:行为执行时,使机器人旋转到目标航向所需的角速度(以弧度/秒表示)。

  • max_angular_accel: 当激活该行为时,使机器人旋转到指定航向所需的角加速度(以弧度/秒²为单位)。

  • simulate_ahead_time:前向投影旋转命令以检查碰撞的时间(以秒为单位)。

配置主控制器

还有一个未在上述提及的``RotationShimController``参数,即``primary_controller``。这是您的应用程序想要用作主要操作模式的控制器类型。它将与shim插件共享相同的名称和yaml命名空间。您可以在下面观察到这一点,其中主要控制器设置为``DWB``(为简洁起见,已删除进度和目标检查器)。

controller_server:
  ros__parameters:
    use_sim_time: True
    controller_frequency: 20.0
    min_x_velocity_threshold: 0.001
    min_y_velocity_threshold: 0.5
    min_theta_velocity_threshold: 0.001
    controller_plugins: ["FollowPath"]
    FollowPath:
      plugin: "nav2_rotation_shim_controller::RotationShimController"
      primary_controller: "dwb_core::DWBLocalPlanner"
      angular_dist_threshold: 0.785
      forward_sampling_distance: 0.5
      rotate_to_heading_angular_vel: 1.8
      max_angular_accel: 3.2
      simulate_ahead_time: 1.0

      # DWB parameters
      ...
      ...
      ...

重要提示是,在**同一yaml命名空间**中,您还可以包含任何所需的“primary_controller”特定参数以配置机器人。因此,在``max_angular_accel``之后,您可以包含任何适用于您平台的``DWB``参数。

演示执行