# iiwa_experement Пакет запускает один из двадцати детерминированных опытов в Webots. Один запуск создаёт один свежий мир: шаблон `worlds/grant/iiwa-grant.wbt` копируется во временную директорию, в копии заменяются пути к PROTO, затем существующий `iiwa_bringup` запускает Webots, робота iiwa 7, контроллеры и камеры. После этого `scene_spawner` добавляет объекты выбранного сценария. Реализована только начальная сцена. Захват, вставка инструмента в `patron`, нанесение герметика, установка и затяжка винтов в пакет не входят. ## Сборка ```bash source /opt/ros/jazzy/setup.bash colcon build --base-paths src --packages-up-to iiwa_experement --symlink-install source install/setup.bash ``` ## Запуск Обязательный параметр `experiment_id` принимает только целое число от 1 до 20: ```bash ros2 launch iiwa_experement experiment.launch.py experiment_id:=1 ``` Проверенные примеры: ```bash ros2 launch iiwa_experement experiment.launch.py experiment_id:=6 ros2 launch iiwa_experement experiment.launch.py experiment_id:=11 ros2 launch iiwa_experement experiment.launch.py experiment_id:=16 ros2 launch iiwa_experement experiment.launch.py experiment_id:=19 ros2 launch iiwa_experement experiment.launch.py experiment_id:=20 ``` `experiment_id:=0`, `21`, `abc` или пустое значение останавливают launch до запуска Webots. Для другого опыта завершите текущий запуск (`Ctrl-C`) и запустите команду с новым номером: мир каждый раз создаётся заново. Дополнительные параметры: | Параметр | По умолчанию | Значение | | --- | --- | --- | | `rviz` | `false` | `true` запускает RViz вместе с Webots | | `scene_config` | установленный `config/scenes.yaml` | другой манифест сценариев | | `base_setting` | установленный `iiwa_config/config/setting.yaml` | базовые настройки для временной копии | Временные `iiwa-grant.wbt` и `setting.yaml` создаются в отдельной директории запуска и удаляются при его завершении. ## Готовность сцены Сервис доступен с момента старта ноды, но сообщает успех только после последнего успешного вызова supervisor: ```bash ros2 service call /iiwa_experement/scene_ready std_srvs/srv/Trigger {} ``` Успешный ответ содержит `success: true` и сообщение вида `experiment 11: 17 objects spawned`. Пока объекты добавляются или если спавн завершился ошибкой, `success` остаётся `false`, а в `message` находится причина и имя последнего объекта. ## Состав сцен | Опыты | Люк | Лоток и винты | Рабочие инструменты | | --- | --- | --- | --- | | 1–5 | свободный | нет | присоска | | 6–9 | отсутствует | нет | герметик | | 10 | свободный | нет | герметик, присоска | | 11–13 | установлен | 10 винтов | магнитный | | 14–15 | установлен | 10 винтов | магнитный, затяжной | | 16–20 | свободный | 10 винтов | присоска, магнитный, герметик, затяжной | Во всех опытах `patron` уже находится на роботе: он включён в URDF через `urdf/tools/tool_active.xacro`. Рабочие инструменты лежат отдельно в четырёх гнёзах стойки. Свободный люк имеет физику; установленный люк зафиксирован. Винты и инструменты в начальной сцене статичны: будущий исполнитель должен освободить их перед захватом. Это исходное положение, а не реализованный механизм захвата. Координаты и наборы объектов заданы только в `config/scenes.yaml`; генератор не выбирает случайные позы. В опытах 11–20 всегда ровно десять винтов, даже если сценарий использует один, два или четыре. В опыте 19 лоток и все десять винтов смещены вместе. ## Ресурсы - Шаблон мира и код: `src/iiwa_experement/`. - OBJ/MTL: `src/iiwa_description/objects/grant/`; они не копируются. - PROTO стола и ограждений: `src/iiwa_description/resource/protos/`. - Спецификации: `doc/experements.md`, `doc/experiment-scenes.md`. Старые `body_hatch*.wbt` и `GrantToolRack.proto` не восстанавливаются и не используются. Стойка собрана из `tool-magizine.obj` и отдельных объектов инструментов. ## Проверки ```bash colcon test --base-paths src --packages-select iiwa_experement colcon test-result --verbose ``` Тесты пакета проверяют: - установку мира, YAML, launch и документации; - все 20 сценариев, включая 10 винтов в опытах 11–20; - уникальные имена, позы и существование OBJ/MTL; - отказы при неверном ID, неизвестном инструменте, 9/11 винтах, повторяющемся имени, винте вне лотка и несовпадении корпуса со стапелем; - отсутствие повторного вызова supervisor при тайм-ауте; - замену локальных PROTO на установленные абсолютные пути, отключение старого случайного `object_spawner` и сохранение `patron` в URDF. Старый `src/iiwa_utils/test/test_body_hatch_worlds.py` относится к удалённым `worlds/grant/body_hatch*.wbt` и `GrantToolRack.proto`; это не тест нового пакета. ## Проверка в Webots Для опытов 1, 6, 11, 16, 19 и 20 запуск в графическом Webots R2025a завершился успешным `scene_ready`: 5, 4, 16, 19, 19 и 19 объектов соответственно. По изображению верхней камеры `d455_top` проверены: - свободный люк на столе, отсутствие люка в опыте 6 и установленный люк в опыте 11; - 10 винтов в лотке во всех проверенных опытах 11, 16, 19 и 20; - четыре инструмента в гнёздах стойки, нужный набор в опытах 1, 6 и 11; - смещение лотка и всех винтов в опыте 19; - `patron` на роботе во всех запусках. Сбои `move_group`, `camera_spawner` и контроллеров в журнале возникают только при принудительном завершении запуска (`Ctrl-C`) и не влияют на готовность сцены.