在matlab和python tf中的旋转变换(四元数、欧拉角、旋转矩阵等)

  • 目录
    • 1. 基本的认识
    • 2. 变换矩阵
    • 3. 欧拉角
    • 4. 四元数
    • 5. matlab中相互转换
    • 6. python tf中相互转换
    • 7. 一点补充及疑惑

目录

1. 基本的认识

空间中的坐标变换包括平移和旋转。

  • 平移变换较为简单,只需要加上一个位置矢量即可。
  • 旋转变换常见的有三种表示方式:旋转矩阵、欧拉角、四元数。

注:由于博主本人知识有限以及篇幅的缘故,博文十分简略,阅读本篇博客前需要一定的知识基础,有问题欢迎一起交流讨论。

2. 变换矩阵

根据《机器人学导论》,我们用平移算子 A P B O ^AP_{BO} APBO​和旋转算子 B A R ^A_BR BA​R进行变换矩阵的计算。
[ A P 1 ] 4 × 1 = [ B A R A P B O 0 1 ] 4 × 4 [ B P 1 ] 4 × 1 \begin{bmatrix}^AP\\1\end{bmatrix}_{4\times1} = \begin{bmatrix}^A_BR&^AP_{BO}\\\textbf{0}&1\end{bmatrix}_{4\times4} \begin{bmatrix}^BP\\1\end{bmatrix} _{4\times1} [AP1​]4×1​=[BA​R0​APBO​1​]4×4​[BP1​]4×1​

  1. 平移算子 A P B O ^AP_{BO} APBO​
    平移将空间中的一个点沿着一个已知的矢量方向移动一定距离。
    A P B O = [ q x q y q z ] 3 × 1 ^AP_{BO}= \begin{bmatrix}q_x\\q_y\\q_z\end{bmatrix}_{3\times1} APBO​=⎣⎡​qx​qy​qz​​⎦⎤​3×1​

  2. 旋转算子 B A R ^A_BR BA​R
    通常是绕坐标系的x、y、z轴旋转一定角度的旋转算子,遵循右手旋转法则。
    例如:绕z轴旋转 θ \theta θ角度的算子:
    B A R = [ c o s θ − s i n θ 0 s i n θ c o s θ 0 0 0 1 ] 3 × 3 ^A_BR = \begin{bmatrix} cos\theta & -sin\theta & 0 \\ sin\theta &cos\theta & 0 \\ 0 & 0 & 1 \\ \end{bmatrix}_{3\times3} BA​R=⎣⎡​cosθsinθ0​−sinθcosθ0​001​⎦⎤​3×3​
    具体原理的话可以参考原书,也可以参考原理,公式。

3. 欧拉角

欧拉角用三个数描述从一个坐标系到另一个坐标系的变换,每个数分别是绕某一个坐标轴转动的角度。网上对于欧拉角对应坐标轴的名称不是很统一,这里参考维基百科,所指的欧拉角是偏航、俯仰和滚转(yaw, pitch and roll),分别对应z,y,x轴的转角。
通常的欧拉角是intrinsic rotations,又称内在旋转,动态旋转等,每次旋转参照的坐标系是旋转后的新坐标系,也可以理解为刚体坐标系。而还有一种欧拉角是extrinsic rotations,又称固定角,外在旋转,静态旋转等,每次旋转参照的坐标系是原始的固定坐标系,两者存在一一对应的关系,以下摘自维基百科:

三个基本旋转可以围绕原始坐标系的轴发生,它保持不动(extrinsic rotations,外在旋转),或者围绕旋转坐标系的轴,在每次基本旋转后改变其方向(intrinsic rotations,内在旋转)。

为 Tait-Bryan 角选择旋转轴有六种可能性。六个可能的序列是:

  • x - y ′- z ″(内在旋转)或z - y - x(外在旋转)
  • y - z ′- x ″(内在旋转)或x - z - y(外在旋转)
  • z - x ′- y ″(内在旋转)或y - x - z(外在旋转)
  • x - z ′- y ″(内在旋转)或y - z - x(外在旋转)
  • z - y ′- x ″(内在旋转)或x - y - z(外在旋转):内在旋转称为:偏航、俯仰和滚转(ypr)
  • y - x ′- z ″(内在旋转)或z - x - y(外在旋转)

具体原理可以参考知乎问题。

4. 四元数

个人理解,某种意义上可以把四元数类比于复数,同样具有实部虚部,同样具有直角坐标形式和极坐标意义,只是把复平面拓展到了“复空间”中。
四个数分别是实部w,虚部x,y,z。在matlab中顺序为wxyz,tf库中顺序为xyzw。四元数的逆等于共轭除以模。作为旋转的四元数是单位四元数:模为1,逆和共轭相等。
具体原理请参照这个知乎回答,简洁明了,超赞!

5. matlab中相互转换

matlab中有相应的转换函数。
注意,在这里欧拉角为弧度制,四元数顺序为wxyz,欧拉角是内旋的欧拉角,默认旋转顺序为zyx,旋转矩阵为三行三列,并且对旋转矩阵进行转置才可以乘以通常的列向量位置矢量。

