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