Wiki
硬體與控制器生命週期
本文由簡體中文內容確定性轉換,並受版本化術語表保護。
硬體與控制器分別有生命週期。控制器 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控制週期