首页 > 其他分享 >四元数

四元数

时间:2024-09-01 15:04:12浏览次数:3  
标签:cdot 旋转 四元 插值 vec theta

四元数

定义

【四元数的可视化】 https://www.bilibili.com/video/BV1SW411y7W1/?share_source=copy_web&vd_source=ac806c24de13bf5f509bf105a8578e24

\[0.00 + 8.46i + 2.64j + 3.38k\\ \]

最左侧实数称为标量部分,右侧\(ijk\)虚部称为向量vector

\[i^2+j^2+k^2=1\\ ij=-ji=k\\ ki=-ik=j\\ jk=-kj=i \]

\[(w_1 + x_1i + y_1j + z_1k)(w_2 + x_2i + y_2j + z_2k)\\ =(w_1w_2 - x_1x_2 - y_1y_2 - z_1z_2)\\ +(w_1x_2 + x_1w_2 + y_1z_2 - z_1y_2)i\\ +(w_1y_2 + y_1w_2 + z_1x_2 - x_1z_2)j\\ +(w_1z_2 + z_1w_2 + x_1y_2 - y_1x_2)k \]

用四元数来描述矩阵相乘

\[\vec v_1=\begin{bmatrix}x_1\\y_1\\z_1\end{bmatrix} =(w_1 + x_1i + y_1j + z_1k)\\ q_1=(w_1,\ \vec v_1) \\ \vec v_2=\begin{bmatrix}x_x\\y_x\\z_x\end{bmatrix} =(w_2 + x_2i + y_2j + z_2k)\\ q_2=(w_2,\ \vec v_2) \\ q_1\cdot q_2=(w_1w_2 - \vec v_1\cdot \vec v_2,\ w_1\vec v_2 + w_2\vec v_1 + \vec v_1 \times \vec v_2) \]

\(q_1\cdot q_2 = (\frac{q_1}{\lVert q_1\rVert})\lVert q_1 \rVert\cdot q_2\)

\(q_1\cdot q_2\)会将\(q_2\)的大小拉伸到\(q_1\)的大小(上市括号外的内容),然后施加一个特殊的四维旋转(上式括号内的内容)

四维超球投影到三维空间,在单位球内的是\([-1,1]^4\),超出\([-1,1]^4\)的点投影到了单位球外,延申至无穷远

投影过程可参考二维到一维、三维到二维的球极投影

四元数在三维点上的应用

【四元数和三维转动,可互动的探索式视频(请看链接)】 https://www.bilibili.com/video/BV1Lt411U7og/?share_source=copy_web&vd_source=ac806c24de13bf5f509bf105a8578e24

当想绕某个轴旋转某个角度时,首先用一个单位向量(\(ijk\)经过归一化,三者平方和为\(1\))定义这个轴,对于三维向量,其实部为\(0\),\(xyz\)作为\(ijk\)的系数

之后,若想旋转的角度是\(\theta\),则使用半角\(\theta/2\)的余弦值作为实部,正弦值乘以四元数向量

如:\(q=(\cos(40^{\circ}/2)+\sin(40^{\circ}/2)(0.67i-0.67j-0.33k))\)

