四元数

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

匿名 (未验证) 提交于 2019-12-02 23:49:02
一、旋转向量 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.toRotationMatrix(); 1.2 旋转向量转欧拉角(Z-Y-X,即RPY) Eigen::Vector3d eulerAngle=rotation_vector.matrix().eulerAngles(2,1,0); 1.3 旋转向量转四元数 Eigen::Quaterniond quaternion(rotation_vector); Eigen::Quaterniond quaternion;Quaterniond quaternion; Eigen::Quaterniond quaternion;quaternion=rotation_vector; 二、旋转矩阵 2.0 初始化旋转矩阵 Eigen::Matrix3d rotation_matrix;rotation

旋转的数学表达:欧拉角、轴向角、四元数与矩阵

匿名 (未验证) 提交于 2019-12-02 23:38:02
  本文发布于游戏程序员刘宇的个人博客,长期更新,转载请注明源地址https://www.cnblogs.com/xiaohutu/p/10979936.html   数学,是人类对客观世界中数量关系和空间形式本质特征进行研究的科学。对同样的某一特征或者关系,可以根据需求用不同的数学符号、定义和过程来表达。在游戏引擎中,我们也有很多这样的例子,比如本文说到的旋转。 欧拉角   旋转是一个过程,一个物体围绕周或者点角度变化的过程。为了描述这个过程我们必须有参照物,于是我们先定义一个世界坐标系,笛卡尔坐标系。          欧拉角用 分别来表示这个物体相对三个坐标系的夹角,这是由数学家欧拉首先提出而得名的。    然而仅仅有 (x, y, z) 来表示旋转是不够的,还有两个因素:   首先是 旋转顺序 ,从各个轴上进行角度旋转时xyz先后的不同会得到不同的结果。我们称这个顺序定义为 顺规 ,下面一段是维基百科的定义:   在经典力学里,时常用zxz顺规来设定欧拉角;照着第二个转动轴的轴名,简称为x顺规。另外,还有别的欧拉角组。合法的欧拉角组中,唯一的限制是,任何两个连续的旋转,必须绕着不同的转动轴旋转。因此,一共有12种顺规。例如,y顺规,第二个转动轴是y-轴,时常用在量子力学、核子物理学、粒子物理学。另外,还有一种顺规,xyz顺规,是用在航空航天工程学;   按(z-x-z, x

matlab练习程序(旋转矩阵、欧拉角、四元数互转)