注释 函数
欧拉角到四元数 q = angle2quat(r1, r2, r3, s), s默认是ZYX顺序,即’ZYX’
矩阵到四元数 q = dcm2quat(n)
四元数到欧拉角 [r1 r2 r3] = quat2angle(q, s)
矩阵到欧拉角 [r1 r2 r3] = dcm2angle(n, s)
四元数到矩阵 n = quat2dcm(q)
固定角到矩阵 n = angle2dcm(r1, r2, r3, s)

6. python tf中相互转换

使用tf库需要安装tf库并在文件开头import tf,这里参考的是一篇tf笔记
注意,下面的函数前需加 tf.transformations. ,这里为了表格美观而省略了。四元数顺序为xyzw,欧拉角是外旋的固定角,默认旋转顺序为xyz。矩阵维度是44,包括旋转和平移变换,旋转变换取前33即可。

注释 函数
固定角到四元数 quaternion_from_euler(ai,aj,ak,axes=‘sxyz’)
矩阵到四元数 quaternion_from_matrix(matrix)
四元数到固定角 eular_from_quaternion(quaternion,axes=‘sxyz’)
矩阵到欧拉角 eulaer_from_matrix(matrix,axes=‘sxyz’)
四元数到矩阵 quaternion_matrix(quaternion)
固定角到矩阵 euler_matrix(ai,aj,ak,axes=‘sxyz’)

7. 一点补充及疑惑

疑惑应该是解决了。
原本博主以为matlab中是采用通常的欧拉角进行变换,但在实际测试中发现,matlab中采用q = angle2quat(r1, r2, r3, ‘zyx’)进行计算和python中采用tf.transformations.quaternion_form_euler(ai,aj,ak,axes=‘szyx’)进行计算,两者对同样的欧拉角计算得到的四元数并不相同
然后博主通过欧拉角和旋转矩阵的对应关系对此进行验证:
假设欧拉角为(1.57, 0, 0),
根据欧拉角旋转矩阵公式:

可以得到:
R X Y Z = [ 1 0 0 0 0 − 1 0 1 0 ] 3 × 3 , R Z Y X = [ 0 − 1 0 1 0 0 0 0 1 ] 3 × 3 R_{XYZ} = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 0 & -1 \\ 0 & 1 & 0 \\ \end{bmatrix}_{3\times3} , R_{ZYX} = \begin{bmatrix} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \\ \end{bmatrix}_{3\times3} RXYZ​=⎣⎡​100​001​0−10​⎦⎤​3×3​,RZYX​=⎣⎡​010​−100​001​⎦⎤​3×3​
在matlab中:
运行n = angle2dcm(1.57, 0, 0,‘xyz’)和n = angle2dcm(1.57, 0, 0,‘zyx’),得到结果:
n X Y Z = [ 1 0 0 0 0 1 0 − 1 0 ] 3 × 3 , n Z Y X = [ 0 1 0 − 1 0 0 0 0 1 ] 3 × 3 n_{XYZ} = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 0 & 1 \\ 0 & -1 & 0 \\ \end{bmatrix}_{3\times3}, n_{ZYX} = \begin{bmatrix} 0 & 1 & 0 \\ -1 & 0 & 0 \\ 0 & 0 & 1 \\ \end{bmatrix}_{3\times3} nXYZ​=⎣⎡​100​00−1​010​⎦⎤​3×3​,nZYX​=⎣⎡​0−10​100​001​⎦⎤​3×3​
在python tf中:
运行

import tf
n = tf.transformations.euler_matrix(ai,aj,ak,axes=‘sxyz’)
print(n)
n = tf.transformations.euler_matrix(ai,aj,ak,axes=‘szyx’)
print(n)

可以得到:
n X Y Z = [ 1 0 0 0 0 − 1 0 1 0 ] 3 × 3 , n Z Y X = [ 0 − 1 0 1 0 0 0 0 1 ] 3 × 3 n_{XYZ} = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 0 & -1 \\ 0 & 1 & 0 \\ \end{bmatrix}_{3\times3}, n_{ZYX} = \begin{bmatrix} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \\ \end{bmatrix}_{3\times3} nXYZ​=⎣⎡​100​001​0−10​⎦⎤​3×3​,nZYX​=⎣⎡​010​−100​001​⎦⎤​3×3​
注:实际结果中n为 4 × 4 4\times4 4×4变换矩阵,这里提取其中的 3 × 3 3\times3 3×3旋转矩阵。
对比结果可知,python中的转换函数符合和旋转矩阵的对应关系,而matlab不符合。对这个结博主还没搞清楚是为什么,只能初步下结论:python的转换结果是准确的。

在C++中也可以使用tf库,参考本链接

这是博主的第一篇博客,作为菜鸟,一直都是参照网上的教程学习,但是自己做的笔记十分的乱,在onenote、ipad、anki上都有,查找和阅读体验都十分的差,因此有了用博客的方式来系统记录和整理笔记的想法,并且在花费了半天的时间之后,终于诞生了这一篇博客。虽然内容十分简略,但总归是开始行动了。
修改多次,还存在疑惑,欢迎一起讨论
最后,有问题欢迎一起交流讨论呀,祝大家都学业有成,生活顺利!

