首页 > 其他分享 >ros2_control 架构分析(2)-HardwareInterface

ros2_control 架构分析(2)-HardwareInterface

时间:2024-10-17 16:49:53浏览次数:10  
标签:control std HardwareInterface 硬件 方法 ros2

1.介绍

在ROS2_control框架中,hardware模块负责与物理硬件进行直接通信。它抽象了三类硬件:system、sensor和actuator,分别对应复杂的系统、仅输出数据的传感器和仅接收输入的执行器。

2.类与接口

在ROS2_control中,system、sensor和actuator作为三个核心类存在被上层调用,它们各自包含对应的interface成员变量。开发者通过继承这些interface并重写其方法来实现特定硬件的通信。

3.核心方法

自定义的HardwareInterface派生类需要实现以下核心方法:

  • on_init():进行硬件初始化,如建立通信和参数设置。
  • on_config():该方法是HardwareInterface基类继承自LifecycleNodeInterface类的方法,与ros2的状态机相关的方法。
  • on_active():该方法是HardwareInterface基类继承自LifecycleNodeInterface类的方法,与ros2的状态机相关的方法。
  • on_deactive():该方法是HardwareInterface基类继承自LifecycleNodeInterface类的方法,与ros2的状态机相关的方法,用于暂停执行,释放短期资源。
  • onCleanup():该方法是HardwareInterface基类继承自LifecycleNodeInterface类的方法,与ros2的状态机相关的方法,该方法作用是放弃资源,擦除内存
  • on_shutdown():该方法是HardwareInterface基类继承自LifecycleNodeInterface类的方法,与ros2的状态机相关的方法,用于最后结束节点,释放所有资源。
  • export_state_interface():定义硬件输出接口,将输出值以指针的形式传出,其他模块通过接口名称可以获取指针
  • export_command_interface():定义硬件输入接口,将输入值以指针的形式传出,其他模块通过接口名称可以获取指针
  • read():从硬件读取数据。
  • write():向硬件写入数据。

这些方法通过接口与硬件进行交互,实现数据的读写操作。其中on_config、 on_active、 on_deactive等函数是ROS2中与状态机相关的新特性,用于管理节点的启动与关闭

4.硬件通信

开发者将硬件的数据以指针形式暴露,其他模块可以通过接口名称直接获取到指针对这些数据进行读写,从而实现高效的通信。

5.插件加载

自定义的HardwareInterface类编译后生成so文件,通过URDF文件以插件形式加载。URDF中的ros2_control标签定义了HardwareInfo结构,该结构包含了URDF中定义的所有相关信息,具体结构体成员如下:

struct HardwareInfo
{
  std::string name;
  std::string type;
  std::string hardware_class_type;
  std::unordered_map<std::string, std::string> hardware_parameters;
  std::vector<ComponentInfo> joints;
  std::vector<ComponentInfo> sensors;
  std::vector<ComponentInfo> gpios;
  std::vector<TransmissionInfo> transmissions;
  std::string original_xml;
};

下方是一个urdf文件的示例,可以看到共有3组ros2_control标签,则就对应有3个HardwareInfo变量,每个变量里都将一组ros2_control标签内的数据填写进来,这个工作是在后面要介绍的resource manager中进行的,在获取了这些数据后会通过initial函数将该变量传递给hardwareinterface基类的info_变量,因此自定义的hardwareinterface的派生类里就能使用基类的这个info_变量。如获取urdf中定义的joint、sensor、interface等等信息

<ros2_control name="RRBotSystemPositionOnly" type="system">
 <hardware>
   <plugin>ros2_control_demo_hardware/RRBotSystemPositionOnlyHardware</plugin>
   <param name="example_param_write_for_sec">2</param>
   <param name="example_param_read_for_sec">2</param>
 </hardware>
 <joint name="joint1">
   <command_interface name="position">
     <param name="min">-1</param>
     <param name="max">1</param>
   </command_interface>
   <state_interface name="position"/>
 </joint>
 <joint name="joint2">
   <command_interface name="position">
     <param name="min">-1</param>
     <param name="max">1</param>
   </command_interface>
   <state_interface name="position"/>
 </joint>
</ros2_control>
<ros2_control name="RRBotForceTorqueSensor1D" type="sensor">
 <hardware>
   <plugin>ros2_control_demo_hardware/ForceTorqueSensor1DHardware</plugin>
   <param name="example_param_read_for_sec">0.43</param>
 </hardware>
 <sensor name="tcp_fts_sensor">
   <state_interface name="force"/>
   <param name="frame_id">rrbot_tcp</param>
   <param name="min_force">-100</param>
   <param name="max_force">100</param>
 </sensor>
