< >
Home » ROS2与MoveIt2教程 » ROS2与MoveIt2入门教程-插件接口

ROS2与MoveIt2入门教程-插件接口

说明:

  • 介绍MoveIt2中不同类型的插件

概述:

  • MoveIt2涉及到多个不同的领域,并提供了许多接口,以便让用户可以覆盖MoveIt2框架的不同部分和实现新的概念,而无需触碰该框架的核心。下面列出了MoveIt2中不同类型的插件,并概述了这些插件在该框架内的用途

请输入图片描述

MoveGroupCapability接口

  • 用法

    通过实现move_group_capability.h接口,可以实现需要频繁执行的功能。每个功能都可以访问move group context,包括例如避免碰撞的障碍物

  • 应用领域

    这种类型的插件通常以ros-action或简单的ros-topic的形式创建通信功能,并且可以在move group context上运行。因此,可能的应用非常多样化

  • 接口说明

    该接口在move_group_capability.h中定义。该接口主要由一个必须被覆盖的初始化函数组成

  • 具体实现

    MoveIt2提供了许多默认功能。可以在此处找到这些默认功能插件的说明。

    一个具体的插件示例就是cartesian_path_service_capability。这个具体插件可用于计算笛卡尔路径。其初始化函数的实现如下所示。在这个示例中,该插件会发布一个包含有关轨迹信息的话题,以及一个用于计算新轨迹的服务。

void move_group::MoveGroupCartesianPathService::initialize()
{
  display_path_ = node_handle_.advertise<moveit_msgs::DisplayTrajectory>    (planning_pipeline::PlanningPipeline::DISPLAY_PATH_TOPIC, 10, true);
  cartesian_path_service_ = root_node_handle_.advertiseService(CARTESIAN_PATH_SERVICE_NAME,     &MoveGroupCartesianPathService::computeService, this);
}

KinematicsBase接口
kinematics::KinematicsBase
KinematicsBase接口使您能够:
编写您自己的正运动学和逆运动学解算器
封装外部的运动学解算器库

  • 接口说明

    具有良好文档的此接口位于此处。

  • 具体实现

    KinematicsBase接口的实现示例包括:

    KDL插件:header, cpp

    SrvKinematicsPlugin插件: header, cpp

PlannerManager接口

planning_interface::PlannerManager

  • 用法

    MoveIt2规划器的基类。通过实现该类,可以将自己的规划器用于 MoveIt2中

  • 接口说明

    该接口是在planning_interface.h中定义的。

  • 具体实现

    MoveIt2这个接口的默认实现是OMPL规划器。

PlanningRequestAdapter接口
planning_request_adapter::PlanningRequestAdapter
此类型插件的概念已经作为“MoveIt2基本概念”文档的一部分进行了说明。

  • 用法
    在传递给解算器之前更新/调整运动规划请求,并操纵由该规划器生成的结果运动规划。默认情况下,MoveIt2中会使用以下适配器:

    • AddTimeParameterization:将速度和加速度值添加到基于最大值的一条运动轨迹,用于后期处理

    • FixWorkspaceBounds:如果未指定,则添加一个规划量

    • FixStartStateBounds:确保关节编码器报告的关节值不超过关节极限值

    • FixStartStateCollision:有的时候,根据网格和URDF,关节编码器报告的当前机器人状态会被认为处于碰撞状态—这是由于噪声和建模不准确造成的

    • FixStartStatePathConstraints:修复违反路径约束的问题,例如在拿着一杯水时抓手的方位

    • ResolveConstraintFrames:将通过子级坐标系(例如位姿目标cup/handle)定义的约束坐标系变更为物体或机器人坐标系(例如cup)

  • 接口说明

    该接口位于这里

  • 具体实现

    该规划请求适配器当前是在为每个机器人生成的 ompl_planning_pipeline.launch中指定的。PlanningRequestAdapters的实现示例都可以在这个moveit_ros_planning文件夹中找到

MoveItControllerManager接口
moveit_controller_manager::MoveItControllerManager

  • 用法

