48 lines
3.6 KiB
Markdown
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-сервис остановки
|
|
|