Source code for opengnc.utils.cayley_klein_utils

"""
Cayley-Klein parameters for attitude representation and composition.
"""

import numpy as np
from typing import cast


[docs] def quat_to_cayley_klein(q: np.ndarray) -> np.ndarray: r""" Convert a quaternion to Cayley-Klein parameters. The Cayley-Klein parameters $(\alpha, \beta)$ are complex numbers representing the rotation: $\alpha = w + i z$ $\beta = y + i x$ Parameters ---------- q : np.ndarray Quaternion [x, y, z, w]. Returns ------- np.ndarray 2x2 complex unitary matrix: [[alpha, beta], [-beta*, alpha*]] """ qv = np.asarray(q) x, y, z, w = qv alpha = complex(w, z) beta = complex(y, x) return cast(np.ndarray, np.array([ [alpha, beta], [-np.conj(beta), np.conj(alpha)] ]))
[docs] def cayley_klein_to_quat(u_mat: np.ndarray) -> np.ndarray: """ Convert a 2x2 Cayley-Klein matrix to a quaternion. Parameters ---------- u_mat : np.ndarray 2x2 complex Cayley-Klein matrix. Returns ------- np.ndarray Quaternion [x, y, z, w]. """ umat = np.asarray(u_mat) alpha = umat[0, 0] beta = umat[0, 1] w = alpha.real z = alpha.imag y = beta.real x = beta.imag return cast(np.ndarray, np.array([x, y, z, w]))
[docs] def cayley_klein_mult(u1: np.ndarray, u2: np.ndarray) -> np.ndarray: """ Multiply two Cayley-Klein matrices (composes rotations). Parameters ---------- u1 : np.ndarray First 2x2 complex matrix. u2 : np.ndarray Second 2x2 complex matrix. Returns ------- np.ndarray Product 2x2 complex matrix. """ return cast(np.ndarray, np.asarray(u1) @ np.asarray(u2))