Files
iiwa-genesis-word/README.md
T

9.1 KiB
Raw Blame History

KUKA iiwa в Genesis World

Standalone Python-приложение: стол, iiwa7 и одна или две RGB-D камеры. ROS 2 не используется. Рабочие описания — обычные URDF с локальными meshes.

Установка и запуск

Все Python-зависимости устанавливает uv:

uv sync --locked
uv run python run_scene.py --config configs/scene.yaml

Для машины без NVIDIA можно выбрать CPU-сборку PyTorch. Сохраняйте --extra cpu и в следующих вызовах uv run, чтобы uv не переключил окружение обратно:

uv sync --extra cpu --locked
uv run --extra cpu python run_scene.py --headless --steps 4 --save-frames
uv run --extra cpu pytest

В configs/scene.yaml переключите scene.mode между without_gripper и with_gripper. Второй режим автоматически выбирает URDF с инструментом и добавляет камеру на нём. Верхняя камера присутствует всегда. Отдельно менять путь URDF или enabled не требуется; выбор режима имеет приоритет над этими устаревшими полями из первоначального плана.

uv run python run_scene.py --viewer
uv run python run_scene.py --headless --steps 120 --save-frames
uv run --extra cuda python run_scene.py --backend gpu --viewer
uv run pytest
IIWA_GENESIS_SMOKE=1 uv run pytest tests/test_genesis_smoke.py

Headless по умолчанию выполняет 120 шагов, viewer работает до закрытия окна, Ctrl+C или Q/Esc в окне кадров. output.preview включает окна RGB и глубины. Превью работает в отдельном процессе: оконные циклы OpenCV и Genesis не мешают друг другу. Если показ не успевает за симуляцией, пропускаются только кадры превью; запись на диск продолжает получать все запланированные кадры. 30 FPS — частота по времени симуляции; реальная скорость зависит от оборудования. Headless всё равно требует рабочий OpenGL/EGL для RGB. Используется EGL, если PYOPENGL_PLATFORM не задан пользователем. GPU требует совместимого драйвера; backend: cpu выбран для переносимого первого запуска. Системный драйвер и библиотеки OpenGL предоставляются ОС, их uv не устанавливает. Обычные тесты проверяют URDF, конфигурацию и математику; opt-in smoke-тесты реально строят оба мира и сохраняют RGB-D на CPU/EGL. Первичная компиляция Genesis может занимать несколько минут. Launcher игнорирует унаследованные Python overlays, а pytest не загружает внешние плагины автоматически.

Конфигурация и координаты

Положения задаются в метрах, углы euler — в градусах, суставы и horizontal_fov — в радианах. Начальные суставы проверяются по URDF limits. Верх столешницы находится на 0,800 м, верх монтажной пластины — на 0,815 м; поэтому основание iiwa по умолчанию расположено на [-0.263, 0, 0.815]. При перемещении стола настройте положение робота согласованно.

Параметры верхней камеры заданы в мировой системе. Параметры камеры инструмента заданы относительно camera_optical_frame: вперёд +Z, вверх изображения -Y. Трансформы крепления сохранены из исходного описания. Направление оптической оси можно уточнять через локальные lookat и up без правки URDF. Исходный optical link расположен у начала CAD-корпуса, поэтому апертура сенсора дополнительно смещена на [0, 0.014, 0.027] м: передняя плоскость находится за корпусом толщиной 26 мм. Это геометрическое приближение, исключающее измерение собственного корпуса, а не заводская калибровка. Нулевая гравитация удерживает выбранную позу без контроллера: v1 предназначена для осмотра сцены и получения изображений, а не динамического управления. При нулевых углах суставов фланец и камера инструмента направлены вверх. Для осмотра стола этой камерой задайте соответствующую рабочую позу в robot.joints.

Камеры и запись

Это приближение D455, использующее профиль из согласованного плана: 640×480, 30 FPS, HFOV 75°, диапазон 0,01–6 м, квантование глубины 1 мм. RGB и depth используют одинаковую идеальную pinhole-калибровку. Не моделируются ИК-проектор, стереосопоставление, IMU, реальные искажения и индивидуальная заводская калибровка D455. Исходный Xacro задавал другую нижнюю границу depth — 0,52 м; выбранные 0,01 м следуют утверждённому плану и изменяются через YAML.

Каждая камера имеет RGB-сенсор Genesis и DepthCamera raycaster. Дальность по лучу преобразуется в optical Z. Пропуски и значения вне диапазона дают depth=0 и valid=false. Depth использует геометрию raycaster; упрощения мешей/коллизий могут отличаться от RGB. Gaussian noise задаётся отдельно для RGB (доля 255) и глубины (метры), выключен по умолчанию и использует фиксированный seed.

--save-frames или output.save_frames сохраняет в уникальную папку запуска:

  • overhead_000000.png — RGB;
  • overhead_000000.npz — float32 depth в метрах и маска valid;
  • overhead_000000.json — intrinsics, обе extrinsics, время симуляции и профиль.

Камера инструмента использует префикс tool. При output.pointcloud: true NPZ содержит также xyz_optical; невалидные точки равны NaN. Центры пикселей располагаются в (u+0.5, v+0.5), оси optical: X вправо, Y вниз, Z вперёд. Относительный output.directory разрешается относительно YAML-файла. Каждый запуск создаёт отдельный каталог, существующие записи сохраняются.

Genesis закреплён на 1.4.1, версии остальных зависимостей фиксирует uv.lock. Xacro явно исключён из транзитивных зависимостей через tool.uv.exclude-dependencies. Genesis 1.4.1, однако, импортирует его безусловно. Модуль приложения runtime.py при импорте Genesis убирает этот единственный импорт из AST модуля загрузки URDF и заменяет load_xacro явной ошибкой. Это адаптация в памяти, ограниченная версией 1.4.1: файлы установленного Genesis не меняются, заглушка Xacro не создаётся. Обновление Genesis требует пересмотра адаптации и повторного smoke-теста. Экспорт описаний также выполнен без Xacro; runtime читает только plain URDF.

Документация: Genesis cameras, raycaster, uv exclusions.