Coverage for src\attipy\_transforms.py: 17%
29 statements
« prev ^ index » next coverage.py v7.11.3, created at 2025-11-11 18:11 +0100
« prev ^ index » next coverage.py v7.11.3, created at 2025-11-11 18:11 +0100
1import numpy as np
2from numba import njit
3from numpy.typing import NDArray
6@njit # type: ignore[misc]
7def _rot_matrix_from_quaternion(q: NDArray[np.float64]) -> NDArray[np.float64]:
8 """
9 Compute the rotation matrix from a unit quaternion.
11 Parameters
12 ----------
13 q : numpy.ndarray, shape (4,)
14 Unit quaternion.
16 Returns
17 -------
18 rot : numpy.ndarray, shape (3, 3)
19 Rotation matrix.
20 """
21 q0, q1, q2, q3 = q
23 _2q1 = q1 + q1
24 _2q2 = q2 + q2
25 _2q3 = q3 + q3
27 _2q1q1 = q1 * _2q1
28 _2q1q2 = q1 * _2q2
29 _2q1q3 = q1 * _2q3
30 _2q2q2 = q2 * _2q2
31 _2q2q3 = q2 * _2q3
32 _2q3q3 = q3 * _2q3
33 _2q0q1 = q0 * _2q1
34 _2q0q2 = q0 * _2q2
35 _2q0q3 = q0 * _2q3
37 rot_00 = 1.0 - (_2q2q2 + _2q3q3)
38 rot_01 = _2q1q2 - _2q0q3
39 rot_02 = _2q1q3 + _2q0q2
41 rot_10 = _2q1q2 + _2q0q3
42 rot_11 = 1.0 - (_2q1q1 + _2q3q3)
43 rot_12 = _2q2q3 - _2q0q1
45 rot_20 = _2q1q3 - _2q0q2
46 rot_21 = _2q2q3 + _2q0q1
47 rot_22 = 1.0 - (_2q1q1 + _2q2q2)
49 rot = np.array(
50 [
51 [rot_00, rot_01, rot_02],
52 [rot_10, rot_11, rot_12],
53 [rot_20, rot_21, rot_22],
54 ]
55 )
56 return rot