旋转变换

旋转变换最为直观的表示方法是“轴-角”:绕着某一个过原点轴,旋转某一角度。

轴可以用一个单位长度的点[w1,w2,w3][w1,w2,w3]表示:原点到该点的射线即为此轴。

使用右手座标系,拇指指向轴方向,四指方向即为旋转的方向。

一个旋转变换可以用用欧拉角、四元数或者旋转矩阵表示。以下讨论不同表示方法之间的关系,以及旋转变换的合成、取逆等操作。

旋转矩阵

旋转可以看做一种特殊的座标变换,而座标变换可以用用3×33×3矩阵RR来表示。对一个座标施加旋转的结果是x′=Rxx′=Rx。

旋转矩阵可以在不同座标系之间进行变换,但不能进行“反演”,即不能在左手系和右手系之间进行变换。

旋转矩阵是正交矩阵,即|R|=1|R|=1,旋转变换不改变向量的长度。

欧拉角的物理意义

任何一个旋转可以表示为依次绕着三个旋转轴旋三个角度的组合。这三个角度称为欧拉角。

三个轴可以指固定的世界座标系轴,也可以指被旋转的物体座标系的轴。三个旋转轴次序不同,会导致结果不同。

本文中提到的欧拉角指:绕着世界座标系的x,y,z轴,依次旋转的结果。其取值范围如下:

θx∈(−π,π),θy∈(−π2,π2),θz∈(−π,π)

θx∈(−π,π),θy∈(−π2,π2),θz∈(−π,π)

欧拉角→→旋转矩阵

单独绕一个轴旋转θθ角度的旋转矩阵为:

如果依次绕x轴、y轴、z轴旋转,该变换的旋转矩阵为:

R=Rz⋅Ry⋅Rx

R=Rz⋅Ry⋅Rx

记三个轴欧拉角的正弦和余弦函数为sx,cx,sy,cy,sz,czsx,cx,sy,cy,sz,cz。使用matlab的syms功能可以轻松推导旋转矩阵RR:

⎡⎣⎢cyczcysz−syczsxsy−cxszcxcz+sxsyszcysxsxsz+cxczsycxsysz−czsxcxcy⎤⎦⎥

[cyczczsxsy−cxszsxsz+cxczsycyszcxcz+sxsyszcxsysz−czsx−sycysxcxcy]

旋转矩阵→→欧拉角

设旋转矩阵i行j列元素为rijrij。根据旋转矩阵的表达式,利用三角函数可以推导出欧拉角取值:

θx=atan2(r32,r33)

θx=atan2(r32,r33)

θy=atan2(−r31,r232+r233−−−−−−−√)

θy=atan2(−r31,r322+r332)

θz=atan2(r21,r11)

θz=atan2(r21,r11)

四元数的物理意义

设有一个通过原点[0,0,0][0,0,0]的旋转轴,该轴上单位长度的点为[w1,w2,w3][w1,w2,w3]。绕此轴旋转θθ角的变换可以用一个向量表示:

[cosθ2,w1sinθ2,w2sinθ2,w3sinθ2]

[cos⁡θ2,w1sin⁡θ2,w2sin⁡θ2,w3sin⁡θ2]

也记为q=[q0,q1,q2,q3]q=[q0,q1,q2,q3],或者q=q0+q1i+q2j+q3kq=q0+q1i+q2j+q3k。四元数的模长为1:

q20+q21+q22+q23=cos2θ2+sin2θ2(w21+w22+w33)=cos2θ2+sin2θ2=1

q02+q12+q22+q32=cos2⁡θ2+sin2⁡θ2(w12+w22+w33)=cos2⁡θ2+sin2⁡θ2=1

四元数→→旋转矩阵

此段公式暂不确定,请您参看评论讨论

利用罗德里格旋转公式可以获得绕某过原点一轴[w1,w2,w3][w1,w2,w3]旋转某一角度θθ的旋转矩阵RR:

⎡⎣⎢cosθ+w21(1−cosθ)w1w2(1−cosθ)−w2sinθw1w2(1−cosθ)cosθ+w22(1−cosθ)w1sinθw2sinθ−w1sinθcosθ⎤⎦⎥

