ros_control hardware_interface硬件接口

目录

硬件接口 

设置新机器人

使用现有接口

创建机器人专用界面

资源管理

硬件接口 

ROS 控制使用硬件接口与可用的 ROS 控制器之一结合使用,向硬件发送 ( write() ) 命令并从中接收 ( read() ) 关节状态。

截至撰写本文时可用的硬件接口列表(通过硬件资源管理器):

  • 关节命令接口- 支持命令一系列关节的硬件接口。请注意,这些命令可以具有任何语义,只要它们每个都可以由单个双精度数表示即可,它们不一定是努力命令。要指定此命令的含义,请参阅派生类:
    • 作用力关节接口 - 用于指挥基于作用力的关节。
    • 速度关节接口 - 用于命令基于速度的关节。
    • 位置关节接口 - 用于指挥基于位置的关节。
  • 关节状态接口 - 支持读取一组指定关节的状态的硬件接口,每个关节都有一些位置、速度和作用力(力或扭矩)。
  • 执行器状态接口 - 支持读取一组指定执行器状态的硬件接口,每个执行器都有一定的位置、速度和作用力(力或扭矩)。
  • 执行器命令接口
    • 作用力执行器接口
    • 速度执行器接口
    • 位置执行器接口
  • 力-扭矩传感器接口
  • IMU传感器接口

请注意,hardware_interface::JointCommandInterface允许读取关节状态并命令基于 [effort|velocity|position] 的关节(请参阅此答案)。

设置新机器人

此页面将引导您完成设置新机器人以与控制器管理器配合使用的步骤。当您使机器人支持一个或多个标准接口时,您将能够利用在标准接口上工作的大型控制器库。

使用现有接口

假设我们有一个有 2 个关节的机器人:A 和 B。两个关节都是位置控制的。在这种情况下,您为机器人定义一个hardware_interface::RobotHW ,它应该提供标准的JointPositionInterface和JointStateInterface,以便它可以重用所有已编写的与JointPositionInterface和JointStateInterface一起使用的控制器。代码如下所示:

#include <hardware_interface/joint_command_interface.h>
#include <hardware_interface/joint_state_interface.h>
#include <hardware_interface/robot_hw.h>

// 我的机器人类,继承自RobotHW接口
class MyRobot : public hardware_interface::RobotHW
{
public:
  // 构造函数
  MyRobot() 
 { 
   // 连接并注册关节状态接口
   hardware_interface::JointStateHandle state_handle_a("A", &pos[0], &vel[0], &eff[0]);
   jnt_state_interface.registerHandle(state_handle_a); //注册"A"关节

   hardware_interface::JointStateHandle state_handle_b("B", &pos[1], &vel[1], &eff[1]);
   jnt_state_interface.registerHandle(state_handle_b); //注册"B"关节

   registerInterface(&jnt_state_interface); //注册关节状态接口

   // 连接并注册关节位置接口
   hardware_interface::JointHandle pos_handle_a(jnt_state_interface.getHandle("A"), &cmd[0]);
   jnt_pos_interface.registerHandle(pos_handle_a); //注册"A"关节位置

   hardware_interface::JointHandle pos_handle_b(jnt_state_interface.getHandle("B"), &cmd[1]);
   jnt_pos_interface.registerHandle(pos_handle_b); //注册"B"关节位置

   registerInterface(&jnt_pos_interface); //注册关节位置接口
  }

private:
  // 私有成员:关节状态接口和关节位置接口
  hardware_interface::JointStateInterface jnt_state_interface;
  hardware_interface::PositionJointInterface jnt_pos_interface;
  double cmd[2]; //控制命令
  double pos[2]; //位置数据
  double vel[2]; //速度数据
  double eff[2]; //力(效能)数据
};

就是这样!那么这段代码实际上是如何控制你的机器人的呢?上述功能旨在使控制器管理器(以及控制器管理器内的控制器)能够访问机器人的关节状态以及机器人的命令。当控制器管理器运行时,控制器将从机器人中的 pos、vel 和 eff 变量中读取,并且控制器会将所需的命令写入 cmd 变量。您的工作是确保 pos、vel 和 eff 变量始终具有可用的最新关节状态,并且您还需要确保机器人执行写入 cmd 变量的所有内容。为此,您可以向机器人类添加 read() 和 write() 函数。在你的 main() 中,你会做这样的事情:

