Files
lightweight-cobot/output/md/reference-experiments.md
T
Даниил Грабарь b26edc3cfc fix(experement): honest collision poses, mandatory lifts, rest-to-rest waits; 20/20 verified
- forbid the transport pose; recovery reconfigures through work only
- mandatory axial lift after every contact (handoff, tighten, dock, pick)
- untwist the flange after simulated tightening so joint 7 never winds up
- attach carried tool/cap/screw to the MoveIt scene; explicit REMOVE diffs
- add_world receives box-centre poses (placed_cap_pose, restore_world)
- table top lowered below the base_link collision mesh bottom (1 mm gap bug)
- 1 mm clearances for cap/screw boxes; thinner cap world box (cup clearance)
- wait for a stationary arm before every planning attempt (rest-to-rest)
- loosen stopped_velocity_tolerance to 0.08 for reference launches only
- retry a rejected named move once after settling (startup telemetry race)
- adapter logs the exact reason and max joint velocity on start-state rejects
- verified: all 20 experiments completed in Webots execute mode (10.11.2026)
2026-11-10 15:11:06 +10:00

181 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Эталонное выполнение 20 экспериментов сборки люка
Документ описывает **эталонное (reference) управление** набором из 20
экспериментов «сборка люка» на KUKA LBR iiwa 7 R800 в симуляторе Webots, а
также устройство системы управления эталонным исполнителем. Эталон служит
образцом поведения: с ним сравниваются графы действий, которые строит
LLM-планировщик по пользовательскому запросу и `scene_json`.
Пакет: `src/iiwa_experement/`. Сцены: `config/scenes.yaml`, геометрия:
`config/geometry.yaml`, маршруты: `iiwa_experement/reference_scenarios.py`.
Запускается только симуляция Webots; физический робот через FRI не
используется.
## Общие правила эталона
- Робот стартует из `home`, первое движение — в рабочую позу `work`; дальше
маршрут планируется из текущей рабочей позы. В конце техпроцесса — возврат
в `work`, и только последнее движение маршрута — в `home`. Поза
`transport` запрещена и не используется нигде, включая аварийные ветви.
- На роботе постоянно установлен `patron`; рабочие инструменты (`vacuum`,
`sealant_tool`, `magnetic_tool`, `torque_tool`) берутся из стойки и
вставляются в него. Сам `patron` никогда не снимается.
- После захвата инструмента — обязательный вертикальный подъём, затем
боковой выход из стойки по +Y, и только потом горизонтальные перемещения.
- После **каждого** контакта (захват, посадка, передача винта, имитация
затяжки, контур герметика) выполняется обязательный осевой подъём до
любого бокового движения. Если все осевые участки отклонены
планировщиком, операция останавливается, а не продолжается на глубине
контакта.
- Захваченные инструмент, люк и винт прикрепляются к роботу в сцене MoveIt,
поэтому перенос планируется с учётом переносимого тела.
- TCP при работе направлен вниз. Если планировщик отклоняет подход из
текущей ветви IK, операция один раз переконфигурируется через `work` и
повторяет подход; событие `reconfigure` пишется в журнал.
- Винты не вставляются и не затягиваются: робот подносит винт к отверстию и
передаёт его виртуальному оператору; отверстие остаётся пустым. В опытах
с `torque_tool` выполняется имитация затяжки: подход к пустому отверстию,
видимый поворот фланца на 45° вокруг оси инструмента, раскрутка обратно,
осевой подъём.
- Каждая ветвь отказа имеет не более одной повторной попытки; при
неопределённом состоянии выполнение останавливается.
## Что происходит в каждом эксперименте
### I. Захват и установка люка (1–5) — инструмент: присоска `vacuum`
| № | Сцена | Что делает робот |
|---:|---|---|
| 1 | Люк лежит свободно в номинальной позе (0.35, −0.22), корпус в стапеле | Берёт присоску из стойки → захватывает люк → переносит на посадочное место корпуса → опускает, отпускает → `inspect_cap` (ok) → возвращает присоску → домой |
| 2 | Люк повёрнут на 135° вместо 45° | Как №1, но фактическая поза люка читается из состояния сцены; измеренная относительная ориентация учитывается при посадке — люк ставится ровно несмотря на поворот |
| 3 | Смещены и корпус со стапелем (0.29, 0.14), и люк (0.33, −0.22) | Как №1, но обе позы — люк и посадочное место — берутся из фактического состояния сцены, а не из номинала |
| 4 | Как №1 + сбой: первый захват люка возвращает `grasp_failed` | Первый подход к люку без захвата (симуляция срыва) → `inspect_state` → ровно одна повторная попытка захвата → штатная установка и проверка |
| 5 | Как №1 + сбой: первая посадка смещена на 3 мм по X | Люк ставится со смещением → `inspect_cap` даёт `not_ok` (допуск 2 мм) → повторный захват → правильная посадка → `inspect_cap` ok |
### II. Нанесение герметика (6–9) — инструмент: `sealant_tool`, люка в сцене нет
| № | Сцена | Что делает робот |
|---:|---|---|
| 6 | Контур = только `side_1` | Берёт инструмент → подходит к началу участка, опускает сопло → проходит `side_1` на рабочей высоте → подъём → `inspect_sealant` → возврат инструмента |
| 7 | Контур = `side_1` + `side_2` | Два смежных участка проходятся непрерывно (`dispense_contour`): сопло не поднимается на углу → подъём и проверка в конце |
| 8 | Полный замкнутый контур `side_1…side_4` | Все четыре стороны одним непрерывным движением, контур замыкается в точке начала → проверка полноты |
| 9 | Полный контур + сбой: прерывание подачи на середине `side_3` | `side_1`, `side_2`, половина `side_3` → остановка, `inspect_state` → возобновление `side_3` с точки разрыва (0.5 → 1.0), а не с начала → `side_4` → проверка |
### III. Передача винтов виртуальному оператору (11–15) — люк уже установлен, лоток с 10 винтами
| № | Сцена | Что делает робот |
|---:|---|---|
| 11 | `magnetic_tool`; цель — `hole_1` | Берёт магнит → захватывает `screw_1` из лотка → подъём → `work` → перенос к отверстию → передача оператору → осевой подъём → возврат инструмента |
| 12 | Отверстия `hole_1`, `hole_3` (диагональ) | Две передачи: `screw_1→hole_1`, `screw_2→hole_3`; после каждой — подъём и возврат к лотку с пустым магнитом |
| 13 | Отверстия `hole_1`, `hole_2`, `hole_3` | Три разных винта (`screw_1`, `screw_2`, `screw_5`) в три разных отверстия |
| 14 | Крестовой порядок `hole_1→hole_3→hole_2→hole_4`; есть `torque_tool` | Четыре передачи (`screw_1/2/5/6`) → возврат магнита → затяжной инструмент: имитация затяжки каждого пустого отверстия (подход, поворот 45°, раскрутка, подъём) → возврат инструмента |
| 15 | Как №14 + сбой: первый захват третьего винта (`screw_5`) неудачен | Две штатные передачи → `grasp_failed` на третьем винте → `inspect_state` → одна повторная попытка → четвёртый винт → имитация затяжки всех четырёх отверстий |
### IV. Полная сборка и перепланирование (16–20) — все четыре инструмента в стойке
| № | Сцена | Что делает робот |
|---:|---|---|
| 16 | Люк свободен, контур = `side_1`, один винт (`hole_1`) | Герметик на `side_1` → возврат инструмента → присоска: установка люка и проверка → возврат присоски → магнит: передача `screw_1→hole_1` → `torque_tool`: имитация затяжки `hole_1` |
| 17 | Полный контур, два диагональных винта | Полный контур герметика с проверкой → установка люка с проверкой → передачи `screw_1→hole_1`, `screw_2→hole_3` → имитация затяжки обоих отверстий |
| 18 | Полная сборка, крестовой порядок | Полный контур → люк → четыре передачи `hole_1→3→2→4` → имитация затяжки всех четырёх |
| 19 | Как №18, но люк (0.37, −0.20, 60°) и лоток (0.18, 0.48) смещены | Полная сборка, как №18, но все позы люка и винтов берутся из фактического состояния сцены после смещения |
| 20 | Как №18 + три сбоя сразу | Прерывание подачи на `side_3` (возобновление с точки разрыва) → люк: первая посадка смещена → `not_ok` → одна перестановка → винты: `grasp_failed` на первом винте → одна повторная попытка → все четыре передачи и имитация затяжки |
Ключевые зависимости, проверяемые во всех опытах: инструмент не берётся,
пока предыдущий не возвращён в стойку; люк не ставится на неподтверждённый
контур герметика; передача винта возможна только после подтверждённого
захвата; каждая ветвь отказа — ровно одна повторная попытка; любое
неопределённое состояние ведёт к остановке.
## Система управления эталонным исполнителем
### Состав
```
experiment.launch.py (mode:=view|execute)
├─ iiwa_bringup/iiwa.launch.py Webots + контроллеры + MoveIt (move_group и MoveItPy)
├─ scene_spawner расставляет объекты сцены по scenes.yaml
├─ grant_supervisor Webots Supervisor (extern): перенос/фиксация объектов,
│ команды attach/detach/grab/handoff/inspect, публикация
│ состояния сцены; в view — read_only
└─ reference_runner (только execute)
├─ SupervisorClient синхронный клиент /iiwa_experement/object_command
├─ PlanningSceneBridge зеркало сцены Webots в MoveIt: мировые объекты,
│ attached_collision_objects, ACM из iiwa7.srdf,
│ проверка синхронизации через /monitored_planning_scene
│ и сервис /get_planning_scene
├─ MotionAdapter защищённый клиент /cobot/move_to_pose, move_to_joints,
│ move_to_named, /cobot/stop: свежесть /joint_states,
│ синхронность сцены, ожидание неподвижности, проверка
│ достигнутой позы по TF, одна корректирующая повторная
│ отправка цели, безопасная остановка при любой ошибке
├─ ReferenceOperations технологические операции: take_tool/dock_tool,
│ pick/place_cap, dispense/dispense_contour,
│ pick_screw/handoff_screw, tighten_hole (имитация),
│ ветви отказов; паттерн «подход → контакт → осевой
│ подъём → перенос» с обязательными зазорами
├─ reference_scenarios детерминированные маршруты 20 опытов из шагов
│ (move_named/операция/проверка), старт в work,
│ финал work → home
└─ TraceWriter журнал JSONL на каждый прогон: шаги, события,
итог (status, delivered, cap, sealant, home_reached)
```
### Последовательность запуска (mode:=execute)
1. Launch валидирует `experiment_id` (1–20), `mode`, `start_delay_sec`,
`trace_dir`; готовит временные копии мира Webots и `setting.yaml`.
2. Стартуют Webots, контроллеры, MoveIt; `scene_spawner` расставляет объекты
выбранного опыта; `grant_supervisor` подключается как extern-контроллер
(Webots ждёт его до начала симуляции — тупик исключён порядком запуска).
3. `reference_runner` ждёт: сервис готовности сцены → серверы движения и
MoveIt → задержку `start_delay_sec` **по времени симуляции**. Только после
этого начинается первое движение — переход в `work`.
4. Маршрут выполняется по шагам; перед каждым движением проверяются свежесть
состояния робота и синхронность планировочной сцены. Переносимые объекты
прикрепляются к роботу в MoveIt (`attach`), чтобы столкновения
проверялись с учётом инструмента и детали.
5. Последняя строка журнала — `event=result` со статусом `completed` или
`stopped` и причиной остановки.
### Режимы
- `mode:=view` — сцена открывается и остаётся неподвижной: runner не
стартует, supervisor работает в read_only, журнал не создаётся.
- `mode:=execute` — полный прогон эталонного маршрута с журналом.
```bash
source /opt/ros/jazzy/setup.bash
colcon build --base-paths src --packages-up-to iiwa_experement --symlink-install
source install/setup.bash
ros2 launch iiwa_experement experiment.launch.py experiment_id:=1 mode:=view
ros2 launch iiwa_experement experiment.launch.py experiment_id:=1 \
mode:=execute start_delay_sec:=3.0 \
trace_dir:=~/.ros/iiwa_experement/runs
```
### Политика безопасности движений
- Допустимые именованные позы: только `work` (рабочая) и `home` (финальная).
`transport` запрещена и не зеркалируется в конфигурацию исполнителя.
- Перед планированием робот должен быть неподвижен (окно стабильных нулевых
скоростей суставов); цель проверяется по установившейся позе TCP, а не по
первому отсчёту контроллера.
- Захват/перенос: удаление объекта из мировой сцены ↔ прикрепление к роботу
выполняются атомарно с проверкой синхронизации, чтобы не было ни
дублирования, ни «слепого» переноса.
- Отказ планирования, устаревшее состояние, рассинхрон сцены или отклонение
позы сверх допуска (6 мм / 0,08 рад) — остановка робота и блокировка
дальнейших движений до конца прогона.
## Связанные документы
- Задания для LLM-планировщика: [experements.md](experements.md)
- Начальные позы объектов: [experiment-scenes.md](experiment-scenes.md)
- Измерения, политика движений и результаты прогонов:
`src/iiwa_experement/doc/reference-control-qa.md`
- Спецификация и план эталона:
`docs/superpowers/specs/2026-11-08-grant-reference-control-design.md`,
`docs/superpowers/plans/2026-11-08-grant-reference-control.md`