Open3D 四元数、欧拉角及旋转向量转旋转矩阵的方式
目录
一、概述
1.1原理
1.2实现步骤
1.3应用场景
二、代码实现
三、数据显示
Open3D点云算法汇总及实战案例汇总的目录地址:
Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客
一、概述
在三维计算机视觉和图形学中,旋转可以用多种方式表示,包括四元数、欧拉角、旋转向量等。这些表示方式各有优缺点,并且在不同的应用场景中具有不同的优势。在 Open3D 中,可以方便地将这些表示方式转换为旋转矩阵,从而统一处理三维旋转操作。
1.1原理
- 四元数: 四元数是一种基于复数扩展的表示旋转的方式,由一个实部和三个虚部构成。四元数的旋转矩阵转换公式如下:
- 欧拉角: 欧拉角是一种基于三个旋转角度的方式来描述旋转,通常是围绕指定的轴(如 XYZ 顺序)旋转。欧拉角的旋转矩阵由每个旋转角度的旋转矩阵乘积得到。
- 旋转向量: 旋转向量(Rodrigues 向量)通过一个三维向量表示旋转,其中向量的方向表示旋转轴,向量的模长表示旋转角度。旋转向量可以通过 Rodrigues 公式转换为旋转矩阵。
1.2实现步骤
- 四元数转旋转矩阵: 使用 Open3D 提供的 get_rotation_matrix_from_quaternion 函数将四元数转换为旋转矩阵。
- 欧拉角转旋转矩阵: 使用 get_rotation_matrix_from_xyz 函数将欧拉角表示的旋转转换为旋转矩阵。
- 旋转向量转旋转矩阵: 使用 get_rotation_matrix_from_axis_angle 函数将旋转向量转换为旋转矩阵
1.3应用场景
- 姿态估计: 在机器人学和计算机视觉中,常用四元数或旋转向量来表示物体的姿态。
- 图形渲染: 在 3D 图形渲染中,欧拉角经常用于控制物体的旋转。
- 运动捕捉: 在人体运动捕捉中,四元数用于表示关节的旋转,以避免欧拉角的万向节锁定问题。
二、代码实现
import open3d as o3d
import numpy as npdef quaternion_to_rotation_matrix(quaternion):"""将四元数转换为旋转矩阵。参数:quaternion (list or np.ndarray): 形如 [w, x, y, z] 的四元数。返回:np.ndarray: 3x3 旋转矩阵。"""return o3d.geometry.get_rotation_matrix_from_quaternion(quaternion)def euler_to_rotation_matrix(euler_angles):"""将欧拉角转换为旋转矩阵。参数:euler_angles (list or np.ndarray): 形如 [rx, ry, rz] 的欧拉角,单位为弧度。返回:np.ndarray: 3x3 旋转矩阵。"""return o3d.geometry.get_rotation_matrix_from_xyz(euler_angles)def axis_angle_to_rotation_matrix(axis_angle):"""将旋转向量(轴角)转换为旋转矩阵。参数:axis_angle (list or np.ndarray): 形如 [ax, ay, az] 的旋转向量,向量的模为旋转角度(弧度)。返回:np.ndarray: 3x3 旋转矩阵。"""return o3d.geometry.get_rotation_matrix_from_axis_angle(axis_angle)def main():# 示例四元数(w, x, y, z)quaternion = [0.707, 0, 0.707, 0]rotation_matrix_from_quaternion = quaternion_to_rotation_matrix(quaternion)print("Rotation matrix from quaternion:\n", rotation_matrix_from_quaternion)# 示例欧拉角 (弧度)euler_angles = [np.pi / 4, np.pi / 4, np.pi / 4]rotation_matrix_from_euler = euler_to_rotation_matrix(euler_angles)print("Rotation matrix from euler angles:\n", rotation_matrix_from_euler)# 示例旋转向量(轴角)axis_angle = [np.pi / 4, 0, 0] # 绕 x 轴旋转 45 度rotation_matrix_from_axis_angle = axis_angle_to_rotation_matrix(axis_angle)print("Rotation matrix from axis angle:\n", rotation_matrix_from_axis_angle)if __name__ == '__main__':main()
三、数据显示
Rotation matrix from quaternion:[[-2.22044605e-16 0.00000000e+00 1.00000000e+00][ 0.00000000e+00 1.00000000e+00 0.00000000e+00][-1.00000000e+00 0.00000000e+00 -2.22044605e-16]]Rotation matrix from euler angles:[[ 0.5 -0.5 0.70710678][ 0.85355339 0.14644661 -0.5 ][ 0.14644661 0.85355339 0.5 ]]Rotation matrix from axis angle:[[ 1. 0. 0. ][ 0. 0.70710678 -0.70710678][ 0. 0.70710678 0.70710678]]