刚体的姿态(attitude)有很多种表示方法,关于这个话题有一篇十分出名的综述[1],也是这篇文章的主要资料来源。这篇文章从二维旋转开始,会讨论旋转矢量、旋转矩阵、四元数、欧拉角等旋转的表示方法。在开始讨论前,需要明确的一点是刚体的姿态具有三个自由度,但使用三个参数对姿态进行全局的、没有奇异性的描述已经被证明是不可能的[2],这也是近来IMU姿态估计的方法大多使用四元数或旋转矩阵的原因。

  1. 二维旋转的表示

相比在三维空间中的旋转,二维旋转十分直观且易于理解。二维旋转指将二维平面上的一个向量

(起点为原点)绕原点旋转一个角度
,得到一个新的向量
。角度
可以完全描述这个旋转操作,因此是最直接的二维旋转的表示方法。但需要注意的是,因为角度具有周期性,任何相差
的整数倍的两个角度所代表的旋转是相同的(只考虑旋转的结果),所以表示角度的空间不是实数集
,而是一个商空间

这个商空间可以和平面上的单位圆做一一对应:

,也就是说,我们可以认为单位圆上的每一个点,对应了一个独特的旋转操作,这也是二维旋转的第二种表示方法。最后,如果我们把旋转后得到的向量写成坐标的形式,可以得到:
(1)

其中

被称为二维旋转矩阵,可以和
作一一对应,是二维旋转的第三种表示方法。旋转矩阵是行列式为1的正交矩阵,也就是说它的每个列向量都是单位向量,每两个列向量都是互相正交(垂直)的。

2. 旋转矢量(rotation vector)

三维旋转和二维旋转的不同是:二维旋转永远绕着垂直于平面的轴旋转,但三维旋转可以绕三维空间内的任意一根轴旋转。根据欧拉旋转定理,任何一个三维旋转可以表示为绕一根转轴

旋转一个角度
,在这里我们约定转轴
用单位向量表示。因此最直接的三维旋转的表示方法就是单位向量
和角度
,这种方法被称为欧拉轴-角(axis-angle)。为了一些计算上的方便,我们可以把轴和角相乘,得到一个三维空间内的一般向量
,很容易验证
和欧拉轴-角是一一对应的,这也就是三维旋转的另一种表示方法,即所谓的旋转矢量。需要注意的是,和二维旋转的角度表示法类似,旋转矢量也具有周期性:任何方向相同,长度相差
的整数倍(可以将负的长度理解为方向相反的向量)的两个旋转矢量表示相同的旋转。因此如果考虑独特的旋转,我们可以把旋转矢量限制在半径为
的三维球体内。

如果在三维空间内一个向量