匿名 (未验证) 提交于 2019-12-02 23:26:52
欧拉角转旋转矩阵公式: 旋转矩阵转欧拉角公式: 旋转矩阵转四元数公式,其中1+r11+r22+r33>0: 四元数转旋转矩阵公式,q0^2+q1^2+q2^2+q3^2=1: 欧拉角转四元数公式: 四元数转欧拉角公式: matlab代码如下: clear all; close all; clc; %欧拉角 x = 0.5; y = 0.6; z = 0.7; Ang1 = [x y z]; %欧拉角转旋转矩阵 Rx = [1 0 0; 0 cos(x) -sin(x); 0 sin(x) cos(x)]; Ry = [cos(y) 0 sin(y); 0 1 0; -sin(y) 0 cos(y)]; Rz = [cos(z) -sin(z) 0; sin(z) cos(z) 0; 0 0 1]; R = Rz*Ry*Rx; R1 = R; %旋转矩阵转欧拉角 x = atan2(R(3,2),R(3,3)); y = atan2(-R(3,1),sqrt(R(3,2)^2+R(3,3)^2)); z = atan2(R(2,1),R(1,1)); Ang2 = [x y z]; %旋转矩阵转四元数 t=sqrt(1+R(1,1)+R(2,2)+R(3,3))/2; q=[t (R(3,2)-R(2,3))/(4*t) (R(1,3)-R(3,1))/(4*t) (R(2,1)-R

四元数与欧拉角(RPY角)的相互转换

匿名 (未验证) 提交于 2019-12-02 23:05:13
转: https://www.cnblogs.com/21207-iHome/p/6894128.html RPY角与Z-Y-X欧拉角   描述坐标系{B}相对于参考坐标系{A}的姿态有两种方式。第一种是 绕固定(参考)坐标轴旋转 :假设开始两个坐标系重合,先将{B}绕{A}的X轴旋转γγ,然后绕{A}的Y轴旋转ββ,最后绕{A}的Z轴旋转αα,就能旋转到当前姿态。可以称其为X-Y-Z fixed angles或RPY角(Roll, Pitch, Yaw)。   Roll:横滚   Pitch: 俯仰 Yaw: 偏航(航向)   另一种姿态描述方式是 绕自身坐标轴旋转 :假设开始两个坐标系重合,先将{B}绕自身的Z轴旋转αα,然后绕Y轴旋转ββ,最后绕X轴旋转γγ,就能旋转到当前姿态。称其为Z-Y-X欧拉角,由于是绕自身坐标轴进行旋转,则旋转矩阵为:   可以发现这两种描述方式得到的旋转矩阵是一样的,即绕固定坐标轴X-Y-Z旋转(γ,β,α)(γ,β,α)和绕自身坐标轴Z-Y-X旋转(α,β,γ)(α,β,γ)的最终结果一样,只是描述的方法有差别而已。In gerenal: three rotations taken about fixed axes yield the same final orientation as the same three rotations taken

OpenGL学习笔记《七》摄像机

♀尐吖头ヾ 提交于 2019-12-01 10:09:40
  在上一篇写opengl坐标系统的文章中,有提到视图空间(View Space),也可以称之为摄像机空间,即从摄像机角度去观察对象。MVP转换矩阵中,上篇文章给了一个简单的视图矩阵(View Matrix)将世界空间坐标转换到视图空间坐标,即相对于摄像机的坐标。   opengl中实际上并没有直接提供摄像机对象,我们是根据一系列的向量运算在游戏空间中创建了一个摄像机对象,并生成对应的视图矩阵(View Matrix)。   创建一个摄像机对象,我们需要构建对应的坐标体系。首先,我们需要知道我们是从哪里观察/用摄像机拍摄,所以需要确定一个摄像机的坐标。在opengl的右手坐标系下,我们先假定摄像机坐标是cameraPos=(0,0,3),即z轴正方向3个单位的位置;确定了摄像机的位置之后,利用 向量减法 ,我们可以从原点出发得到摄像机的方向,cameraDir = vp - vo,不过我们在这里得到的方向其实是摄像机拍摄方向的反反向;   得到了摄像机方向,再利用一个世界空间内相对于原点的单位向量up=(0,1,0),使用 向量叉乘 ,我们可以得到右轴向量,cameraRight = up x cameraDir;   最后,根据摄像机方向,右轴,再使用 向量叉乘 ,我们可以得到上轴向量,cameraUp = cameraDir x cameraRight;   利用上述得到的方向

[VINS]IMU与相机之间旋转量的标定

柔情痞子 提交于 2019-11-28 20:39:53
VINS-Mono [1] 中IMU-Camera外参旋转量 \(R_b^c\) 的计算方法在他们实验室发的之前的论文有详细讲解 [ 2 ] 。视觉利用匹配特征点中的基础矩阵求出相机坐标系下两帧的旋转量 \(R_{c_k}^{c_{k+1}}\) ,通过IMU预积分得到的两帧之间IMU坐标系下的旋转量$ R_{b_k}^{b_{k+1}}$,两个旋转量满足: \[R_b^c R_{b_k}^{b_{k+1}}=R_{c_k}^{c_{k+1}}R_b^c \tag{1}\] 四元数表示,则有 \[q_b^c \otimes q_{b_k}^{b_{k+1}}-q_{c_k}^{c_{k+1}} \otimes q_b^c = 0 \tag{2}\] 将四元数乘法运算化为一个 \(4 \times 4\) 的矩阵运算,YouTube上有个很好的视频讲解 [3] 。伯克利CS184也作出很好的讲解 [4] ,使用行向量表示四元数,推过程类似。这里做简单的归纳讲述。两个四元数分别为: \(q_a=\left[\begin{array} {c}{x_a}\\{y_a}\\{z_a}\\{w_a} \end{array}\right]\) , \(q_b=\left[\begin{array} {c}{x_b}\\{y_b}\\{z_b} \\{w_b}\end{array}\right]\

unity 使用四元数旋转向量

ⅰ亾dé卋堺 提交于 2019-11-28 19:29:43
1.向量转换为四元数 Quaternion qua0=new Quaternion(); Debug.Log(qua0.eulerAngles);//输出:(0.0, 0.0, 0.0) Quaternion qua1=Quaternion.LookRotation(Vector3.forward); Debug.Log(qua1.eulerAngles);//输出:(0.0, 0.0, 0.0) Quaternion qua2=Quaternion.LookRotation(new Vector3(1,0,0)); Debug.Log(qua2.eulerAngles);//输出: (0.0, 90.0, 0.0) 来源: https://www.cnblogs.com/kingBook/p/11423272.html

从四元数入手到姿态解算

孤人 提交于 2019-11-26 19:49:22
从四元数入手到姿态解算 四元数 姿态解算 四元数 四元数(quaternion)是威廉·哈密顿提出的。四元数与复数类似,可以借助复数进行理解,复数:i^2=-1。于此对应的四元数基本性质是:i²=j²=k²=i·j·k=-1。 四元数基本运算: 加法: 定义两个四元数 四元数加法:p + q 跟复数、向量和矩阵一样,两个四元数之和需要将不同的元素加起来。 乘法: 叉乘: 代数形式: 同矩阵,四元数的乘法有非可替换性,即pq不等于qp。 四元数点积: p · q 求共轭 q*=(-x, -y, -z, w) 我们着重考虑四元数与三维空间旋转移动之间的关系。 首先我们借助复数在二维空间移动来考虑四元数,在复数域,我们对一个复数乘i相当于在复数域逆时针旋转90度,,乘任一复数相当于旋转复数相对应的角度。 那么对于四元数,三维坐标系下给定一个矢量v,再给定一个旋转的单位四元素q,让v旋转q。 先将v改写成四元素的形式v = (x, y ,z, 0), 接下来要旋转v须用q前乘以矢量v,再后乘以q-1。即完成了q对应的旋转移动操作,其中q的实部使原先矢量移动,虚部使其旋转,位旋转轴。 在实际应用中四元数多和欧拉角转换,这里给出两者变换的公式: 姿态解算 对于上式的计算,首先我们需要知道一个矩阵: 即欧拉角坐标变化矩阵,实质上就是两个坐标系的转化,参数分别为Z轴旋转为偏航角(YAW)ψ

Unity基础之:UnityAPI的学习

自闭症网瘾萝莉.ら 提交于 2019-11-26 12:11:25
版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址: http://www.cnblogs.com/raymondking123/ )以及微信公众号"优梦创客" 您可以自由转载,但必须加入完整的版权声明! Quaternion 表示旋转 矩阵 //9个浮点数,数据占用量大,且除了表示旋转外,还表示缩放((0,0),(1,1),(2,2)点表示x,y,z的三个缩放) //显卡使用 欧拉角 rotation,绕x,y,z轴的旋转量 //给定朝向的表示不惟一,通过限定yaw,roll在+-180度,pitch在+-90度可以解决该问题 (pitch,绕右向量旋转,点头;yaw,绕上向量旋转,摇头;roll,绕前方向,转头;常用于飞行模拟) //万向锁 如:一个平行于x轴的向量绕y轴旋转-90度,会平行于z轴,此时所有绕z轴的旋转都不再起作用 轴角对 //用旋转轴,旋转角度的对偶表示旋转 //旋转角无唯一 单位四元数:[1,0] 1是标量,0是零向量 四元数的模,4个数的平方和开根 identity :单位四元数 eulerAngles //返回四元数对应的欧拉角,是一个属性 W,x,y,z w表示转化后的旋转值,x,y,z表示转化后的旋转轴 LookRotation //给定一个方向向量,返回表示该方向旋转的四元数 public static Quaternion