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 總覽 · 上一篇:從零編寫模擬硬體外掛 · 下一篇:硬體與控制器生命週期