ОдометрияИТЛН · виртуальная лабораторная
Вариант 010 / 4

Лабораторная ВП02 · 6 академических часов · практика П2

У робота нет GPS.
Он считает обороты колёс.
Где он окажется?

Мобильный робот в помещении часто знает своё положение только по энкодерам — датчикам поворота колёс. Пересчёт поворотов колёс в координаты называется одометрией. Она проста и быстра, но любая мелкая неточность накапливается: через несколько метров робот «думает», что он в одном месте, а на самом деле — в другом.

В этой работе вы сами посчитаете и запрограммируете одометрию, а затем выясните, как разные ошибки проявляются в траектории — и чего по одним энкодерам узнать нельзя.

Что нужно сделать ↓
Ролик: четыре сценария одного роботавариант 01 · реальная модель
1 / 4
Идеальный робот

Где робот на самом делеГде он «думает», что находится (одометрия)Заданный маршрут

Задание за одну минуту

Что от вас требуется

Цель

Научиться восстанавливать положение робота по энкодерам и исследовать по отдельности три заранее заданных источника ошибки: неверный радиус колеса в программе, случайный шум датчика и проскальзывание колеса. Вы увидите, как каждый из них проявляется в траектории и метриках.

Важно: в опытах причина ошибки известна заранее. По одним энкодерам нельзя надёжно отличить неверный радиус от проскальзывания: для этого нужен внешний эталон, например другой датчик или известный маршрут.

Пять шагов

  1. Расчёт — один шаг одометрии вручную · 1 ч
  2. Код — своя функция updatePose · 1 ч
  3. Опыты — 10 запусков: прогноз → опыт → наблюдение · 3 ч
  4. Анализ — статистика и выводы · ½ ч
  5. Отчёт — выгрузка и защита · ½ ч

Что сдать

  • HTML-отчёт с графиками (можно распечатать в PDF)
  • JSON-файл со всеми данными
  • Внутри: расчёт с объяснением, ваш код, 10 опытов с прогнозами и наблюдениями, статистику, выводы и ответ на вопрос своего варианта

Хотя бы один опыт нужно рассчитать своей функцией, а не встроенной.

Как оценивается — 4 балла

  • 1 расчёт и объяснение
  • 1 свой код, прошедший проверки
  • 1 полный протокол опытов
  • 1 анализ, выводы, защита

Программа проверяет числа и комплектность. Качество объяснений и авторство кода оценивает преподаватель.

Минимум теории

Три идеи, на которых держится одометрия

Робот дифференциальный: два колеса — левое (L) и правое (R). Метки L и R — латинские буквы, а не греческие. Система координат: ось — вправо, — вверх, курс отсчитывается от оси против часовой стрелки. Единицы: метры и радианы.

1

Поворот колеса → путь колеса

Энкодер сообщает угол поворота колеса в радианах. Умножаем его на радиус — получаем длину дуги на ободе. Если колесо не проскальзывает, это и есть путь по полу.

2

Среднее путей → движение вперёд

Центр робота находится посередине между колёсами, поэтому он проходит среднее из двух путей.

3

Разность путей → поворот

Если правое колесо прошло больше левого, робот повернул влево (против часовой стрелки). Чем шире колея , тем меньше поворот при той же разности.

Попробуйте сами: один шаг

Двигайте ползунки и следите, как меняется движение робота. Это тренажёр для понимания, он не засчитывается как выполнение заданий.

Здесь условный робот: = = 0,04 м, колея = 0,25 м, старт в (0; 0), курс 0. Данные вашего варианта будут ниже.

Полная формула шага одометрии и откуда в ней коэффициент

Мы знаем длину дуги и поворот . Чтобы получить новые координаты, нужно знать прямой отрезок (хорду) от старой точки до новой и его направление.

  • Хорда направлена под углом — посередине между старым и новым курсом. Обозначим .
  • Хорда короче дуги. Отношение «хорда / дуга» равно . При прямом движении ( = 0) = 1.
  • Курс после шага приводим к диапазону — это операция wrap.

В коде обычно называют gain. Формула точна, если внутри шага скорости колёс постоянны.

Три источника ошибки, которые вы будете исследовать

Неверный радиус

Программа считает колесо на несколько процентов больше или меньше, чем оно на самом деле. Ошибка систематическая: она повторяется на каждом шаге в одну сторону.

Шум энкодера

Каждое показание немного неточное: к нему добавляется случайная величина со стандартным отклонением рад на шаг. Ошибка случайная, её оценивают по серии повторов.

Проскальзывание

Колесо крутится, но по полу проходит меньше. Энкодер измеряет вращение, а не путь, поэтому не замечает потерю. Ошибка возникает в реальном движении, а не в программе. Поэтому по одним энкодерам проскальзывание трудно отличить от неверного радиуса.

Модель кинематическая: шаг расчёта = 0,05 с; динамика моторов, контакт шин, столкновения и дискретность энкодеров не моделируются.

Поиграйте перед работой

Песочница: крутите ошибки — смотрите на траекторию

Робот вашего варианта и реальная модель. Каждое изменение ползунка сразу пересчитывает весь маршрут. Попробуйте понять, как ведёт себя каждая ошибка, прежде чем делать обязательные опыты. Песочница не засчитывается и в отчёт не попадает.

ИстинаОдометрияМаршрут

Разобрались? Переходите к работе