</ros2_control>
<ros2_control name="RRBotGripper" type="actuator">
 <hardware>
   <plugin>ros2_control_demo_hardware/PositionActuatorHardware</plugin>
   <param name="example_param_write_for_sec">1.23</param>
   <param name="example_param_read_for_sec">3</param>
 </hardware>
 <joint name="gripper_joint ">
   <command_interface name="position">
     <param name="min">0</param>
     <param name="max">50</param>
   </command_interface>
   <state_interface name="position"/>
   <state_interface name="velocity"/>
 </joint>
</ros2_control>

标签:control,std,HardwareInterface,硬件,方法,ros2
From: https://blog.csdn.net/weixin_48418084/article/details/143023276

相关文章

  • 【大画丹青】——AI电商主图,controlnet
    浅试一下电商图,效果还行,能加一些电商lora模型就更好了第一步:抠图,这个很简单,PS2024都可以直接抠主体或者去除背景了第二步:文生图,这个CN我选的控制轮廓,效果质量不错,只用了主模型【maji写实】,加lora会更稳定一些,效果更好。第三步:叠图,把原商品图叠上去,局部重绘背景(主要为了......
  • Maximum Control (medium)
    算法转化题意,即为求树上最长不重链覆盖长链剖分显然可以使用长链剖分的思想,直接剖分后贪心的求最大链即可代码#include<bits/stdc++.h>usingnamespacestd;#definelllonglongconstintmaxn=1e5+5;intn,u,v,rt,d[maxn],son[maxn],h[maxn];inth......
  • 库卡ForceTorqueControl(一)
    1.功能说明ForceTorqueControl是一个可后载入的备选软件包,具有下列功能:执行取决于测得的过程力和力矩的运动遵守过程力和力矩,不取决于工件的位置和尺寸遵守加工工件期间复杂的过程力变化沿着根据测得的过程力编程的轨迹调整速度通过对机器人柔韧性的编程补偿工件的......
  • 【ROS2实操三】动作通信
    概念关于action通信,我们先从之前导航中的应用场景开始介绍,描述如下:        机器人导航到某个目标点,此过程需要一个节点A发布目标信息,然后一个节点B接收到请求并控制移动,最终响应目标达成状态信息。        乍一看,这好像是服务通信实现,因为需求中要A发送......
  • 针对所有的controller 添加出入参log日志打印
    packagecom.aide.web.tool;importlombok.extern.slf4j.Slf4j;importorg.aspectj.lang.ProceedingJoinPoint;importorg.aspectj.lang.annotation.Around;importorg.aspectj.lang.annotation.Aspect;importorg.springframework.stereotype.Component;importjava.ut......
  • 基于ROS2的智能协同系统
    基于ROS2的智能协同系统任务一:基础任务配置ubuntu环境,注意ROS版本与ubuntu版本间的对应关系安装ROS2框架使用Publisher-Subscriber结构,完成两个node节点间传输数据功能传输文字与视频STEP:配置Ubuntu环境安装VMware安装虚拟机(VMware)保姆级教程(附安装包)_v......
  • 过滤器拦截器拦截了request后,controller的@RequestBody 无法获取request内容,报错 Requ
    SpringMVC的拦截器、过滤器、Controller之间的关系 众所周知所有的post请求中的body参数是已流形式存在的,而流数据只能读取一次(为啥看这里),如果在拦截器和过滤器中需要对post参数进行处理的话,就会报Requiredrequestbodyismissing异常。既然知道原因,那只要能将流保存起来......
  • Boost Data Visualization with a New Gauge Control
    BoostDataVisualizationwithaNewGaugeControlCodejockToolkitPro24.0.0helpsusersexperiencemodern,customizablegaugesthatbringdatatolife,inasingle,versatilecomponent.CodejockToolkitProisacomprehensivesuiteofUIcomp......
  • ROS2 如何实现发布者和订阅者
    1、创建工作空间ros2_workspacecdqhr_ws/srcros2pkgcreatetest_moudle--build-typeament_cmake--dependenciesrclcpp目录格式如上图2、创建订阅者和发布者code创建发布者节点在路径:/qhr_ws/src/test_moudle/src下创建 talker.cpp的文件,内容如下:#in......
  • CAN(Controller Area Network)总线的仲裁机制
    CAN(ControllerAreaNetwork)总线的仲裁机制是其核心特性之一,它确保了在多节点环境中数据能够高效、公正地传输。以下是对CAN仲裁机制的详细解释和介绍:一、仲裁机制概述在CAN总线网络中,各个节点地位平等,没有固定的主节点或从节点之分。这种设计使得每个节点在需要时都可以试图......