ошибка между двумя поворотами? - PullRequest
0 голосов
/ 29 июня 2011

извините - я должен это знать, но я не знаю.Я вычислил положение системы отсчета (S1) относительно базовой системы отсчета (S0) посредством двух разных процессов, которые дают мне две разные матрицы аффинного преобразования 4x4.Я хотел бы вычислить ошибку между ними, но не уверен, как бороться с компонентом вращения.Буду рад любому совету.

спасибо!

Ответы [ 2 ]

3 голосов
/ 10 марта 2017

Если R0 и R1 - две матрицы вращения, которые должны быть одинаковыми, то R0 * R1 'должно быть тождественным.Величина вектора вращения, соответствующая R0 * R1 ', является вращением (в радианах, как правило) из единицы.Преобразование матриц вращения в векторы вращения эффективно выполняется по формуле Родригеса.

Чтобы ответить на ваш вопрос с помощью общего варианта использования, Python и OpenCV, ошибка составляет

r, _ = cv2.Rodrigues(R0.dot(R1.T))
rotation_error_from_identity = np.linalg.norm(r)
1 голос
/ 29 июня 2011

Вы ищете одноосное вращение от кадра S1 до кадра S0 (или наоборот). Ось вращения здесь не так важна. Вы хотите угол поворота.

Пусть R0 и R1 - верхние левые матрицы вращения 3x3 из ваших матриц 4x4 S0 и S1. Теперь вычислите E = R0 * transpose (R1) (или transpose (R0) * R1; на самом деле не имеет значения, какой.)

Теперь посчитайте

d(0) = E(1,2) - E(2,1)
d(1) = E(2,0) - E(0,2)
d(2) = E(0,1) - E(1,0)

dmag = sqrt(d(0)*d(0) + d(1)*d(1) + d(2)*d(2))

phi = asin (dmag/2)

Я пропустил некоторые волосатые детали (и эти детали могут вас укусить). В частности, вышеупомянутое недопустимо для очень больших углов ошибок (ошибка> 90 градусов) и неточно для больших углов ошибок (угол> 45 градусов).

Если у вас есть функция общего назначения, которая извлекает вращение одной оси из матрицы, используйте ее. Или, если у вас есть функция общего назначения, которая извлекает кватернион из матрицы, используйте ее. (Вращение одной оси и кватернионы очень тесно связаны друг с другом).

...