Install
openclaw skills install so3SO(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 averaging
openclaw skills install so3Complete SO(3) rotation matrix toolkit for 3D rotations with Lie group/ Lie algebra operations, rotation representation conversions, skew-symmetric matrix operations, and rotation averaging.
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]
Check if matrix is a valid SO(3) rotation matrix.
Multiply two rotation matrices: R1 @ R2.
Compute relative rotation between two matrices.
from_1_to_2=True: Returns R1.T @ R2from_1_to_2=False: Returns R2.T @ R1Compute inverse of rotation matrix (transpose).
Convert 3D vector to skew-symmetric matrix.
vec = [x, y, z] -> [[ 0, -z, y],
[ z, 0, -x],
[-y, x, 0]]
Extract vector from skew-symmetric matrix.
SO3_from_quat(q) - Quaternion [w, x, y, z] to rotation matrixSO3_to_quat(R) - Rotation matrix to quaternion [w, x, y, z]SO3_from_axis_angle(axis, angle) - Axis-angle to rotation matrixSO3_to_axis_angle(R) - Returns (axis, angle) tupleSO3_from_euler(euler_angles, axes='zyx', intrinsic=True) - Euler to matrixSO3_to_euler(R, axes='zyx', intrinsic=True) - Matrix to EulerSO(3) to so(3) log map, returns rotation vector (3D).
SO(3) to so(3) log map, returns skew-symmetric matrix (3x3).
SO3_skew(SO3_Log(R))so(3) to SO(3) exp map from rotation vector.
so(3) to SO(3) exp map from skew-symmetric matrix.
SO3_Exp(SO3_unskew(omega_hat))Compute mean rotation matrix from multiple rotations.
Most functions handle both automatically.
R @ R.T = I (orthogonal)
det(R) = 1 (special)
Rotation vector where direction is axis, magnitude is angle.
Required packages:
numpy - Array operationsqmt - Quaternion utilitiesscipy - Rotation averagingInstall with:
pip install numpy qmt scipy
# 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)