Системы координат: земная и связанная
Чтобы управлять аппаратом, нужно договориться, относительно чего меряем «вверх», «вперёд» и «вбок».
Связанная система координат жёстко привязана к корпусу аппарата (нос, правое крыло, низ), а земная — к земле (север, восток, вниз).
Две системы
В авиации часто используют земную систему NED (North-East-Down): ось X на север, Y на восток, Z вниз. И связанную систему: ось вперёд (по носу), ось вправо, ось вниз относительно корпуса. Когда аппарат наклоняется, связанные оси поворачиваются вместе с ним, а земные остаются на месте.
Зачем две? Датчики (гироскоп, акселерометр) меряют в связанной системе — «что чувствует корпус». А маршрут и сила тяжести заданы в земной. Управление — это постоянный перевод между ними.
Поворот на плоскости
Простейший случай — поворот вектора на угол $\theta$ вокруг вертикали (рыскание). Координаты пересчитываются так:
$$ \begin{cases} x' = x\cos\theta - y\sin\theta \\ y' = x\sin\theta + y\cos\theta \end{cases} $$
import math
# Вектор "вперёд" аппарата в связанной системе: (1, 0)
# Аппарат повёрнут на 30 градусов по рысканию.
theta = math.radians(30)
x, y = 1.0, 0.0
x2 = x * math.cos(theta) - y * math.sin(theta)
y2 = x * math.sin(theta) + y * math.cos(theta)
print("Направление носа в земной СК:")
print("x =", round(x2, 3), "y =", round(y2, 3))
print("Длина вектора:", round(math.hypot(x2, y2), 3))Вывод:
Направление носа в земной СК: x = 0.866 y = 0.5 Длина вектора: 1.0
Нос, повёрнутый на 30°, смотрит на $(\cos 30°, \sin 30°)=(0{,}866,\,0{,}5)$. Длина сохранилась — поворот не меняет длину вектора, это важное свойство корректной матрицы поворота.
Как работает под капотом
В трёх измерениях поворот задаётся матрицей $3\times 3$. Полный переход из связанной системы в земную — это перемножение трёх таких матриц (по числу углов). Автопилот вычисляет эту матрицу каждый цикл, чтобы, например, понять, куда в земных координатах направлен вектор тяги наклонённого коптера.
Частые ошибки
- Путать, в какой системе заданы показания датчика: гироскоп — в связанной, GPS — в земной.
- Брать синусы и косинусы от градусов вместо радиан (в Python функции ждут радианы).
- Использовать «матрицу поворота», у которой не сохраняется длина вектора, — признак ошибки.
Итог
- Земная система (NED) неподвижна; связанная вращается с корпусом.
- Датчики меряют в связанной СК, маршрут задан в земной — нужен перевод.
- Поворот сохраняет длину вектора; в 3D — матрица из трёх углов.