RMCS 框架插件组件,负责:
- 维护飞镖全局状态机 (State Machine)
- 管理任务队列 (Task Queue),每帧驱动当前任务向前推进
- 通过 RMCS Interface 黑板与底层硬件组件通信
- 对任务失败提供统一的异常处理入口
┌─────────────────────────────────────────────────────────────────┐
│ │
│ IDLE ──[提交Task]──► RUNNING ──[SUCCESS]──► IDLE |
│ ▲ │ │
│ │ ├──[FAILURE]──► ERROR │
│ │ │ │
│ [recover] [cancel()] │
│ │ │ │
│ ERROR ◄────────────────-┘ │
└─────────────────────────────────────────────────────────────────┘
DartManager 继承自 rmcs_executor::Component 和 rclcpp::Node,在初始化时会注册一系列输入输出接口,用于与底层硬件和外部组件通信。
系统状态由 State 枚举定义:
IDLE:空闲,无任务运行。RUNNING:有任务正在执行。ERROR:任务失败,等待恢复。
每帧通过 update() 函数轮询命令并驱动任务执行:
- 空闲 (
IDLE):从队列中取出下一个任务并开始执行。 - 运行中 (
RUNNING):调用tick_current_task()推进当前任务。根据任务返回的状态 (SUCCESS,FAILURE, 或RUNNING) 进行状态转换。 - 错误 (
ERROR):暂停调度,等待外部发送recover命令。
外部组件可以通过写入 /dart/manager/command 接口发送指令(字符串格式)。
内置保留命令包括:
cancel:取消当前任务并清空任务队列。recover:从ERROR状态恢复到IDLE。
其他任务命令(如 load, fire)会在 poll_command() 中解析并生成对应的 Task 加入队列。
开发者可以通过派生 Action 或组装现有的 Action 创建 Task。DartManager 提供了 API 供任务访问底层的硬件输入输出接口,例如 belt_target_velocity() 和 left_belt_velocity()。
任务执行失败时会触发 on_task_failure(),该函数会将输出置零,保证系统安全,并将状态机置为 ERROR。