Одометрия дифференциального привода

Как робот на двух колёсах понимает, куда он приехал, просто считая обороты колёс.

Одометрия — оценка перемещения робота по данным с датчиков движения (энкодеров колёс) путём интегрирования скоростей.

У дифференциального привода два ведущих колеса с независимыми скоростями $v_L, v_R$ и расстоянием между ними $b$ (база). Из них получаются линейная и угловая скорости центра робота:

$$ v = \frac{v_R + v_L}{2}, \qquad \omega = \frac{v_R - v_L}{b} $$

Если колёса крутятся одинаково — едем прямо ($\omega = 0$); если по-разному — поворачиваем. Чтобы развернуться на месте, колёса крутят в противоположные стороны.

Интегрирование позы

Зная $v, \omega$, обновляем позу $(x, y, \theta)$ за малый шаг $\Delta t$:

$$ \theta \mathrel{+}= \omega \, \Delta t, \quad x \mathrel{+}= v \cos\theta \, \Delta t, \quad y \mathrel{+}= v \sin\theta \, \Delta t $$

Считаем

$v_L = 0.5$, $v_R = 0.7$ м/с, база $b = 0.3$ м. Проедем 1 секунду шагами по 0.1 с.

import math

vL, vR, b = 0.5, 0.7, 0.3
v = (vR + vL) / 2
w = (vR - vL) / b
print("v =", round(v, 4), "м/с,  w =", round(w, 4), "рад/с")

x = y = theta = 0.0
dt = 0.1
for _ in range(10):
    theta += w * dt
    x += v * math.cos(theta) * dt
    y += v * math.sin(theta) * dt

print("через 1 с: x =", round(x, 4), "y =", round(y, 4),
      "theta =", round(math.degrees(theta), 2), "град")

Вывод:

v = 0.6 м/с,  w = 0.6667 рад/с
через 1 с: x = 0.5499 y = 0.2112 theta = 38.2 град

Как работает под капотом

Энкодеры считают «тики» — доли оборота колеса. Умножив на длину окружности колеса, получаем пройденный каждым колесом путь, отсюда $v_L, v_R$, отсюда — приращение позы. Это счисление пути (dead reckoning): дёшево и быстро, но ошибки накапливаются — проскальзывание колёс и неточность базы со временем уводят оценку от истины. Поэтому одометрию дополняют другими датчиками (IMU, лидар) и фильтрами.

Частые ошибки

  • Обновлять $x, y$ по старому $\theta$, а не по обновлённому — для маленького $\Delta t$ разница мала, но при больших шагах накапливается.
  • Путать базу $b$ (между колёсами) с радиусом колеса — это разные величины.
  • Доверять одометрии на длинной дистанции без коррекции — дрейф неизбежен.

Итог

  • Дифференциальный привод задаёт $v$ и $\omega$ через скорости двух колёс.
  • Поза интегрируется пошагово из $v, \omega$ и $\Delta t$.
  • Одометрия — дешёвое счисление пути, но ошибки накапливаются (дрейф).
  • Для точности её комбинируют с другими датчиками.
Проверьте себя
1. Как из скоростей колёс получают угловую скорость робота?
Aω = (v_R + v_L)/2
Bω = (v_R − v_L)/b
Cω = v_R·v_L
Dω = b/(v_R − v_L)
2. Главный недостаток одометрии (счисления пути)?
AВысокая стоимость
BНакопление ошибки (дрейф) из-за проскальзывания и неточностей
CНужен GPS
DРаботает только в помещении