Мне интересно сравнить кватернионы объекта, представленного в реальном мире (с маркером 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;
Я что-то упустил?