3D rigid-body transformations and rotations
Project description
SE3kit
SE3kit is a lightweight Python library designed for 3D rigid-body transformations and rotations. It provides intuitive wrappers for homogeneous transformations, rotation representations (matrices, Euler angles, quaternions), and geometric primitives.
[!NOTE] This library includes optional ROS compatibility, automatically detecting and converting to/from ROS 1 or ROS 2 geometry messages if available.
🚀 Features
- Rigid Body Transformations: Easy-to-use 4x4 homogenous transformation matrices (
Transformation). - Rotations: Comprehensive 3x3 rotation matrix support with conversions to/from Euler angles, Quaternions, and Axis-Angles (
Rotation). - Translations: Vector arithmetic and unit management (
Translation). - Homogeneous Points: 4D point representation for SE(3) operations (
HPoint). - ROS Integration: Seamless conversion between SE3kit objects and ROS
geometry_msgs.
📦 Installation
This library is pure Python with minimal dependencies (numpy, numpy-quaternion).
From PyPI (Recommended)
To install the latest stable version from PyPI:
pip install se3kit
From Source
To install the library in editable mode from source:
git clone https://github.com/daniyalmaroufi/se3kit.git
cd se3kit
pip install -e .
For Development
For contributors, install the development dependencies (testing, linting, docs):
pip install -e '.[dev]'
pre-commit install
📚 Documentation
Full API documentation is available at: 👉 https://daniyalmaroufi.github.io/se3kit/
🛠 Usage
Rigid Body Transformations
Create and compose transformations intuitively:
import se3kit as se3
# Create a transformation: 1 meter up in Z, identity rotation
t1 = se3.Transformation(se3.Translation([0, 0, 1]), se3.Rotation())
# Compose transformations
t2 = se3.Transformation(
se3.Translation([0.5, 0, 0]),
se3.Rotation.from_rpy([0, 0, 1.57]) # Rotate 90° around Z
)
t_combined = t1 * t2
3D Point Transformation
Transform homogeneous points efficiently:
import se3kit as se3
p = se3.HPoint(0.1, 0.5, 0.0)
p_transformed = t_combined.transform_hpoint(p)
print(p_transformed.xyz) # Access as standard 3D vector
Homogeneous Point (HPoint) Representation
Store and manipulate 3D points in either Cartesian or Full Homogeneous Form
import se3kit as se3
import numpy as np
# Cartesian coordinates
p1 = se3.HPoint(0.2, 0.4, 0.1)
# From NumPy array
p2 = se3.HPoint(np.array([1.0, 2.0, 3.0]))
# From full homogeneous vector
p3 = se3.HPoint(np.array([0.5, 0.0, 1.0, 1.0]))
print(p1.xyz) # [0.2, 0.4, 0.1]
print(p2.as_array()) # Full 4×1 homogeneous vector
Transform a Homogeneous Point (HPoint)
Transform points attached to a robot’s tool through the end-effector pose.
import se3kit as se3
# A tool point on the robot’s end effector
tool_point = se3.HPoint(0.1, 0.0, 0.0)
# End-effector pose in world frame
T_world_ee = se3.Transformation(
se3.Translation([0.5, 0.2, 1.0]),
se3.Rotation.from_rpy([0, 0, 1.57])
)
p_world = T_world_ee.transform_hpoint(tool_point)
print(p_world.xyz)
Kinematic Chain Representation
Compose multiple transformations to represent an entire robot arm’s kinematic chain.
import se3kit as se3
# Example arm links
T1 = se3.Transformation(se3.Translation([0, 0, 0.4]), se3.Rotation.from_rpy([0, 0, 0.5]))
T2 = se3.Transformation(se3.Translation([0, 0, 0.3]), se3.Rotation.from_rpy([0, 0.2, 0]))
T3 = se3.Transformation(se3.Translation([0.1, 0, 0]), se3.Rotation.from_rpy([0.1, 0, 0]))
T_end_effector = T1 * T2 * T3
print(T_end_effector.as_geometry_pose())
Scaling and Unit Conversions
Seamlessly convert between millimeters and meters for transformations.
import se3kit as se3
T_mm = se3.Transformation.convert_m_to_mm(T_end_effector)
T_m = se3.Transformation.convert_mm_to_m(T_mm)
print(T_mm.translation.xyz)
🤝 Contributing
We welcome contributions! Please follow these steps to ensure a smooth workflow:
- Install Hooks: Run
pre-commit installto set up linting hooks. - Test Locally: Run
python -m unittest discover -vto ensure all tests pass. - Lint: Code is automatically formatted with
blackandruffon commit.
📄 License
Distributed under the Apache 2.0 License. See LICENSE for more information.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file se3kit-1.0.5.tar.gz.
File metadata
- Download URL: se3kit-1.0.5.tar.gz
- Upload date:
- Size: 41.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8c5f1cb92d1f5cb803df04b58a9963eb0278ad267b2ea87e8037826d8e241ecd
|
|
| MD5 |
26ef83b11e4e793e4c1d583a7ce98b99
|
|
| BLAKE2b-256 |
f48897d80812d89fbf9c1a177d51d3f8de2e5a3ae30e8aac82eeea875ae6a206
|
File details
Details for the file se3kit-1.0.5-py3-none-any.whl.
File metadata
- Download URL: se3kit-1.0.5-py3-none-any.whl
- Upload date:
- Size: 29.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
03c73b93f63d2d9b8e25568fc764b1cc69d0628aa94e532a50990147067d393a
|
|
| MD5 |
8c64f36852337b6d10b5596406e9c812
|
|
| BLAKE2b-256 |
f8b3dbbe9ab27bb355a1f393ee72448012cfcf1ed9ee84dbea8fafdeda338812
|