四元数运动学笔记(3)四元数和旋转相关的约定表述

1.四元数的约定表述
1.1 四元数表述的差异
1.2 Hamilton vs JPL
1.2.1元素的顺序
1.2.2 左手系和右手系
1.2.3 旋转操作的对象
1.2.4 旋转操作的方向
1.3 文章采用的表述
1.4扰动和时间导数
1.4.1右扰动和左扰动
1.4.2 Hamilton表示下的(L-G)的四元数时间导数
1.4.3 其他有用的表述方式
1.5 barfoot书中表述
2.旋转角速率表示旋转积分
2.1零阶积分
2.2一阶积分
2.3归一化处理

1.四元数的约定表述

1.1 四元数表述的差异

  • 根据实部虚部的顺序,左手系和右手系(left-handed,right-handed),操作是旋转向量还是旋转坐标系(active or passive),操作方向(local to global or global to local),四元数有122中表述方法,其中Hamilton 和JPL是两种常见的表述方式,两者的对比如下表:

  • JPL 在航空上经常使用,Hamliton的表述在机器人领域更为常见,和ROS,Eigen,Ceres的程序库中使用的表示一致,和很多应用在IMU上的卡尔曼滤波文献也一致。

1.2 Hamilton vs JPL

  • 这里详细比较两者的差异

1.2.1元素的顺序

  • Hamilton将实部是第一元素,JPL实部是最后一个元素

1.2.2 左手系和右手系

  • 右手系和左手系定义的差别

  • 两者定义下的四元数是共轭关系

1.2.3 旋转操作的对象

  • 一种是假设坐标轴frame不变(active),向量在旋转,这种类似于相机不动,相机里观察的目标在动,或者说整个过程都是假定在一个坐标系下的。

  • 一种是假设向量不变(passive),坐标轴在变,类似于相机的视角在变,目标不动,这个和很多SLAM中的表述方式一致,因为SLAM中是假设路标是静止的。如barfoot书中,一个向量r可以由由不同坐标系下的坐标表示,即passive。Hamliton和JPL都是使用的passive的方式。
  • passive的表示中,向量r只有一种形式表示,不同时刻的坐标系是在变化的,即向量r在不同时刻有不一样的坐标表示。

  • active 和passive其实就是相对运动关系:

1.2.4 旋转操作的方向

  • 我的理解,Local和global是相对的概念,从旋转矩阵的推导我们知道,开始假设机体系b和导航系n是重合的,然后我们推导用空间某个向量r的初始坐标和旋转矩阵,表示r在旋转后的b系新的坐标.这里b即local,n系即global。
  • 或者说我们选择是将相机在新的视角看到的空间某个固定点的坐标转成开始相机视角下的坐标(local-global:,barfoot书中的);

    还是旋转将相机在初始视角看到的空间固定点坐标转到相机新的视角下看到的坐标(global-local:,barfoot书中)

  • local to global,旋转矩阵下标第一个是旧坐标系,第二个是新坐标系,且下标表述满足链式原则,所以对于添加扰动,local to global 是右扰动,global to local是左扰动。后面会证明。
  • 两种方式其实也是相对运动的关系

  • 可以证明,Hamilton和JPL的四元数表示在数值上是相等的。

1.3 文章采用的表述

  • 文章采用local to global的表示,且简化以下表示:

1.4扰动和时间导数

1.4.1右扰动和左扰动

  • 局部扰动(local perturbation)是右扰动形式;

    local to global的形式下,局部扰动项表示为(下标第一个是旧坐标系G,第二个是新坐标系L)

  • global 扰动是左扰动,证明和局部扰动是相似的:

1.4.2 Hamilton表示下的(L-G)的四元数时间导数

  • 所以局部扰动的表达式和一阶泰勒项为:

  • 四元数时间导数,涉及到四元数运算时,三维角速度向量是用四元数方式表示的,相似的可以推导旋转矩阵的微分,相对于G-L的旋转微分,我们很容易发现L-G的优势,因为实际角速度是机体系b(local)下传感器获得的。

1.4.3 其他有用的表述方式

  • 通过以上推导而来

1.5 barfoot书中表述

  • 根据上述讨论,结合barfoot书中旋转相关公式的形式,可以得知barfoot书中的的表述是:四元数实部在后,使用右手系,passive方式,采用左扰动/全局扰动(global to local)。

2.旋转角速率表示旋转积分

  • 这里不采用文章中的推导,从笔记(2)中,四元数和旋转向量出发推导:

    泰勒展开得到:

2.1零阶积分

  • 零阶积分是假设,这里零阶积分方法的不同主要在于参数值的选取时间的不同。去的均值,有类似平滑的作用,是okvis采用的方法。

2.2一阶积分

  • 一阶积分是假设的二阶微分为0,一微分是常数,利用插值方法得到:

  • 代入2.1中的泰勒展开式,并利用叉乘性质简化:

  • 结果为零阶积分加二阶校正项,采样时间很短时,二阶项叉乘的部分几乎共线,该二阶项会很小。

2.3归一化处理

  • 由于积分舍去了高阶项,使得积分后的四元数不再是单位四元数,需要从新归一化

