Skip to content

Wiki

管理器与资源管理源码

About 3 min read

Existing English translations were reused. 14 current source blocks remain in Simplified Chinese, without triggering paid translation.

把前面已经运行的行为连接到框架调用链,按层定位错误。

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 总览 · 上一篇:从零编写控制器 · 下一篇:实时循环与异步通信