Skip to content

Commit

Permalink
Add quaternion_double
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexanderFabisch committed Oct 20, 2024
1 parent d2876c1 commit f55007f
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 2 deletions.
1 change: 1 addition & 0 deletions doc/source/api.rst
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ Quaternion and Axis-Angle Operations

~axis_angle_from_two_directions
~axis_angle_slerp
~quaternion_double
~concatenate_quaternions
~q_prod_vector
~q_conj
Expand Down
6 changes: 4 additions & 2 deletions pytransform3d/rotations/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,9 @@
mrp_from_quaternion,
quaternion_from_mrp)
from ._quaternion_operations import (
quaternion_integrate, quaternion_gradient, concatenate_quaternions, q_conj,
q_prod_vector, quaternion_diff, quaternion_dist, quaternion_from_euler)
quaternion_double, quaternion_integrate, quaternion_gradient,
concatenate_quaternions, q_conj, q_prod_vector, quaternion_diff,
quaternion_dist, quaternion_from_euler)
from ._mrp import concatenate_mrp
from ._slerp import (slerp_weights, pick_closest_quaternion, quaternion_slerp,
axis_angle_slerp, rotor_slerp)
Expand Down Expand Up @@ -218,6 +219,7 @@
"cross_product_matrix",
"mrp_from_quaternion",
"quaternion_from_mrp",
"quaternion_double",
"quaternion_integrate",
"quaternion_gradient",
"concatenate_quaternions",
Expand Down
19 changes: 19 additions & 0 deletions pytransform3d/rotations/_quaternion_operations.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,25 @@
axis_angle_from_quaternion, quaternion_from_angle, check_axis_index)


def quaternion_double(q):
"""Create another quaternion that represents the same orientation.
The unit quaternions q and -q represent the same orientation (double
cover).
Parameters
----------
q : array-like, shape (4,)
Unit quaternion.
Returns
-------
q_double : array, shape (4,)
-q
"""
return -check_quaternion(q, unit=True)


def quaternion_integrate(Qd, q0=np.array([1.0, 0.0, 0.0, 0.0]), dt=1.0):
"""Integrate angular velocities to quaternions.
Expand Down
3 changes: 3 additions & 0 deletions pytransform3d/rotations/_quaternion_operations.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ import numpy as np
import numpy.typing as npt


def quaternion_double(q: npt.ArrayLike) -> np.ndarray: ...


def quaternion_integrate(Qd: npt.ArrayLike, q0: npt.ArrayLike = ..., dt: float = ...) -> np.ndarray: ...


Expand Down
8 changes: 8 additions & 0 deletions pytransform3d/test/test_rotations.py
Original file line number Diff line number Diff line change
Expand Up @@ -1611,6 +1611,14 @@ def test_quaternion_invert():
assert_array_almost_equal(pr.q_id, q_q_inv)


def test_quaternion_double():
rng = np.random.default_rng(2235)
for _ in range(5):
q1 = pr.random_quaternion(rng)
q2 = pr.quaternion_double(q1)
pr.assert_quaternion_equal(q1, q2)


def test_quaternion_gradient_integration():
"""Test integration of quaternion gradients."""
n_steps = 21
Expand Down

0 comments on commit f55007f

Please sign in to comment.