使用旋转垫片控制器

概述

本教程将讨论如何设置您的机器人以使用“RotationShimController”来帮助您的机器人在开始跟踪路径时创建直观的原地旋转行为。本教程的目标是向读者解释控制器的价值、如何配置它、如何使用它配置主控制器,以及最后使用它的示例。

在开始本教程之前,强烈建议您完成:ref:getting_started,特别是如果您是 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 将从机器人的实际起始航向开始搜索,不需要旋转,因为它们的路径由物理约束保证可驾驶)。

Regulated Pure Pursuit 内置了此功能,因此无需与 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

旋转垫片控制器非常简单,只有几个参数来规定其应实施的条件。

  • angular_dist_threshold: The angular distance (in radians) apart from the robot’s current heading and the approximated path heading to trigger the rotation behavior. Once the robot is within this threshold, control is handed over to the primary controller plugin.

  • forward_sampling_distance: The distance (in meters) away from the robot to select a point on the path to approximate the path’s starting heading at. This is analogous to a “lookahead” point.

  • rotate_to_heading_angular_vel: The angular velocity (in rad/s) to have the robot rotate to heading by, when the behavior is enacted.

  • max_angular_accel: The angular acceleration (in rad/s/s) to have the robot rotate to heading by, when the behavior is enacted.

  • simulate_ahead_time: The Time (s) to forward project the rotation command to check for collision

配置主控制器

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 参数。

演示执行