Skip to content

Commit

Permalink
Add dual_quaternion_double
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexanderFabisch committed Oct 25, 2024
1 parent e31a1ea commit a928889
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 4 deletions.
1 change: 1 addition & 0 deletions doc/source/api.rst
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,7 @@ Dual Quaternion

~check_dual_quaternion
~dual_quaternion_requires_renormalization
~dual_quaternion_double
~dq_conj
~dq_q_conj
~concatenate_dual_quaternions
Expand Down
10 changes: 10 additions & 0 deletions pytransform3d/test/test_transformations.py
Original file line number Diff line number Diff line change
Expand Up @@ -938,3 +938,13 @@ def test_pq_slerp():
def test_transform_requires_renormalization():
assert pt.transform_requires_renormalization(np.eye(4) + 1e-6)
assert not pt.transform_requires_renormalization(np.eye(4))


def test_dual_quaternion_double():
rng = np.random.default_rng(4183)
A2B = pt.random_transform(rng)
dq = pt.dual_quaternion_from_transform(A2B)
dq_double = pt.dual_quaternion_double(dq)
pt.assert_unit_dual_quaternion_equal(dq, dq_double)
assert_array_almost_equal(
A2B, pt.transform_from_dual_quaternion(dq_double))
9 changes: 5 additions & 4 deletions pytransform3d/transformations/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@
vectors_to_directions, transform)
from ._pq_operations import pq_slerp
from ._dual_quaternion_operations import (
dq_q_conj, dq_conj, concatenate_dual_quaternions, dual_quaternion_sclerp,
dual_quaternion_power, dq_prod_vector)
dual_quaternion_double, dq_q_conj, dq_conj, concatenate_dual_quaternions,
dual_quaternion_sclerp, dual_quaternion_power, dq_prod_vector)
from ._random import (
random_transform, random_screw_axis, random_exponential_coordinates)
from ._plot import plot_transform, plot_screw
Expand Down Expand Up @@ -74,8 +74,9 @@
"vectors_to_directions", "transform",
"random_transform", "random_screw_axis", "random_exponential_coordinates",
"pq_slerp",
"dq_q_conj", "dq_conj", "concatenate_dual_quaternions",
"dual_quaternion_sclerp", "dual_quaternion_power", "dq_prod_vector",
"dual_quaternion_double", "dq_q_conj", "dq_conj",
"concatenate_dual_quaternions", "dual_quaternion_sclerp",
"dual_quaternion_power", "dq_prod_vector",
"plot_transform", "plot_screw",
"assert_transform", "assert_exponential_coordinates_equal",
"assert_screw_parameters_equal", "assert_unit_dual_quaternion_equal",
Expand Down
20 changes: 20 additions & 0 deletions pytransform3d/transformations/_dual_quaternion_operations.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,26 @@
from ..rotations import concatenate_quaternions


def dual_quaternion_double(dq):
"""Create another dual quaternion that represents the same transformation.
The unit dual quaternions sigma and -sigma represent the same
transformation (double cover).
Parameters
----------
dq : array-like, shape (8,)
Unit dual quaternion to represent transform:
(pw, px, py, pz, qw, qx, qy, qz)
Returns
-------
dq_double : array, shape (8,)
-dq
"""
return -check_dual_quaternion(dq, unit=True)


def dq_conj(dq):
"""Conjugate of dual quaternion.
Expand Down
3 changes: 3 additions & 0 deletions pytransform3d/transformations/_dual_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 dual_quaternion_double(dq: npt.ArrayLike) -> np.ndarray: ...


def dq_conj(dq: npt.ArrayLike) -> np.ndarray: ...


Expand Down

0 comments on commit a928889

Please sign in to comment.