Дальше: ваш вариант и пять шагов с проверками. Формулы и словарь всегда доступны по кнопке «Справка» вверху.

Перейти к выполнению →
Выполнение · 5 шагов · около 6 часов. Сдать: HTML-отчёт и JSON. Хотя бы один опыт рассчитайте своей функцией.
← Теория

Перед началом

Ваш вариант и ваш робот

Номер варианта назначает преподаватель. От него зависят размеры робота, старт, маршрут и условия опытов. Формулы у всех одинаковые. Для каждого варианта черновик сохраняется отдельно.

1

Шаг 1 из 5 · около 1 часа

Посчитайте один шаг вручную

не выполнено

Зачем: прежде чем доверить расчёт программе, нужно понимать каждое действие. Ваш код на шаге 2 должен будет выдать те же числа.

Подсказка по шагам
  1. Пути колёс: = ·, = ·.
  2. — среднее путей, — их разность, делённая на колею .
  3. , . Калькулятор — в режиме радиан!
  4. Начальный курс переведите в радианы (умножить на ) и подставьте в формулы для и .
Разобранный пример на других числах
Допуск ±0,0005. Можно вводить через точку или запятую.
2

Шаг 2 из 5 · около 1 часа

Запрограммируйте шаг одометрии

не выполнено

Зачем: робот выполняет этот расчёт 20 раз в секунду. Ваша функция будет вызываться на каждом шаге опыта вместо встроенной.

Что написать

Функцию updatePose(pose, deltaLeft, deltaRight, geometry) на JavaScript. Она получает текущую позу и показания энкодеров за шаг и возвращает новый объект { x, y, theta }. Исходный pose изменять нельзя.

Связь кода и формул
pose.x, pose.y, pose.theta, ,
deltaLeft, deltaRight, , рад
geometry.rL, geometry.rR, , м
geometry.b, м
gain

Полезное: Math.sin, Math.cos, Math.abs, Math.PI. Деление на ноль при = 0 нужно обработать отдельно. Лимит исполнения — 2 с.

odometry.js
    3

    Шаг 3 из 5 · около 3 часов

    Проведите опыты: прогноз → опыт → наблюдение

    0 / 10

    Зачем: выяснить, как каждый источник ошибки влияет на одометрию. Опыты сгруппированы в пять исследовательских вопросов. Выберите опыт, до запуска запишите прогноз, рассчитайте, посмотрите траекторию и запишите, что увидели.

    Выберите опыт вышеВстроенная одометрия
    —
    ИстинаОдометрияМаршрут
    Показания на текущем шаге
    Рассчитайте опыт.

    Протокол

    0 запусков
    №ОпытКонечная ошибка, мRMSE, мОшибка курса, °Код
    4

    Шаг 4 из 5 · около 30 минут

    Проанализируйте результаты

    не выполнено

    Зачем: один запуск со случайным шумом ничего не доказывает. Нужна серия и её статистика. После этого сформулируйте выводы по каждому источнику ошибки.

    Статистика пяти шумовых опытов (Э3)

    Найдите среднюю конечную ошибку и выборочное стандартное отклонение (делитель ). Здесь — конечная ошибка i-го опыта, = 5.

    Сначала выполните пять шумовых опытов.

    Выводы каждый не короче 40 символов

    5

    Шаг 5 из 5 · около 30 минут

    Соберите отчёт и подготовьтесь к защите

    0 / 4

    Готовность

      Выгрузить можно и незаконченную работу. Браузер хранит черновик только на этом компьютере, поэтому для сдачи нужны файлы.

      Вопросы на защите

      • Почему команда моторам — не измерение перемещения?
      • Почему при проскальзывании энкодеры могут быть исправны?
      • Почему нулевая конечная ошибка не гарантирует точную траекторию?
      • Почему задаётся на приращение, а не на позицию?
      • Как изменить алгоритм при другой колее и разных радиусах?
      • Что эта модель не проверяет (динамику, ROS 2, реальные датчики)?

      Справка

      Словарь

      Одометрия
      Оценка положения робота по накопленным показаниям датчиков движения (здесь — энкодеров колёс).
      Энкодер
      Датчик угла поворота колеса. Выдаёт приращение угла за шаг, рад.
      Поза
      Положение и ориентация: , (м) и курс (рад).
      Истина / оценка
      Истина — где робот на самом деле (в модели это известно). Оценка — что вычислила одометрия.
      Колея
      Расстояние между левым и правым колесом, м.
      Ошибка радиуса
      Программа использует радиус, отличающийся от настоящего на заданный процент. Сам робот едет правильно.
      Шум
      Стандартное отклонение случайной добавки к каждому показанию энкодера, рад на шаг 0,05 с.
      Проскальзывание
      Доля пути, которую колесо «теряет» относительно пола. Энкодер её не видит.
      Seed
      Номер случайной последовательности. Одинаковый seed повторяет тот же шум.
      Конечная ошибка
      Расстояние между истиной и оценкой в последний момент опыта, м.
      RMSE
      Среднеквадратичная ошибка положения за весь опыт, м.
      Невозврат
      Насколько настоящий робот не вернулся в точку старта после квадрата, м.

      Справка

      Шаг одометрии

      Ось — вправо, — вверх, курс — против часовой. Метры и радианы; начальный курс переводится умножением на .

      Статистика серии

      Цвета на графиках

      ИстинаОдометрияМаршрутСравниваемый опыт

      Словарь

      Лекция Л2 · Раздел «Три идеи»