SparseAGS / liegroups /tests /numpy /test_so3_numpy.py
qitaoz's picture
init commit
26ce2a9 verified
import copy
import numpy as np
from liegroups.numpy import SO3
def test_identity():
T = SO3.identity()
assert isinstance(T, SO3)
def test_from_rpy_to_rpy():
r, p, y = np.pi / 4., np.pi / 3., np.pi
test_r, test_p, test_y = SO3.from_rpy(r, p, y).to_rpy()
assert np.isclose(test_r, r)
assert np.isclose(test_p, p)
assert np.isclose(test_y, y)
def test_dot():
C = np.array([[0, 0, -1],
[0, 1, 0],
[1, 0, 0]])
C2 = C.dot(C)
assert np.allclose((SO3(C).dot(SO3(C))).mat, C2)
def test_rotx():
C_got = SO3.rotx(np.pi / 2)
C_expected = np.array([[1, 0, 0],
[0, 0, -1],
[0, 1, 0]])
assert np.allclose(C_got.mat, C_expected)
def test_roty():
C_got = SO3.roty(np.pi / 2)
C_expected = np.array([[0, 0, 1],
[0, 1, 0],
[-1, 0, 0]])
assert np.allclose(C_got.mat, C_expected)
def test_rotz():
C_got = SO3.rotz(np.pi / 2)
C_expected = np.array([[0, -1, 0],
[1, 0, 0],
[0, 0, 1]])
assert np.allclose(C_got.mat, C_expected)
def test_rpy():
r = np.pi / 12
p = np.pi / 6
y = np.pi / 3
C_got = SO3.from_rpy(r, p, y)
C_expected = SO3.rotz(y).dot(SO3.roty(p).dot(SO3.rotx(r)))
assert np.allclose(C_got.mat, C_expected.mat)
def test_quaternion():
q1 = np.array([1, 0, 0, 0])
q2 = np.array([0, 1, 0, 0])
q3 = np.array([0, 0, 1, 0])
q4 = np.array([0, 0, 0, 1])
q5 = 0.5 * np.ones(4)
q6 = -q5
assert np.allclose(SO3.from_quaternion(q1).to_quaternion(), q1)
assert np.allclose(SO3.from_quaternion(q2).to_quaternion(), q2)
assert np.allclose(SO3.from_quaternion(q3).to_quaternion(), q3)
assert np.allclose(SO3.from_quaternion(q4).to_quaternion(), q4)
assert np.allclose(SO3.from_quaternion(q5).to_quaternion(), q5)
assert np.allclose(SO3.from_quaternion(q5).mat,
SO3.from_quaternion(q6).mat)
def test_wedge():
phi = [1, 2, 3]
Phi = SO3.wedge(phi)
phis = np.array([[1, 2, 3], [4, 5, 6]])
Phis = SO3.wedge(phis)
assert np.array_equal(Phi, -Phi.T)
assert np.array_equal(Phis[0, :, :], SO3.wedge(phis[0]))
assert np.array_equal(Phis[1, :, :], SO3.wedge(phis[1]))
def test_wedge_vee():
phi = [1, 2, 3]
Phi = SO3.wedge(phi)
phis = np.array([[1, 2, 3], [4, 5, 6]])
Phis = SO3.wedge(phis)
assert np.array_equal(phi, SO3.vee(Phi))
assert np.array_equal(phis, SO3.vee(Phis))
def test_left_jacobians():
phi_small = [0., 0., 0.]
phi_big = [np.pi / 2, np.pi / 3, np.pi / 4]
left_jacobian_small = SO3.left_jacobian(phi_small)
inv_left_jacobian_small = SO3.inv_left_jacobian(phi_small)
assert np.allclose(left_jacobian_small.dot(inv_left_jacobian_small),
np.identity(3))
left_jacobian_big = SO3.left_jacobian(phi_big)
inv_left_jacobian_big = SO3.inv_left_jacobian(phi_big)
assert np.allclose(left_jacobian_big.dot(inv_left_jacobian_big),
np.identity(3))
def test_exp_log():
C = SO3.exp(np.pi * np.ones(3) / 4)
assert np.allclose(SO3.exp(SO3.log(C)).mat, C.mat)
def test_exp_log_zeros():
C = SO3.exp(np.zeros(3))
assert np.allclose(SO3.exp(SO3.log(C)).mat, C.mat)
def test_perturb():
C = SO3.exp(np.pi * np.ones(3) / 4)
C_copy = copy.deepcopy(C)
phi = np.array([0.3, 0.2, 0.1])
C.perturb(phi)
assert np.allclose(C.as_matrix(), (SO3.exp(phi).dot(C_copy)).as_matrix())
def test_normalize():
C = SO3.exp(np.pi * np.ones(3) / 4)
C.mat += 0.1
C.normalize()
assert SO3.is_valid_matrix(C.mat)
def test_inv():
C = SO3.exp(np.pi * np.ones(3) / 4)
assert np.allclose((C.dot(C.inv())).mat, np.identity(3))
def test_adjoint():
C = SO3.exp(np.pi * np.ones(3) / 4)
assert np.allclose(C.adjoint(), C.mat)
def test_transform_vectorized():
C = SO3.exp(np.pi * np.ones(3) / 4)
pt1 = np.array([1, 2, 3])
pt2 = np.array([4, 5, 3])
pts = np.array([pt1, pt2]) # 2x3
Cpt1 = C.dot(pt1)
Cpt2 = C.dot(pt2)
Cpts = C.dot(pts)
assert(
np.allclose(Cpt1, Cpts[0])
and np.allclose(Cpt2, Cpts[1])
)