跳到正文

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