Wiki
管理器與資源管理源碼
本文由簡體中文內容確定性轉換,並受版本化術語表保護。
本節把前面已經運行過的行為串成調用鏈。閲讀目標是知道每層負責什麼,以及故障發生在哪裏。
1.示例 1:從機械人描述追到硬件實例
在固定版本源碼中按順序定位:
ControllerManager 接收 robot_description
→ ResourceManager::load_urdf
→ parse_control_resources_from_urdf
→ 按 system / actuator / sensor 分类
→ load_and_initialize_system 等函数
→ pluginlib 根据 XML 查找并创建派生对象
→ 调用 on_init
→ 导入状态、命令接口并验证描述一致性
1.1.關鍵數據怎樣傳遞
URDF 字符串變成 HardwareInfo;HardwareInfo 保存組件、關節與參數;插件 on_init 獲得這個對象;接口導出後,ResourceManager 以完整名字管理句柄。
查看時同時打開 MiniSystem 的 on_init 與導出函數。這樣可以把框架調用與自己的代碼對應起來。
2.示例 2:從 spawner 追到控制器插件
spawner 请求管理器服务
→ load_controller 根据 type 创建控制器实例
→ 初始化控制器节点和参数
→ configure_controller 调用 on_configure
→ switch_controller 协调停用与激活
→ 根据 InterfaceConfiguration 借出接口
→ on_activate
→ update 循环开始调度这个 active 控制器
spawner 是服務客户端,不是實時控制循環。它退出後,控制器仍由管理器持有並繼續運行。
3.示例 3:把錯誤放回對應層
| 錯誤位置 | 典型原因 | 查找重點 |
|---|---|---|
| URDF 解析 | 標籤、參數、關節聲明不一致 | component_parser |
| 硬件加載 | 插件 XML、庫、類名或依賴缺失 | pluginlib 與資源管理器日誌 |
| 配置失敗 | 參數錯誤、設備無法打開 | on_configure |
| 激活失敗 | 接口不可用或已佔用 | claim 與 switch 路徑 |
| 週期報錯 | 非法命令、反饋超時、算法失敗 | read/update/write 返回值 |
4.示例 4:實際搜索源碼
cd ~/ros2_control_humble_reference/ros2_control
rg -n 'load_urdf|claim_command_interface|load_and_initialize_system' hardware_interface/src
rg -n 'ControllerManager::(load_controller|switch_controller|read|update|write)' controller_manager/src
rg -n 'createSharedInstance|createUnmanagedInstance' controller_manager hardware_interface
rg 僅幫助定位,閲讀時要打開函數上下文,不能只憑搜索命中行推斷狀態機行為。若系統沒有 rg,可執行 sudo apt-get install ripgrep,或用編輯器搜索。
5.控制器切換為何需要協調
管理服務可能由 Executor 線程處理,而控制器列表和接口正在控制線程中使用。管理器需要安排切換時機,避免一邊 update 一邊隨意刪除對象。具體同步方式應以固定提交實現為準。
6.本節總結
ControllerManager 管理控制器與調度,ResourceManager 管理硬件與接口,pluginlib 創建可加載對象。它們一起讓“配置裏寫一個名字”最終變成“某個 C++ 方法被週期調用”。
源碼:ros2_control/controller_manager/controller_manager/spawner.py、ros2_control/controller_manager/src/controller_manager.cpp、ros2_control/hardware_interface/src/resource_manager.cpp。
返回 Humble 總覽 · 上一篇:從零編寫控制器 · 下一篇:實時循環與異步通信