Кватернионы: кратко и зачем
Углы Эйлера наглядны, но ломаются в особых положениях — кватернионы решают эту проблему.
Кватернион — набор из четырёх чисел $(w,x,y,z)$, компактно и без вырождений описывающий поворот в трёхмерном пространстве.
Проблема углов Эйлера
Углы Эйлера удобны для человека, но у них есть болезнь — складывание рамки (gimbal lock): в некоторых положениях (например, тангаж 90°) две оси вращения совпадают, и одна степень свободы теряется. Для акробатического полёта это опасно. Поэтому внутри автопилоты хранят ориентацию кватернионом, а углы Эйлера вычисляют только для показа пилоту.
Единичный кватернион
Поворот описывает единичный кватернион — у которого сумма квадратов компонент равна единице:
$$ w^2 + x^2 + y^2 + z^2 = 1 $$
Поворот на угол $\alpha$ вокруг оси задаётся через половинный угол: $w=\cos\tfrac{\alpha}{2}$, а $(x,y,z)$ — это ось, умноженная на $\sin\tfrac{\alpha}{2}$.
import math
# Поворот на 90 градусов вокруг вертикальной оси (рыскание)
alpha = math.radians(90)
w = math.cos(alpha / 2)
z = math.sin(alpha / 2)
x = y = 0.0
norm = math.sqrt(w*w + x*x + y*y + z*z)
print("Кватернион:", (round(w, 3), round(x, 3),
round(y, 3), round(z, 3)))
print("Норма (должна быть 1):", round(norm, 4))
# Извлекаем угол рыскания обратно
yaw = math.atan2(2 * (w*z + x*y), 1 - 2 * (y*y + z*z))
print("Восстановленный yaw (град):", round(math.degrees(yaw), 2))Вывод:
Кватернион: (0.707, 0.0, 0.0, 0.707) Норма (должна быть 1): 1.0 Восстановленный yaw (град): 90.0
Мы закодировали поворот на 90° четырьмя числами, проверили, что норма равна единице, и аккуратно извлекли исходный угол обратно. Никакого вырождения.
Как работает под капотом
Кватернионы дёшевы для композиции поворотов (перемножение четырёх чисел против матрицы $3\times 3$) и не накапливают ошибку нормировки так, как матрицы. Их легко «подравнивать» — делить на норму. Поэтому в реальных автопилотах (PX4, ArduPilot) оценка ориентации хранится кватернионом, а интегрирование гироскопа идёт именно в кватернионах.
Частые ошибки
- Брать полный угол вместо половинного: в кватернионе фигурирует $\alpha/2$.
- Забывать нормировать кватернион после операций — он перестаёт описывать поворот.
- Думать, что кватернионы «магия»: это просто компактная и устойчивая запись того же поворота.
Итог
- Углы Эйлера страдают от gimbal lock; кватернионы — нет.
- Единичный кватернион: $w^2+x^2+y^2+z^2=1$, угол берётся как $\alpha/2$.
- Реальные автопилоты хранят ориентацию кватернионом, углы Эйлера — лишь для показа.