# Motion Planning ## Purpose Определяет публичные ROS-контракты планирования и исполнения суставных, декартовых и именованных движений через MoveIt 2. ## Requirements ### Requirement: Суставная цель Action `cobot/move_to_joints` SHALL принимать ровно семь углов в радианах и коэффициент скорости, а результат SHALL содержать `success` и `message`. #### Scenario: Допустимая цель - **WHEN** клиент отправляет семь суставных координат и скорость - **THEN** сервер планирует движение группы `iiwa_arm` от текущего состояния и сообщает стадии `planning` и `executing` ### Requirement: Декартова цель Action `cobot/move_to_pose` SHALL принимать XYZ в метрах, KUKA ABC в радианах, скорость, планировщик и `frame_id`; ориентация SHALL интерпретироваться как ZYX: A=yaw, B=pitch, C=roll. #### Scenario: Цель без frame_id - **WHEN** action-цель содержит пустой `frame_id` - **THEN** сервер использует `planning.default_frame` и планирует движение TCP из `planning.pose_link` ### Requirement: Выбор планировщика Декартово движение SHALL поддерживать ключи `ompl`, `ptp`, `lin`, `circ`, `chomp` и отвергать неизвестный ключ с отрицательным результатом. #### Scenario: Неизвестный планировщик - **WHEN** получен ключ, отсутствующий в списке поддерживаемых - **THEN** результат action содержит `success=false` и объяснение ошибки ### Requirement: Именованная цель Сервис `cobot/move_to_named` SHALL принимать имя `group_state` из SRDF, масштаб скорости и ускорения; нулевой `accel_scale` SHALL означать масштаб, равный скорости. #### Scenario: Неизвестное имя - **WHEN** имя отсутствует в SRDF - **THEN** ответ сервиса содержит `success=false` и сообщение об неизвестном состоянии ### Requirement: Сериализация операций Сервер движения SHALL выполнять не более одной операции планирования и исполнения через общий планирующий компонент одновременно. #### Scenario: Два запроса одновременно - **WHEN** одновременно поступают две команды движения - **THEN** операции сериализуются, а состояние одной операции не подменяет состояние другой ### Requirement: Результат исполнения Сервер MUST различать успех, отказ планирования, ошибку исполнения и отмену; успешное построение плана само по себе не SHALL считаться успешным движением. #### Scenario: План не исполнен - **WHEN** контроллер возвращает ошибку исполнения траектории - **THEN** результат команды содержит `success=false` с диагностическим сообщением