Добавлены 3д объекты в виртуальный мир (молотки 5шт)

This commit is contained in:
Даниил Грабарь
2026-09-15 13:08:17 +10:00
parent f7dff2e484
commit 71e669c2ed
23 changed files with 123769 additions and 5 deletions
+59 -2
View File
@@ -107,11 +107,68 @@ Python overlays, а pytest не загружает внешние плагины
сенсора дополнительно смещена на `[0, 0.014, 0.027]` м: передняя плоскость
находится за корпусом толщиной 26 мм. Это геометрическое приближение,
исключающее измерение собственного корпуса, а не заводская калибровка.
Сцена использует нулевую гравитацию и суставной position controller для
удержания позы и выполнения команд с ограниченной скоростью.
Сцена использует гравитацию `[0, 0, -9.81]` м/с². У робота включена полная
компенсация гравитации и суставной position controller для удержания позы и
выполнения команд с ограниченной скоростью. Свободный инструмент подчиняется
гравитации и контактам.
При нулевых углах суставов фланец и камера инструмента направлены вверх.
Для осмотра стола этой камерой задайте соответствующую рабочую позу в `robot.joints`.
## Случайный молоток на столе
В `configs/scene.yaml` перечислите допустимые имена файлов без расширений:
```yaml
tools:
allowed: [hammer1, hammer3, hammer5]
seed: null
```
При построении сцены равновероятно выбирается **ровно один** молоток из списка.
Он остаётся тем же объектом в течение запуска. `allowed: [hammer2]` всегда
выбирает второй молоток. Список не может быть пустым; повторы, неизвестные имена
и отсутствующие OBJ/MTL отклоняются при чтении конфигурации. Файлы загружаются
из `iiwa_genesis_description/tools/hammer/`. Конфиги без раздела `tools`
используют все пять молотков.
При `seed: null` выбор модели, положения и поворота производится заново при
каждом запуске; случайный выбор может повторить предыдущую модель. Целое
неотрицательное число, например `seed: 17`, повторяет выбор и начальную позу.
Этот seed независим от `scene.seed`, используемого симуляцией и камерами.
Выбранное имя выводится в терминале и используется как имя сущности Genesis.
Молоток лежит на свободной стороне стола: весь его контур находится внутри
`X=[0.06, 0.58]`, `Y=[-0.48, 0.48]` м в системе стола, за пределами монтажной
пластины и бортиков. Положение учитывает `table.position` и `table.euler`.
Нижняя точка появляется на 5 мм выше столешницы (локальная высота 0.800 м),
затем инструмент опускается на неё под действием гравитации. Область рассчитана
на поставляемый стол; произвольные начальные позы руки, пересекающие эту область,
могут сразу привести к контакту с инструментом.
Импорт учитывает Y-up экспорт Blender `(X, Y, Z) → (X, -Z, Y)` и смещения
молотков в исходной Blender-сцене; OBJ/MTL не изменяются. Масштаб остаётся 1:1.
Все детали одного OBJ образуют одно свободное твёрдое тело с шестью степенями
свободы. Коллизии строятся по выпуклым частям геометрии с разложением вогнутых
участков, а не по одному охватывающему параллелепипеду. Молоток может падать,
сдвигаться, вращаться и сталкиваться со столом и роботом.
Плотность 3000 кг/м³ и коэффициент трения 0.65 — начальные приближения;
масса и инерция вычисляются по геометрии. Для точного цифрового двойника нужно
отдельно откалибровать распределение массы и параметры контакта. Управление
захватом и сценарии захвата этим изменением не добавляются.
В текущих MTL отсутствуют `map_Kd` и другие текстурные карты: процедурные
материалы Blender не переносятся через такой OBJ-экспорт. Genesis загружает
доступные MTL; для сохранения древесных волокон и других текстур их нужно
запечь в изображения и экспортировать с материалами.
Проверка реальных контактов всех пяти OBJ со столом (может требовать несколько
минут на первичное разложение мешей и компиляцию):
```bash
IIWA_GENESIS_SMOKE=1 uv run pytest tests/test_tool_physics.py
```
## Камеры и запись
Это **приближение D455**, использующее профиль из согласованного плана: