Wiki
狀態接口與命令接口源碼
本文由簡體中文內容確定性轉換,並受版本化術語表保護。
本節解釋框架創建接口以後,控制器與硬件插件如何訪問同一資源。
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 總覽 · 上一篇:從零編寫模擬硬件插件 · 下一篇:硬件與控制器生命週期