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