lidar_camera_cablition/convert.py
2024-12-16 12:30:52 +08:00

97 lines
2.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -- coding: utf-8 --
import numpy as np
from scipy.spatial.transform import Rotation as rot
import cv2
import numpy as np
import math
# 旋转矩阵转旋转向量Rxyz->Rvector按特定轴旋转
def rotvector2rot(rotvector):
Rm = cv2.Rodrigues(rotvector)[0]
return Rm
# 旋转矩阵转欧拉角
def isRotationMatrix(R):
Rt = np.transpose(R)
shouldBeIdentity = np.dot(Rt, R)
I = np.identity(3, dtype=R.dtype)
n = np.linalg.norm(I - shouldBeIdentity)
return n < 1e-6
def rot2euler(R):
# assert (isRotationMatrix(R))
sy = math.sqrt(R[0, 0] * R[0, 0] + R[1, 0] * R[1, 0])
singular = sy < 1e-6
if not singular:
x = math.atan2(R[2, 1], R[2, 2]) * 180 / np.pi
y = math.atan2(-R[2, 0], sy) * 180 / np.pi
z = math.atan2(R[1, 0], R[0, 0]) * 180 / np.pi
else:
x = math.atan2(-R[1, 2], R[1, 1]) * 180 / np.pi
y = math.atan2(-R[2, 0], sy) * 180 / np.pi
z = 0
return np.array([x, y, z])
def rot2eulerpi(R):
# assert (isRotationMatrix(R))
sy = math.sqrt(R[0, 0] * R[0, 0] + R[1, 0] * R[1, 0])
singular = sy < 1e-6
if not singular:
x = math.atan2(R[2, 1], R[2, 2])
y = math.atan2(-R[2, 0], sy)
z = math.atan2(R[1, 0], R[0, 0])
else:
x = math.atan2(-R[1, 2], R[1, 1])
y = math.atan2(-R[2, 0], sy)
z = 0
return np.array([x, y, z])
def rot_to_ypr_zyx(R):
"""
将旋转矩阵R转换为Yaw-Pitch-Roll角度Z-Y-X顺序
"""
sin_p = 2 * (R[2, 0] ** 2 - R[0, 0] ** 2 + R[1, 0] ** 2) ** 0.5
if sin_p < 1e-6:
sin_p = 1e-6
if R[2, 0] > 0:
sin_p = -sin_p
roll = np.arctan2(R[2, 0], R[2, 2])
pitch = np.arcsin(-R[2, 1])
yaw = np.arctan2(R[1, 0], R[0, 0])
return yaw, pitch, roll
def rot_to_ypr_xyz(R):
# 计算R的trace值
tr = np.trace(R)
# 计算sqrt(R.T.R) - 1的模长即平方根trace值
sqrt_tr_m1 = np.sqrt(0.25 * ((tr - 3) ** 2) + (R[2, 2] - 1) ** 2)
# 根据平方根trace值判断Yaw-Pitch-Roll角的计算方法
yaw = np.arctan2(R[2, 1], R[2, 2]) # 使用arctan2计算Yaw角
pitch = np.arcsin(-R[2, 0]) # 使用arcsin计算Pitch角
roll = np.arctan2(R[1, 0], R[0, 0]) # 使用arctan2计算Roll角
return yaw, pitch, roll
# 四元数转欧拉角
def quaternion2euler(quaternion):
r = rot.from_quat(quaternion)
euler = r.as_euler('xyz', degrees=True)
return euler
# 四元数转旋转矩阵
def quaternion2rot(quaternion):
r = rot.from_quat(quaternion)
rot = r.as_matrix()
return rot
# 欧拉角转四元数
def euler2quaternion(euler):
r = rot.from_euler('xyz', euler, degrees=True)
quaternion = r.as_quat()
return quaternion
# 欧拉角转旋转矩阵
def euler2rot(euler):
r = rot.from_euler('xyz', euler, degrees=True)
rotation_matrix = r.as_matrix()
return rotation_matrix