Ликбез по кватернионам, часть 5 3/4 - исследуем "пространство поворотов"

Dec 24, 2021 20:21

Оглавление "Ликбеза по кватернионам":
[Spoiler (click to open)]
Часть 1 - история вопроса
Часть 2 - основные операции
Часть 3 - запись вращения через кватернионы
Часть 4 - кватернионы и спиноры; порядок перемножения
Часть 5 - практическая реализация поворота
Часть 5 1/2 - введение метрики, "расстояния" между поворотами
часть 5 5/8 - метрика ненормированных кватернионов
часть 5 11/16 - красивая псевдометрика произвольных кватернионов
Часть 5 3/4 - исследуем "пространство поворотов"
Часть 5 7/8 - почти изотропный ёжик
Часть 6 - поворот по кратчайшему пути
Часть 6 1/4 - кратчайший поворот в общем случае
Часть 6 2/4 - поворот, совмещающий два направления
Часть 6 3/4 - кватернион из синуса и косинуса угла
Часть 6 7/8 - "уполовинивание угла" на плоскости
Часть 7 - интегрирование угловых скоростей, углы Эйлера-Крылова
Часть 8 - интегрирование угловых скоростей, матрицы поворота
Часть 8 1/2 - ортонормирование матрицы и уравнения Пуассона
Часть 9 - интегрирование угловых скоростей с помощью кватернионов
Часть 10 - интегрирование угловых скоростей, методы 2-го порядка
Часть 10 1/2 - интегрирование с поддержанием нормы
Часть 11 - интегрирование угловых скоростей, методы высших порядков (в разработке)
Часть 12 - навигационная задача
Часть 13 - Дэвенпорт берёт след!
Часть 14 - линейный метод Мортари-Маркли
Часть 15 - среднее от двух кватернионов
Часть 15 1/2 - проверка и усреднение кватернионов
Часть 16 - разложение кватерниона на повороты
Часть 17 - лидарная задача
Задачка к части 17
Дэвенпорт VS Мортари-Маркли
Мортари-Маркли берут реванш!
Дэвенпорт VS Мортари-Маркли, раунд 3


Тут 2born напомнил об удивительно нетривиальной задачке изотропного ёжика - как равномерно во все стороны пустить векторы? Как случайным образом выбрать вектор на сфере - я когда-то писал, но тут хочется именно упорядоченно, и чтобы при этом "параллели и меридианы" никоим образом не угадывались - не было бы у шарика очерченного "верха", и "низа".

Худо-бедно она решена - можно всё треугольниками замостить, а можно смоделировать отталкивающиеся заряды на сфере, и они должны будут максимально отодвинуться друг от друга. Но это всё "алгоритмически" - а прямо-таки "параметризации" сколько-нибудь простой, следуя которой, мы получим все необходимые векторы, похоже, в принципе не существует.

Хотел попробовать её же через кватернионы, ведь они же такую замечательную метрику имеют, но "с нахрапу" оно не получается - мы задачу расставить равномерно точки на сфере решили свести к задаче расставить равномерно точки на ГИПЕРСФЕРЕ a2+x2+y2+z2=1 ! Будто бы и так проблем не хватало...

Но раз уж об этом речь пошла - я как раз хотел уяснить для себя, а "как выглядят все возможные повороты"? Если нам захочется ограничиться десятком-другим поворотов, то какие надо будет взять, чтобы любой поворот был похож хоть на какой-то из них, чтобы не было больших прорех?

Пришёл к довольно интересным результатам:
- если поворот вообще никак не задавать, имеем максимально возможную неопределённость в 180°,
- вводя 4 поворота: нулевой и повороты на 180° вокруг осей X, Y, Z, можно "приблизить" любой поворот с точностью до 120° (Малкольм Шустер ошибочно написал, что с точностью до 90°, и 10 лет этого никто не замечал!),
- введя ещё 8 поворотов, можно "приблизить" любой поворот с точностью до 90°,
- введя ещё 12 поворотов, можно "приблизить" любой поворот с точностью до ≈62,8°. Не 60°, а именно 62,8°, арксинус от хитрой иррациональной величины!!!

Причём:
- 9 из 24 поворотов - на 180°,
- 8 из 24 - на 120°,
- 6 из 24 - на 90°,
- 1 из 24 - "нулевой поворот", он же - отсутствие поворота.


Мы вводили метрику, "расстояние" между кватернионами (и соответствующими поворотами):



Смысл у этой метрики следующий: мы находим наиболее "неудачный" единичный вектор, которого повороты на Λ и Μ наиболее явно уводят в разные стороны, и берём длину вектора разности преобразованных векторов. Когда единичный вектор развернулся на 180°, длина вектора разности равна двум. Скажем, был (1;0;0), а стал (-1;0;0), и разность: (2;0;0). Это максимальное расстояние между поворотами, которое может случиться.

