fbence
fbence

Reputation: 2153

scipy.spatial rotation gives different numbers than rotation with pyquaternion or self implementation

I compared results of rotating a vector with scipy.spatial.transform.Rotation, pyquaternion.Quaternion and my own implementation.

My own and pyquaternion and pretty similar, but Rotation is quite different.

import numpy as np
from pyquaternion import Quaternion
from scipy.spatial.transform import Rotation


def ham(q1, q2):
    a1, b1, c1, d1 = q1
    a2, b2, c2, d2 = q2

    return np.array(
        [
            a1 * a2 - b1 * b2 - c1 * c2 - d1 * d2,
            a1 * b2 + b1 * a2 + c1 * d2 - d1 * c2,
            a1 * c2 - b1 * d2 + c1 * a2 + d1 * b2,
            a1 * d2 + b1 * c2 - c1 * b2 + d1 * a2,
        ]
    )


vector = np.array([-9.86411084, 0.10916063, -0.68953008])
purequat = np.array([0, -9.86411084, 0.10916063, -0.68953008])
# order: w, i, j, k
quat = np.array([-0.54312134, 0.42388916, -0.45617676, 0.5632019])
conj = np.array([1, -1, -1, -1])
quatconj = quat * conj  # hand conjugate
Q = Quaternion(quat)
R = Rotation.from_quat(quat)

print("manual:", ham(quat, ham(purequat, quatconj))[1:])
print("Quaternion:", Q.rotate(vector))
print("Rotation:", R.apply(vector))
print("Rotation inv:", R.inv().apply(vector))
manual: [-0.14691211  9.88691296 -0.08305227]
Quaternion: [-0.14691852  9.88734378 -0.08305589]
Rotation: [-2.87868815  9.45502779 -0.32195404]
Rotation inv: [-2.33238602  0.16116154 -9.60843655]

I think the result of scipy is wrong, but maybe I'm misunderstanding something. Am I misunderstanding something or should I open an issue on the scipy bugtracker?

Upvotes: 0

Views: 1836

Answers (1)

fbence
fbence

Reputation: 2153

The answer was of course, very obvious. Given a quaternion w + xi + yj + zk then pyquaternion treats an array of four numbers as [w,x,y,z] while scipy as [x,y,z,w].

Upvotes: 4

Related Questions