Pywayne VIO SO3
Overview
Complete SO(3) rotation matrix toolkit for 3D rotations with Lie group/ Lie algebra operations, rotation representation conversions, skew-symmetric matrix operations, and rotation averaging.
Quick Start
from pywayne.vio.SO3 import SO3_skew, SO3_Exp, SO3_Log, SO3_to_quat
import numpy as np
# Skew-symmetric matrix
vec = np.array([1, 2, 3])
skew = SO3_skew(vec) # Returns 3x3 skew-symmetric matrix
# Log/Exp mapping
R = np.eye(3)
rotvec = SO3_Log(R) # Rotation vector (Lie algebra)
R_recon = SO3_Exp(rotvec) # Back to rotation matrix
# Quaternion conversion
quat = SO3_to_quat(R) # Returns [w, x, y, z]
Core Functions
Basic Operations
check_SO3(R)
Check if matrix is a valid SO(3) rotation matrix.
- Validates shape (3, 3)
- Checks R.T @ R = I (orthogonality)
SO3_mul(R1, R2)
Multiply two rotation matrices: R1 @ R2.
SO3_diff(R1, R2, from_1_to_2=True)
Compute relative rotation between two matrices.
from_1_to_2=True: Returns R1.T @ R2
from_1_to_2=False: Returns R2.T @ R1
SO3_inv(R)
Compute inverse of rotation matrix (transpose).
- Supports single (3, 3) or batch (N, 3, 3) inputs
Skew-Symmetric Matrices
SO3_skew(vec)
Convert 3D vector to skew-symmetric matrix.
vec = [x, y, z] -> [[ 0, -z, y],
[ z, 0, -x],
[-y, x, 0]]
- Supports single vector (3,) or batch (N, 3)
SO3_unskew(skew)
Extract vector from skew-symmetric matrix.
- Single matrix (3, 3) -> vector (3,)
- Batch (N, 3, 3) -> vectors (N, 3)
Rotation Representation Conversions
Quaternion
SO3_from_quat(q) - Quaternion [w, x, y, z] to rotation matrix
SO3_to_quat(R) - Rotation matrix to quaternion [w, x, y, z]
- Uses Hamilton convention (wxyz)
Axis-Angle
SO3_from_axis_angle(axis, angle) - Axis-angle to rotation matrix
SO3_to_axis_angle(R) - Returns (axis, angle) tuple
Euler Angles
SO3_from_euler(euler_angles, axes='zyx', intrinsic=True) - Euler to matrix
SO3_to_euler(R, axes='zyx', intrinsic=True) - Matrix to Euler
- Supports all rotation sequences
Lie Group/ Lie Algebra Mapping
SO3_Log(R)
SO(3) to so(3) log map, returns rotation vector (3D).
- Input: (3, 3) or (N, 3, 3)
- Output: (3,) or (N, 3)
SO3_log(R)
SO(3) to so(3) log map, returns skew-symmetric matrix (3x3).
- Equivalent to
SO3_skew(SO3_Log(R))
SO3_Exp(rotvec)
so(3) to SO(3) exp map from rotation vector.
- Handles zero vectors gracefully
- Input: (3,) or (N, 3)
- Output: (3, 3) or (N, 3, 3)
SO3_exp(omega_hat)
so(3) to SO(3) exp map from skew-symmetric matrix.
- Equivalent to
SO3_Exp(SO3_unskew(omega_hat))
Averaging
SO3_mean(R)
Compute mean rotation matrix from multiple rotations.
- Uses scipy Rotation.mean()
- Input: (N, 3, 3)
- Output: (3, 3)
Data Formats
Single vs Batch
- Single matrix: shape (3, 3)
- Batch: shape (N, 3, 3)
Most functions handle both automatically.
SO(3) Matrix Properties
R @ R.T = I (orthogonal)
det(R) = 1 (special)
Lie Algebra Vector
Rotation vector where direction is axis, magnitude is angle.
Dependencies
Required packages:
numpy - Array operations
qmt - Quaternion utilities
scipy - Rotation averaging
Install with:
pip install numpy qmt scipy
Example Usage
# Create rotation from axis-angle
axis = np.array([0, 0, 1]) # Z-axis
angle = np.pi / 4 # 45 degrees
R = SO3_from_axis_angle(axis, angle)
# Verify it's valid
print(check_SO3(R)) # True
# Get Lie algebra representation
rotvec = SO3_Log(R)
print(f"Rotation vector: {rotvec}")
# Convert back
R_recon = SO3_Exp(rotvec)
print(f"Reconstruction error: {np.linalg.norm(R - R_recon):.2e}")
# Batch averaging
R_batch = np.array([R, SO3_inv(R), SO3_mul(R, R)])
R_mean = SO3_mean(R_batch)
1---2name: pywayne-vio-so33description: SO(3) rotation matrix utilities including Lie group/ Lie algebra operations, rotation representation conversions, skew-symmetric matrix operations, and rotation averaging. Use when working with 3D rotations, robot kinematics, computer vision, SLAM, or any task requiring SO(3) matrix validation and manipulation, quaternion/ axis-angle/ Euler angle conversions, Lie algebra Log/Exp mapping, skew-symmetric matrix operations, or rotation matrix averaging4---56# Pywayne VIO SO378## Overview910Complete SO(3) rotation matrix toolkit for 3D rotations with Lie group/ Lie algebra operations, rotation representation conversions, skew-symmetric matrix operations, and rotation averaging.1112## Quick Start1314```python15from pywayne.vio.SO3 import SO3_skew, SO3_Exp, SO3_Log, SO3_to_quat16import numpy as np1718# Skew-symmetric matrix19vec = np.array([1, 2, 3])20skew = SO3_skew(vec) # Returns 3x3 skew-symmetric matrix2122# Log/Exp mapping23R = np.eye(3)24rotvec = SO3_Log(R) # Rotation vector (Lie algebra)25R_recon = SO3_Exp(rotvec) # Back to rotation matrix2627# Quaternion conversion28quat = SO3_to_quat(R) # Returns [w, x, y, z]29```3031## Core Functions3233### Basic Operations3435#### check_SO3(R)36Check if matrix is a valid SO(3) rotation matrix.37- Validates shape (3, 3)38- Checks R.T @ R = I (orthogonality)3940#### SO3_mul(R1, R2)41Multiply two rotation matrices: `R1 @ R2`.4243#### SO3_diff(R1, R2, from_1_to_2=True)44Compute relative rotation between two matrices.45- `from_1_to_2=True`: Returns `R1.T @ R2`46- `from_1_to_2=False`: Returns `R2.T @ R1`4748#### SO3_inv(R)49Compute inverse of rotation matrix (transpose).50- Supports single (3, 3) or batch (N, 3, 3) inputs5152### Skew-Symmetric Matrices5354#### SO3_skew(vec)55Convert 3D vector to skew-symmetric matrix.56```57vec = [x, y, z] -> [[ 0, -z, y],58 [ z, 0, -x],59 [-y, x, 0]]60```61- Supports single vector (3,) or batch (N, 3)6263#### SO3_unskew(skew)64Extract vector from skew-symmetric matrix.65- Single matrix (3, 3) -> vector (3,)66- Batch (N, 3, 3) -> vectors (N, 3)6768### Rotation Representation Conversions6970#### Quaternion71- `SO3_from_quat(q)` - Quaternion [w, x, y, z] to rotation matrix72- `SO3_to_quat(R)` - Rotation matrix to quaternion [w, x, y, z]73- Uses Hamilton convention (wxyz)7475#### Axis-Angle76- `SO3_from_axis_angle(axis, angle)` - Axis-angle to rotation matrix77- `SO3_to_axis_angle(R)` - Returns (axis, angle) tuple7879#### Euler Angles80- `SO3_from_euler(euler_angles, axes='zyx', intrinsic=True)` - Euler to matrix81- `SO3_to_euler(R, axes='zyx', intrinsic=True)` - Matrix to Euler82- Supports all rotation sequences8384### Lie Group/ Lie Algebra Mapping8586#### SO3_Log(R)87SO(3) to so(3) log map, returns rotation vector (3D).88- Input: (3, 3) or (N, 3, 3)89- Output: (3,) or (N, 3)9091#### SO3_log(R)92SO(3) to so(3) log map, returns skew-symmetric matrix (3x3).93- Equivalent to `SO3_skew(SO3_Log(R))`9495#### SO3_Exp(rotvec)96so(3) to SO(3) exp map from rotation vector.97- Handles zero vectors gracefully98- Input: (3,) or (N, 3)99- Output: (3, 3) or (N, 3, 3)100101#### SO3_exp(omega_hat)102so(3) to SO(3) exp map from skew-symmetric matrix.103- Equivalent to `SO3_Exp(SO3_unskew(omega_hat))`104105### Averaging106107#### SO3_mean(R)108Compute mean rotation matrix from multiple rotations.109- Uses scipy Rotation.mean()110- Input: (N, 3, 3)111- Output: (3, 3)112113## Data Formats114115### Single vs Batch116- Single matrix: shape (3, 3)117- Batch: shape (N, 3, 3)118119Most functions handle both automatically.120121### SO(3) Matrix Properties122```123R @ R.T = I (orthogonal)124det(R) = 1 (special)125```126127### Lie Algebra Vector128Rotation vector where direction is axis, magnitude is angle.129130## Dependencies131132Required packages:133- `numpy` - Array operations134- `qmt` - Quaternion utilities135- `scipy` - Rotation averaging136137Install with:138```bash139pip install numpy qmt scipy140```141142## Example Usage143144```python145# Create rotation from axis-angle146axis = np.array([0, 0, 1]) # Z-axis147angle = np.pi / 4 # 45 degrees148R = SO3_from_axis_angle(axis, angle)149150# Verify it's valid151print(check_SO3(R)) # True152153# Get Lie algebra representation154rotvec = SO3_Log(R)155print(f"Rotation vector: {rotvec}")156157# Convert back158R_recon = SO3_Exp(rotvec)159print(f"Reconstruction error: {np.linalg.norm(R - R_recon):.2e}")160161# Batch averaging162R_batch = np.array([R, SO3_inv(R), SO3_mul(R, R)])163R_mean = SO3_mean(R_batch)164```