Данную метрику можно перевести в угол, например, по теореме косинусов (две стороны имеют единичную длину, это единичный вектор, повёрнутый на Λ и на Μ, третья сторона - наша метрика, угол, противолежащий ей и ищем):



либо, можно через половинный угол:



Здесь лучше видно, что при малых отклонениях можно саму метрику принять за угол в радианах, сильной ошибки не будет. Но только не сейчас, когда мы имеем дело с огромными углами!

Начнём с "базисных" кватернионов:
- ±1 - кватернионы нулевого поворота (как водится, у нас резервирование - два кватерниона 1 и -1 выражают один и тот же поворот),
- ±i - кватернионы поворота на 180° вокруг оси X. Тут даже о хитрой кватернионной математике можно не размышлять - мы и так привыкшие, что поворот на 180° ПО ЧАСОВОЙ и ПРОТИВ ЧАСОВОЙ стрелки - это одно и то же! И если мы хотим при плавных движениях получать столь же плавные углы / кватернионы, мы должны смириться с этой неоднозначностью, иначе на ровном месте получим ступеньки, когда -179,889 ВНЕЗАПНО превращается в +180. Кватернионы в некотором смысле расширили эту неоднозначность вообще на ЛЮБЫЕ углы, потому как убрать её всё равно невозможно...
- ±j - кватернионы поворота на 180° вокруг оси Y,
- ±k - кватернионы поворота на 180° вокруг оси Z.

Нетрудно увидеть, что "расстояние" (метрика) между любыми двумя этими поворотами / кватернионами составляет 180°. Длина кватерниона разности: корень из 2. Подставив его в формулу - получим метрику 2, которая соответствует 180°.

Именно эти 4 "базисных" кватерниона - наиболее далеко "разнесены друг от друга"! Хотя это лишь один из способов ввести 4 таких кватерниона, есть бесчисленное множество других. По сути, умножим их все на один и тот же кватернион (скажем, сменим систему координат) - и снова получим 4 наиболее разнесённых.

Что интересно, если этими поворотами подействовать на конкретный вектор - не так-то и чувствуется их "максимальная разнесённость"! Почему-то я ожидал, что сейчас этот вектор максимально развернёт "во все стороны", ан нет. Если взять вектор (1;0;0), поворот вокруг оси X на него не подействует, а повороты вокруг Y или Z - подействуют одинаково, породив (-1;0;0). Нулевой поворот,очевидно, также сохранит (1;0;0). Итого, был один вектор - стало 2, оба на одной оси. И проблема не в векторе (1;0;0). Возьмёшь (0;1;0) или (0;0;1) - будет то же самое. А какой-нибудь (1;1;1) в кои-то веки каждым поворотом преобразуется по-своему, но не столь "диаметрально". Просто по повороту ОДНОГО вектора нельзя ничего сказать, нужно поворачивать хотя бы пару не соосных векторов (а где пара - там и третий можно построить через векторное произведение).

Вот легендарная статья Малкольма Шустера про алгоритм QUEST (QUaternion ESTimator): [“Three-Axis Attitude Determination from Vector Observations,” M. D. Shuster and S. D. Oh, Journal of Guidance and Control, Vol. 4, No. 1, January-February 1981, pp. 70-77], который является шустрым решением задачи Дэвенпорта (см. Дэвенпорт берёт след). Там всё-таки от кватерниона перешли к вектору Родрига, который всем хорош, но при любом повороте на 180° он обращается в бесконечность. И чтобы этого избежать, предлагалось "исходную задачу" развернуть на 180° по одной из осей, чтобы уйти подальше от роковой точки. При этом (на странице 74, в правой колонке) было сказано: как только мы из 4 возможных поворотов (никакого, или на 180° по одной из осей) выберем наиболее подходящий, у нас останется поворот не более чем на 90°. Было это опубликовано в 1981 году.

А 10 годами позже ему пришло письмо, где товарищ Gregory Natanson указал на ошибку (история описана в [“The Quest for Better Attitudes,” Malcolm D. Shuster, The Journal of the Astronautical Sciences, Vol. 54, Nos. 3 and 4, July-December 2006, pp. 657-683]).

Давайте найдём её самостоятельно. Поищем поворот, который максимально отличается от 4 рассмотренных нами.

Заметим, что с точки зрения метрики нет никакой разницы между 4 компонентами кватерниона, их можно записывать в любом порядке, менять местами - метрика от этого не поменяется! Поэтому, без ограничения общности можно рассмотреть кватернион Λ=a+xi+yj+zk, у которого