经过旋转矢量
所表示的旋转操作后得到
,那么它们两者有以下关系(Rodrigues' rotation formula):
(2)

最后需要说明的是,当

时,旋转矢量
的导数会出现无穷大的情况,这也是旋转矢量表示方法的奇异点。

3. 旋转矩阵(rotation matrix)

类似于二维旋转,

的关系也可以用矩阵的形式来表示:
(3)

其中

被称为旋转矩阵,也是 IMU 姿态表示中最常用到的方法。表示三维旋转的旋转矩阵
是一个3×3,行列式为 1 的正交矩阵,也就是说它的每个列向量都是单位向量,每两个列向量互相正交(垂直)。可以证明两个旋转矩阵的乘积还是旋转矩阵,所以全部旋转矩阵构成一个“群”,也就是著名的 SO(3) 群,其中群的乘法就是矩阵的乘法。需要注意的是,矩阵的乘法是不交换的,也就是说一般情况下
,这意味着连续进行的两个旋转如果交换顺序,那么旋转的结果也会不同。

旋转矩阵可以由旋转矢量计算得到:

(4)

其中

表示叉积矩阵,也就是对任意向量
,它的表达式为:
(5)

最后需要说明的是,(4)可以写成指数矩阵的表达形式:

,其中指数矩阵指:

4. 单位四元数(unit quaternion)

四元数是对复数数系的进一步拓展,由四个实数表示:

。三个虚数单位服从以下的运算规则:
。三维旋转可以用单位四元数表示,即
的四元数。四元数有以下几种常见的运算:

(i) 乘法:

(ii) 幂:

(iii) 共轭:

(iv) 逆:

对于单位四元数,它的逆运算和共轭运算的结果是一样的。需要注意的是,与旋转矩阵类似,四元数的乘法也是不交换的。

表示一个三维旋转的单位四元数可以由旋转矢量

计算得到:
(6)

代入上式可以得到
,这意味着
表示相同的三维旋转。这是单位四元数一个非常重要的性质,它和三维旋转并不是一一对应的,而是 2 比 1 的对应关系。与旋转矩阵类似,(6)也可以用指数函数的形式表示:如果将三维向量
写为一个实部为 0 的四元数
,那么
,其中四元数的指数函数为
。四元数也可以和旋转矩阵之间互相转换,具体公式可以通过欧拉轴-角表示法(4) 和 (6) 间接得到。

最后,与旋转矩阵类似,一个向量

经过单位四元数
所表示的旋转操作后,得到的
也有很简单的形式:
(7)

5. 欧拉角(Euler angles)

欧拉角大概是最常用到的姿态表示方法了,它的思路是把一个三维旋转分解为三个绕坐标轴的旋转。欧拉角使用时最令人困惑的地方在于它的不同定义方法:根据三个坐标轴的不同顺序,可以有12种定义方法;根据坐标轴是惯性坐标系(extrinsic)还是体坐标系(intrinsic),可以有2种定义方法。因此,一共有24种可能的方法来定义欧拉角,而且这些定义方式没有一种是通用的,因此每次使用欧拉角时一定要说明是哪种定义。在量子力学中,最常用的欧拉角是体坐标系 z-x'-z'';我个人比较喜欢的一种欧拉角是体坐标系 z-y'-x'',其中三个旋转角度也叫作yaw(航向角),pitch(俯仰角)和roll(横滚角)。

体坐标系欧拉角z-x-z,xyz是原始坐标系,XYZ是旋转后的坐标系
体坐标系欧拉角z-y-x,xyz是原始坐标系,XYZ是旋转后的坐标系

欧拉角可以很方便地转化为旋转矩阵,其中绕三个坐标轴的旋转分别可以转化为如下的旋转矩阵:

(i) 绕x轴旋转

(ii) 绕y轴旋转

(iii) 绕z轴旋转

对于用惯性坐标系定义的欧拉角,可以按坐标轴顺序将以上三个基本旋转矩阵左乘;而用体坐标系定义的欧拉角,则需按坐标轴顺序右乘。例如体坐标系 z-y'-x'' 欧拉角所对应的旋转矩阵是:

(8)

因为三维旋转具有三个自由度,所以欧拉角是所有姿态的表示方法中需要用到参数最少的一种,也就是只用到三个参数。但是这样的简化也带来了一些不方便的地方,在这里我们讨论欧拉角的两个缺点。第一个是欧拉角具有周期性,但和旋转矢量不同,它的周期性很不直观。以体坐标系 z-y'-x'' 欧拉角为例,它三个角度的范围是:

。这三个角度不仅以
为周期,而且通过
的公式可以验证:
表示的是相同的三维旋转。这样非常规的周期性在实践中有时难以察觉,而且也使欧拉角本身的含义变得难以理解。欧拉角的第二个缺点是“臭名昭著”的自锁现象(gimbal lock):即当俯仰角
时,第三步中的 x-轴与第一步中的 z-轴重合,因此第一步绕 z-轴的旋转和第三步绕 x-轴的旋转实际上是一样的,导致欧拉角损失了一个自由度。在自锁点附近,横滚角
及航向角
的导数会趋向于无穷大,这也是欧拉角表示方法的奇异点。在使用卡尔曼滤波器时,这样的性质可能会使方差的计算十分不准确,我们会在后面讨论卡尔曼滤波器的文章中详细介绍这个问题。

6. 旋转和姿态的关系

在上面的讨论中,旋转矢量、旋转矩阵、四元数、欧拉角指的都是在三维空间中旋转一个向量的操作,那么这个操作和刚体的姿态有什么关系?这个问题可以用旋转矩阵回答:假设旋转矩阵

将一个坐标系 xyz 旋转到 x'y'z'(将坐标轴理解为三维向量),那么如果一个向量在 xyz 坐标系中由坐标
表示,在 x'y'z' 坐标系中由坐标
表示,这两个坐标有如下的关系:
(9)

在IMU中,我们计算的

是将一个向量在体坐标系(x'y'z')里的坐标转为在惯性坐标系(xyz)中的坐标,那么这个旋转矩阵
的另外一层含义是将惯性坐标系旋转到体坐标系的旋转操作。

如果我们将

代入(9)可以得到:
的第一列是体坐标系的x-轴在惯性坐标系里的坐标;类似的,
的第二、三列分别是体坐标系的 y-轴和 z-轴在惯性坐标系里的坐标。因为的
逆和它的转置相等,所以
的第一、二、三行分别是惯性坐标系的 x-轴、y-轴、z-轴在体坐标系里的坐标。

7. 总结

刚体的姿态一般可以用四种方法表示:旋转矢量、旋转矩阵、四元数和欧拉角。刚体的姿态有三个自由度,在四种表示方法中,旋转矢量和欧拉角用了三个参数;四元数用了四个参数和一个约束条件(长度为1);旋转矩阵用了九个参数和六个约束条件(矩阵的正交性)。旋转矢量和欧拉角都具有奇异性,也就是说在某种姿态下,它们的导数会趋向无穷大;四元数没有奇异性,但它和姿态是2比1的对应关系;只有旋转矩阵既没有奇异性,而且和姿态是一一对应的。在IMU姿态估计中,可以使用旋转矩阵、四元数或欧拉角对角速度进行积分,并设计滤波器。在乘法扩展卡尔曼滤波器中(MEKF),是用四元数进行积分,用旋转矢量表示姿态误差及估计姿态的协方差矩阵。

依据imu姿态角计算z轴倾角_1. 姿态的表示方法相关推荐

  1. 依据imu姿态角计算z轴倾角_[姿态估计] DenseFusion详解

    今天分享一篇关于6D姿态估计任务的paper: <DenseFusion: 6D Object Pose Estimation by Iterative Dense Fusion> 来源于 ...

  2. 依据imu姿态角计算z轴倾角_树莓派小车-07-IMU姿态解算 imu_complementray_filter

    上一篇文章介绍了互补滤波器与ROS的接口定义,这篇文章将结合论文分析代码. complementary_filter.cpp 首先从成员变量开始看,毕竟这些变量在后面用到的时候需要了解他所代表的意思, ...

  3. 电子罗盘-航向角计算

    坐标变换 手机初始状态accelerometer 与 magnetometer 读数为 (假定初始状态为水平放置,如上图所示) G1=⎡⎣⎢ax1ay1az1⎤⎦⎥=⎡⎣⎢00g⎤⎦⎥(1)(1)G1 ...

  4. 四元数解算姿态角解析

    本文来自:链接 一.概述 无人机求解姿态角有多种算法,但由于各种算法的自身限制及计算机计算速度的限制,所以我们需要选择一个较佳的求解算法,下面我们先来看看几种求解姿态角的算法: 1. 欧拉角法: 欧拉 ...

  5. 关于无人机四元数解算姿态角解析你知道吗?

    原文链接http://www.elecfans.com/d/705815.html 一.概述 无人机求解姿态角有多种算法,但由于各种算法的自身限制及计算机计算速度的限制,所以我们需要选择一个较佳的求解 ...

  6. 姿态角(Euler角):yaw pitch roll

    姿态角和自由度相关联: 姿态角在控制,机械领域广泛使用: 这里,简单了解一下: 什么是姿态角(Euler角)? yaw,pitch,roll的识别? 步骤阅读 百度经验:jingyan.baidu.c ...

  7. IMU静态初始粗对准计算姿态角

    初始对准的目的是确定惯性导航系统各坐标轴相对于参考坐标系指向过程.在捷联导航系统中,姿态信息可以以方向余弦矩阵形式表示,角度对准的目的就是去欸的那个方向余弦矩阵,方向余弦矩阵定义了惯性导航敏感轴与参考 ...

  8. imu初始对准matlab,IMU静态初始粗对准计算姿态角

    初始对准的目的是确定惯性导航系统各坐标轴相对于参考坐标系指向过程.在捷联导航系统中,姿态信息可以以方向余弦矩阵形式表示,角度对准的目的就是去欸的那个方向余弦矩阵 ,方向余弦矩阵定义了惯性导航敏感轴与参 ...

  9. IMU内参标定以及初始化(9轴IMU,比6轴多三个姿态角信息)

    IMU内参标定以及初始化(绕8字) 一.IMU内参标定 1.6轴(角速度+线加速度)信息初始化(标定噪声和bias) 2.三轴姿态信息初始化(绕8子) 二.IMU模块ROS配置 注意事项: 因为三个方 ...

最新文章

  1. 信息级联/信息瀑布(Information Cascade)
  2. 单身程序猿适合找单身程序媛吗?
  3. 浅析校园安防视频监控设备发展趋势
  4. 使用HSRP和SLB实现服务器群负载均衡和冗余
  5. MySQL索引的创建、删除和查看
  6. MySQL之数据库对象查看工具mysqlshow
  7. 【VMCloud云平台】SCAP(一)规划
  8. c++模板显示实例化,显示具体化,隐式实例化
  9. base64 linux_渗透测试常用Linux命令总结
  10. Java Web学习总结(18)——JSP标签
  11. java post 注册_Java 以 post 发送方式实现百度链接提交主动推送
  12. Ext.Net学习笔记20:Ext.Net FormPanel 复杂用法
  13. 超级简单:ASP.NET输出缓存
  14. mybatis使用详解
  15. VScode环境变量配置
  16. 马哥Linux学习笔记2-3Linux命令帮助的获取详解
  17. STC12C2052AD+TM1640+DS1302闹钟
  18. NB-IoT 基于蜂窝的窄带物联网
  19. 苹果CMS v10海螺v6.01模板/附17套苹果cms视频影视网站模板
  20. 3GPP 首个5G标准

热门文章

  1. spring依赖注入_Spring源码阅读:Spring依赖注入容器
  2. python画五角星代码_Python使用Turtle模块绘制五星红旗代码示例
  3. 无头虚拟化服务器,在 Ubuntu 18.04 LTS 上使用 KVM 配置无头虚拟化服务器
  4. [蓝桥杯]算法提高 天天向上(记忆化搜索)
  5. 奇小葩讲设备树(3/5)-- Linux设备树详解(三)u-boot设备树的传递
  6. com.alibaba.druid.pool.DruidDataSource.error解决办法
  7. ARM Cortex-M3相比于ARM其他系列微控制器的优势和特点
  8. USB接口定义(Z)
  9. Eigen入门之密集矩阵 2-- Matrix及Vector的计算方法
  10. 机器学习中激活函数和模型_探索机器学习中的激活和丢失功能