null

时间: 2024-11-25 12:56:20

四元数运动学笔记(3)四元数和旋转相关的约定表述的相关文章

四元数运动学笔记(4)旋转的雅克比矩阵

1.相对于旋转向量的雅克比2.相对于四元数的雅克比2.1相关公式2.2推导雅克比 1.相对于旋转向量的雅克比 这里在全局系下利用左扰动进行推导: 2.相对于四元数的雅克比 2.1相关公式 三叉积公式: 纯实部的四元数和四元数相乘,这里是实数 两个纯虚四元数相乘: 2.2推导雅克比 由以上三个公式可以得到以下公式的推导,其中这里的在涉及到四元数相乘的情况时,都是四元数的表示形式(纯实部四元数和纯虚部四元数),其他情况下则是正常的标量和三维向量. 旋转过程相对于四元数的雅克比 null

eigen 中四元数、欧拉角、旋转矩阵、旋转向量

一.旋转向量 1.0 初始化旋转向量:旋转角为alpha,旋转轴为(x,y,z) Eigen::AngleAxisd rotation_vector(alpha,Vector3d(x,y,z)) 1.1 旋转向量转旋转矩阵 Eigen::Matrix3d rotation_matrix;rotation_matrix=rotation_vector.matrix(); Eigen::Matrix3d rotation_matrix;rotation_matrix=rotation_vector.

Unity脚本-Rotate旋转相关知识点

1,Transform旋转 transform.Rotate(X, Y, Z);//分别绕X,Y,Z轴旋转,可写为绕某个轴旋转,栗子transform.Rotate(0, 90, 0); transform.Rotate(Vector3.right * Time.deltaTime);//以欧拉角旋转,顺序是ZXY,right是向X轴旋转1度 transform.Rotate(0, 45, 0, Space.World);//绕世界坐标系的XYZ轴旋转,也就是其顶层父物体的坐标系,如果自身在顶层

linux学习笔记(一)-文件目录相关的命令&&文件通配符

一.几个命令概述 1.查看目录以及目录底下的文件:ls(-a显示隐藏文件:-d显示目录本身:-l显示详细内容:-R递归显示,即把子目录的文件也显示出来:-h以更加被人类理解的格式显示,比如显示文件大小的时候用M为单位显示:-i显示文件索引ID) 2.查看文件内容:cat,head,tail,less,more,tac cat:将文件连接起来,输出在屏幕上,可接多个文件(-E:显示隐藏的换行符:-n:显示出行号) head:默认查看文件的前10行(-n#:查看文件的前#行.空白行也是一行) tai

【3D研发笔记】之【数学相关】(一):坐标系

现在开始学习3D基础相关的知识,本系列的数学相关笔记是基于阅读书籍<3D数学基础:图形与游戏开发>而来,实现代码使用AS3,项目地址是:https://github.com/hammerc/hammerc-Snake3D-as3与https://github.com/hammerc/hammerc-Snake3D-as3-examples,而3D类库代码则是模仿Away3D的设计来编写的,实现上尽可能模仿Away3D,部分修改的地方学习笔记中会进行特别说明. 言归正传,先看看2D方面,对于2D

JPA学习笔记(5)——EntityManager相关

Persistence EntityManagerFactory EntityManager find方法 getReference方法 persist方法 remove方法 merge方法 情况1传入的对象没有id 情况2传入的对象有identityManager的缓存中没有该对象数据库中没有该记录 情况3传入的对象有identityManager的缓存没有该对象数据库中有该记录 情况4传入的对象有identityManager的缓存有该对象 flush方法 refresh方法 clear c

OC屏幕旋转相关

OC屏幕旋转分为两个部分来说,第一个是开启了Device Orientation,开启了的话,自己旋转,没开启需要自己手动处理.因为现在大多数都是用自动布局,这个一般用不到,最近在看AVFoundation相关的东西,需要用到这个,所以总结下  第一部分,开启了自动旋转: (1)注册屏幕旋转通知: [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; //注册屏幕旋转通知 [[NSNotificatio

HTML笔记三,表单相关元素和属性

表单元素 <form>:用于生成输入表单,该元素不可视化 action:指定当前表单提交的地址,必填 method:指定提交表单时发送何种类型的请求,post或者get,一般post,必填:其中GET方式可以在地址栏种看到传送的数据,POST方法看不到较安全 enctype:指定对表单内容进行编码的字符集 name:名称 target:以何种方式打开目标url,_self,_blank,_top,_parent四个中的一个 <input>: type= text:单行文本框 pas

算法笔记_022:字符串的旋转(Java)

目录 1 问题描述 2 解决方案 2.1 蛮力移位 2.2 三步反转 1 问题描述 给定一个字符串,要求将字符串前面的若干个字符移到字符串的尾部.例如,将字符串"abcdef"的前3个字符'a'.'b'和'c'移到字符串的尾部,那么原字符串将变成"defabc".请写一个函数实现此功能. 2 解决方案 2.1 蛮力移位 此方法将需要移动的字符一个一个地移到字符串的尾部,具体代码如下: package com.liuzhen.string_1; public clas