[cos⁡θ+w12(1−cos⁡θ)w1w2(1−cos⁡θ)w2sin⁡θw1w2(1−cos⁡θ)cos⁡θ+w22(1−cos⁡θ)−w1sin⁡θ−w2sin⁡θw1sin⁡θcos⁡θ]

代入四元组的表示方法,可得:

⎡⎣⎢⎢1−2q22−2q232q1q2+2q3q02q1q3−2q2q02q1q2−2q3q01−2q21−2q232q2q3+2q1q02q1q3+2q2q02q2q3−2q1q01−2q21−2q22⎤⎦⎥⎥

[1−2q22−2q322q1q2−2q3q02q1q3+2q2q02q1q2+2q3q01−2q12−2q322q2q3−2q1q02q1q3−2q2q02q2q3+2q1q01−2q12−2q22]

旋转矩阵→→四元数

此段公式暂不确定,请您参看评论讨论

根据旋转矩阵的表达式,利用三角函数性质,可以由旋转矩阵得到四元数:

q0=1+r11+r22+r33−−−−−−−−−−−−−−−√2

q0=1+r11+r22+r332

q1=r32−r234q0

q1=r32−r234q0

q2=r13−r314q0

q2=r13−r314q0

q3=r21−r124q0

q3=r21−r124q0

开根号要求1+Tr(R)>01+Tr(R)>0(其中TrTr表示矩阵的迹,等于对角元素之和,也等于特征值之和),分式要求q0≠0q0≠0。

某些情况下(例如θ=πθ=π),q0q0接近零,Tr(R)Tr(R)接近-1,需要使用以下方式求解(来源于此处)。

如果r11,r22,r33r11,r22,r33中,r11r11最大:

S=1+r11−r22−r33−−−−−−−−−−−−−−−√

S=1+r11−r22−r33

q0=r32−r23S

q0=r32−r23S

q1=S/4

q1=S/4

q2=r12+r21S

q2=r12+r21S

q3=r21+r12S

q3=r21+r12S

如果r11,r22,r33r11,r22,r33中,r22r22最大:

S=1−r11+r22−r33−−−−−−−−−−−−−−−√

S=1−r11+r22−r33

q0=r13−r31S

q0=r13−r31S

q1=r12+r21S

q1=r12+r21S

q2=S/4

q2=S/4

q3=r23+r32S

q3=r23+r32S

如果r11,r22,r33r11,r22,r33中,r33r33最大:

S=1−r11−r22+r33−−−−−−−−−−−−−−−√

S=1−r11−r22+r33

q0=r21−r12S

q0=r21−r12S

q1=r13+r31S

q1=r13+r31S

q2=r23−r32S

q2=r23−r32S

q3=S/4

q3=S/4

变换的逆

使用欧拉角表示时,必须颠倒三个旋转轴的顺序,同时对旋转角度取反。

使用旋转矩阵表示时,求矩阵的逆即可:R∗=R−1R∗=R−1。

使用四元组表示时,考虑其物理意义,对后三位取反即可:q−1=[q0,−q1,−q2,−q3]q−1=[q0,−q1,−q2,−q3]。

向量的叉乘

接下去讨论之前,需要先复习向量的叉乘。

三维空间中的一个点可以表示为向量[xi,yj,zk][xi,yj,zk],其中i,j,ki,j,k是三个座标轴:[1,0,0],[0,1,0],[0,0,1][1,0,0],[0,1,0],[0,0,1]。

两个向量a,ba,b叉乘的结果是一个向量,其长度为|a||b|sinθ|a||b|sin⁡θ。θθ表示从向量aa到bb的小于180°的角度。其方向垂直于a,ba,b所在平面,遵循右手定则:四指从aa转向bb,拇指方向为叉乘结果方向。

四元组作为一种向量,其叉乘涉及到虚数单位的乘法,遵循以下原则:

i×i=−1

i×i=−1

i×j=−j×i

i×j=−j×i

i×j=k,j×k=i,k×i=j

i×j=k,j×k=i,k×i=j

