跳到正文

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