2016-08-28 1 views
2

Мне нужно компенсировать потоковые данные кватерниона на определенную сумму. Для этого я планирую получить разницу между 2, а затем смещать первую на вторую.Найти разницу во времени между двумя кватернионами для калибровки двух систем координат

У меня возникли проблемы с поиском разницы между 2.

Using this converter.

Я бегу этот код:

public void convertQuat180() 
{ 
    Quaternion q = new Quaternion(0.65328f, 0.2706f, 0.65328f, -0.2706f); //45,180,0 

    Quaternion q180 = new Quaternion(0.70711f, 0, 0.70711f, 0); // 0,90,0 

    Quaternion result = q180 * Quaternion.Inverse(q); 

    Console.WriteLine(result); 
} 

Я бы ожидать result быть:

(euler) diff = 45, 90 , 0 

Но вместо этого я получаю:

135,-180,0 

Где я собираюсь здесь не так?

+1

Я не уверен, имеет ли смысл представить это с использованием углов Эйлера. Вращение разности, скорее всего, не будет иметь углов, которые являются отличием двух поворотов источника. Во всяком случае, с приведенной выше формулой вы получаете поворот, такой как 'result * q = q180'. Разве это не то, что вы хотели? –

+0

ОК, может быть, я должен придерживаться quats, чтобы проверить. Я новичок в них, и мне гораздо легче воображать Эйлера! Является ли приведенный выше код действительным, чтобы найти разницу? И тогда как я применил бы эту разницу к оригинальному quat? – anti

+1

Проблема углов Эйлера заключается в том, что оси не могут быть видны независимо друг от друга. По-видимому, лучшей альтернативой этому сценарию является прилипание к кватернионам или матрицам вращения. Вы обновляете поворот, представленный кватернионом, простым умножением (см. Мой первый комментарий). Но, конечно, это вернет вас к отправной точке. –

ответ

3

Вы хотите преобразовать системы координат. У вас есть поворот, измеренный датчиком RS и поворот камеры RC. Оба связаны константой (назовем его) смещение RO:

RS = RC * RO 

или в качестве альтернативы

RC = RS * RO^-1 

Во время процедуры калибровки, вы приобретаете RS и RC. Затем, вы можете вычислить смещение как:

RO = RC^-1 * RS 
RO^-1 = RS^-1 * RC 

Просто рассчитать тот, который вы будете использовать чаще (вероятно RO^-1, потому что вы хотите, чтобы получить вращение камеры от датчика вращения).

+0

Спасибо! '^' - это «сила», верно? Как бы это выглядело в коде? (еще раз, пожалуйста, простите мое математическое невежество) – anti

+0

Обозначение '^ -1' является обратным. –

+0

ах я вижу. Итак, ваше уравнение выше было бы: 'RO = Quaternion.Inverse (RC) * RS;' , а затем я могу просто использовать 'Quaternion.Inverse (RO);' чтобы получить значение, которое я хочу? – anti

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