在matlab和python if中的旋转变换(四元数、欧拉角、旋转矩阵)等相关推荐

  1. matlab中quat2angle,RPY_Euler_Quaternion_AngleAxis角度转化:Matlab、Python、Halc

    RPY_Euler_Quaternion_AngleAxis角度转化:Matlab.Python.Halc RPY_Euler_Quaternion_AngleAxis角度转化:Matlab.Pyth ...

  2. [Python+MATLAB] 在Python中使用MATLAB (持续更新中)

    文章目录 在Python中安装MATLAB引擎 官方介绍 个人介绍 结果演示 常见用法 一些tips: 使用Python能使用MATLAB的函数吗? 答案是可以的! The MATLAB Engine ...

  3. 在win10中安装caffe并配置MATLAB和Python接口(支持GPU加速)

    笔记本电脑配置(14年的老机器)CPU i54200 显卡:GTX850m 1.软件准备: vs2013 cuda8.0(官网下载,查看显卡是否支持cuda),cudnn v5.0(支持cuda8.0 ...

  4. 关于python文件中调用matlab函数的打包问题

    1.首先说明python如何调用matlab函数的? 这里我参考的是这篇文章:(3条消息) pythonGUI调用matlab并打包成可执行文件的解决方法_白金之星1717的博客-CSDN博客_pyt ...

  5. (MATLAB/C/Python)快速中值滤波

    (MATLAB/C/Python)快速中值滤波 一.中值滤波 二.快速中值滤波 介绍 原理 优化 三.代码 MATLAB C Python 四.测试 其他 by HPC_ZY 最近一个项目中需要用到中 ...

  6. trapz 函数在matlab 和 python中的区别

    trapz 函数! 1.matlab 中,贝塞尔函数的表达形式 他山之石--官方文档 // matlab中的函数 Q = trapz(Y) /* 如果 Y 为向量,则 trapz(Y) 是 Y 的近似 ...

  7. MATLAB和Python线性系统解中的病态和正则化

    线性系统解决方案中的病态 病态线性系统是一种线性系统,它对右侧矩阵上的系数矩阵或矢量的较小摄动做出响应,而系统解却发生了较大变化. 看到这一点,将向要考虑的两个示例提供两种小扰动. 在第一个示例中,将 ...

  8. matlab中的expotest,提高Fortran矩阵指数性能(Expokit比Matlab、Python慢)

    我正在进行一个模拟,其中的瓶颈是执行大量复杂的双精度矩阵指数运算,我发现Fortran(Expokit)对于小矩阵很好,但对于较大的矩阵,它的性能比Matlab或Python差.在 我在下面包含了一个 ...

  9. python识别视频中某个物体的轨迹_用Matlab来识别视频中物体的运动轨迹!

    对于很多生命科学领域的研究者来说,研究生物的行为是很多人研究工作中必不可少的部分.在进行生物行为研究工作的时候,生物的运动又是重中之重.这这里我以小鼠的一段运动视频为例,教大家用Matlab来分析视频 ...

最新文章

  1. EXCHANGE2O10用户设置外出助理失效
  2. linux系统程序设计
  3. 处理测试环境硬盘爆满
  4. python多久可以精通_学Python需要多久能学会?精通Python需要多长时间?
  5. Yum包管理工具的20个常用命令
  6. 视觉SLAM笔记(1) 初识SLAM
  7. 怎么激活linux系统远程桌面休眠状态,如何从命令行挂起/休眠?
  8. 初步接触TinyXML2
  9. (转)Javascript的DOM操作 - 性能优化
  10. SPOJ PGCD (mobius反演 + 分块)
  11. x-bov16 firmware android,MSD0431XX 松下
  12. matlab读取气象数据,基于MATLAB实现3种气象数据的读取和绘图
  13. Python 3.7.1 模块 文本处理 正则表达式 re
  14. 蔡军生先生第二人生的源码分析(2)第二人生的基本功能
  15. express 验证码功能
  16. moss2007 是什么_MOSS 2007站点权限
  17. [转]斗鱼大数据搭建的经验和坑
  18. emlog模板 Meta主题带后台开源版 资源娱乐网模板
  19. hazelcast java_Spring Boot和Hazelcast使用详解
  20. 阿里云服务器端口访问失败 问题解决

热门文章

  1. 《八》微信小程序中的 Page
  2. 如何理解e.clientX和e.clientY e.screenX e.screenY
  3. CKEditor5 支持 WPS 贴贴文字图片,默认贴贴进入空白空格
  4. SGAPI使用备忘录
  5. 关于word的那些事
  6. 鸿蒙空间最高级,鸿蒙天帝-第4406章:神秘的敌人
  7. 解决添加内存条后可用容量不变
  8. JAVA毕业设计济南旅游网站计算机源码+lw文档+系统+调试部署+数据库
  9. # 什么是Tproxy透明代理
  10. 逆势增长15%,烨辉医药CEO:洪水已经没至胸口,数字化势在必行