nabbla (nabbla1) wrote,
nabbla
nabbla1

Category:

Ликбез по кватернионам, часть 6 3/4: кватернион из синуса и косинуса угла

Часть 1 - история вопроса
Часть 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 получить кватернион, который послужит отправной точкой для работы алгоритма "ближней зоны", и нужны эти формулы. Автор надеется впихнуть всю математику в отечественную радстойкую ПЛИС, поэтому использование тригонометрических функций - жуткое расточительство!
Tags: кватернионы-это просто (том 1), математика, работа
Subscribe

  • Нахождение двух самых отдалённых точек

    Пока компьютер долго и упорно мучал симуляцию, я пытался написать на ассемблере алгоритм захвата на ближней дистанции. А сейчас на этом коде можно…

  • Слишком общительный счётчик

    Вчера я чуть поторопился отсинтезировать проект,параметры не поменял: RomWidth = 8 вместо 7, RamWidth = 9 вместо 8, и ещё EnableByteAccess=1, чтобы…

  • Балансируем конвейер QuatCore

    В пятницу у нас всё замечательно сработало на симуляции, первые 16 миллисекунд полёт нормальный. А вот прошить весь проект на ПЛИС и попробовать "в…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments