坐标系转换之三:欧拉角、四元数、旋转矩阵、方向余弦矩阵、旋转向量、轴角表示

46人阅读 评论(0) 收藏 举报
分类:

坐标转换有很多种方法,不同的领域有不同的使用习惯。
上两篇文章我们讲了旋转矩阵和欧拉角,可知欧拉角是可以由旋转矩阵转化而来。
那么怎么从欧拉角转化为旋转矩阵呢?

欧拉角(Euler angles)与旋转矩阵(Rotation Matrix)

假设坐标系1的欧拉角yaw(Azimuth)、pitch、roll的角度为α,β,γ,可以由公式:

R(α,β,γ)=Rz(α)Ry(β)Rx(γ)=cosαcosβsinαcosβsinβcosαsinβsinγsinαcosγsinαsinβsinγ+cosαcosγcosβsinγcosαsinβcosγ+sinαsinγsinαsinβcosγcosαsinγcosβcosγ

旋转矩阵是一个正交矩阵,其中,

Rz(α)=cosαsinα0sinαcosα0001

Ry(β)=cosβ0sinβ010sinβ0cosβ

Rx(γ)=1000cosγsinγ0sinγcosγ

那么假设有坐标系1中的点坐标为 P1 ,经过欧拉角的旋转变换变成了坐标系2的坐标 P2,那么有


P1=RP2

注意相乘的顺序,顺序不同旋转矩阵也不同

旋转矩阵与方向余弦矩阵(Direction Cosine Matrix)

方向余弦就是各个坐标轴之间的夹角的余弦。上面提到的欧拉角就是按照某坐标轴顺序依次进行旋转,每相乘一次即乘以一个矩阵,而这个矩阵其实就是方向余弦矩阵。
比如欧拉角yaw(Azimuth),是围绕z轴旋转,那么就是乘以Rz(α)。这里的Rz(α)就是一个方向余弦矩阵。
其实可以看出,旋转矩阵就是三个方向余弦矩阵的相乘,本质上都是一样的。所以在下面的讨论中不再做区分,统称旋转矩阵。

在matlab中,可以用函数angle2dcm和dcm2angle来完成旋转矩阵与欧拉角之间的相互转换。

轴角表示(Axis-Angle)

旋转的轴角表示用两个值参数化了旋转: 一个直线(轴),和描述绕这个轴旋转的一个角。也叫做旋转的指数坐标。

比如我们可以使用<Axis,Angle>=<(x,y,z),θ>=(x,y,z,θ)来表示坐标的旋转。其中Axis可以是任意一条直线,大小也不一。

旋转向量(Rotation vector)

轴角表示很直观得说明了坐标系的旋转情况,但还是不够简洁。旋转向量本质上还是轴角表示,但是只是用了一个向量来代替。
还以上一个例子展开说明,若一个旋转情况的轴角表示为(x,y,z,θ),那么其旋转向量为

(θx,θy,θz)

其中,(x,y,z)(x,y,z)的单位向量。
旋转向量在安卓中可以用TYPE_ROTATION_VECTOR直接拿到旋转向量,但要注意的是,安卓中的旋转向量是

(xsin(θ2),ysin(θ2),zsin(θ2))

matlab中,可以使用angle2rod函数来从欧拉角转化为旋转向量。

四元数(Quaternion)

四元数是旋转向量的变种,在旋转向量前(或后)加了一项,变成了:

(cos(θ2),xsin(θ2),ysin(θ2),zsin(θ2))

设四元数


q=qiqjqkqr=qii+qjj+qkk+qr,(这里把角度放在了后面)

则需满足:


q2i+q2j+q2k+q2r=1

设有坐标系1里的点P1,需要通过四元数转换到坐标系2点P2,则有:


P2=qP1q1

其中,q1q的共轭,


q1=qiqjqkqr

四元数的好处就是计算方便快捷,安卓中可以使用getQuaternionFromVector方法由旋转矩阵得到四元数。

四元数与欧拉角的转换

注意,不同的旋转顺序,坐标表示,转换的方式都不尽相同,请在转换前留意。

若绕z-y-x轴的顺序旋转,欧拉角为yaw (ψ), pitch (θ) and roll (φ) 。
可以求出四元数q=(qi,qj,qk,qr),这里qr为角度,即角度放在了后面:


qiqjqkqr=sinϕ2cosθ2cosψ2cosϕ2sinθ2sinψ2=cosϕ2sinθ2cosψ2+sinϕ2cosθ2sinψ2=cosϕ2cosθ2sinψ2sinϕ2sinθ2cosψ2=cosϕ2cosθ2cosψ2+sinϕ2sinθ2sinψ2

若已知四元数求欧拉角:


rollpitchyaw=atan2(2(qrqi+qjqk),12(q2i+q2j))=arcsin(2(qrqjqkqi))=atan2(2(qrqk+qiqj),12(q2j+q2k))

如果把角度放在前面,即q=(q0,q1,q2,q3),有:


