Skip to content

Wiki

状态接口与命令接口源码

About 4 min read

Existing English translations were reused. 17 current source blocks remain in Simplified Chinese, without triggering paid translation.

本节解释框架创建接口以后,控制器与硬件插件如何访问同一资源。

1.示例 1:追踪一条位置命令

控制器借到 joint1/position 的 LoanedCommandInterface
  → set_value 写入接口存储
硬件插件 get_command("joint1/position")
  → 读取同一接口的命令
设备反馈进入 read
  → set_state("joint1/position", feedback)
状态读取者从借用的 StateInterface 取得反馈

接口名只是查找键,真正保存数值的是框架创建的接口对象。从零编写模拟硬件插件中的 q_ 是教学设备模型;框架不会因为名字相同就自动把 q_ 当作接口存储。

2.示例 2:理解自动导出

硬件接口描述由 XML 解析而来。默认 on_export_state_interfaces 和 on_export_command_interfaces 创建并返回框架管理的共享接口。

阶段 关注什么
on_init 参数、名称、接口组合是否有效
接口创建和导入 描述与存储是否正确建立
on_configure/on_activate 初始状态与目标是否合理
read 设备反馈写入框架状态
write 从框架命令取得设备目标

不需要为了设置一个普通关节反馈而重写导出函数。确有自定义接口需求时,先阅读 unlisted 接口描述的扩展点。

3.示例 3:借用接口的值是否总能读取

自编控制器中使用如下模式:

const auto value = state_interfaces_[index].get_optional();
if (!value) {
  return controller_interface::return_type::ERROR;
}
if (!command_interfaces_[index].set_value(*value)) {
  return controller_interface::return_type::ERROR;
}

这是 update 内的解释片段,完整控制器见从零编写控制器。optional 为空时不能解引用,写入失败也不能假定目标已经生效。

硬件插件的 get_command/set_state 便利函数,与控制器借出的 LoanedInterface 方法属于不同层次,不应将两种函数签名混用。

4.示例 4:观察资源释放

运行自己的双关节实例后:

ros2 control list_hardware_interfaces
ros2 control set_controller_state forward_position_controller inactive
ros2 control list_hardware_interfaces
ros2 control set_controller_state forward_position_controller active

停用命令控制器时应释放 claimed 状态,重新激活时再申请。状态接口可供多个读取者使用;同一命令接口不能让两个普通控制器任意同时写入。

源码:ros2_control/hardware_interface/include/hardware_interface/hardware_component_interface.hpp、ros2_control/hardware_interface/include/hardware_interface/loaned_command_interface.hpp、ros2_control/hardware_interface/include/hardware_interface/loaned_state_interface.hpp。


返回 Jazzy 总览 · 上一篇:从零编写模拟硬件插件 · 下一篇:硬件与控制器生命周期