Очевидно, что лучше всего будет приблизить его кватернионом Μ=1 или Μ=-1. Также для упрощения возьмём a>0, и кватернион Μ=1 - мы знаем, что если взять -1 и/или взять a<0, метрика от этого не поменяется.

Запишем, чему равен квадрат разности кватернионов:



Поскольку кватернион должен иметь единичную норму, то a2+x2+y2+z2=1, и выражение упростится:



Как видно, чем меньше a - тем больше будет расхождение. Но по условию



минимальным значением может быть лишь a=1/2, при этом также |x|=|y|=|z|=1/2. В противном случае одна из компонент окажется больше, чем a, и мы вместо кватерниона Μ=1 выберем, к примеру, Μ=i.

Квадрат вектора длины кватерниона тогда составляет 1, подстановка в формулу для метрики даёт корень из трёх, что соответствует углу 120°.

Итак, кватернионы



(все возможные комбинации знаков)

отличаются от кватернионов ±1, ±i, ±j и ±k на 120°.

Эти кватернионы как раз-таки выражают поворот на 120° вокруг "самой длинной диагонали куба". Как направлена ось поворота относительно осей координат - нагляднее всего видно на турникетах - "вертушках":




Три перекладины расположены во взаимно-перпендикулярных направлениях, как оси координат. Каждый поворот на 120° переводит их друг в друга.

Различных кватернионов мы привели 16 штук, но половина из них, как водится, "избыточна", а новых поворотов мы добавили ровно 8. Ось X разделила пространство на 2 половинки, ось Y - ещё пополам (получилось 4 "квадранта"), а ось Z - ещё пополам (получилось 8 "октантов"). Вот в каждом из них своя "вертушка" с поворотом на 120° - это и есть наши дополнительные 8 поворотов!

Посмотрим, какие повороты теперь максимально отдалены от 12 поворотов уже рассмотренных? Снова рассмотрим кватернион произвольного поворота Λ=a+xi+yj+zk, у которого (без ограничения общности)



Как посчитать метрику, если мы его "приблизили" кватернионом Μ=1, мы уже выводили. Но теперь, если a≈1/2, гораздо "выгоднее" будет приблизить его одним из кватернионов Ν=1/2(±1±i±j±k), где знаки перед 1, i, j, k будут совпадать со знаками a,x,y,z соответственно. В итоге получим квадрат длины разности:







(мы учли единичную норму кватерниона)

Максимальное значение мы здесь получим, если |a|=1, и, соответственно, |x|=|y|=|z|=0. Квадрат длины составит 1, соответственно, метрика корень из трёх и угол 120°. Но нам попросту не нужно приближать кватернион 1 данным вектором! Когда |a| велико, гораздо "выгоднее" выбрать единичный кватернион! Поэтому нам нужно искать "краевое" значение, где оба приближения перестают работать.

Мы "стартуем" с |a|=1, но должны уменьшить значение |a|, и логичнее всего "переместить" его частично в x, оставив y,z нулевыми, поскольку при заданном значении x2+y2+z2, минимальное значение |x|+|y|+|z| получится, если y=z=0.

"Напрашивается" взять:



Тогда, если мы "приближаем" наш кватернион кватернионом Μ=1, получаем квадрат длины разности


Если же мы "приближаем" его кватернионом Ν=1/2(±1±i±j±k), то квадрат длины разности равен:


Как видно, длины сошлись, а значит, это действительно наиболее "отдалённый" ото всех остальных поворот.

Получаем метрику, равную корню из двух, что соответствует углу 90°.

Теперь, если мы хотим ещё точнее "приближать" произвольный поворот, напрашивается добавить кватернионы:







(повороты на ±90° вокруг осей X,Y,Z, соответственно)

но ещё нужны:







Это повороты на 180° вокруг ещё 6 осей.

Видим, насколько повороты на 180° "популярны" - из 24 пока что введённых нами поворотов, 9 приходится на повороты 180°, ещё 8 - на повороты 120°, 6 - на повороты 90°, и ещё нулевой поворот! И в целом, складывается "перекос" в сторону больших поворотов! И это не наша "прихоть" - примерно так это всё и устроено. Мы сейчас тыкаем точки на гиперсфере a2 + x2 + y2 + z2 = 1 сколько-нибудь равномерно, причём кватернионы нулевого поворота - это её полюса, а кватернионы поворота на 180° - это её ЭКВАТОР. Именно поэтому здесь их приходится ставить очень много!

Давайте оценим, какова максимальная ошибка "приближения" произвольного поворота одним из этих 24. Я поначалу надеялся, что здесь приду к кватернионам вида



