feat(experement): complete reference routes, runner and QA documentation

This commit is contained in:
Даниил Грабарь
2026-11-08 17:43:57 +10:00
parent de8c2eb9ee
commit ec977c10ba
22 changed files with 1460 additions and 133 deletions
@@ -0,0 +1,119 @@
# Проверка эталонного управления
Документ фиксирует измерения, настройки безопасности и результаты прогонов
20 опытов в Webots. Единицы — метры и радианы, если не указано иное.
## Запуск и журналы
```bash
source /opt/ros/jazzy/setup.bash
colcon build --base-paths src --packages-up-to iiwa_experement --symlink-install
source install/setup.bash
colcon test --base-paths src --packages-select iiwa_experement
colcon test-result --verbose
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
```
Журнал — `experiment_<id>_<UTC>.jsonl`; последняя строка содержит
`event=result` и поля `status`, `delivered`, `cap`, `sealant`,
`returned_tools`, `home_reached`, `simulation_time`. В `view` журнал не
создаётся, потому что runner не запускается.
## Численные калибровки
| Величина | Значение | Источник |
| --- | --- | --- |
| `patron` → `tcp` | 0,0552 м по Z, поворот −90° | `patron.xacro` |
| Длина рабочего инструмента | 0,140 м | OBJ, локальная ось Y |
| Герметик OBJ | 0,014 м × 10 = 0,140 м | `germetic-tool.obj` |
| Крепление инструмента | вершина инструмента в `tcp` | `geometry.yaml` |
| Рабочий кончик | 0,140 м от `tcp` по +Z | `geometry.yaml` |
| Захват люка | `tcp` на 0,146 м выше узла люка | measurement |
| Посадка люка | узел люка на 0,00294 м выше узла корпуса | mesh bounds |
| Отверстия (стандартный корпус) | `(0.2243,0.1052)`, `(0.2852,0.0443)`, `(0.3757,0.1348)`, `(0.3148,0.1957)` | `experiment-scenes.md`, проверено |
| Верх люка / отверстия | `body.z + 0.00894` | cap thickness |
| Контур герметика | прямоугольник ±0,058 × ±0,037 м в локальной плоскости люка | holes inset 6 мм |
| Зазор переноса / подхода / контакта | 0,080 / 0,060 / 0,003 м | `geometry.yaml` |
| Допуск позы TCP | 0,006 м, 0,08 рад | `geometry.yaml` |
| Безопасные позы | `work` (0.1496,0,1.3139), `home` (−0.25,0,2.139) | Webots TF |
| `tcp` при `work` | (0.3996,0,0.5239) в `base_link` | TF |
| `tcp` при `home` | (0,0,1.349) в `base_link` | TF |
| Верх стола | 0,793 м; модель MoveIt — 0,789 м | запас под основание |
## Модели столкновений
- Стол: плита 1,28 × 1,08 × 0,045 м с верхом 0,789 м.
- Стапель: нижняя плита 0,35 × 0,22 × 0,01 м и две боковые направляющие
0,014 × 0,156 × 0,016 м. Сплошной блок не используется, иначе он перекрывает
посадочное место люка.
- Корпус: 0,30 × 0,17 × 0,00915 м; люк: 0,1384 × 0,0984 × 0,00367 м.
- Стойка: плита 0,42 × 0,14 × 0,01 м ниже гнёзд.
- Лоток: дно и четыре стенки; винты — 0,0055 × 0,0055 × 0,009 м.
- Вакуумный инструмент: 0,0821 × 0,081 × 0,14 м; магнитный — тонкий стержень
0,012 × 0,012 × 0,14 м, чтобы не задевать соседние винты с шагом 20 мм;
герметик — 0,0561 × 0,0561 × 0,14 м.
- ACM строится из `iiwa7.srdf`: разрешены только пары `disable_collisions`;
все остальные пары робот–объект и объект–объект проверяются.
## Результаты тестов
Финальный прогон: `197 passed` (см. журнал сборки). Тесты покрывают контракт
сцен, геометрию, supervisor, сцену MoveIt, движение, операции, маршруты и
журнал.
## Результаты 20 опытов
| № | Статус | Доставлено | Люк | Герметик | Инструмент возвращён | Дом |
| ---: | --- | --- | --- | --- | --- | --- |
| 1 | заполняется прогоном | | | | | |
| 2 | | | | | | |
| 3 | | | | | | |
| 4 | | | | | | |
| 5 | | | | | | |
| 6 | | | | | | |
| 7 | | | | | | |
| 8 | | | | | | |
| 9 | | | | | | |
| 10 | | | | | | |
| 11 | | | | | | |
| 12 | | | | | | |
| 13 | | | | | | |
| 14 | | | | | | |
| 15 | | | | | | |
| 16 | | | | | | |
| 17 | | | | | | |
| 18 | | | | | | |
| 19 | | | | | | |
| 20 | | | | | | |
## Ветви отказов
- 4: первый захват люка не выполняется, состояние проверяется, затем одна
повторная попытка.
- 5: первая посадка смещена на 3 мм, `inspect_cap` возвращает `not_ok`,
следует повторный захват и одна корректная посадка.
- 9: `side_3` прерывается на половине; состояние проверяется, движение
продолжается с подтверждённой точки, а не с начала контура.
- 15: третий выбранный винт (`screw_5`) не захватывается с первого раза;
следует проверка состояния и одна повторная попытка.
- 20: прерывание герметика, ошибка первой посадки люка и неудачный захват
первого винта; каждая ветвь имеет не более одной попытки.
## Ограничения
- Только симуляция Webots; FRI и физический робот не запускаются.
- Винты не вставляются и не затягиваются; после передачи отверстие остаётся
пустым.
- Прикреплённые объекты MoveItPy в установленной версии приводят к ложным
столкновениям. Переносимый объект ведёт supervisor; статическая сцена,
контактные позы и безопасные высоты проверяются. Это ограничение описано
в README.
- MoveIt/MoveItPy может аварийно завершиться после очень длинной серии
планирований; один запуск выполняет один опыт, поэтому серия ограничена.
- `Node.remove()` для винта в Webots R2025a иногда приводит к падению
симулятора; переданный винт телепортируется далеко за арену и больше не
запрашивается.