# Motion Sequences ## Purpose Описывает запуск последовательности суставных и декартовых целей, контроль её состояния и прекращение исполнения через веб-интерфейс. ## Requirements ### Requirement: Конфигурация последовательности Runner SHALL читать JSON-файл с точками движения и параметрами выполнения и различать суставные и декартовы точки. #### Scenario: Суставная точка - **WHEN** точка конфигурации содержит суставные координаты - **THEN** runner отправляет цель `MoveToJoints` и ожидает её результата перед следующей точкой #### Scenario: Декартова точка - **WHEN** точка конфигурации задаёт декартову позу - **THEN** runner отправляет цель `MoveToPose` с заданным планировщиком и ожидает результата ### Requirement: Контроль последовательности через HTTP `POST /sequences/start` SHALL запускать отдельный процесс последовательности, а `GET /sequences/status` и `GET /sequences/logs` SHALL показывать её состояние и ограниченный журнал. #### Scenario: Запущенный процесс - **WHEN** runner исполняется - **THEN** `/sequences/status` возвращает `running` и идентификатор процесса ### Requirement: Повторы и запись Runner SHALL выполнять заданное число итераций последовательности `home → waypoints → home`, выдерживать паузу между итерациями и при заданном `bag_path` записывать выбранные ROS-топики в MCAP. #### Scenario: Две итерации без записи - **WHEN** клиент задаёт `n_iterations=2` и пустой `bag_path` - **THEN** последовательность из начальной, промежуточных и конечной целей выполняется дважды без записи rosbag #### Scenario: Второй запуск при активном runner - **WHEN** `POST /sequences/start` вызывается при работающем процессе - **THEN** сервер отвечает 409 и не создаёт второй процесс #### Scenario: Путь записи уже существует - **WHEN** заданный `bag_path` указывает на существующий каталог - **THEN** runner удаляет каталог перед созданием новой записи MCAP ### Requirement: Ошибка точки прерывает выполнение Runner MUST прекращать последовательность при неуспехе цели и инициировать остановку движения, вместо перехода к следующей точке. #### Scenario: Отказ action - **WHEN** одна из целей возвращает отрицательный результат - **THEN** остальные точки не отправляются, а runner завершает выполнение с ошибкой ### Requirement: Остановка активного процесса Общая веб-команда остановки SHALL завершать активный процесс runner и предотвращать дальнейшую отправку точек. #### Scenario: Остановка во время последовательности - **WHEN** вызывается `POST /stop` во время работы runner - **THEN** процесс останавливается до выполнения оставшихся точек