2

Я отслеживаю 3 точки (3D, x y z) на жестком теле, которые я использую для определения локальной системы координат. Я использую эту ориентацию локальной координатной системы (в глобальной системе отсчета), чтобы установить ориентацию вида в программе VR. Чтобы сделать это, и избегайте карданного замка с углами Эйлера, я пытаюсь использовать кватернион, чтобы установить ориентацию вида.Матрица вращения для эквивалентности кватернионов

Я создаю матрицу вращения из трех точек, затем я использую этот метод, описанный на Wikipedia, для извлечения предполагаемого эквивалентного кватерниона. Затем я просто устанавливаю ориентацию вида как вычисленный кватернион.

Однако я наблюдаю, что в основном есть только 1 степень свободы (шаг), когда я также могу одновременно видеть изменения в рыскании и рулоне. Я извлек углы Эйлера из матрицы вращения, и он хорошо работает, за исключением карданного замка. Поэтому я уверен, что матрица вращения пригодна для использования, хотя в моем случае она неправильна.

Мой вопрос: почему предположительный эквивалентный кватернион, по-видимому, только меняет степень свободы?

Я знаю, что кватернион - это поворот вокруг одной оси, однако я думал, что если бы он был получен из матрицы вращения, конечный результат был бы таким же, как с установкой углов Эйлера?

Вот мой код в Python:

import viz 
import numpy as np 

vec1 = np.array([-0.96803,-0.25022,0.01751],dtype=float) 
vec3 = np.array([-0.024815,0.96553,0.07863],dtype=float) 
vec4 = np.array([-0.03655,0.07178,-0.99675],dtype=float) 
#normalize to unit length 
vec1 = vec1/np.linalg.norm(vec1) 
vec3 = vec3/np.linalg.norm(vec3) 
vec4 = vec4/np.linalg.norm(vec4) 

M1 = np.zeros((3,3),dtype=float) #rotation matrix 

#rotation matrix setup 
M1[:,0] = vec1 
M1[:,1] = vec3 
M1[:,2] = vec4 

#get the real part of the quaternion first 
r = np.math.sqrt(float(1)+M1[0,0]+M1[1,1]+M1[2,2])*0.5 
i = (M1[2,1]-M1[1,2])/(4*r) 
j = (M1[0,2]-M1[2,0])/(4*r) 
k = (M1[1,0]-M1[0,1])/(4*r) 

viz.MainView.setQuat(i,j,k,r) 

Любая помощь или идеи, было бы здорово!

+0

Математика выглядит хорошо для меня. Я немного запутался. Вы сравниваете вращение матрицы с поворотом кватерниона? Если результаты будут одинаковыми, казалось бы, ограниченные степени свободы будут проблемой с вашим выбором матрицы. –

+0

@ bob.sacamento Я просто пытаюсь выразить матрицу вращения как кватернион. Я не уверен на 100%, что это правильный способ его фразы. В коде, который я не опубликовал, я смог определить углы Эйлера из матрицы, поэтому, я думаю, я построил его правильно. Существуют ли другие способы построения матрицы, которая повлияет на вещи? – willpower2727

+0

Это не матрица вращения. Незначительная проблема: строки не ортогональны друг другу (но они близки). Большая проблема: определитель равен -1 (или близко к нему). Как вы сформировали эту матрицу? –

ответ

2

Основная проблема заключается в том, что вы применили алгоритм, который относится только к соответствующим матрицам вращения 3x3 к матрице, которая не ортогональна и очень близка к неправильной матрице вращения. Именно последний является ключевым источником ваших проблем.

Вашей матрица М1

array([[-0.9994477 , -0.02887993, 0.0164005 ], 
     [-0.02958325, 0.99862763, -0.04323132], 
     [ 0.01513678, 0.0436899 , 0.99893047]]) 

Вы получите нонсенс, когда вы неправильно применить этот алгоритм для извлечения кватерниона из правильной матрицы поворота к этой неправильной матрице. В частности, поскольку M[2,1] приблизительно равен -M[1,2], M[0,2] приблизительно равен M[2,0], а M[1,0] приблизительно равен M[0,1], вы получите то, что кажется почти чистым.

Замечание: То же самое относится к алгоритмам для извлечения углов Эйлера из матрицы. Все эти алгоритмы предполагают, что матрица является правильной матрицей вращения. Когда вы неправильно применяете их к неправильной матрице вращения, вы получите глупость.

+0

Отлично! Да, я только что обнаружил, что создаю левую систему координат, получая неправильную матрицу вращения. Я изменился на правый метод, и теперь я вижу, как все 3 изменения dof. Благодаря! Бог благословит ученых-ракетологов! – willpower2727

+0

@ willpower2727 - Как в сторону, вплоть до семи месяцев назад, я был одним из тех благословенных ученых-ракетологов. Несколько лет назад был разработан надежный и общий алгоритм для извлечения углов Эйлера из (правильной) матрицы вращения. Оказалось, что я не первый; Ken Shoemake разработал (и опубликовал) аналогичный алгоритм несколько лет назад. Мой код на C++ был преобразован в Java; вы можете увидеть этот код Java по адресу http://uahuntsville-siso-smackdown.googlecode.com/svn-history/r3/trunk/ez/siso/smackdown/utilities/EulerAngles.java еще на несколько месяцев (пока Google не отключится код google). –

Смежные вопросы