如果想对一点\(p\)应用这个旋转,只需\(p'=q\cdot p\cdot q^{-1}\)即可,就能得到旋转后的坐标\(p'\),\(p'\)是一个四元数,其实部为0,\(ijk\)向量系数即为旋转后的三维坐标

为什么是\(q\cdotp\cdot q^{-1}而不是q\cdot p\)?

\(q\)的本质是一个空间变换,旋转变换是其中一环,旋转*缩放=空间变换

四元数有一个性质是可逆的

那么(旋转*缩放)p / 缩放 = 旋转*p?

然而这样做是不行的,因为空间变换\(q\)必定包含旋转和缩放

于是可以用到左右手螺旋定则

\(q\)左乘\(p\)或右乘\(p\),只会影响旋转的方向,不会影响缩放的方向

而\(q\cdot p\)和\(q^{-1}\cdot p\)的异同在于二者旋转一样缩放相反

于是可以通过\(q\cdot p\cdot q^{-1}\),左乘\(q\)和右乘\(q^{-1}\)分别完成半个\(\theta\)角度的旋转,而\(q\)与\(q^{-1}\)又刚好抵消掉了缩放

四元数插值

要在两个四元数之间进行球面线性插值(Spherical Linear Interpolation), Slerp()。球面线性插值可在球面表面大圆的弧线上做匀速率运动,因此对于旋转插值有两个期望的性质

  • 旋转插值路径使得扭矩最小化:两个旋转之间的路径是旋转空间中所能得到的最短路径
  • 插值有很顶角速度:动画参数\(t\)的变化量和所得旋转的变换了的关系在插值过程中是恒定的,换句话说,在插值范围内,插值速度是恒定的

\[slerp(q_1, q_2. t)=\frac{q_1\sin((1-t)\theta)+q_2\sin(t\theta)}{\sin\theta}\\ t\in[0,1] \]

Shoemake(1985)提出的公式

\[q_\bot=q_2-(q_1\cdot q_2)q_1 \\ q'=q_1\cos(\theta t)+\hat q_\bot\sin(\theta t) \]

PBRT中的公式

以一种更直观的方式理解

考虑在2D平面下的两个单位圆上的向量\(v_0\)和\(v_1\),二者夹角为\(\theta\),想要计算二者之间角度为\(\theta'\)的插值向量,可以寻找正交于\(v_0\)的向量\(v_\bot\),再应用三角恒等式\(v'=v_0\cos\theta'+v_\bot\sin\theta'\)

那么要计算\(q'\),首先要在四元数空间种计算一个正交坐标系,一个轴为\(q_1\),另一个是于\(q_1\)正交的四元数\(q_\bot\),这样两轴就构成张开\(q_1\)和\(q_2\)的基

可以通过将\(q_2\)投影到\(q_1\),再由\(q_2\)减去这一部分得到\(q_\bot\)

\(q_\bot=q_2-(q_1\cdot q_2)q_1\)

那么插值四元数为\(q'=q_1\cos(\theta t)+\hat q_\bot\sin(\theta t)\)

要注意的点

在插值时应检查两个四元数是否几乎平行

  • 二者几乎平行,则按顺序对四元数分量用普通的线性插值以避免数值不稳定

  • 否则,按\(q_\bot=q_2-(q_1\cdot q_2)q_1\)

    \(q'=q_1\cos(\theta t)+\hat q_\bot\sin(\theta t)\)

    插值计算四元数

标签:cdot,旋转,四元,插值,vec,theta
From: https://www.cnblogs.com/Tellulu/p/18391291

相关文章

  • 使用四元数解决欧拉角万向锁问题(二)
    使用四元数规避欧拉角万向锁问题(二)一、背景二、具体应用公式1.单位四元数对应旋转作用于向量2.轴角表示转四元数三、代码及实验1.python2.实验结果以及分析四、验证五、存在问题六、参考资料一、背景在使用四元数解决欧拉角万向锁问题(一)一文中已经实现了基于固......
  • 计算机网络知识普及之四元组
    在涉及到TCP/UDP等IP类通信协议时,存在四元组概念这里只是普及使用先来一些前置知识,什么是IP协议?IP协议全称为互联网协议,处于网络层中,主要作用是标识网络中的设备,每个设备的IP地址是唯一的。在网络传输中,IP地址主要用于数据包的寻址。目前IP协议主要有两个版本,IPv4和IPv6,......
  • (slam工具)6 python四元数转化旋转矩阵
       importnumpyasnpfromscipy.spatial.transformimportRotationasRimportpyprojfrompyprojimportProj,transform#0.0169380355232107080.58455146147157355-0.488705791564092830.64744060819180593-129342.747563395343469822.8668770161534369......
  • 四元组统计
    四元组统计题目信息题目描述有\(n\)个正整数\(a_i\),你要统计有多少个四元组满足\(\gcd(a_i,a_j,a_k,a_l)=1\)。输入格式输入包含多组数据。对于每组数据:第一行一个正整数\(n\),接下来一行\(n\)个正整数\(a_i\)。输出格式若干行,每行对应一个输入数......
  • 四元数在旋转变换和插值中的有趣的可视化解释
    四元数可以旋转三维空间中的向量,而最近刚好硬着头皮读《复分析可视化方法》(见[1]),这本书中,作者非常巧妙地运用球极射影的方法,将三维空间单位球面上绕向量轴旋转的变换,映射为复平面上旋转矩阵的表示,对四元数的插值给出可视化的有趣并且直观的解释。四元数的基本定义(参考2),两个四元数......
  • 四元数 学习笔记
    License:CCBY-NC-SA4.0目录复数极坐标表示三维旋转四元数Grassmann积纯四元数共轭逆三维旋转,但是四元数矩阵形式旋转的复合四元数的插值杂参考资料复数在了解四元数之前,要先了解复数对空间干了什么。设有复数\(z_1=a+b\mathrm{i},z_2=c+d\mathrm{i}\),则\[z_1z_2......
  • Eigen四元数初始化,对应wxyz的值
    #include<iostream>#include<Eigen/Geometry>intmain(){Eigen::Quaternionq1(1,2,3,4);Eigen::Vector3dpos=Eigen::Vector3d::Zero();Eigen::Quaterniondquat=Eigen::Quaterniond::Identity();doubleq_tmp[4]={1,2,3,......
  • 算法随笔——图论:无向图三/四元环计数
    参考:https://oi-wiki.org/graph/rings-count/题目链接:P1989无向图四元环计数求四元环步骤:建双向边。给每条边定向,由度数小的点指向大的,若度数一样则看编号大小。此时只有这几种情况:都可以归类为:枚举起始点A,枚举A<-->B(双向边),枚举B-->C,让C点被访问次数\(cnt\)......
  • 三、四元环计数
    无向图三元环计数:定义一个有向图\(G'\):把\(G\)中每条边改成从度数小的点指向度数大的点的有向边。性质:\(G'\)中每个点的出度\(\le2\sqrtm\)。证明:若\(u\)的出度\(>2\sqrtm\),则显然\(u\)在原图中的度数\(>2\sqrtm\)。所以\(u\)指向的至少\(2\sqrtm+1\)个......
  • 刚体四元数姿态控制
    摘要:首先给出刚体被控对象的微分方程,然后对四元数微分方程线性化求出合适的PD控制参数,然后详细分析了误差四元数的概念和性质,并提出四元数和旋转矩阵的等价性,然后简要介绍了非对角转动惯量矩阵的一些特点,最后分别仿真验证了调节问题、跟踪问题和误差四元数,附录中给出了使用拉塞尔......