跳到正文

Wiki

硬件與控制器生命週期

約 4 分鐘閱讀

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

硬件與控制器分別有生命週期。控制器 active 需要可用接口,但它與硬件並不是同一個對象。

1.兩套狀態分別表示什麼

硬件:加载配置 → 建立通信 → 允许执行 → 停用 → 清理通信
控制器:加载实例 → 读取参数 → 取得接口并更新 → 释放接口 → 卸载
硬件回調 教學實現中的任務 實物中通常需要考慮
on_init 驗證接口、分配存儲 解析地址、關節與協議參數
on_configure 重置模擬狀態 打開通信,驗證設備身份和反饋
on_activate 對齊命令與反饋 檢查故障、模式與使能條件
on_deactivate 保持當前狀態 按設備協議停止或保持
on_cleanup 當前模擬實現不佔用設備 關閉通信與線程
on_shutdown 結束生命週期 執行設備所需退出動作

表中實物任務是設計職責,不代表框架自動執行了設備操作。active 狀態本身不能證明驅動器已經使能。

2.示例 1:只改變控制器狀態

啓動 mini.launch.py 後執行:

ros2 control list_controllers
ros2 control set_controller_state forward_position_controller inactive
ros2 control list_controllers
ros2 control list_hardware_components

2.1.預期現象

控制器 inactive,而 MiniSystem 仍可能 active。不要把“控制器已停用”解釋成“硬件已經關閉”。

3.示例 2:再改變硬件狀態

先確保命令控制器 inactive,然後執行:

ros2 control set_hardware_component_state MiniSystem inactive
ros2 control list_hardware_components
ros2 control list_hardware_interfaces
ros2 control set_hardware_component_state MiniSystem active
ros2 control set_controller_state forward_position_controller active

恢復順序是先保證硬件滿足激活條件,再激活控制器。不要假設停用硬件會替你完整處理所有控制器狀態;操作後重新查看兩張狀態表。

3.1.回調是誰調用的

CLI 向管理器發服務請求;管理器協調控制器或資源管理器;框架最後調用插件中的生命週期回調。用户不需要在 launch 中直接調用 MiniSystem::on_activate。

3.2.返回值有什麼區別

生命週期回調返回 CallbackReturn,包括 SUCCESS、FAILURE、ERROR。週期 read/write/update 返回相應接口層的 return_type。二者不是可互換的枚舉。

成功、失敗、錯誤的後續狀態由框架狀態機和回調處理共同決定。尤其 ERROR 不等於“記錄一句日誌後照常運行”;需要查看硬件狀態、接口可用性和管理器日誌。

4.示例 3:理解激活時對齊目標

假設反饋為 0.4,上一次運行遺留命令為 -0.8。如果激活後直接下發舊值,機械人可能出現突然運動。因此 MiniSystem 在 on_activate 中把命令和已應用目標都對齊到反饋。

真實設備反饋不能在配置時隨意清零。配置模擬狀態的邏輯不能機械複製到編碼器驅動。

5.對應底層源碼

查看 ros2_control/hardware_interface/include/hardware_interface/system_interface.hpp、ros2_control/hardware_interface/src/system.cpp,以及管理器中的控制器配置與切換實現。對照當前版本實際行為,不把較新版本的生命週期規則套入本例。


返回 Humble 總覽 · 上一篇:狀態接口與命令接口源碼 · 下一篇:read-update-write控制週期