硬件组件(Hardware Components)¶
在 ros2_control 框架中,硬件组件(Hardware Components)是对物理硬件的抽象。目前支持三种类型:
- Actuator(执行器):如电机、伺服驱动器
- Sensor(传感器):如编码器、IMU、力传感器
- System(系统):同时包含执行器与传感器的复合设备(如机器人手臂、移动底盘)
📚 有关每种类型的详细说明,请参阅 Hardware Components 官方文档。
指导原则与最佳实践¶
- 硬件接口类型设计:明确区分命令接口(CommandInterface)与状态接口(StateInterface)
- 编写硬件组件:遵循生命周期规范,正确实现状态迁移
- 不同更新频率:支持与 Controller Manager 主循环不同的读写频率
- 异步执行:对耗时操作(如网络通信)使用异步线程
- 语义组件(Semantic Components):将底层硬件信号映射为高层语义接口(如将电机电流映射为“夹爪力”)
- 生命周期管理:严格遵循
LifecycleNode状态机
硬件组件的生命周期(Lifecycle)¶
硬件组件的状态迁移由 LifecycleNode 控制。每个生命周期回调方法的返回值类型为:
返回值含义¶
| 返回值 | 含义 |
|---|---|
CallbackReturn::SUCCESS |
方法执行成功,状态迁移正常进行 |
CallbackReturn::FAILURE |
方法执行失败,状态迁移中止,组件停留在当前状态 |
CallbackReturn::ERROR |
发生严重错误,需在 on_error() 中处理 |
状态迁移与对应方法¶
| 方法 | 成功后的目标状态 | 说明 |
|---|---|---|
on_init()on_cleanup() |
UNCONFIGURED | 硬件仅被初始化,未建立通信,无接口注册到 ResourceManager |
on_configure()on_deactivate() |
INACTIVE | 通信已建立,硬件已配置,可读取状态; 执行器/系统:命令接口存在但不可用(不会发送到硬件) |
on_activate() |
ACTIVE | 状态可读,命令接口可用: • 执行器/系统:电源已启用(如释放刹车),命令将实际发送至硬件 |
on_shutdown() |
FINALIZED | 硬件准备卸载/销毁,释放所有资源(内存、连接等) |
⚠️ 当前行为说明:
即使处于INACTIVE状态,Controller Manager 仍会向命令接口写入数据(见 相关 issue)。
未来计划引入安全关键接口(safety-critical interfaces),仅在ACTIVE状态下允许写入(见 路线图 PR)。
read() 与 write() 中的错误处理¶
当硬件组件的 read() 或 write() 方法返回:
Controller Manager 将自动调用:
以处理运行时错误。
错误恢复机制¶
-
若
on_error()返回CallbackReturn::SUCCESS:
硬件组件将回到UNCONFIGURED状态,可重新配置激活。 -
若
on_error()返回CallbackReturn::FAILURE或ERROR:
硬件组件将进入FINALIZED状态,无法恢复。
❗ 当前限制:
Controller Manager 没有提供重新加载硬件插件的服务。一旦硬件组件进入FINALIZED状态,必须重启整个ros2_control_node才能恢复。
最佳实践建议¶
- 在
on_configure()中建立通信(如串口、CAN、EtherCAT) - 在
on_activate()中启用硬件动力(如使能驱动器、释放抱闸) - 在
on_deactivate()中安全停机(如关闭使能、启用抱闸) - 在
on_cleanup()/on_shutdown()中彻底释放资源 - 在
read()/write()中捕获异常并返回ERROR,而非让进程崩溃 - 在
on_error()中尝试恢复通信或进入安全状态
✅ 通过严谨的生命周期管理,可显著提升机器人系统的可靠性与安全性。