Мехмат МГУ отзывает 500 000 своих выпускников. Причина отзыва: во втором томе Фихтенгольца на странице 187 в формуле XVIII.56 отсутствует нормирующий оператор
В части 15 мы показали, как не наступить на одни грабли, усредняя кватернионы (случай кватернионов, выражающих почти один и тот же поворот, но имеющих разный знак), но тут же с разбегу наступили на вторые, которые до сих пор мы умудрялись обходить стороной, а именно: потерю точности.
Методика "проверки на вшивость" и усреднения, приведённая в конце части 15, хорошо работает, если мы задаём достаточно большой допустимый угол рассогласования, хотя бы 10° и выше. В таком случае, cos(10°/2)=0,996, при проверке мы будем по сути смотреть на 3-й значащий разряд, который будет представлен с хорошей точностью.
Но если у нас речь идёт о точности в 1° или 0,1° или ещё лучше (что для звёздных датчиков и систем стыковки совсем не редкость!), то такой метод будет раз за разом ошибаться, иногда отбраковывая вполне себе корректные кватернионы (действительно отличающиеся менее чем на 0,1°), а иногда пропуская откровенный мусор. Причина, как всегда, очень проста: подсчитывая скалярное произведение кватернионов близких поворотов, мы будем получать значения, очень близкие к 1 или -1, и сравнивать их с cos(α/2)≈1-α2/8, поэтому и плохая нормировка (в том числе из-за непредставимости правильно нормированного кватерниона в имеющейся разрядной сетке), и ошибки вычислений способны полностью забить собой "полезный сигнал", выражающий угол.
Поэтому, если мы не хотим повсюду переходить на удвоенную (а лучше - расширенную) точность и образцово-показательную нормировку (никаких приближённых выражений, только квадратный корень, только хардкор), придётся пойти обходным путём...
Нужно оценить, действительно ли угол между поворотами не превышает α, и если это так, найти средний кватернион.
Можно поступить, к примеру, так.
Как и прежде, находим скалярное произведение
(p от слова product - произведение),
но в этот раз смотрим только на его знак. Если p>0, то
в противном случае
(это большая греческая Кси) Иными словами, мы меняем знак у одного из кватернионов (это с тем же успехом мог быть и Λ), если их скалярное произведение меньше нуля.
А далее, чтобы проверить, что кватернионы выражают близкие повороты, найдём всё-таки квадрат модуля разности:
Из нашего определения метрики ( часть 5 1/2) получаем
откуда, учитывая малые значения α, можно записать
К примеру, если α=10°, то
Точное решение неравенства (15 1/2.1) даст диапазон:
(второй диапазон мы отбрасываем, зная, что квадрат модуля разности кватернионов не может быть выше 2, т.к мы расположили оба кватерниона на одной "полусфере")
тогда как приближенная оценка (15 1/2.2) даст нам диапазон
Ошибка составляет не более 0,2% - очень неплохо, учитывая, что мы здесь имеем дело всего-то с "проверкой на вшивость". Величина α сама по себе зачастую берётся "по порядку величины", и чересчур усердствовать здесь не надо.
Зато теперь мы можем спокойно проводить использовать и представление компонентов кватерниона с фиксированной точкой 1.15 (точность 12 угловых секунд, но при ошибке менее 0,31° старый метод давал бы скалярное произведение, превышающее единицу!) или с плавающей точкой одинарной точности, без страха, что вполне приличные данные будут забракованы или наоборот, пропущен мусор.
Опишем получившуюся методику. Есть кватернионы Λ и Μ, а также допустимый угол α - максимально допустимый угол между поворотами, выражаемыми этими кватернионами.
Нужно оценить, действительно ли угол между поворотами не превышает α, и если это так, найти средний кватернион.
1. Находим скалярное произведение
2. Если p>0, то
в противном случае
3. Находим квадрат модуля разности кватернионов:
4. Если
значит расстояние между поворотами не превышает α, можно находить средний. В противном случае "бьём тревогу".
5. Находим ненормированный средний кватернион:
6. Нормируем его. Подойдёт приближенная формула, использующая только сложения и умножения: