跳到正文

Wiki

管理器與資源管理源碼

約 4 分鐘閱讀

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

本節把前面已經運行過的行為串成調用鏈。閲讀目標是知道每層負責什麼,以及故障發生在哪裏。

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 總覽 · 上一篇:從零編寫控制器 · 下一篇:實時循環與異步通信