跳到正文

Wiki

硬件与控制器生命周期

约 4 分钟阅读

硬件与控制器分别有生命周期。控制器 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控制周期