跳到正文

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 總覽 · 上一篇:從零編寫控制器 · 下一篇:即時迴圈與非同步通訊