跳转至

硬件组件(Hardware Components)

ros2_control 框架中,硬件组件(Hardware Components)是对物理硬件的抽象。目前支持三种类型:

  • Actuator(执行器):如电机、伺服驱动器
  • Sensor(传感器):如编码器、IMU、力传感器
  • System(系统):同时包含执行器与传感器的复合设备(如机器人手臂、移动底盘)

📚 有关每种类型的详细说明,请参阅 Hardware Components 官方文档


指导原则与最佳实践

  • 硬件接口类型设计:明确区分命令接口(CommandInterface)与状态接口(StateInterface)
  • 编写硬件组件:遵循生命周期规范,正确实现状态迁移
  • 不同更新频率:支持与 Controller Manager 主循环不同的读写频率
  • 异步执行:对耗时操作(如网络通信)使用异步线程
  • 语义组件(Semantic Components):将底层硬件信号映射为高层语义接口(如将电机电流映射为“夹爪力”)
  • 生命周期管理:严格遵循 LifecycleNode 状态机

硬件组件的生命周期(Lifecycle)

硬件组件的状态迁移由 LifecycleNode 控制。每个生命周期回调方法的返回值类型为:

rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn

返回值含义

返回值 含义
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() 方法返回:

hardware_interface::return_type::ERROR

Controller Manager 将自动调用:

on_error(previous_state)

以处理运行时错误。

错误恢复机制

  • on_error() 返回 CallbackReturn::SUCCESS
    硬件组件将回到 UNCONFIGURED 状态,可重新配置激活。

  • on_error() 返回 CallbackReturn::FAILUREERROR
    硬件组件将进入 FINALIZED 状态无法恢复

当前限制
Controller Manager 没有提供重新加载硬件插件的服务。一旦硬件组件进入 FINALIZED 状态,必须重启整个 ros2_control_node 才能恢复。


最佳实践建议

  1. on_configure() 中建立通信(如串口、CAN、EtherCAT)
  2. on_activate() 中启用硬件动力(如使能驱动器、释放抱闸)
  3. on_deactivate() 中安全停机(如关闭使能、启用抱闸)
  4. on_cleanup() / on_shutdown() 中彻底释放资源
  5. read()/write() 中捕获异常并返回 ERROR,而非让进程崩溃
  6. on_error() 中尝试恢复通信或进入安全状态

✅ 通过严谨的生命周期管理,可显著提升机器人系统的可靠性安全性