main()
{
  MyRobot robot;
  controller_manager::ControllerManager cm(&robot);

  while (true)
  {
     robot.read();
     cm.update(robot.get_time(), robot.get_period());
     robot.write();
     sleep();
  }
}

正如上图所示,您当然不限于仅从一个接口继承。您的机器人可以提供任意数量的接口。例如,您的机器人可以提供“PositionJointInterface”和“VelocityJointInterface”等等。

创建机器人专用界面

如果您不想为机器人编写一套全新的控制器,并且想利用现有控制器的库,那么标准接口非常棒。但是,如果您的机器人具有标准接口不支持的某些功能怎么办?这是否意味着您根本无法使用标准接口?你猜怎么着,事实证明你可以两者兼得!您可以使用标准接口(并重复使用标准控制器)来实现机器人的标准功能。同时,您可以在特定于机器人的界面中公开特定于机器人的功能。再看一下上图,看看它如何显示具有标准接口和机器人专用接口的机器人。

对于这种情况,代码是什么样的?
 

class MyRobot : public hardware_interface::RobotHW
{
public:
  // 构造函数
  MyRobot() 
  {
    // 注册关节状态和位置接口
    ...
    ... // 此处的 ... 表示上一个例子中提到的代码,具体请参考前面的代码示例
    ...

    // 注册一些机器人特有的接口
    registerInterface(&cool_interface); // 注册自定义的“cool_interface”接口
  }

  private:
    MyCustomInterface cool_interface; // 定义一个名为 cool_interface 的私有成员,类型为 MyCustomInterface
};

或者...您可以注册 MyRobot 类本身:

class MyRobot : public hardware_interface::RobotHW, public hardware_interface::HardwareInterface
{
public:
  // 构造函数
  MyRobot() 
  {
    // 注册关节状态和位置接口
    ...
    ... // 此处的 ... 表示前面示例代码中的内容,具体请参考之前的代码注释
    ...

    // 注册 MyRobot 类本身,以便使 'someCoolFunction' 函数可用
    // MyRobot 类继承自 HardwareInterface,这样才能做到这一点
    registerInterface(this);
  }

  // 定义一个函数
  void someCoolFunction();
 
};

因此,自定义接口只不过是向机器人类添加任意数量的函数调用,并注册机器人类本身。这些机器人特定的功能仅适用于专门为您的机器人设计的控制器,但与此同时,您的机器人仍将使用机器人的标准接口与标准控制器配合使用。

资源管理

控制器管理器跟踪每个控制器正在使用哪些资源。资源可以是“right_elbow_joint”、“base”、“left_arm”、“wrist_joints”等。几乎任何您想用于您的特定机器人的东西。资源在硬件接口中指定。例如,!PositionJointInterface 使用关节名称作为资源。您当然可以实现自己的硬件接口,并定义自己的资源。当控制器初始化时,它们会从硬件接口请求大量资源;这些请求由控制器管理器记录。因此控制器管理器确切地知道哪个控制器请求了哪些资源。

RobotHW 类有一个简单的资源管理默认实现:它只是防止两个使用相同资源的控制器同时运行。请注意,使用相同资源的两个控制器可以同时加载,但不能同时运行。如果这个简单的资源管理方案适合您的机器人,您无需执行任何操作,控制器管理器将自动应用此方案。如果您的机器人需要不同的方案,您可以通过实现一个函数轻松创建自己的方案:
 

class MyRobot : public hardware_interface::RobotHW 
{ 
public: 
  MyRobot() 
  { 
    // 注册硬件接口 接口
    ... 
    ...(参见上面的代码)
    ... 


    // 实现机器人特定的资源管理
    bool checkForConflict(const std: :list<ControllerInfo>& info) const 
    { 
       // 该控制器列表不能同时运行
       ... 
       return true; 

       // 该列表中的控制器可以同时运行
       ... 
       return false; 
    } 
  } 
};

