This repository contains a Python implementation of the SU-decomposition, which can be used to compute a coordinate-invariant local representation for rigid-body motion trajectories and force trajectories. This representation is referred to as the Dual-Upper-Triangular Invariant Representation (DUTIR). The accompanying Python package is called the SU-decomposition library, or sulib.
The implementation is intended for trajectory analysis, identification, and generalization across coordinate systems. A detailed description of the method is provided in the corresponding paper:
A Coordinate-Invariant Local Representation of Motion and Force Trajectories for Identification and Generalization Across Coordinate Systems
A preprint is available on arXiv.
A key feature of the provided code is that it enables the direct computation of the DUTIR from either a screw trajectory or a rigid-body pose trajectory. The main steps of the implementation when starting from a rigid-body pose trajectory are summarized conceptually in the figure below:
More specifically, the main functionalities of the provided code are:
sulib.SU(): Compute the SU-decomposition of a 6 x 3 matrix.sulib.screw_trajectory_to_dutir(): Compute the DUTIR from a 6 x N screw trajectory, where N represents the number of trajectory samples. The DUTIR is computed by applying the SU-decomposition to successive and overlapping windows of screw triplets.sulib.pose_trajectory_to_dutir(): Compute the DUTIR from a 4 x 4 x N rigid-body pose trajectory, where N represents the number of trajectory samples. The pose trajectory is first converted into a screw trajectory, after whichsulib.screw_trajectory_to_dutir()is applied.
The function sulib.screw_trajectory_to_dutir() takes screw trajectories as input. For motion, these screw trajectories correspond to twist trajectories. For force/torque data, they correspond to wrench trajectories.
Conceptually:
Rigid-body pose trajectory
│
▼
Twist trajectory Wrench trajectory
│ │
▼ ▼
SU-decomposition SU-decomposition
│ │
▼ ▼
DUTIR of rigid-body motion DUTIR of force/torque data
Hence, the functions sulib.screw_trajectory_to_dutir() and sulib.SU() can be applied directly to either twist or wrench data:
Install the latest published version from PyPI:
pip install sulibsulib.RU, sulib.SU, sulib.pose_trajectory_to_dutir, sulib.screw_trajectory_to_dutir, and sulib.generate_synthetic_pose_trajectory.
import numpy as np
import sulib
# Generate pose trajectory data of a precession motion
T, dt = sulib.generate_synthetic_pose_trajectory(trajectory_type="rotation_3D")
# Calculate the DUTIR of this pose trajectory
dutir, twist_trajectory = sulib.pose_trajectory_to_dutir(T, dt, L=0.3, twist_type="body")
# Print the first three samples of the twist_trajectory as an intermediate result
print("Three twist samples:")
print(np.round(twist_trajectory[:, :3], 5))
print(" ")
# Print the first DUTIR sample
print("First DUTIR sample:")
print(np.round(dutir[:, :, 0], 5))Output:
Three twist samples:
[[ 2.35575 2.35575 2.35575]
[ 0.05608 0.1681 0.27975]
[ 2.35575 2.35041 2.33975]
[ 0. -0. -0. ]
[ 0.23557 0.23504 0.23398]
[-0.00561 -0.01681 -0.02798]]
First DUTIR sample:
[[ 3.332 3.33012 3.32446]
[-0. 0.11214 0.22409]
[ 0. 0. -0.00377]
[ 0. -0. -0. ]
[ 0. 0. -0. ]
[ 0. -0. -0. ]]Clone the repository and install the required dependencies and sulib package:
git clone https://github.com/arnoverduyn/SU_decomposition.git
cd SU_decomposition
pip install -r requirements.txt
pip install -e .The core implementation is located in src/sulib.
SU_decomposition/
├── data/
│ └── demos/
│ ├── contour_following/
│ ├── peg_on_hole_alignment/
│ ├── pouring/
│ └── pouring_objects/
│
├── figures/
│
├── notebooks/
│ ├── notebook.ipynb
│
├── scripts/
│ ├── example_public.py
│ ├── example_developer_dutir_force.py
│ └── example_developer_dutir_motion.py
│
├── src/
│ └── sulib/
│ ├── _data_handling.py
│ ├── _plotting.py
│ ├── _preprocessing.py
│ ├── _robotics.py
│ └── _core.py
│
├── tests/
│ └── test_core.py
│
├── pyproject.toml
├── requirements.txt
├── LICENSE
├── CHANGELOG.md
└── README.md
sulib._robotics— robotics-related operations for rigid-body trajectories.sulib._preprocessing— trajectory preprocessing utilities.sulib._data_handling— loading and handling trajectory data.sulib._plotting— visualization utilities.sulib._core— core functionalities of thesulibpackage
The notebooks/ directory contains numerical examples and demonstrations.
Additional example scripts are provided in scripts/:
If you use this implementation in academic work, please cite the associated paper:
A Coordinate-Invariant Local Representation of Motion and Force Trajectories for Identification and Generalization Across Coordinate Systems
Preprint: arXiv:2604.10241
This project is distributed under the license specified in LICENSE.