iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >转换矩阵、平移矩阵、旋转矩阵关系以及python实现旋转矩阵、四元数、欧拉角之间转换
  • 150
分享到

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

python变换矩阵旋转矩阵欧拉角四元数平移矩阵 2023-09-17 17:09:52 150人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

文章目录 1. 转换矩阵、平移矩阵、旋转矩阵之间的关系2. 缩放变换、平移变换和旋转变换2. python实现旋转矩阵、四元数、欧拉角互相转化 由于在平时总是或多或少的遇到平移旋转的问题,

文章目录


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

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

假设有两个向量 a1 = ( x1 , y1 , z1 ) a_1 = (x_1, y_1, z_1) a1=(x1,y1,z1) a2 = ( x2 , y2 , z2 ) a_2 = (x_2, y_2, z_2) a2=(x2,y2,z2),它们的转换关系为:

a 1 =R∗ a 2 +T a_1 = R * a_2 + T a1=Ra2+T
这里 R R R就是它的旋转矩阵 T T T就是它的平移矩阵。使用齐次方式表示如下:

( a 1 1 ) = ( R T 0 1 ) ∗ ( a 2 1 ) \begin{pmatrix} a_1\\ 1 \end{pmatrix}= \begin{pmatrix} R&T\\ 0&1 \end{pmatrix}* \begin{pmatrix} a_2\\1 \end{pmatrix} (a11)=(R0T1)(a21)
使用元素值替换后,表示如下:
( x 1 y 1 z 1 1 ) = ( r 11 r 12 r 13 t 1 r 21 r 22 r 23 t 2 r 31 r 32 r 33 t 3 0 0 0 1 ) ∗ ( x 2 y 3 z 2 1 ) \begin{pmatrix} x_1\\y_1\\z_1\\1 \end{pmatrix}= \begin{pmatrix} r_{11}&r_{12}&r_{13}&t_{1}\\ r_{21}&r_{22}&r_{23}&t_{2}\\ r_{31}&r_{32}&r_{33}&t_{3}\\ 0&0&0&1 \end{pmatrix}* \begin{pmatrix} x_2\\y_3\\z_2\\1 \end{pmatrix} x1y1z11 = r11r21r310r12r22r320r13r23r330t1t2t31 x2y3z21
在仿射变换中的转换矩阵表示先线性变换再平移。在这里转换矩阵表示如下:
转换矩阵= ( r 11 r 12 r 13 t 1 r 21 r 22 r 23 t 2 r 31 r 32 r 33 t 3 0 0 0 1 ) 转换矩阵= \begin{pmatrix} r_{11}&r_{12}&r_{13}&t_{1}\\ r_{21}&r_{22}&r_{23}&t_{2}\\ r_{31}&r_{32}&r_{33}&t_{3}\\ 0&0&0&1 \end{pmatrix} 转换矩阵= r11r21r310r12r22r320r13r23r330t1t2t31
平移矩阵表示如下:
平移矩阵T= ( t 1 t 2 t 3 ) 平移矩阵T=\begin{pmatrix} t_{1}\\ t_{2}\\ t_{3}\\ \end{pmatrix} 平移矩阵T= t1t2t3
旋转矩阵表示如下:
旋转矩阵R= ( r 11 r 12 r 13 r 21 r 22 r 23 r 31 r 32 r 33 ) 旋转矩阵R=\begin{pmatrix} r_{11}&r_{12}&r_{13}\\ r_{21}&r_{22}&r_{23}\\ r_{31}&r_{32}&r_{33} \end{pmatrix} 旋转矩阵R= r11r21r31r12r22r32r13r23r33

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

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

  • 缩放变换

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

在这里插入图片描述

  • 平移变换

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

在这里插入图片描述

  • 旋转变换

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

在这里插入图片描述
对于一般性的旋转问题,可以用简单的旋转描述复杂的旋转。用 x 轴,y 轴和 z 轴上的旋转来定义旋转:

在这里插入图片描述

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

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

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

from scipy.spatial.transfORM import Rotation as Rdef quaterNIOn2euler(quaternion):    r = R.from_quat(quaternion)    euler = r.as_euler('xyz', degrees=True)    return eulerdef euler2quaternion(euler):    r = R.from_euler('xyz', euler, degrees=True)    quaternion = r.as_quat()    return quaterniondef euler2rotation(euler):    r = R.from_euler('xyz', euler, degrees=True)    rotation_matrix = r.as_matrix()    return rotation_matrixdef quaternion2rotation_matrix(quaternion):    r = R.from_quat(quaternion)    rotation_matrix = r.as_matrix()    return rotation_matrixdef 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 quaternionif __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}')

来源地址:https://blog.csdn.net/QLeelq/article/details/129057441

--结束END--

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

本文链接: https://www.lsjlt.com/news/411252.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作