叉乘满足反交换律:

a×b=−b×a

a×b=−b×a

联想叉乘的物理意义:交换了a,ba,b顺序,则拇指方向反转。

叉乘满足加法分配律:

(a+b)×c=a×c+b×c

(a+b)×c=a×c+b×c

特别要注意,叉乘不满足结合律:

(a×b)×c≠a×(b×c)

(a×b)×c≠a×(b×c)

四元数的叉乘

四元数既不是矢量也不是标量。可以看做一个标量q0q0和一个三维矢量[q1,q2,q3][q1,q2,q3]的结合体:q=q0+q1i+q2j+q3kq=q0+q1i+q2j+q3k。

两个四元数a1+a2i+a3j+a4ka1+a2i+a3j+a4k,b1+b2i+b3j+b4kb1+b2i+b3j+b4k,相乘的结果q=a×bq=a×b:

q0=a1b1−a2b2−a3b3−a4b4

q0=a1b1−a2b2−a3b3−a4b4

q1=a1b2+a2b1+a3b4−a4b3

q1=a1b2+a2b1+a3b4−a4b3

q2=a1b3−a2b4+a3b1+a4b2

q2=a1b3−a2b4+a3b1+a4b2

q3=a1b4+a2b3−a3b2+a4b1

q3=a1b4+a2b3−a3b2+a4b1

四元数叉乘不满足交换律、结合律。

变换的组合

使用欧拉角表示时,很难直接组合两个变换。

使用旋转矩阵表示时,依次做矩阵相乘即可:R=R2R1R=R2R1。

使用四元组表示时,需要对两个四元组叉乘:q=q2×q1q=q2×q1。

注意,先发生的变换要放在乘号右侧。

由于叉乘不满足结合律,当有一系列变化q1,q2,q3…q1,q2,q3…陆续发生时,要用括号保证乘法发生的顺序:

q=q4×(q3×(q2×q1))

q=q4×(q3×(q2×q1))

使用四元数

首先把待旋转的点(x,y,z)(x,y,z)表示成四元数形式:p=[0,x,y,z]p=[0,x,y,z]。这里的四元数不再表示一个旋转,所以模长不一定为1。

对该点pp施加旋转变换qq,通过四元组的两次叉乘实现:p′=q×p×q−1=[0,x′,y′,z′]p′=q×p×q−1=[0,x′,y′,z′]。

利用matlab的syms功能(参看附录),可以得到对三维点[x,y,z][x,y,z]施加变换[q0,q1,q2,q3][q0,q1,q2,q3]的结果:

x′=x(q20+q21−q22−q23)+2y(q1q2−q0q3)+2z(q0q2+q1q3)

x′=x(q02+q12−q22−q32)+2y(q1q2−q0q3)+2z(q0q2+q1q3)

y′=2x(q0q3+q1q2)+y(q20−q21+q22−q23)+2z(−q0q1+q2q3)

y′=2x(q0q3+q1q2)+y(q02−q12+q22−q32)+2z(−q0q1+q2q3)

z′=2x(−q0q2+q1q3)+2y(q0q1+q2q3)+z(q20−q21−q22+q23)

———————

作者:shenxiaolu1984

来源:CSDN

原文:https://blog.csdn.net/shenxiaolu1984/article/details/50639298

版权声明:本文为博主原创文章,转载请附上博文链接!

