Metrics

Common metrics used in 3D Orientation representations.

References

[Huynh](1, 2, 3, 4, 5) Huynh, D.Q. Metrics for 3D Rotations: Comparison and Analysis. J Math Imaging Vis 35, 155-164 (2009).
[Kuffner]Kuffner, J.J. Effective Sampling and Distance Metrics for 3D Rigid Body Path Planning. IEEE International Conference on Robotics and Automation (ICRA 2004)
[Hartley](1, 2, 3) R. Hartley, J. Trumpf, Y. Dai, H. Li. Rotation Averaging. International Journal of Computer Vision. Volume 101, Number 2. 2013.
ahrs.utils.metrics.angular_distance(R1: numpy.ndarray, R2: numpy.ndarray) → float

Angular distance between two rotations \(\mathbf{R}_1\) and \(\mathbf{R}_2\) in SO(3), as defined in [Hartley]:

\[d(\mathbf{R}_1, \mathbf{R}_2) = \|\log(\mathbf{R}_1\mathbf{R}_2^T)\|\]

where \(\|\mathbf{x}\|\) represents the usual euclidean norm of the vector \(\mathbf{x}\).

Parameters:
  • R1 (numpy.ndarray) – 3-by-3 rotation matrix.
  • R2 (numpy.ndarray) – 3-by-3 rotation matrix.
Returns:

d – Angular distance between rotation matrices

Return type:

float

ahrs.utils.metrics.chordal(R1: numpy.ndarray, R2: numpy.ndarray) → float

Chordal Distance

The chordal distance between two rotations \(\mathbf{R}_1\) and \(\mathbf{R}_2\) in SO(3) is the Euclidean distance between them in the embedding space \(\mathbb{R}^{3\times 3}=\mathbb{R}^9\) [Hartley]:

\[d(\mathbf{R}_1, \mathbf{R}_2) = \|\mathbf{R}_1-\mathbf{R}_2\|_F\]

where \(\|\mathbf{X}\|_F\) represents the Frobenius norm of the matrix \(\mathbf{X}\).

Parameters:
  • R1 (numpy.ndarray) – 3-by-3 rotation matrix.
  • R2 (numpy.ndarray) – 3-by-3 rotation matrix.
Returns:

d – Chordal distance between matrices.

Return type:

float

ahrs.utils.metrics.euclidean(x: numpy.ndarray, y: numpy.ndarray, **kwargs) → float

Euclidean distance between two arrays as described in [Huynh]:

\[d(\mathbf{x}, \mathbf{y}) = \sqrt{(x_0-y_0)^2 + \dots + (x_n-y_n)^2}\]

Accepts the same parameters as the function numpy.linalg.norm().

This metric gives values in the range [0, \(\pi\sqrt{3}\)]

Parameters:
  • x (array) – M-by-N array to compare. Usually a reference array.
  • y (array) – M-by-N array to compare.
  • mode (str) – Mode of distance computation.
Returns:

d – Distance or difference between arrays.

Return type:

float

Examples

>>> import numpy as np
>>> from ahrs.utils.metrics import euclidean
>>> num_samples = 5
>>> angles = np.random.uniform(low=-180.0, high=180.0, size=(num_samples, 3))
>>> noisy = angles + np.random.randn(num_samples, 3)
>>> euclidean(angles, noisy)
2.585672169476804
>>> euclidean(angles, noisy, axis=0)
array([1.36319772, 1.78554071, 1.28032688])
>>> euclidean(angles, noisy, axis=1)     # distance per sample
array([0.88956871, 1.19727356, 1.5243858 , 0.68765523, 1.29007067])
ahrs.utils.metrics.identity_deviation(R1: numpy.ndarray, R2: numpy.ndarray) → float

Deviation from Identity Matrix as defined in [Huynh]:

\[d(\mathbf{R}_1, \mathbf{R}_2) = \|\mathbf{I}-\mathbf{R}_1\mathbf{R}_2^T\|_F\]

where \(\|\mathbf{X}\|_F\) represents the Frobenius norm of the matrix \(\mathbf{X}\).

The error lies within: [0, \(2\sqrt{2}\)]

Parameters:
  • R1 (numpy.ndarray) – 3-by-3 rotation matrix.
  • R2 (numpy.ndarray) – 3-by-3 rotation matrix.
Returns:

d – Deviation from identity matrix.

Return type:

float

ahrs.utils.metrics.qad(q1: numpy.ndarray, q2: numpy.ndarray) → float

Quaternion Angle Difference

Parameters:
  • q1 (numpy.ndarray) – First quaternion, or set of quaternions, to compare.
  • q2 (numpy.ndarray) – Second quaternion, or set of quaternions, to compare.
  • error lies within (The) –
Returns:

d – Angle difference between given unit quaternions.

Return type:

float

ahrs.utils.metrics.qcip(q1: numpy.ndarray, q2: numpy.ndarray) → float

Cosine of inner products as defined in [Huynh]:

\[d(\mathbf{q}_1, \mathbf{q}_2) = \arccos(|\mathbf{q}_1\cdot\mathbf{q}_2|)\]

The error lies within: [0, \(\frac{\pi}{2}\)]

Parameters:
  • q1 (numpy.ndarray) – First quaternion, or set of quaternions, to compare.
  • q2 (numpy.ndarray) – Second quaternion, or set of quaternions, to compare.
Returns:

d – Cosine of inner products of quaternions.

Return type:

float

ahrs.utils.metrics.qdist(q1: numpy.ndarray, q2: numpy.ndarray) → float

Euclidean distance between two unit quaternions as defined in [Huynh] and [Hartley]:

\[d(\mathbf{q}_1, \mathbf{q}_2) = \mathrm{min} \{ \|\mathbf{q}_1-\mathbf{q}_2\|, \|\mathbf{q}_1-\mathbf{q}_2\|\}\]

The error lies within [0, \(\sqrt{2}\)]

Parameters:
  • q1 (numpy.ndarray) – First quaternion, or set of quaternions, to compare.
  • q2 (numpy.ndarray) – Second quaternion, or set of quaternions, to compare.
Returns:

d – Euclidean distance between given unit quaternions

Return type:

float

ahrs.utils.metrics.qeip(q1: numpy.ndarray, q2: numpy.ndarray) → float

Euclidean distance of inner products as defined in [Huynh] and [Kuffner]:

\[d(\mathbf{q}_1, \mathbf{q}_2) = 1 - |\mathbf{q}_1\cdot\mathbf{q}_2|\]

The error lies within: [0, 1]

Parameters:
  • q1 (numpy.ndarray) – First quaternion, or set of quaternions, to compare.
  • q2 (numpy.ndarray) – Second quaternion, or set of quaternions, to compare.
Returns:

d – Euclidean distance of inner products between given unit quaternions.

Return type:

float