zoukankan      html  css  js  c++  java
  • 一文梳理旋转矩阵,欧拉角,四元数,旋转向量和齐次变换矩阵之间的联系和用途

    前言

    这几个名词都是用来描述一个物体的位置和姿态的。它们之间可以相互转化,而且各有各的优点与缺点。我先把这几个名词之间的联系理清楚,然后再解释他们各自适合的领域以及为何需要他们。旋转矩阵的初衷就是人们希望给定一个向量x,然后我对它旋转,能直接通过矩阵乘法的形式得到旋转后的向量坐标。也就是说y=Ax。这个方便计算机计算,因此旋转矩阵常用于编程。旋转矩阵是一个正交矩阵(AT=A1A^T=A^{-1})而且行列式是1。既然有了旋转矩阵那么为何还要欧拉角呢?这是因为我给你一个旋转矩阵,人看不懂它到底转了多少角度啊。计算机很容易算出来,但是对人来说非常困难。比如飞机驾驶员你让他以旋转矩阵的形式给飞机下指令,那人家不得疯了。而欧拉角那就非常直观,欧拉角就是我飞机头抬头多少(俯仰角pitch),向左拐还是向右拐(偏航角yaw),以及滚筒动作的角度(滚转角roll)。因此欧拉角一般是方便用户操作,或者程序员检查运算结果是否正确。然后有了欧拉角为何还要四元数呢?因为欧拉角有问题,即万向锁问题可以看这个解释万向锁视频。欧拉角的意思是说旋转可以分解为绕机身,机翼,垂直机身三个轴旋转。注意了是依次旋转,每次旋转后的旋转轴姿态已经变化。看下图,比如你先绕机翼那个轴转90度,然后你会发现原先(第一幅图)的滚转角(即绕原先的机身转)与现在的偏航角(绕垂直机身的那个轴)重合了。也就是说滚转这个方向等与偏航了,两个自由度合并成一个了。这样一个麻烦就是如果一个给定旋转矩阵可能会计算出多个欧拉角。于是乎,数学家就用四元数来代替欧拉角。
    在这里插入图片描述
    在这里插入图片描述
    旋转向量其实和欧拉角类似也会存在万向锁的,任何只用三个变量来描述姿态的方法都会产生万向锁。旋转向量就是方向与旋转轴相同,模为旋转角度的一个向量。之所以会用旋转向量是因为旋转矩阵用9个元素来描述三维的旋转,太浪费了。所以想用三个元素的向量来描述三维运动,这个向量就是旋转向量。齐次变换矩阵就是既包含旋转又包含平移的变换矩阵(它是4x4),旋转矩阵只包含旋转(它是3x3),齐次变换矩阵的左上角是旋转矩阵,右侧那列是平移量

    这几个名词是可以相互转换的。我就不讲公式,我只讲转换的方法。

    旋转矩阵变换到欧拉角、旋转向量

    旋转矩阵它本质是把极坐标写成矩阵的形式,它可以计算出旋转的角度然后将角度分解得到欧拉角。旋转矩阵也可以转换到旋转向量,旋转向量的方向是旋转矩阵特征值为1的那个特征向量。为什么呢?因为旋转向量的方向是旋转轴重合也就是说这个向量绕旋转轴怎么旋转都不变,即Rn=nRn=n,而这刚好是特征值为1时候的表达式。前面提到了旋转的角度是旋转向量的模。然后旋转的角度是根据rodrigues公式两边求trace(对角线元素求和)可以算出旋转的角度。

    旋转向量变换到旋转矩阵、四元数

    旋转向量变换到旋转矩阵是利用rodrigues公式.而变换到四元数是直接可以等价变换。接下来讲讲旋转向量怎么变换到四元数。
    假设旋转向量的方向向量是[nx,ny,nz][n_x,n_y,n_z],它的模是θ heta,那么变换到的四元数为[cosθ2,nxsinθ2,nysinθ2,nzsinθ2][cosfrac heta 2,n_x sin frac heta 2, n_y sin frac heta 2,n_z sin frac heta 2]。同样四元数也很容易可以变换到旋转向量。

    知乎 https://www.zhihu.com/people/yuanmuou/activities
  • 相关阅读:
    学习Windows(BAT)、Linux(Shell)编程,并分别写一个脚本文件解决自己的一个问题
    国外著名黑客信息
    设置电脑护眼配色,减少电脑对眼睛的伤害(转)
    Java基础学习笔记
    [转] java正则表达式中的数量词
    JAVA学习间项目笔记
    [转]Java堆和栈的区别 经典总结
    Delphi下Webbrowser的使用技巧
    Pascal精要笔记
    网页元素特征字符串
  • 原文地址:https://www.cnblogs.com/ailitao/p/11047266.html
Copyright © 2011-2022 走看看