matlab 罗德里格 公式,旋转矩阵,四元素,欧拉角相关推荐

  1. 手眼标定(python、realsense、jaka);四元素、欧拉角、旋转矢量到旋转矩阵转换

    一.相机到机械臂末端位姿自动标定 机械臂和realsense初始化: import jkrc import math import time import pyrealsense2 as rs imp ...

  2. 四元素定义、运算、插值、与欧拉角之间的转换

    在3D图形学中,最常用的旋转表示方法便是四元数和欧拉角,比起矩阵来具有节省存储空间和方便插值的优点.本文主要归纳了两种表达方式的转换,计算公式采用3D笛卡尔坐标系: 定义..分别为绕Z轴.Y轴.X轴的 ...

  3. 基于四元素法的捷联惯导姿态更新算法

    摘要          本文主要介绍了机载捷联惯导系统常用的姿态更新算法--四元素法,并重点介绍了利用四元素法进行姿态更新的一般过程.        关键词:四元素法,连贯导,姿态 1 引言      ...

  4. 四元素基础理论及其应用

    在阅读<Indirect Kalman Filter for 3D Attitude Estimation>一文时,发现文中对四元素的定义采用了非Hamilton方式,阅读有一些冲突,难以 ...

  5. matlab图形绘制经典案例,MATLAB经典教程第四章_图形绘制.ppt

    <MATLAB经典教程第四章_图形绘制.ppt>由会员分享,可在线阅读,更多相关<MATLAB经典教程第四章_图形绘制.ppt(32页珍藏版)>请在人人文库网上搜索. 1.Ma ...

  6. matlab m语言,我要编写matlab一个公式的m语言,请问错在哪里?,M语言的MATLAB的M语言...

    导航:网站首页 > 我要编写matlab一个公式的m语言,请问错在哪里?,M语言的MATLAB的M语言 我要编写matlab一个公式的m语言,请问错在哪里?,M语言的MATLAB的M语言 匿名网 ...

  7. VR开发-罗德里格公式的研究

    最近在做VR方面的研究,看到了Google Cardboard对传感器处理的代码,对旋转矩阵.罗德里格公式做了一些研究. 罗德里格公式是计算三维空间中,一个向量绕旋转轴旋转给定角度以后得到的新向量的计 ...

  8. 几何基础 罗德里格公式

    罗德里格公式说明了轴角表示方式,以及和旋转矩阵之间的关系. 参考与致谢 罗格里德旋转计算 https://www.cnblogs.com/wtyuan/p/12324495.html -------- ...

  9. Unity3D学习笔记(八):四元素和书籍推荐

    书籍推荐: 3D数学基础:图形与游戏开发--游戏软件开发专家系列(美)邓恩 Unity Shader入门精要 冯乐乐(92年) 数据结构(Python语言描述) 数据结构.算法与应用(C++语言描述) ...

最新文章

  1. 了解下WSDL 文档
  2. 深度优先搜索(dfs),城堡问题
  3. golang 接口类型 interface 简介
  4. python组合数据类型有哪些_Python学习之组合数据类型
  5. MySQL 中 delete 语句的子查询限制
  6. 【渝粤题库】陕西师范大学292241金融市场学Ⅰ 作业(高起专)
  7. 蚂蚁三面题目(java开发岗):Java锁机制+JVM+线程池+事务+中间件
  8. 换了一个皮肤,心情也好多了
  9. 使用easy_install安装BeautifulSoup——Python
  10. python获取文件修改时间_Python-获取文件最后修改时间 | 学步园
  11. 浙江计算机二级c语言考试,浙江计算机二级考试(C语言)上机试题
  12. 【实用工具】一键在线抠图、一键在线更换图片背景、一键更换证件照片背景颜色的神奇AI网站 RemoveBg
  13. 动平衡仪制作方法总结
  14. 微信文件管理更改文件夹移动报错
  15. AutoJs学习-实现自动刷快手极速版
  16. Excel模板导出并插入图片
  17. 数据库表数据如何去重
  18. oracle 无法分配32字节,ORA-04031:无法分配 32 字节的共享内存
  19. 独立钻石Solitaire算法求解
  20. 镜头选择基础和视觉系统

热门文章

  1. 法国Nao机器人在C++开发中如何使用外部库
  2. 项目练习:构建读写分离的数据库集群
  3. 自学python第四课——字符串运算符、字符串内置函数、字符串常用方法总结
  4. WiTricity科技助力中国电动汽车无线充电标准
  5. Denso 盘点机应用介绍
  6. 基于深度学习框架的火灾识别报警平台搭建----OpenCV3.1.0读取dav视频数据出错
  7. VB的天地,横看成岭侧成峰
  8. Java中级部分内容笔记 异常 I/O 集合框架 泛型 Lambda
  9. 在知识分享的时代,你焦虑个毛啊
  10. Unity粒子动态更改层级