Добавлена спецификация и навыки для codex и kimi-code

This commit is contained in:
Даниил Грабарь
2026-11-05 14:07:19 +10:00
parent 0e3fd0358f
commit 54f8f14ed7
30 changed files with 3385 additions and 2 deletions
View File
+51
View File
@@ -0,0 +1,51 @@
# Deployment
## Purpose
Определяет воспроизводимый запуск LWC в локальной или контейнерной среде, выбор физического робота или Webots и правила загрузки единой конфигурации.
## Requirements
### Requirement: Целевая платформа
Система SHALL поддерживать нативный запуск на Ubuntu 24.04 с ROS 2 Jazzy и отдельный Docker-сценарий на совместимом Linux-хосте.
#### Scenario: Локальная подготовка
- **WHEN** пользователь запускает `cobot local-setup` на поддерживаемом хосте
- **THEN** мастер проверяет зависимости ROS 2 и Webots и собирает workspace из `src/`
### Requirement: Явный выбор режима
Команда `cobot run` SHALL предлагать среду запуска и режим контроллера или Webots; режим Webots SHALL передавать launch-аргумент `simulate:=1`.
#### Scenario: Выбор симуляции
- **WHEN** пользователь выбирает «Симулятор Webots»
- **THEN** запускается общее дерево `iiwa.launch.py` с симуляционной аппаратной моделью и временем `/clock`
#### Scenario: Выбор контроллера
- **WHEN** пользователь выбирает «Контроллер»
- **THEN** запускается то же дерево с FRI hardware interface и системным временем
### Requirement: Единый файл настроек
Основной launch SHALL загружать путь из аргумента `setting`, разрешать `pkg://` пути и передавать параметры подсистемам из загруженной структуры.
#### Scenario: Пользовательская конфигурация
- **WHEN** задан `setting:=/path/to/cobot-setting.yaml`
- **THEN** launch использует этот файл для параметров робота, симуляции, планирования, веб-сервера и Foxglove
### Requirement: Ошибка конфигурации до движения
Система MUST отклонять некорректные обязательные параметры и отсутствующие обязательные файлы конфигурации до начала командного движения.
#### Scenario: Неверный период FRI
- **WHEN** `fri_cycle_ms` находится вне диапазона 1–100 мс
- **THEN** запуск аппаратного контроллера завершается ошибкой конфигурации
#### Scenario: Неверные параметры TCP-гизмы
- **WHEN** значение тайм-аута или скорости TCP-гизмы неположительно либо не является конечным числом
- **THEN** загрузчик настроек отвергает конфигурацию
### Requirement: Состав запуска
Основной launch SHALL поднимать публикацию состояния робота, контроллеры, MoveIt и сервер движения; Webots, RViz, веб-сервер и Foxglove SHALL включаться согласно режиму и настройкам.
#### Scenario: Отключён веб-сервер
- **WHEN** `web.enabled` имеет значение `false`
- **THEN** узел `iiwa_web_server` не добавляется в launch
@@ -0,0 +1,54 @@
# Direct Trajectories
## Purpose
Описывает приём готовых суставных траекторий из JSON и CSV, их проверку перед публикацией и поведение остановки.
## Requirements
### Requirement: Форматы ввода
HTTP API SHALL принимать JSON-точки через `POST /trajectory/send` и CSV-файл через `POST /trajectory/send_csv` с семью суставными колонками и временем от начала.
#### Scenario: CSV с вариантами имён
- **WHEN** CSV использует заголовки `joint_1`–`joint_7` и `time_from_start`
- **THEN** колонки сопоставляются с `joint1`–`joint7` и временем `t` независимо от порядка
### Requirement: Конечные и допустимые точки
Каждая точка MUST содержать семь конечных углов и допустимое время; траектория MUST укладываться в позиционные, скоростные, ускорительные и рывковые ограничения из конфигурации.
#### Scenario: Недопустимый сустав
- **WHEN** точка выходит за допустимый диапазон сустава
- **THEN** HTTP API возвращает 422 и не публикует траекторию
### Requirement: Свежий неподвижный старт
Прямая траектория MUST начинаться со свежего полного `/joint_states` и неподвижного робота; при ненулевом времени первой точки система SHALL добавить стартовую точку текущего положения.
#### Scenario: Устаревшая обратная связь
- **WHEN** возраст или временная метка `/joint_states` превышают настроенный предел
- **THEN** запрос отклоняется с 409 без публикации
#### Scenario: Нулевая первая точка не совпадает
- **WHEN** первая точка имеет `t=0`, но отличается от измеренного положения больше допуска
- **THEN** запрос отклоняется с 422
### Requirement: Пересчёт времени
Система SHALL при необходимости растягивать время траектории для соблюдения динамических ограничений и возвращать фактическую длительность и коэффициент масштабирования.
#### Scenario: Быстрый сегмент
- **WHEN** исходный интервал между точками требует превышения настроенных динамических лимитов
- **THEN** опубликованная траектория имеет увеличенные интервалы и ответ сообщает `time_scale`
### Requirement: Граница проверки прямого пути
Прямой траекторный API SHALL проверять суставные и динамические ограничения, но не SHALL заявлять проверку столкновений для промежуточного пути.
#### Scenario: Траектория в допустимых суставных лимитах
- **WHEN** клиент отправляет валидные точки без подтверждённой проверки сцены
- **THEN** API может опубликовать траекторию, а ответственность за оценку столкновений остаётся вне этого API
### Requirement: Защита от замены и остановка
Система MUST отвергать новую прямую траекторию во время ещё активной и MUST не публиковать подготовленную цель, если в ходе подготовки пришла остановка.
#### Scenario: Остановка во время подготовки
- **WHEN** `POST /stop` вызывается до публикации подготовленной траектории
- **THEN** подготовка инвалидируется, а эта траектория не отправляется контроллеру
+54
View File
@@ -0,0 +1,54 @@
# External API
## Purpose
Фиксирует доступные внешним клиентам HTTP и MCP операции для чтения состояния и отправки команд роботу, включая типы данных, проверку ввода и ошибки зависимостей ROS.
## Requirements
### Requirement: Включаемый сервер
При `web.enabled=true` система SHALL запускать FastAPI на настроенных `host` и `port`, предоставлять OpenAPI-описание и монтировать MCP-приложение по `/mcp`.
#### Scenario: Веб-сервер включён
- **WHEN** основной launch загружает `web.enabled=true`
- **THEN** запускается `iiwa_web_server` с путями к конфигурации эндпоинтов и суставных лимитов
### Requirement: Конфигурируемые маршруты
Маршруты из `api_endpoints.yaml` SHALL создавать HTTP обработчики типов `topic`, `service`, `action`, `fk` и `tf` с описанными полями и тайм-аутами.
#### Scenario: Отключённый маршрут
- **WHEN** запись маршрута имеет `enabled=false`
- **THEN** маршрут не появляется в доступном HTTP API
### Requirement: Чтение состояния
`GET /robot/joint_states` SHALL возвращать имена, положения, скорости и усилия из `/joint_states`; `GET /robot/pose` SHALL возвращать TCP относительно `base_link`, XYZ в метрах, кватернион и KUKA ABC в радианах и градусах.
#### Scenario: Нет сообщения суставов
- **WHEN** `/joint_states` не поступает до тайм-аута маршрута
- **THEN** запрос чтения состояния возвращает HTTP 503
### Requirement: Команды движения через HTTP
`POST /robot/move/joints`, `/robot/move/pose` и `/robot/move/named` SHALL передавать проверенные цели в соответствующие ROS action или service и возвращать `success` и `message`.
#### Scenario: Некорректная длина суставов
- **WHEN** тело запроса `/robot/move/joints` содержит не семь углов
- **THEN** запрос получает 422 и ROS action не вызывается
#### Scenario: Нет ROS-сервера
- **WHEN** соответствующий ROS action или service недоступен до тайм-аута
- **THEN** HTTP обработчик возвращает 503
### Requirement: Единицы HTTP-позы
`POST /robot/move/pose` SHALL принимать XYZ в метрах и A/B/C в радианах по соглашению ZYX; `speed` SHALL лежать в `[0.01, 1.0]`.
#### Scenario: Выбор планировщика без учёта регистра
- **WHEN** клиент указывает `planner="PTP"`
- **THEN** маршрут нормализует ключ до `ptp` до отправки action-цели
### Requirement: MCP-представление
MCP-приложение SHALL строиться из тех же FastAPI-маршрутов, которые зарегистрированы для HTTP управления и чтения.
#### Scenario: Запрос каталога инструментов MCP
- **WHEN** MCP-клиент подключается к `/mcp`
- **THEN** операции, выведенные из маршрутов FastAPI, доступны через MCP-приложение
+51
View File
@@ -0,0 +1,51 @@
# FRI Control
## Purpose
Описывает контракт управления физическим iiwa 7 через Sunrise FRI 1.16 и `ros2_control`, включая синхронизацию циклов, допустимые команды и отказ при потере надёжной связи.
## Requirements
### Requirement: Разделение циклов
FRI-клиент SHALL выполнять отдельный циклический обмен с Sunrise и синхронизировать его с блокирующим циклом `controller_manager`.
#### Scenario: Согласованный период
- **WHEN** аппаратный режим запускается с `robot.fri_cycle_ms=10`
- **THEN** частота `controller_manager` задаётся равной 100 Гц
#### Scenario: Несовпадение периода
- **WHEN** Sunrise сообщает период, отличный от настроенного FRI-периода
- **THEN** обмен фиксирует ошибку вместо продолжения движения
### Requirement: Позиционный интерфейс
Аппаратный интерфейс SHALL предоставлять команду положения для семи суставов и публиковать измеренные положение, скорость, усилие и внешний момент там, где доступны данные FRI.
#### Scenario: Активное позиционное управление
- **WHEN** FRI находится в `COMMANDING_ACTIVE` с `POSITION` и `JOINT` overlay
- **THEN** клиент передаёт полный массив семи суставных положений в радианах
### Requirement: Проверка режима и телеметрии
Система MUST отвергать командование при неверном режиме, недостаточном качестве связи, нарушении safety-состояния, неактивных приводах или нечисловой телеметрии.
#### Scenario: Неверный FRI-режим
- **WHEN** Sunrise сообщает командный режим, отличный от `POSITION` с `JOINT` overlay
- **THEN** цикл командования завершается ошибкой и не принимает новую цель приложения
### Requirement: Ограничение команды
Клиент MUST проверять конечность каждого целевого угла и допустимый диапазон до отправки; между циклами он SHALL ограничивать шаг по настроенной скорости и применять настроенное сглаживание положения.
#### Scenario: Цель за пределом
- **WHEN** получена суставная цель вне настроенных пределов
- **THEN** команда отвергается до вызова FRI `setJointPosition`
### Requirement: Остановка при нарушении цикла
Система MUST считать пропуск FRI-пакета, отсутствие продвижения временной метки, истечение watchdog и выход из `COMMANDING_ACTIVE` отказом, требующим явного восстановления.
#### Scenario: Застывший цикл ros2_control
- **WHEN** FRI-цикл не завершён `ros2_control` за 100 мс
- **THEN** FRI worker отмечает отказ и прекращает дальнейшую нормальную выдачу целей
#### Scenario: Нет готовой сессии
- **WHEN** сессия не достигла `MONITORING_READY` за 15 секунд после начала обмена
- **THEN** инициализация завершается ошибкой
+47
View File
@@ -0,0 +1,47 @@
# 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-сервис остановки
+50
View File
@@ -0,0 +1,50 @@
# 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` с диагностическим сообщением
+55
View File
@@ -0,0 +1,55 @@
# 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** процесс останавливается до выполнения оставшихся точек
+43
View File
@@ -0,0 +1,43 @@
# Observability
## Purpose
Определяет доступные оператору средства наблюдения за состоянием робота и симуляции и требования к диагностике отказов без сокрытия ошибок связи или движения.
## Requirements
### Requirement: Суставная телеметрия
Активный контроллер SHALL публиковать измеренное состояние семи суставов через `joint_state_broadcaster` для планирования и внешнего чтения.
#### Scenario: Работа контроллера
- **WHEN** аппаратный или симуляционный контроллер активен
- **THEN** `/joint_states` доступен серверу движения, веб-мосту и визуализации
### Requirement: RViz по запросу
Основной launch SHALL поддерживать отдельный аргумент `rviz` для визуализации модели и планирования.
#### Scenario: RViz включён
- **WHEN** launch получает `rviz:=true`
- **THEN** запускаются RViz-узлы с конфигурацией из `digital_twin.rviz.config`
### Requirement: Foxglove bridge по настройке
При `foxglove.enabled=true` система SHALL запускать `foxglove_bridge` с настроенными портом, адресом, TLS и списками разрешённых топиков, сервисов и параметров.
#### Scenario: Foxglove отключён
- **WHEN** `foxglove.enabled=false`
- **THEN** bridge не запускается основным launch
### Requirement: Явное сообщение об отказе FRI
Аппаратная подсистема MUST сообщать диагностическую причину ошибки FRI, включая ошибки SDK, тайм-аут цикла, неверный период и потерю сессии.
#### Scenario: Ошибка FRI step
- **WHEN** FRI `step()` завершается неуспешно
- **THEN** worker отмечает отказ, прекращает нормальный обмен и выводит сообщение об ошибке
### Requirement: Различение состояний движения
Action движения SHALL публиковать обратную связь `planning` и `executing`, а окончательный результат SHALL содержать сообщение, пригодное для диагностики.
#### Scenario: Планирование цели
- **WHEN** сервер начал обработку action-цели
- **THEN** клиент получает стадию `planning`, затем `executing` до вызова планирования и исполнения
+43
View File
@@ -0,0 +1,43 @@
# Project Tooling
## Purpose
Описывает операторские команды для настройки, сборки, запуска и локального просмотра документации проекта без прямого вмешательства в циклическое управление.
## Requirements
### Requirement: Мастер первичной настройки
`cobot setup` SHALL последовательно предлагать настройку документации, параметров робота и среды сборки.
#### Scenario: Первый запуск
- **WHEN** пользователь вызывает `cobot setup`
- **THEN** получает отдельный выбор для локальной документации, `cobot-setting.yaml` и среды ROS 2 или Docker
### Requirement: Редактирование конфигурации
`cobot robot-setup` SHALL сохранять редактируемые значения в `cobot-setting.yaml` и применять выбранный из реестра инструмент к модели робота.
#### Scenario: Выбор другого инструмента
- **WHEN** пользователь меняет `tool.active`
- **THEN** конфигурация и генерируемые Xacro/SRDF файлы соответствуют выбранному инструменту
### Requirement: Сборка из src
`cobot rebuild` SHALL запускать `colcon build --base-paths src` для всех пакетов или выбранного подмножества и поддерживать `--symlink-install`.
#### Scenario: Пересборка одного пакета
- **WHEN** пользователь задаёт `cobot rebuild iiwa_controller --symlink-install`
- **THEN** CLI передаёт пакет и флаг символьной установки в colcon
### Requirement: Локальная документация
`cobot doc-setup` SHALL предоставлять запуск документации, сборку статического сайта и PDF, пересборку и остановку сервера.
#### Scenario: Сборка документации
- **WHEN** пользователь вызывает `cobot doc-setup build`
- **THEN** создаются статическая документация и PDF из исходников `doc/lwc-doc/`
### Requirement: Разделение файлов Sunrise и colcon
ROS workspace MUST исключать `src/iiwa_sunrise` из colcon-сборки, оставляя Java-исходники для отдельной сборки в Sunrise Workbench.
#### Scenario: Сборка рабочего пространства
- **WHEN** выполняется `colcon build --base-paths src`
- **THEN** пакет контроллерных Java-программ не собирается colcon
+47
View File
@@ -0,0 +1,47 @@
# Robot Model
## Purpose
Фиксирует кинематическую модель семиосевого iiwa 7, систему координат TCP, ограничения суставов и зависимость модели от выбранного инструмента.
## Requirements
### Requirement: Семь осей и единицы
Модель SHALL содержать суставы `joint1`–`joint7` в заданном порядке; суставные положения SHALL выражаться в радианах, скорости в радианах в секунду.
#### Scenario: Публикация состояния
- **WHEN** запущен `joint_state_broadcaster`
- **THEN** `/joint_states` содержит имена и значения всех семи управляемых суставов
### Requirement: Согласованные лимиты
URDF, `ros2_control`, MoveIt и проверка внешних суставных команд MUST брать границы из `joint_limits.yaml` с учётом мягкого диапазона там, где он предусмотрен.
#### Scenario: Суставная цель вне мягкой границы
- **WHEN** HTTP-запрос суставного движения содержит угол за допустимой границей
- **THEN** запрос отклоняется до отправки ROS action с кодом 422
### Requirement: Активный инструмент
Конфигурация инструмента SHALL определять Xacro-описание, конечное звено кинематической цепи, TCP и пары отключённых самоколлизий.
#### Scenario: Выбор инструмента из реестра
- **WHEN** `cobot robot-setup` применяет инструмент из `tools.yaml`
- **THEN** обновляются `tool_active.xacro` и `iiwa7.srdf`, сохраняя существующие именованные положения
#### Scenario: Нет инструмента
- **WHEN** выбран `none`
- **THEN** TCP совпадает с `link_ee` через фиксированное соединение
### Requirement: Декартова система координат
Декартово движение SHALL задавать целевую позу TCP относительно указанного `frame_id`, по умолчанию `base_link`.
#### Scenario: Рамка не указана
- **WHEN** клиент оставляет `frame_id` пустым
- **THEN** сервер движения использует `planning.default_frame`
### Requirement: Именованные положения
Именованные положения SHALL определяться `group_state` в SRDF и предоставляться клиенту вместе с именами и углами суставов.
#### Scenario: Запрос каталога
- **WHEN** клиент вызывает `GET /robot/positions`
- **THEN** возвращаются доступные `group_state` с именем, группой, описанием и суставными углами
+43
View File
@@ -0,0 +1,43 @@
# Simulation
## Purpose
Описывает цифровой двойник в Webots для проверки запуска, суставного управления, объектов сцены, камер и интерактивного TCP без подключения к физическому роботу.
## Requirements
### Requirement: Симуляционный контроллер
Режим `simulate` SHALL создавать модель iiwa в Webots и использовать `webots_ros2_control` вместо FRI hardware interface.
#### Scenario: Запуск Webots
- **WHEN** launch получает `simulate:=true`
- **THEN** создаётся робот в выбранном world, а контроллеры запускаются с симуляционным временем
### Requirement: Начальное состояние и геометрия
Симуляция SHALL загружать начальные суставные положения, ограничения, инструмент и преобразование размещения робота из конфигурации.
#### Scenario: Изменён активный инструмент
- **WHEN** инструмент применён до нового запуска Webots
- **THEN** URDF модели содержит соответствующую геометрию и TCP
### Requirement: Объекты сцены
При включённых `digital_twin.webots.objects` система SHALL размещать заданное число объектов из перечисленных OBJ-моделей в настроенной области относительно основания робота.
#### Scenario: Повтор моделей
- **WHEN** число объектов больше числа доступных моделей
- **THEN** модели могут повторяться, а общее число создаваемых объектов соответствует `count`
### Requirement: Камеры
Камеры Webots SHALL загружаться из файлов конфигурации; включённый драйвер SHALL публиковать изображения и `CameraInfo`, а для датчика глубины — предусмотренные глубинные данные.
#### Scenario: Настроена D455
- **WHEN** в списке камер указан `d455_top.yaml`
- **THEN** симуляционный запуск создаёт камеру с именами топиков и параметрами из этого файла
### Requirement: Симуляционный TCP-инструмент
TCP-гизма SHALL запускаться только при включённом флаге и в режиме симуляции.
#### Scenario: Физический режим
- **WHEN** запуск выполняется с `simulate:=false`
- **THEN** узлы интерактивной TCP-гизмы не активируются
+54
View File
@@ -0,0 +1,54 @@
# Sunrise Program
## Purpose
Определяет обязанности программы на контроллере KUKA при установлении FRI-сессии и ограничения выбранного сетевого и управляющего режима.
## Requirements
### Requirement: Отдельное развёртывание
`ServerFriRos2` SHALL собираться и развёртываться в Sunrise Workbench отдельно от ROS workspace; физический запуск MUST сверять адрес ПК, порт FRI, инструмент и Load Data с конфигурацией ячейки.
#### Scenario: Новый контроллер
- **WHEN** программа переносится на другую ячейку
- **THEN** оператор проверяет сетевые константы, имя инструмента и его данные нагрузки перед FRI-сессией
### Requirement: Выбор интерфейса сети
Программа SHALL предлагать KONI или KLI и использовать адрес ПК выбранной сети при создании FRI-конфигурации.
#### Scenario: Выбран KLI
- **WHEN** оператор выбирает KLI
- **THEN** период отправки устанавливается в 10 мс и режим ручного ведения недоступен в меню
### Requirement: Подъезд до запуска FRI
Программа SHALL перемещать робот в предварительно заданное суставное положение до открытия FRI-сессии; оператор MUST проверять это положение для своей ячейки и инструмента.
#### Scenario: Запуск физической программы
- **WHEN** оператор начинает `ServerFriRos2`
- **THEN** робот выполняет настроенный подъезд до входа в позиционный или мониторинговый режим FRI
### Requirement: Выбор командного режима
Для позиционного управления программа SHALL создавать FRI-сессию с позиционными суставными командами; выбранный режим управления SHALL соответствовать возможностям клиентского аппаратного интерфейса.
#### Scenario: Позиционный режим
- **WHEN** оператор выбирает Position или JointImpedance для командного движения
- **THEN** клиент ROS получает сессию с `POSITION` command mode и `JOINT` overlay
### Requirement: Мониторинг без команд
Режим Monitor SHALL быть доступен только при выборе KONI; перед ручным ведением программа SHALL проверить данные нагрузки инструмента и предупредить оператора, если проверка не прошла.
#### Scenario: Попытка Monitor на KLI
- **WHEN** оператор выбирает KLI
- **THEN** программа не предлагает Monitor как режим запуска
#### Scenario: Неверные Load Data
- **WHEN** проверка нагрузки инструмента в Monitor не проходит
- **THEN** программа показывает предупреждение и предоставляет оператору выбор остановить запуск или явно продолжить
### Requirement: Завершение сессии
Программа MUST закрывать FRI-сессию при штатном окончании и при освобождении приложения, включая ошибки соединения.
#### Scenario: Нет клиента
- **WHEN** FRI-клиент не подключается в отведённые 30 секунд
- **THEN** программа сообщает тайм-аут и закрывает сессию