checkForConflict 方法的输入是控制器信息对象的列表。这些对象中的每一个都与一个控制器匹配,并包含有关该控制器的所有信息。此信息包括控制器名称、控制器类型、硬件接口类型以及控制器声明的资源列表。基于所有这些信息,您可以提出自己的方案来决定是否允许给定的控制器列表同时运行。
参考链接:https://github.com/ros-controls/ros_control/wiki/hardware_interface

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: `ros_control`是ROS中的一个控制框架,用于实现机器人的高级控制。它提供了一套抽象的控制接口,使得机器人硬件控制和软件控制可以被分离开来。`ros_control`框架包含了多个组件,例如控制器(controller)、硬件接口hardware interface)、传感器接口(sensor interface)等,这些组件可以按照需要组合在一起,构建出适合不同机器人和应用场景的控制系统。 在`ros_control`框架下,机器人控制器可以通过订阅机器人状态信息(如关节角度、速度、加速度等),并根据控制策略发布控制指令,控制机器人的运动。同时,硬件接口可以将控制指令转化为实际的电机控制信号,从而控制机器人的运动。 `ros_control`框架的优势在于它提供了一套标准化的控制接口,使得不同类型的机器人可以使用同一套控制器进行控制。这样,开发者可以更加专注于机器人的应用开发,而不必关注底层的硬件控制细节。 ### 回答2: ros_control是一个在ROS机器人操作系统)中用于控制机器人的软件包。它提供了一种标准化的方法来控制不同类型的机器人,包括机械臂、移动机器人和其他类型的机器人ros_control的设计目标是提供一个灵活且可扩展的控制架构,以满足不同机器人控制需求。它将机器人控制分为硬件接口控制器两个层次。硬件接口层负责处理机器人硬件和传感器的数据交互,包括读取传感器数据和发送控制命令到机器人硬件控制器层则负责实现控制算法,根据硬件接口提供的数据计算出适当的控制命令,并发送给硬件接口层执行。 通过ros_control,使用者可以很容易地编写自己的硬件接口控制器。它提供了一套标准化的接口和类来处理机器人控制相关的操作。使用标准化接口可以使不同类型的硬件接口控制器之间可以互相替换,而无需修改其他部分的代码。这使得开发者可以更加专注于控制算法的设计和实现,而不需要关注细节的硬件接口实现。 此外,ros_control还提供了一些常用的控制器实现,如PID控制器、位置控制器和速度控制器等。这些控制器可以直接用于控制机器人,而无需用户自己实现。同时,它也支持用户自定义控制器,使开发者可以根据自己的需求实现更复杂的控制策略。 总而言之,ros_control是一个在ROS控制机器人的重要软件包。它提供了一套灵活且可扩展的控制架构,使开发者可以更加方便地设计和实现机器人控制算法。 ### 回答3: ros_control是一个ROS(Robot Operating System)软件包,用于控制机器人硬件。它提供了一个灵活和通用的框架,用于在ROS中实现各种机器人控制算法和架构。 ros_control主要由以下几个组件组成: 1. 硬件接口Hardware Interface):该组件定义了机器人硬件控制系统之间的接口,包括传感器和执行器。它允许开发者将具体的机器人硬件ros_control框架进行连接和集成。 2. 控制器(Controller):该组件实现了具体的机器人控制算法,例如PID控制器、状态机控制等。开发者可以根据机器人的需求编写自定义控制器,或者使用已经提供的控制器。 3. 控制器管理器(Controller Manager):该组件负责启动、停止和切换控制器。它允许用户通过ROS话题或服务接口来管理机器人的不同控制器,并实现控制器间的平滑过渡。 4. 硬件接口管理器(Hardware Interface Manager):该组件管理不同硬件接口的初始化和更新。它通过ros_control中定义的硬件接口统一处理传感器和执行器的数据流。 使用ros_control,开发者可以方便地在ROS中实现机器人控制功能。它提供了一个统一的接口和管理机制,使得不同的控制器和硬件接口能够无缝集成,并能够通过ROS的通信机制进行配置和切换。 总之,ros_control是一个强大而灵活的机器人控制框架,它提供了一个通用的接口和管理机制,方便开发者在ROS中实现机器人的各种控制算法和架构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值