Преобразование угла оси ArUco в Unity3D Quaternion - PullRequest
0 голосов
/ 09 июля 2020

Мне интересно сравнить кватернионы объекта, представленного в реальном мире (с маркером ArUco поверх него), и его смоделированной версией в Unity3D.

Для этого я сгенерировал разные сцены в Unity с объектом в разных местах. Я сохранил его положение и ориентацию относительно камеры в файле csv. где кватернионы выглядят примерно так (например):

[-0.492555320262909 -0.00628990028053522 0.00224017538130283 0.870255589485168]

В ArUco после использования estimatePoseSingleMarkers я получил компактную версию Angle-Axis и преобразовал ее в Quaternion, используя следующую функцию:

def find_quat(rvecs):
  a = np.array(rvecs[0][0])
  theta = math.sqrt(a[0]**2 + a[1]**2 + a[2]**2) 
  b = a/theta 
  qx = b[0] * math.sin(theta/2)
  qy = -b[1] * math.sin(theta/2) # left-handed vs right handed
  qz = b[2] * math.sin(theta/2)
  qw = math.cos(theta/2)
  print(qx, qy, qz, qw)

, где rvecs - это возвращаемое значение ArUco

Однако после этого я все еще получаю разные результаты, например, ту же сцену:

[0.9464098048208864 -0.02661258975275046 -0.009733748408866453 0.321722715311581] << aruco result </p>

[-0.492555320262909 -0.00628990028053522 0.00224017538130283 0.870255589485168] << Результат Unity </p>

Пример ввода для find_quat:

[[[ 2.4849011 0.04546755 -0.030406 ]]], который является выходным of estimatePoseSingleMarkers function

Quaternion Unity находится следующим образом:

GameObject.Find("Cube").transform.localRotation;

Я что-то упустил?

1 Ответ

0 голосов
/ 13 июля 2020

Для тех, кто приходит сюда и пытается найти ответ.

Моя проблема заключалась в том, что у меня был маркер на вершине куба (повернутый на -90), что делало преобразование ориентации невозможным.

Измените точку поворота в Unity и поверните ее на -90. Затем преобразовать в

(x, y, z, w) = (-x, y, -z, w)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...