Wiki
硬件与控制器生命周期
Existing English translations were reused. 23 current source blocks remain in Simplified Chinese, without triggering paid translation.
硬件与控制器分别有生命周期。控制器 active 需要可用接口,但它与硬件并不是同一个对象。
1.两套状态分别表示什么
硬件:加载配置 → 建立通信 → 允许执行 → 停用 → 清理通信
控制器:加载实例 → 读取参数 → 取得接口并更新 → 释放接口 → 卸载
| 硬件回调 | 教学实现中的任务 | 实物中通常需要考虑 |
|---|---|---|
| on_init | 验证接口、分配存储 | 解析地址、关节与协议参数 |
| on_configure | 重置模拟状态 | 打开通信,验证设备身份和反馈 |
| on_activate | 对齐命令与反馈 | 检查故障、模式与使能条件 |
| on_deactivate | 保持当前状态 | 按设备协议停止或保持 |
| on_cleanup | 当前模拟实现不占用设备 | 关闭通信与线程 |
| on_shutdown | 结束生命周期 | 执行设备所需退出动作 |
表中实物任务是设计职责,不代表框架自动执行了设备操作。active 状态本身不能证明驱动器已经使能。
2.示例 1:只改变控制器状态
启动 mini.launch.py 后执行:
ros2 control list_controllers
ros2 control set_controller_state forward_position_controller inactive
ros2 control list_controllers
ros2 control list_hardware_components
2.1.预期现象
控制器 inactive,而 MiniSystem 仍可能 active。不要把“控制器已停用”解释成“硬件已经关闭”。
3.示例 2:再改变硬件状态
先确保命令控制器 inactive,然后执行:
ros2 control set_hardware_component_state MiniSystem inactive
ros2 control list_hardware_components
ros2 control list_hardware_interfaces
ros2 control set_hardware_component_state MiniSystem active
ros2 control set_controller_state forward_position_controller active
恢复顺序是先保证硬件满足激活条件,再激活控制器。不要假设停用硬件会替你完整处理所有控制器状态;操作后重新查看两张状态表。
3.1.回调是谁调用的
CLI 向管理器发服务请求;管理器协调控制器或资源管理器;框架最后调用插件中的生命周期回调。用户不需要在 launch 中直接调用 MiniSystem::on_activate。
3.2.返回值有什么区别
生命周期回调返回 CallbackReturn,包括 SUCCESS、FAILURE、ERROR。周期 read/write/update 返回相应接口层的 return_type。二者不是可互换的枚举。
成功、失败、错误的后续状态由框架状态机和回调处理共同决定。尤其 ERROR 不等于“记录一句日志后照常运行”;需要查看硬件状态、接口可用性和管理器日志。
4.示例 3:理解激活时对齐目标
假设反馈为 0.4,上一次运行遗留命令为 -0.8。如果激活后直接下发旧值,机器人可能出现突然运动。因此 MiniSystem 在 on_activate 中把命令和已应用目标都对齐到反馈。
真实设备反馈不能在配置时随意清零。配置模拟状态的逻辑不能机械复制到编码器驱动。
5.对应底层源码
查看 ros2_control/hardware_interface/include/hardware_interface/system_interface.hpp、ros2_control/hardware_interface/src/system.cpp,以及管理器中的控制器配置与切换实现。对照当前版本实际行为,不把较新版本的生命周期规则套入本例。
返回 Humble 总览 · 上一篇:状态接口与命令接口源码 · 下一篇:read-update-write控制周期