Часть 2 - основные операции
Часть 3 - запись вращения через кватернионы
Часть 4 - кватернионы и спиноры; порядок перемножения
Часть 5 - практическая реализация поворота
Часть 5 1/2 - введение метрики, "расстояния" между поворотами
Часть 6 - поворот по кратчайшему пути
Часть 6 1/4 - кратчайший поворот в общем случае
Часть 6 2/4 - поворот, совмещающий два направления
Часть 6 3/4 - кватернион из синуса и косинуса угла
Часть 7 - интегрирование угловых скоростей, углы Эйлера-Крылова
Часть 8 - интегрирование угловых скоростей, матрицы поворота
Часть 8 1/2 - ортонормирование матрицы и уравнения Пуассона
Часть 9 - интегрирование угловых скоростей с помощью кватернионов
Часть 10 - интегрирование угловых скоростей, методы 2-го порядка
Часть 11 - интегрирование угловых скоростей, методы высших порядков (в разработке)
Часть 12 - навигационная задача
Часть 13 - Дэвенпорт берёт след!
Часть 14 - линейный метод Мортари-Маркли
Часть 15 - среднее от двух кватернионов
Часть 15 1/2 - проверка и усреднение кватернионов
Часть 16 - разложение кватерниона на повороты
Ещё одну маленькую хитрость только что нашёл, спешу поделиться.
Допустим, что нам известна ось поворота, а также мы знаем синус и косинус угла поворота, возможно, ещё и домноженные на некоторую константу. То есть, у нас есть пара (x,y):
(Например, на валу стоит старый добрый синус-косинусный трансформатор, он же резольвер, с двух обмоток которого снимается сигнал, амплитуда которого пропорциональная синусу и косинусу угла)
Из этой пары (x,y) нам нужно составить кватернион поворота на данный угол φ вокруг известной оси, пусть это будет ось X:
Подход в лоб: находим угол φ с помощью функции arctan2:
Эта функция есть почти во всех математических библиотеках, находит угол между осью OX и вектором (x,y) с учётом квадранта.
Затем посчитать синус и косинус.
Понятно, подход не самый красивый, но с работой справляется.
Нельзя ли сделать лучше?
Можно обойтись без углов, вспомнив школьную тригонометрию.
Первым делом находим непосредственно косинус:
после чего оба компонента кватерниона будут найдены по формулам половинных углов:
(sgn(y) возращает "знак" y - +1 для положительных y и -1 для отрицательных)
НИКОГДА ТАК НЕ ДЕЛАЙТЕ!!!
Мало того, что решение по-прежнему весьма громоздкое (у нас тут три квадратных корня), главная проблема - в точности.
Когда cosφ близок к единице (а это, простите, самый тривиальный случай φ=0, который в моей задаче имеет особенное значение - именно сюда стянется процесс, если всё будет работать правильно!), происходит вычитание близких величин, мы начинаем использовать самые младшие биты числа x, которые могут быть зашумлены, при том, что значение y мы вообще по сути игнорируем! Уж лучше использовать arctan2 и иже с ним - там мы по крайней мере имеем гарантированную точность.
Но есть способ лучше.
Поделим и умножим выражение для искомого кватерниона на 2cos(φ/2):
Как и ранее в части 6, мы сначала находим ненормированный кватернион:
после чего нормируем его и получаем ответ.
Но не забываем об особом случае, когда φ=180° - тогда мы получим нулевой ненормированный кватернион и деление на ноль при попытке отнормировать его.
Для этой ситуации мы можем провести выкладки по-другому, поделить и умножить кватернион на 2sin(φ/2):
То есть, в этой ситуации мы вычисляем ненормированный кватернион
и нормируем его.
Осталось понять, когда применять первую формулу, а когда вторую. Для этого найдём норму этих кватернионов:
Чем она выше - тем лучше, поскольку именно обе компоненты, болтающиеся в непосредственной близости от нуля - вещь, которую нам хочется избежать!
Как видно, критерий выбора очень прост. Если x > 0 (и, следовательно, и cosφ > 0), выбираем верхнюю формулу, в противном случае - нижнюю, вот и всё.
Автору понадобились эти выкладки в алгоритме видеоизмерителя параметров сближения. На дальней дистанции мы довольствуемся аффинным приближением, т.е считаем мишень плоской, а её проекцию на фотоприёмную матрицу - линейной. Первым делом мы находим коэффициенты линейного преобразования, после чего факторизуем матрицу 2х2 на крен, масштаб и ракурс. Для того, чтобы из матрицы крена 2х2 получить кватернион, который послужит отправной точкой для работы алгоритма "ближней зоны", и нужны эти формулы. Автор надеется впихнуть всю математику в отечественную радстойкую ПЛИС, поэтому использование тригонометрических функций - жуткое расточительство!