dual quaternion policy model added
This commit is contained in:
parent
b83c490464
commit
5e42128f06
@ -0,0 +1,43 @@
|
|||||||
|
from dual_quaternions import DualQuaternion
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
|
||||||
|
class DualQuaternionSplines:
|
||||||
|
def __init__(self, pose_vector, nr_interpolation_steps=10):
|
||||||
|
self.pose_vector = pose_vector
|
||||||
|
self.nr_interpolation_steps = nr_interpolation_steps
|
||||||
|
self.dual_quaternions = self.parse_input_vector()
|
||||||
|
|
||||||
|
def generate_trajectory(self):
|
||||||
|
"""Generate an interpolated trajectory from the list of dual quaternions."""
|
||||||
|
interpolated_trajectory = []
|
||||||
|
for i in range(len(self.dual_quaternions) - 1):
|
||||||
|
interpolated_trajectory.extend(self.interpolate_dual_quaternions(self.dual_quaternions[i],
|
||||||
|
self.dual_quaternions[i+1],
|
||||||
|
self.nr_interpolation_steps))
|
||||||
|
return interpolated_trajectory
|
||||||
|
|
||||||
|
def parse_input_vector(self):
|
||||||
|
"""Parse the input vector into dual quaternions."""
|
||||||
|
dual_quats = []
|
||||||
|
for i in range(0, len(self.pose_vector), 7):
|
||||||
|
pose = self.pose_vector[i:i+7]
|
||||||
|
dq = self.quaternion_to_dual_quaternion(pose)
|
||||||
|
dual_quats.append(dq)
|
||||||
|
return dual_quats
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def quaternion_to_dual_quaternion(pose):
|
||||||
|
"""Convert position and quaternion to a dual quaternion.
|
||||||
|
:param pose: [q_rw, q_rx, q_ry, q_rz, q_tx, q_ty, q_tz]"""
|
||||||
|
return DualQuaternion.from_quat_pose_array(pose)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def interpolate_dual_quaternions(dq1, dq2, steps=10):
|
||||||
|
"""Interpolate between two dual quaternions."""
|
||||||
|
return [DualQuaternion.sclerp(dq1, dq2, t) for t in np.linspace(0, 1, steps)]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1 +0,0 @@
|
|||||||
# TODO
|
|
@ -0,0 +1,29 @@
|
|||||||
|
import unittest
|
||||||
|
from dual_quaternions import DualQuaternion
|
||||||
|
from src.interaction_policy_representation.interaction_policy_representation.models.dual_quaternion_splines import DualQuaternionSplines
|
||||||
|
|
||||||
|
|
||||||
|
class TestDualQuaternionSplines(unittest.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
# Example input vector (position + quaternion for 2 poses)
|
||||||
|
self.input_vector = [1., 0., 0., 1., 0., 0., 0., 0., 1., 0., 0., 0., 1., 0.]
|
||||||
|
# Expected dual quaternion for the first pose, adapted based on actual class functionality
|
||||||
|
self.expected_first_dq = DualQuaternion.from_quat_pose_array(self.input_vector[:7])
|
||||||
|
|
||||||
|
def test_parse_input_vector(self):
|
||||||
|
trajectory = DualQuaternionSplines(self.input_vector)
|
||||||
|
# Check if the first dual quaternion matches the expected one
|
||||||
|
# This assumes the implementation details about how dual quaternions are stored
|
||||||
|
self.assertAlmostEqual(trajectory.dual_quaternions[0].q_r.w, self.expected_first_dq.q_r.w, places=5)
|
||||||
|
self.assertAlmostEqual(trajectory.dual_quaternions[0].q_r.x, self.expected_first_dq.q_r.x, places=5)
|
||||||
|
# Add more assertions as needed for y, z, dual part
|
||||||
|
|
||||||
|
def test_generate_trajectory(self):
|
||||||
|
trajectory = DualQuaternionSplines(self.input_vector)
|
||||||
|
interpolated_trajectory = trajectory.generate_trajectory()
|
||||||
|
# Ensure the interpolated trajectory is not empty
|
||||||
|
self.assertTrue(len(interpolated_trajectory) > 0)
|
||||||
|
# Add more specific tests, e.g., comparing specific interpolated values
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
Loading…
Reference in New Issue
Block a user