Files
lightweight-cobot/openspec/specs/motion-arbitration/spec.md
T

48 lines
3.6 KiB
Markdown

# Motion Arbitration
## Purpose
Определяет согласование конкурирующих источников движения, интерактивное управление TCP в Webots и семантику общей команды остановки.
## Requirements
### Requirement: Приоритет обычного движения
При включённой TCP-гизме цели обычного траекторного action SHALL иметь приоритет над низкоприоритетной командой гизмы.
#### Scenario: Цель MoveIt при активности гизмы
- **WHEN** поступает обычная цель `FollowJointTrajectory`
- **THEN** выдача новых низкоприоритетных целей блокируется до терминального результата контроллера
### Requirement: Аренда приоритета
Сервис `/cobot/tcp_gizmo/priority` SHALL выдавать именованную аренду на конечный TTL по настенным часам и поддерживать продление и освобождение.
#### Scenario: Некорректный TTL
- **WHEN** владелец пуст или TTL не находится в допустимом интервале `(0, 60]` секунд
- **THEN** запрос аренды отклоняется
#### Scenario: Потеря аренды
- **WHEN** продление аренды из сервера движения не подтверждено
- **THEN** текущая операция движения прерывается с ошибкой приоритета
### Requirement: Одна команда на жест
Гизма SHALL преобразовывать отпускание маркера в одну цель TCP с текущей эпохой состояния и SHALL отвергать устаревшую эпоху или недоступную обратную связь.
#### Scenario: Устаревшая эпоха
- **WHEN** команда содержит эпоху, отличную от опубликованной в `GizmoState`
- **THEN** цель не отправляется контроллеру и публикуется причина отклонения
### Requirement: Безопасный переход приоритета
Новая высокоприоритетная команда SHALL ждать терминального результата уже переданной низкоприоритетной траектории до отправки контроллеру.
#### Scenario: Низкая цель ещё исполняется
- **WHEN** поступает высокая цель во время исполнения цели гизмы
- **THEN** высокая цель ожидает подтверждённого завершения низкой цели
### Requirement: Общая остановка
`/cobot/stop` SHALL отменять текущую операцию планировщика и инвалидировать ожидающие операции; `POST /stop` дополнительно SHALL останавливать runner и прямую траекторию.
#### Scenario: HTTP остановка
- **WHEN** клиент вызывает `POST /stop`
- **THEN** веб-сервер останавливает последовательность, отправляет удержание/сброс прямой траектории и вызывает ROS-сервис остановки