Wiki
管理器與資源管理原始碼
約 3 分鐘閱讀
本文由簡體中文內容確定性轉換,並受版本化術語表保護。
把前面已經執行的行為連線到框架呼叫鏈,按層定位錯誤。
1.示例 1:模型怎樣變成硬體物件
robot_description
→ 解析 HardwareInfo 与 InterfaceDescription
→ ResourceManager 按插件名加载对象
→ on_init 检查和保存配置
→ 框架创建并导入接口
→ 配置、激活硬件
pluginlib 根據 XML 把查詢名稱對映到 C++ 派生類。類匯出、外掛描述、庫安裝和資源登記都需要正確。
2.示例 2:引數怎樣進入控制器
spawner 提交参数文件和加载请求
→ 管理器创建控制器实例
→ 配置控制器节点参数
→ on_configure
→ switch 协调接口借用与激活
→ on_activate
→ 周期 update 调度 active 控制器
spawner 是服務客戶端,退出後控制器仍由管理器持有。管理器引數與控制器節點引數要分別檢查。
3.示例 3:按錯誤所在層排查
| 層次 | 典型問題 |
|---|---|
| 模型解析 | joint 名稱和介面宣告不一致 |
| 外掛建立 | 查詢名、匯出、共享庫依賴錯誤 |
| 配置 | 引數歸屬錯誤或裝置無法連線 |
| 啟用 | 介面不可用或被佔用 |
| 週期執行 | 輸入非法、反饋過期或演算法失敗 |
在原始碼目錄搜尋:
cd ~/ros2_control_jazzy_reference/ros2_control
rg -n 'load_urdf|claim_command_interface' hardware_interface/src
rg -n 'ControllerManager::(load_controller|switch_controller|read|update|write)' controller_manager/src
開啟命中函式上下文,沿呼叫引數繼續讀。不能只憑搜尋命中行推斷資源歸還和錯誤恢復行為。
3.1.為什麼管理服務不能隨意改 update 中的物件
服務執行緒與控制執行緒可能併發。管理器需要同步控制器列表與切換時機,避免物件正在執行時被直接解除安裝。閱讀 update 與 switch 的協作,比單獨閱讀載入函式更能解釋執行行為。
原始碼:ros2_control/controller_manager/controller_manager/spawner.py、ros2_control/controller_manager/src/controller_manager.cpp、ros2_control/hardware_interface/src/resource_manager.cpp。
返回 Jazzy 總覽 · 上一篇:從零編寫控制器 · 下一篇:即時迴圈與非同步通訊