在matlab和python if中的旋转变换(四元数、欧拉角、旋转矩阵)等
在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 BAR进行变换矩阵的计算。
[ 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=[BAR0APBO1]4×4[BP1]4×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=⎣⎡qxqyqz⎦⎤3×1旋转算子 B A R ^A_BR BAR
通常是绕坐标系的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} BAR=⎣⎡cosθsinθ0−sinθcosθ0001⎦⎤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=⎣⎡1000010−10⎦⎤3×3,RZYX=⎣⎡010−100001⎦⎤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=⎣⎡10000−1010⎦⎤3×3,nZYX=⎣⎡0−10100001⎦⎤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=⎣⎡1000010−10⎦⎤3×3,nZYX=⎣⎡010−100001⎦⎤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中的旋转变换(四元数、欧拉角、旋转矩阵)等相关推荐
- matlab中quat2angle,RPY_Euler_Quaternion_AngleAxis角度转化:Matlab、Python、Halc
RPY_Euler_Quaternion_AngleAxis角度转化:Matlab.Python.Halc RPY_Euler_Quaternion_AngleAxis角度转化:Matlab.Pyth ...
- [Python+MATLAB] 在Python中使用MATLAB (持续更新中)
文章目录 在Python中安装MATLAB引擎 官方介绍 个人介绍 结果演示 常见用法 一些tips: 使用Python能使用MATLAB的函数吗? 答案是可以的! The MATLAB Engine ...
- 在win10中安装caffe并配置MATLAB和Python接口(支持GPU加速)
笔记本电脑配置(14年的老机器)CPU i54200 显卡:GTX850m 1.软件准备: vs2013 cuda8.0(官网下载,查看显卡是否支持cuda),cudnn v5.0(支持cuda8.0 ...
- 关于python文件中调用matlab函数的打包问题
1.首先说明python如何调用matlab函数的? 这里我参考的是这篇文章:(3条消息) pythonGUI调用matlab并打包成可执行文件的解决方法_白金之星1717的博客-CSDN博客_pyt ...
- (MATLAB/C/Python)快速中值滤波
(MATLAB/C/Python)快速中值滤波 一.中值滤波 二.快速中值滤波 介绍 原理 优化 三.代码 MATLAB C Python 四.测试 其他 by HPC_ZY 最近一个项目中需要用到中 ...
- trapz 函数在matlab 和 python中的区别
trapz 函数! 1.matlab 中,贝塞尔函数的表达形式 他山之石--官方文档 // matlab中的函数 Q = trapz(Y) /* 如果 Y 为向量,则 trapz(Y) 是 Y 的近似 ...
- MATLAB和Python线性系统解中的病态和正则化
线性系统解决方案中的病态 病态线性系统是一种线性系统,它对右侧矩阵上的系数矩阵或矢量的较小摄动做出响应,而系统解却发生了较大变化. 看到这一点,将向要考虑的两个示例提供两种小扰动. 在第一个示例中,将 ...
- matlab中的expotest,提高Fortran矩阵指数性能(Expokit比Matlab、Python慢)
我正在进行一个模拟,其中的瓶颈是执行大量复杂的双精度矩阵指数运算,我发现Fortran(Expokit)对于小矩阵很好,但对于较大的矩阵,它的性能比Matlab或Python差.在 我在下面包含了一个 ...
- python识别视频中某个物体的轨迹_用Matlab来识别视频中物体的运动轨迹!
对于很多生命科学领域的研究者来说,研究生物的行为是很多人研究工作中必不可少的部分.在进行生物行为研究工作的时候,生物的运动又是重中之重.这这里我以小鼠的一段运动视频为例,教大家用Matlab来分析视频 ...
最新文章
- EXCHANGE2O10用户设置外出助理失效
- linux系统程序设计
- 处理测试环境硬盘爆满
- python多久可以精通_学Python需要多久能学会?精通Python需要多长时间?
- Yum包管理工具的20个常用命令
- 视觉SLAM笔记(1) 初识SLAM
- 怎么激活linux系统远程桌面休眠状态,如何从命令行挂起/休眠?
- 初步接触TinyXML2
- (转)Javascript的DOM操作 - 性能优化
- SPOJ PGCD (mobius反演 + 分块)
- x-bov16 firmware android,MSD0431XX 松下
- matlab读取气象数据,基于MATLAB实现3种气象数据的读取和绘图
- Python 3.7.1 模块 文本处理 正则表达式 re
- 蔡军生先生第二人生的源码分析(2)第二人生的基本功能
- express 验证码功能
- moss2007 是什么_MOSS 2007站点权限
- [转]斗鱼大数据搭建的经验和坑
- emlog模板 Meta主题带后台开源版 资源娱乐网模板
- hazelcast java_Spring Boot和Hazelcast使用详解
- 阿里云服务器端口访问失败 问题解决
热门文章
- 《八》微信小程序中的 Page
- 如何理解e.clientX和e.clientY e.screenX e.screenY
- CKEditor5 支持 WPS 贴贴文字图片,默认贴贴进入空白空格
- SGAPI使用备忘录
- 关于word的那些事
- 鸿蒙空间最高级,鸿蒙天帝-第4406章:神秘的敌人
- 解决添加内存条后可用容量不变
- JAVA毕业设计济南旅游网站计算机源码+lw文档+系统+调试部署+数据库
- # 什么是Tproxy透明代理
- 逆势增长15%,烨辉医药CEO:洪水已经没至胸口,数字化势在必行