# ВП02 — рабочая веб-лабораторная по одометрии

[Открыть занятие](index.html) · [Методика и разбор преподавателю](https://gitlab.astersky.ru/science/learncourses/-/blob/main/ИТЛН/Лабораторная_ВП02.md) · [ИТЛН](https://gitlab.astersky.ru/science/learncourses/-/blob/main/ИТЛН/README.md) · [Презентация](../concept/index.html)

## Запуск

Откройте `index.html` в Chrome двойным щелчком. Пакеты и внешние сервисы не требуются. Либо из корня репозитория выполните `python3 -m http.server 8080 --bind 127.0.0.1` и откройте `http://localhost:8080/ИТЛН/vp02/`.

Оформление: светлая и тёмная темы на общем стиле лаборатории `../shared/` (`theme.css`, `theme.js`); переключатель в шапке, выбор запоминается, без выбора действует тема системы. Цвета графиков заданы CSS-переменными в `lab.css`.

## Структура страницы

Страница разделена на два режима с переключателем в шапке. **«Разобраться»**: ролик, задание, три идеи, песочница, словарь. **«Выполнить»**: вариант и пять шагов. Кнопка «Справка» в любом режиме открывает формулы, цвета графиков и словарь в отдельном окне. Ссылки на раздел другого режима (например, `#step-3`) сами переключают режим. Последний выбранный режим запоминается. Без JavaScript видны оба режима.

Порядок построен по [методической ревизии](https://gitlab.astersky.ru/science/learncourses/-/blob/main/ИТЛН/Лабораторная_ВП02.md#review-2026-10-07): сначала проблема, затем задание.

0. **Проблема и ролик.** Робот без GPS: где он окажется? Ролик автоматически показывает четыре сценария варианта 01 на реальной модели: идеальный робот, неверный радиус, шум и проскальзывание. Есть пауза и выбор сценария; при `prefers-reduced-motion` ролик не запускается сам.
1. **Задание за минуту:** цель, пять шагов с часами, что сдать, рубрика 4 балла, ссылка на Л2 и словарь.
2. **Три идеи:** колесо → путь, среднее → движение, разность → поворот. Тренажёр одного шага (не засчитывается), полная формула с объяснением $g$, три источника ошибки.
2а. **Песочница** (не засчитывается): ползунки ошибки радиуса, шума, проскальзывания, seed и маршрута для робота своего варианта; траектория и метрики пересчитываются реальной моделью сразу; подсказка объясняет наблюдаемый эффект. Идея перенесена из демонстрационного макета `../concept/stand.html?mode=odometry`.
3. **Вариант:** ФИО, группа, номер 01–15, паспорт робота, маршрута и ошибок, вопрос защиты.
4. **Шаги 1–5:** расчёт (с подсказкой и разобранным примером на других числах) → функция `updatePose` и 8 проверок → опыты Э1–Э5 (10 обязательных запусков: прогноз → расчёт → анимация → наблюдение; наложение любого сохранённого опыта для сравнения, шаг +0,5 с) → статистика и выводы → отчёт.

Приложение проверяет числа, код и комплектность; длина текста — только формальная проверка заполнения, не оценка качества. Проверка самостоятельности и объяснений остаётся за преподавателем. Сохранённый опыт — весь рассчитанный журнал, а не выбранный кадр воспроизведения.

## Реализовано

- Дифференциальная кинематика, отдельные истина и оценка; точная дуга и независимая истинная модель через центр вращения.
- 15 фиксированных вариантов: геометрия, начальная поза, сторона и направление обхода квадрата, индивидуальные дефект/шум/seed/проскальзывание и вопрос защиты. [Таблица вариантов и контрольные результаты](https://gitlab.astersky.ru/science/learncourses/-/blob/main/ИТЛН/Лабораторная_ВП02.md#индивидуальные-варианты-назначение-и-реализация).
- Квадрат с поворотами на месте, прямая той же идеальной линейной длины, полукруг радиуса 0,45 м. Вращения на месте означают разное время маршрутов.
- Ошибка предполагаемого радиуса выбранного варианта колеса; гауссов шум энкодерных приращений; постоянная доля проскальзывания выбранного колеса.
- Воспроизводимый seed, пауза, шаг, просмотр по времени, истинная/оценённая траектории и показатели полного опыта.
- Студенческий код исполняется в отдельном Worker, получает только энкодеры и предполагаемую геометрию. Тайм-аут 2 с. Менять исходный pose нельзя.
- Локальное сохранение, импорт JSON с повторным вычислением данных, экспорт графиков и журналов.
- Каждый вариант имеет отдельный черновик; переключение восстанавливает его ответы и опыты. Старые JSON версии 1.0 импортируются как отдельный прежний образец, не как один из новых вариантов.

## Проверки

```bash
node --test ИТЛН/vp02/model.test.cjs
```

Фактически выполнено 07.10.2026 (новый интерфейс): 10 проверок ядра; в Chrome через Playwright пройден весь сценарий варианта 01 — неверный и верный расчёт, заготовка/бесконечный/правильный код, 10 опытов (первый — своей функцией), статистика, выгрузка HTML/JSON/MD, перезагрузка, переключение вариантов 01 → 07 → 01, импорт JSON; ширины 1440 и 390 px; ошибок консоли нет. Ранее (версия интерфейса 1.1): 10 проверок ядра, включая 150 условий вариантов и их повторяемость; в Chrome пройден весь сценарий варианта 01 с правильными и неправильными ответами, заготовкой/правильным/бесконечным кодом, всеми 10 опытами на студенческом вычислителе, статистикой, экспортом и импортом, восстановлением после перезагрузки. Для всех 15 вариантов проверены ручные ответы и идеальный маршрут на студенческой функции, переключение и отдельные черновики. Проверена ширина 390, 768, 1024 и 1440 px. Это техническая проверка, не проведённый пилот со студентами.

## Границы

Не моделируются динамика привода и шин, столкновения и квантование энкодеров. $\sigma$ относится к одному приращению при шаге $\Delta t=0{,}05$ с; нельзя переносить её без пересчёта на другой период сенсора. Прямая и квадрат имеют одинаковую идеальную линейную длину, но разное время и количество шагов; их сравнение не изолирует только форму пути. Набор проверок кода конечен; нужна защита. Данные сохраняются в конкретном браузере/адресе: для переноса используйте JSON. Импорт отчёта с кодом повторно исполняет этот код в Worker. Это учебная среда для своего кода, не защищённая система экзамена.

## Единая запись обозначений


Во всей лабораторной — в теории, паспорте, подписях, динамических данных и HTML-отчёте — математические обозначения отображаются через MathML; на SVG-схемах используются математические фрагменты с настоящими индексами, пояснения остаются обычным шрифтом. Markdown-методика и отчёт используют LaTeX. Метки L/R прямые и латинские, например $r_{\mathrm L}$, $r_{\mathrm R}$; колея — $b$, начальный курс — $\theta_0$. Код и машинные JSON/CSV сохраняют допустимые идентификаторы. Связь кода и обозначений поясняется в программном задании.

## Файлы

`model.js` — ядро (без DOM); `model.test.cjs` — независимые проверки; `student-code.js` — проверка и исполнение кода в Worker; `math.js` — обозначения и формулы (LaTeX + MathML, вставка через `data-sym` / `data-formula`); `view.js` — сцена траекторий, ролик и тренажёр шага; `lab.js` — логика занятия, протокол, черновики и отчёты; `lab.css` — самостоятельная светлая тема; `index.html` — статичная разметка страницы. Внешние пакеты, шрифты и сеть не нужны.