MoveIt2不强制要求控制器的实现方式。为了让你的控制器可以在 MoveIt2周使用,需要实现这个接口。此接口的主要目的在于公开一组已知的控制器,并可能允许激活和停用它们(如果有多个控制器可用的话)。通常情况下,可以使用多个控制器来执行一个运动。当有多个控制器可用时,将某个控制器标记为默认控制器会使MoveIt2更喜欢使用该控制器。该管理器还协调两个控制器之间的切换。某个控制器可以是激活的或非激活的。这意味着MoveIt2可以在需要时激活该控制器,并让重叠的控制器(控制同一组关节的控制器)处于非激活状态

  • 具体实现

    该接口是在controller_manager.h中定义的。 该接口的一个具体实现可以在这里找到:moveit_simple_controller_manager。 controller_manager.launch应该看起来如下所示:

<launch>
  <rosparam file="$(find xamla_egomo_moveit_config_dev)/config/controllers.yaml"/>
  <param name="use_controller_manager" value="true"/>
  <param name="trajectory_execution/execution_duration_monitoring" value="true"/>
  <param name="moveit_controller_manager"     value="moveit_simple_controller_manager/MoveItSimpleControllerManager"/>
</launch>

其中控制器是在“controllers.yaml”文件中定义的。

ControllerHandleAllocator接口
moveit_ros_control_interface::ControllerHandleAllocator

  • 用法

    通过实现ControllerHandle.h接口,可以为基于动作的控制器提供处理程序分配。控制器处理程序是基于类MoveItControllerHandle的。 这些处理程序与控制器通信以便执行诸如发送轨迹等任务。

  • 接口说明

    该接口是在ControllerHandle.h中定义的。

  • 具体实现

    此接口的一个示例性实现是joint_trajectory_controller plugin.cpp。 这也是目前唯一可用的实现

MoveItSensorManager接口
moveit_sensor_manager::MoveItSensorManager
此插件用于将传感器集成到规划过程中。该接口是在sensor_manager.h中定义的。

  • 用法

    用于保存传感器的信息,例如:可以执行观察的沿Z轴的最大距离。该管理器可以将传感器指向空间中的某个特定点。这可能需要执行某条轨迹,但可能会或可能不会执行该轨迹。如果没有执行该轨迹,就会将该轨迹作为sensor_trajectory的一部分返回。 这是推荐的行为,因为此函数的调用者可以检查该轨迹的安全性。该函数在成功时会返回true(要么成功完成了执行,要么成功计算了一条轨迹)。

  • 具体实现

    待办(TODO)。

ConstraintSamplerAllocator接口
constraint_samplers::ConstraintSamplerAllocator

  • 用法

    待办(TODO)。

  • 接口说明

    待办(TODO)。

  • 具体实现

    待办(TODO)。

CollisionPlugin接口
collision_detection::CollisionPlugin
用于加载自定义碰撞检测机器人/世界的插件API。

  • 用法
namespace my_collision_checker
  {
  class MyCollisionDetectorAllocator :
    public collision_detection::CollisionDetectorAllocatorTemplate<MyCollisionWorld, MyCollisionRobot,     MyCollisionDetectorAllocator>
  {
    public:
      static const std::string NAME_;
  };
  const std::string MyCollisionDetectorAllocator::NAME_("my_checker");
  }
     namespace collision_detection
  {
  class MyCollisionDetectionLoader : public CollisionPlugin
  {
  public:
    virtual bool initialize(const planning_scene::PlanningScenePtr& scene, bool exclusive) const
    {
      scene->setActiveCollisionDetector(my_collision_checker::MyCollisionDetectorAllocator::create(),     exclusive);
      return true;
     }
   };
    
  • 应用领域

    如果您想使用自定义的碰撞检测算法进行自碰撞或与环境的碰撞检测,则这是提供必要接口的插件。

  • 接口说明

    该接口是在collision_plugin.h中定义的。该接口主要由一个必须被覆盖的初始化函数组成

  • 具体实现

    该接口目前尚没有可用的实现。

OccupancyMapUpdater接口
occupancy_map_monitor::OccupancyMapUpdater

  • 用法

    待办(TODO)。

  • 接口说明

    待办(TODO)。

  • 具体实现

    待办(TODO)。

参考英语原文地址:https://moveit.ros.org/documentation/plugins/

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros2与moveit2入门教程