Кватернионы и численная устойчивость
Я изучаю кватернионы единиц и как их использовать для представления и составления вращений. Википедия говорит, что они численно более устойчивы, чем матричные представления, но не дают ссылки. Может ли кто-нибудь объяснить мне (желательно с некоторыми математическими соображениями), почему численно устойчивее использовать единичные кватернионы для работы с вращениями (например, для приложения OpenGL), а не с матрицами вращения? Это только потому, что избегают блокировки карданного подвеса?
5 ответов
Эта статья в Википедии предвзята. От
по состоянию на 18 апреля 2014 года:
При составлении нескольких вращений на компьютере ошибки округления обязательно накапливаются. Слегка отключенный кватернион по-прежнему представляет вращение после нормализации: слегка смещенная матрица может больше не быть ортогональной и ее сложнее преобразовать обратно в правильную ортогональную матрицу.
Это предвзято. Нет ничего сложного в повторной ортогонализации матрицы вращения, см., Например:
и кватернионы также должны быть повторно нормализованы: "кватернион, который слегка отклонен, все еще представляет вращение после нормализации". Кватернионы здесь не имеют существенного преимущества.
Я постараюсь исправить это в Википедии. Это предвзятое мнение появляется в Википедии и в других местах...:(
Это отвечает на ваш вопрос.
ОБНОВЛЕНИЕ: я забыл упомянуть: замок карданного подвеса здесь не играет роли; от этого не страдают ни кватернионы, ни матрицы вращения.
Некоторые примечания стороны. Несмотря на то, что кватернионы более компактны, чем матрицы вращения, совсем не ясно, что использование кватернионов приведет к меньшему количественному вычислению в вашем приложении в целом, см.:
Для справки: матрицы вращения с большим успехом использовались на микроконтроллерах с ограниченными ресурсами для отслеживания ориентации, см. Направление косинусная матрица IMU: теория Уильяма Премерлани и Пола Биздера. У меня также есть непосредственный опыт отслеживания ориентации на микроконтроллере (MSP430), и я могу только сказать, что матрицы вращения быстрые и стабильные для отслеживания ориентации.
Моя точка зрения такова: нет существенной разницы между матрицами вращения и кватернионами, когда они используются для отслеживания ориентации.
Если у вас уже есть библиотека, которая использует кватернионы для представления вращений, то придерживайтесь кватернионов; если ваша библиотека уже использует матрицы вращения, то используйте матрицы вращения. Даже если одно представление спасло бы вас от операции с плавающей точкой здесь и там, нет смысла менять ваше приложение / библиотеку для использования другого представления; даже на микроконтроллерах с ограниченными ресурсами экономия будет незначительной.
Единственное истинное преимущество кватернионов, которое я вижу, состоит в том, что кватернионы можно использовать для интерполяции. Ни матрицы вращения, ни углы Эйлера не могут этого сделать.
Не уверен, будет ли это достаточно математическим для вашего вкуса, но я все равно попробую: проблема с матрицей вращения заключается в том, что она содержит избыточную информацию. У вас есть 9 значений, которые кодируют преобразование только с 3 степенями свободы.
Из-за этой избыточности существуют ограничения на 9 значений в матрице, чтобы сформировать действительную матрицу вращения. Матрица должна быть ортогональной, это означает, что векторы строк должны быть ортонормированными (каждый вектор имеет длину 1, а скалярное произведение каждой пары равно 0).
Когда вы обновляете матрицу вращения, обычно объединяя ее с инкрементными матрицами вращения, появляются числовые ошибки. Эти ошибки накапливаются с каждым обновлением. Если вы не сделаете что-то с этим, векторы строк будут уходить все дальше и дальше от ортонормированности. Как только матрица достаточно далеко от ортогональности, она может начать заметно деформировать геометрию, к которой она применяется (перекос, масштабирование и т. Д.).
Вы можете избежать этих проблем при использовании матриц вращения, периодически ортонормируя векторы строк. Для этого требуются некоторые простые векторные операции, так что это не страшно.
"Замок карданного подвеса" - это красная сельдь - ни матрицы, ни единичные кватернионы по своей сути не являются объектом блокировки карданного подвеса.
На самом деле матрицы имеют небольшое преимущество по сравнению с кватернионами в поддержании числовой стабильности по сравнению с последовательностью вращений, поскольку для создания каждого элемента в матричном произведении требуется меньше операций FP. Кватернионы имеют небольшое преимущество в простоте коррекции числового дрейфа (чтобы действительно хорошо справиться с матрицей, вам нужно сделать SVD).
Честно говоря, однако, вряд ли это будет иметь большое значение для вашего приложения, и теория, стоящая за числовой стабильностью, становится довольно пугающей. Если вы действительно заинтересованы в этой области, я могу порекомендовать Higham точность и стабильность численных алгоритмов.
У меня есть приложение, в котором у меня есть "машина" после сплайна. Я вычисляю производную сплайна, чтобы определить прямой вектор, затем я вычисляю левый и верхний векторы, чтобы создать матрицу ориентации. Затем я разлагаю его на кватернион.
Когда я превращаю эти кватернионы в ключевые кадры в анимации, есть некоторые повороты, когда Q_z переключается с -1 на 1. Я еще не исследовал, как получить библиотеку Python Блендера, чтобы дать мне декомпозицию, которая стабильна при небольших изменениях.
Использование единичных кватернионов может быть численно нестабильным больше, чем матрицы.
1. Если вы конвертируете кватернион в единицу и предполагаете, что это единица (а не весовые коэффициенты в квадрате), вы можете получить драматическую ошибку. И если вы преобразуете из сломанной матрицы обратно в кватернион и наоборот, вы можете очень быстро достичь нестабильного вращения.
- Последовательное умножение кватернионов, дрейф их до неединичной длины. И как предыдущий может произвести сломанную матрицу.
Чтобы избежать этих ошибок, вы должны нормализовать кватернионы после каждой операции, приводящей к ошибкам округления. Или примите ваши кватернионы как неединичные, и конвертируйте в матрицу с весами (около 8 дополнительных шагов).
ПРИМЕЧАНИЕ: многие операции выполняются быстрее, чем с единицей, например, преобразование из матрицы.