Wiki
状态接口与命令接口源码
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 总览 · 上一篇:从零编写模拟硬件插件 · 下一篇:硬件与控制器生命周期