转换矩阵、平移矩阵、旋转矩阵关系以及python实现旋转矩阵、四元数、欧拉角之间转换


由于在平时总是或多或少的遇到平移旋转的问题,每次都是现查资料,然后查了忘,忘了继续查,这次弄明白之后干脆写一篇文章,给人方便同时于己方便,后续如有扩充或变动也方便添加。

1. 转换矩阵、平移矩阵、旋转矩阵之间的关系

假设有两个向量转换矩阵、平移矩阵、旋转矩阵关系以及python实现旋转矩阵、四元数、欧拉角之间转换转换矩阵、平移矩阵、旋转矩阵关系以及python实现旋转矩阵、四元数、欧拉角之间转换,它们的转换关系为:

转换矩阵、平移矩阵、旋转矩阵关系以及python实现旋转矩阵、四元数、欧拉角之间转换
这里转换矩阵、平移矩阵、旋转矩阵关系以及python实现旋转矩阵、四元数、欧拉角之间转换就是它的旋转矩阵转换矩阵、平移矩阵、旋转矩阵关系以及python实现旋转矩阵、四元数、欧拉角之间转换就是它的平移矩阵。使用齐次方式表示如下:

转换矩阵、平移矩阵、旋转矩阵关系以及python实现旋转矩阵、四元数、欧拉角之间转换
使用元素值替换后,表示如下:
转换矩阵、平移矩阵、旋转矩阵关系以及python实现旋转矩阵、四元数、欧拉角之间转换
在仿射变换中的转换矩阵表示先线性变换再平移。在这里转换矩阵表示如下:
转换矩阵、平移矩阵、旋转矩阵关系以及python实现旋转矩阵、四元数、欧拉角之间转换
平移矩阵表示如下:
转换矩阵、平移矩阵、旋转矩阵关系以及python实现旋转矩阵、四元数、欧拉角之间转换
旋转矩阵表示如下:
转换矩阵、平移矩阵、旋转矩阵关系以及python实现旋转矩阵、四元数、欧拉角之间转换

2. 缩放变换、平移变换和旋转变换

如果理解以上知识点之后,缩放变换、平移变换和旋转变换的特殊情况也迎刃而解。

缩放变换只是在尺度上进行改变,所以它的变换形式如下:

转换矩阵、平移矩阵、旋转矩阵关系以及python实现旋转矩阵、四元数、欧拉角之间转换

平移变换的时候,角度不发生改变,也就是旋转矩阵R为单位矩阵,所以它的变换形式如下:

转换矩阵、平移矩阵、旋转矩阵关系以及python实现旋转矩阵、四元数、欧拉角之间转换

当空间内的物体绕着 x 轴,y 轴或者 z 轴旋转的时候,变换矩阵为:

转换矩阵、平移矩阵、旋转矩阵关系以及python实现旋转矩阵、四元数、欧拉角之间转换

转换矩阵、平移矩阵、旋转矩阵关系以及python实现旋转矩阵、四元数、欧拉角之间转换

这三个角就被称作欧拉角(Euler angles)。

2. python实现旋转矩阵、四元数、欧拉角互相转化

在应用中,我们往往会遇到旋转矩阵、四元数和欧拉角之间的互相转换,在这里,我们只使用python代码来实现它们之间互相转换。

from scipy.spatial.transform import Rotation as R

def quaternion2euler(quaternion):
    r = R.from_quat(quaternion)
    euler = r.as_euler('xyz', degrees=True)
    return euler

def euler2quaternion(euler):
    r = R.from_euler('xyz', euler, degrees=True)
    quaternion = r.as_quat()
    return quaternion

def euler2rotation(euler):
    r = R.from_euler('xyz', euler, degrees=True)
    rotation_matrix = r.as_matrix()
    return rotation_matrix

def quaternion2rotation_matrix(quaternion):
    r = R.from_quat(quaternion)
    rotation_matrix = r.as_matrix()
    return rotation_matrix

def rotation_matrix2euler(rotation_matrix):
    r = R.from_matrix(rotation_matrix)
    euler = r.as_euler('xyz', degrees=True)
    return euler
    

def rotation_matrix2quaternion(rotation_matrix):
    r = R.from_matrix(rotation_matrix)
    quaternion = r.as_quat()
    return quaternion

if __name__ == '__main__':
    # 四元数=>欧拉角
    quaternion = [0.71934025092983234, -1.876085535681999e-06, -3.274841213980097e-08, -0.69465790385533299]
    euler = quaternion2euler(quaternion) # [-9.20000743e+01  1.52039496e-04 -1.52039496e-04]
    print(f'euler: {euler}')
    
    # 四元数=>旋转矩阵
    rotation_matrix = quaternion2rotation_matrix(quaternion)
    print(f'rotation_matrix: {rotation_matrix}')
    
    # 欧拉角=>四元数
    quaternion = euler2quaternion(euler)
    print(f'quaternion: {quaternion}') # [-7.19340251e-01  1.87608554e-06  3.27484122e-08  6.94657904e-01]
    
    # 欧拉角=>旋转矩阵
    rotation_matrix = euler2rotation(euler)
    print(f'rotation_matrix: {rotation_matrix}')
    
    # 旋转矩阵=>欧拉角
    euler = rotation_matrix2euler(rotation_matrix)
    print(f'euler: {euler}')
    
    # 旋转矩阵=>四元数
    quaternion = rotation_matrix2quaternion(rotation_matrix)
    print(f'quaternion: {quaternion}')

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2023年3月30日
下一篇 2023年3月30日

相关推荐