(именно в них будут заключаться новые "максимально отдалённые" точки)

поскольку у нас уже были кватернионы с 1 ненулевым компонентом, затем с 4 ненулевыми (но одинаковыми по модулю), затем с 2 ненулевыми (одинаковыми по модулю), и было бы красиво, если и эти здесь сыграют свою роль.

Но это повороты на 109° (плюс ещё 4 поворота на 180° вокруг других осей). Значит, вокруг "нулевого поворота" они явно ничего не сделают, если там была максимальная "дыра" менее 90° - она там и останется!

Так что придётся честно поискать, где же у нас самые большие прорехи. У нас есть выкладки, чему равен квадрат длины разности кватернионов для первой группы Μ=1 (и иже с ними, i, j, k) и второй группы Ν=1/2(±1±i±j±k). Эти выкладки остаются в силе. Но нам нужно посчитать квадрат длины разности и для



(это заглавная греческая Кси)

Напомним, когда мы считаем максимальное расхождение, мы условились, что без ограничения общности:



и для данного случая нужен именно тот вариант Ξ, приведённый выше.

Найдём квадрат длины разности кватернионов:







Приравняем квадраты длин разностей |Λ-Μ|2 и |Λ-Ξ|2:



откуда



Пока логично: |a|>>|x| "отрабатывается" семейством Μ, |a|≈|x| - семейством Ξ, а здесь нужен некий промежуточный случай...

Минимальное значение |x| соответствует |x|=|y|=|z|, поскольку если |x| станет меньше, мы нарушим неравенство, на которое условились. Исходя из условий нормировки, получим:





При данных значениях, квадрата длины разности кватернионов как для Μ, так и для Ξ составит 0,375. Но если теперь посчитать для Ν, получим всего лишь 0,178. То есть, попытавшись максимально отдалиться от двух ближайших поворотов, мы придвинули точку очень близко к третьему!

Отсюда можно сделать вывод, что искать точку нужно РАВНОУДАЛЁННОЙ от всех трёх семейств Μ, Ν, Ξ! Поэтому сохраним соотношение



и теперь ещё приравняем квадрат длины разности для Ν и Ξ:



откуда



Подставляя сюда |a| выраженное через |x| и повозившись с квадратными корнями, получаем:



Исходя из того, что |x|≥|y|≥|z| (в противном случае мы бы поменяли их местами), мы не можем сделать |z|=0, в таком случае выйдет |x|<|y|. Максимум, что может быть:





Теперь, из условия единичной нормы, мы наконец-то находим значения:







После этого убеждаемся, что квадрат длины разности кватернионов для любого "семейства" окажется одним и тем же, равным



Метрику мне удалось упростить до выражения:



Что даёт нам немножко странный угол 62,8° (62,79943°, если чуть точнее).

И тут мы не можем сказать, что "не додумались" до 60°, поскольку если бы "не додумались" - получили бы угол МЕНЬШЕ, ЧЕМ НАДО (не сумели найти самую отдалённую точку). А тут можно уверенно заявить, что повороты, отличающиеся от ранее перечисленных 24 штук на 62,8°, существуют, и мы можем назвать их все "поимённо". В этот раз, мы имеем дело с "семейством"


,

причём нужно ещё применить всевозможные перестановки коэффициентов!

Только перебрав всевозможные знаки, мы получаем 16 комбинаций (но половина выражает тот же самый поворот). Число перестановок 4 элементов: 24, но поскольку два коэффициента всё-таки совпадает, половина перестановок оказывается лишней, поэтому 12.

Итого, имеем 192 кватерниона, выражающие 96 различных поворотов. Углы поворота составляют 62,8° (24 штуки), 138,6° (48 штук) и 163,15° (24 штуки).

Какая получится максимальная "ошибка приближения", если к прошлым 24 поворотам добавить эти 96 (в сумме: 120), я пока не считал.

Какая в этом практическая польза - пока не знаю. Первые 4 поворота нашли своё применение в алгоритме QUEST и иже с ними, чтобы гарантировать, что найденный угол поворота даже близко не будет лежать к 180°. Более мелкое деление, наверное, в алгоритмическом плане смысла не имеет, просто для "интуиции".

PS. Не могу гарантировать, что эти 24 поворота "оптимальны" - может быть, что другие 24 поворота дадут максимальную "ошибку приближения" меньше, чем здесь. Но я почти уверен, что СУЩЕСТВЕННОГО УЛУЧШЕНИЯ добиться нельзя, и следовательно, все наши наблюдения о том, "каких поворотов больше всего", безусловно верны.

кватернионы-это просто (том 1), странные девайсы, математика, работа

Previous post Next post
Up