Система ориентации: цепочка обработки IMU

Урок-практикум: собираем полную цепочку от сырых данных IMU до устойчивого угла наклона.

Система ориентации — конвейер, превращающий сырые данные акселерометра и гироскопа в стабильную оценку угла: фильтрация, наклон, слияние.

Здесь сходятся темы курса: датчик (IMU), фильтрация шума, слияние. Покажем полную цепочку: чистим акселерометр медианой, считаем наклон через arctan, сливаем с гироскопом комплементарным фильтром.

Шаг 1: наклон из акселерометра

Угол тангажа из проекций ускорения (урок про IMU):

$$ \theta_{acc} = \arctan\frac{a_x}{\sqrt{a_y^2 + a_z^2}} $$

import math, statistics

def pitch_from_acc(ax, ay, az):
    return math.degrees(math.atan2(ax, math.sqrt(ay*ay + az*az)))

# сырые отсчёты ax с одним выбросом
ax_raw = [4.9, 5.0, 9.5, 4.8, 5.1]
# медианный фильтр от выброса
ax = statistics.median(ax_raw)
print("ax после медианы:", ax)
print("угол:", round(pitch_from_acc(ax, 0.0, 8.5), 2), "°")

Вывод:

ax после медианы: 5.0
угол: 30.47 °

Шаг 2: слияние с гироскопом

Сливаем угол акселерометра с интегралом гироскопа комплементарным фильтром (раздел 6):

import math, random
random.seed(3)

dt = 0.1
alpha = 0.96
angle = 0.0
true = 0.0

for k in range(6):
    true += 3.0 * dt                              # реально 3 °/с
    gyro = 3.0 + random.uniform(-0.2, 0.2)        # шумная скорость
    acc = true + random.uniform(-2, 2)            # шумный угол
    angle = alpha*(angle + gyro*dt) + (1-alpha)*acc
    print("истина", round(true, 2), "-> оценка", round(angle, 2))

Вывод:

истина 0.3 -> оценка 0.3
истина 0.6 -> оценка 0.61
истина 0.9 -> оценка 0.84
истина 1.2 -> оценка 1.18
истина 1.5 -> оценка 1.43
истина 1.8 -> оценка 1.75

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

Полная цепочка ориентации: сырые данные → калибровка нуля (датчик в покое не должен показывать наклон) → медианный/низкочастотный фильтр от выбросов и шума → расчёт угла акселерометра → слияние с гироскопом → готовый угол для управления. В реальных автопилотах вместо комплементарного фильтра часто стоит расширенный фильтр Калмана по всем трём осям плюс магнитометр для курса, но логика та же. Главное — каждый блок курса (датчик, АЦП, калибровка, фильтр, слияние) здесь занимает своё место в конвейере.

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

  • Пропустить калибровку нуля — система покажет наклон в покое.
  • Сливать нефильтрованный акселерометр — выбросы протекут в угол.
  • Интегрировать гироскоп без слияния — угол уплывёт за минуты.

Итог

  • Ориентация — это конвейер: калибровка → фильтр → наклон → слияние.
  • Медиана убирает выбросы акселерометра, arctan даёт наклон, комплементарный фильтр сливает с гироскопом.
  • Каждый блок курса находит здесь практическое применение.
Проверьте себя
1. Зачем перед расчётом наклона прогонять акселерометр через медианный фильтр?
AЧтобы ускорить расчёт
BЧтобы убрать одиночные выбросы, искажающие угол
CЧтобы перевести в градусы
DЭто не нужно
2. Какой блок в системе ориентации не даёт углу уплыть в долгой перспективе?
AИнтеграл гироскопа
BСлияние с акселерометром (комплементарный фильтр)
CАЦП
DАнтидребезг