跳到正文

Wiki

狀態接口與命令接口源碼

約 4 分鐘閱讀

本文由簡體中文內容確定性轉換,並受版本化術語表保護。

本節解釋框架創建接口以後,控制器與硬件插件如何訪問同一資源。

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