q=cos(ψ/2)00sin(ψ/2)cos(θ/2)0sin(θ/2)0cos(ϕ/2)sin(ϕ/2)00=cos(ϕ/2)cos(θ/2)cos(ψ/2)+sin(ϕ/2)sin(θ/2)sin(ψ/2)sin(ϕ/2)cos(θ/2)cos(ψ/2)cos(ϕ/2)sin(θ/2)sin(ψ/2)cos(ϕ/2)sin(θ/2)cos(ψ/2)+sin(ϕ/2)cos(θ/2)sin(ψ/2)cos(ϕ/2)cos(θ/2)sin(ψ/2)sin(ϕ/2)sin(θ/2)cos(ψ/2)

由欧拉角求四元数:


ϕθψ=atan2(2(q0q1+q2q3),12(q21+q22))asin(2(q0q2q3q1))atan2(2(q0q3+q1q2),12(q22+q23))

matlab中(Aerospace Toolbox),
quatmultiply,quatinv,quatconj分别对应四元数的乘法、逆、和共轭。
angle2quat和quat2angle进行欧拉角与四元数的互转。
dcm2quat和quat2dcm进行旋转矩阵与四元数的互转。
rod2quat和quat2rod进行旋转向量与四元数的互转。

Reference:

  1. matlab中各种表示之间的相互转换:http://cn.mathworks.com/help/aeroblks/axes-transformations.html
  2. 维基百科:坐标转换的各种向量介绍与转换:https://en.wikipedia.org/wiki/Rotation_formalisms_in_three_dimensions
  3. Conversion between quaternions and Euler angles:https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles
查看评论

旋转矩阵、四元数和欧拉角之间的转换——Matlab

这段时间一直在搞一些关于坐标旋转的东西,刚开始的时候很苦恼,不知道这三种方式之间怎么转换。最近终于明白怎么用Matlab来实现他们之间的转换,所以记录下来。         用R表示旋转矩阵,yaw ...
  • zzcoming
  • zzcoming
  • 2016年07月29日 15:42
  • 10263

欧拉角和旋转矩阵的转换

欧拉角是一种常用的描述方位的方法。这项技术是著名数学家Leonhard Euler(1707~1783)的名字命名的,他证明了角位移序列等价于单个角位移。想详细了解的请点击维基百科:http://zh...
  • xufuyuan
  • xufuyuan
  • 2015年11月17日 20:20
  • 12713

矩阵欧拉角四元数转换软件

  • 2014年11月25日 22:25
  • 247KB
  • 下载

由旋转矩阵求欧拉角

  • 2015年09月06日 20:40
  • 93KB
  • 下载

旋转矩阵、欧拉角、四元数、轴/角之间的转换

在机器人学中,表示旋转的有四种方式。不同的人可能习惯于用不同的方法,现将四种方式之间的转换整理出来如下。 旋转矩阵 旋转矩阵R表示坐标系`O-x'y'z'`中的向量坐标变换为同一向量在坐标...
  • xuehuafeiwu123
  • xuehuafeiwu123
  • 2017年07月12日 17:24
  • 3747

四元数、欧拉角、方向余弦矩阵

欧拉角转换成方向余弦矩阵欧拉角有12中旋转顺序分别为 1 X-Y-Z 2 X-Z-Y 3 X-Y-X 4 X-Z-X ….. 每种旋转顺序可以分解为3次旋转,每次旋转或者围绕X轴,或者绕Y轴,或者绕...
  • qq_27114397
  • qq_27114397
  • 2016年11月21日 21:16
  • 3165

旋转矩阵求欧拉角的简单算法

  • 2009年12月14日 19:29
  • 187KB
  • 下载

机器人旋转矩阵与欧拉角转换公式

  • 2015年12月29日 13:07
  • 108KB
  • 下载

Eigen中欧拉角,旋转向量,旋转矩阵,四元数的转换

三维空间的旋转可以用欧拉角,旋转向量,旋转矩阵,四元数来表示。 首先是欧拉角表示法,我们可以用绕某个轴旋转来表示。 旋转向量就是用一个旋转轴和一个旋转角来表示旋转。 旋转矩阵用一个矩阵来表示空间...
  • ktigerhero3
  • ktigerhero3
  • 2017年07月26日 17:58
  • 3162

Slam编程一 旋转向量、旋转矩阵,欧拉角、变换矩阵和四元数

任意旋转可用一个旋转轴和一个旋转角度来表示。 旋转向量,旋转向量的方向与旋转轴一致,长度为旋转角度。 在三维坐标下定义旋转轴为向量n(0,1,0)即旋转轴为y轴,旋转角度为k=30. 则旋转向量...
  • ChouPiJang
  • ChouPiJang
  • 2017年09月13日 20:10
  • 469
    新家地址
    个人资料
    持之以恒
    等级:
    访问量: 7万+
    积分: 1836
    排名: 2万+
    最新评论