四元数
四元数
四元数是由爱尔兰数学家威廉·卢云·哈密顿在1843年创立出的数学概念.速度更快、提供平滑插值、有效避免万向锁问题、存储空间较小.
其中
罗德里格旋转公式(Rodrigues’ rotation formula)
罗德里格旋转公式是在给定转轴和旋转角度后,旋转一个向量的有效算法.公式如下,具体推导参考图片(By Maschen - Own work, CC0)
四元数基本运算
模长
加减法
乘法
对任意四元数 $q_{1}=[s, \mathbf{v}], q_{2}=[t, \mathbf{u}]$ 有逆
旋转公式
可借助罗德里格旋转公式,分别对垂直旋转轴和平行旋转轴的向量进行旋转.
或者借助$\mathbf{a} \times(\mathbf{b} \times \mathbf{c})=(\mathbf{a} \cdot \mathbf{c}) \mathbf{b}-(\mathbf{a} \cdot \mathbf{b}) \mathbf{c}$直接推导
注意:可以证明即使v不是实部为0的纯四元数,旋转公式所得结果的向量部分也相同
双倍覆盖
四元数q与-q表示同一个旋转,轴正方向旋转$\theta $,与反方向旋转$2\pi - \theta $等价
四元数插值
两个四元数之间中间变换
两个四元数之间的中间变换可以通过对空间中一个向量的变换来理解.
四元数${q_0}$到${q_1}$的变换$\Delta q$的角度看实部就可以了,实部就是两个四元数的点乘${q_0} \cdot {q_1}$的结果,由于两个都是单位四元数,所以中间变换$\Delta q$在三维空间中实际旋转的角度就是两个四元数之间夹角的两倍
常用插值算法
- 正规化线性插值(Normalized Linear Interpolation),沿着直线进行差值,在差值角度比较大会出现角速度不均匀
球面线性插值 ( Spherical Linear Interpolation), 最常用的姿态差值算法, 运算会多一点,较慢, 小角度通常选用Nlerp,效果差不多, 还能避免除以0的错误, 实际算法中可以检测四元数之间的夹角, 小角度用Nlerp,大角度用Slerp
同时由于双倍覆盖的问题,在进行姿态插值时需要先计算两个四元数之间夹角是否大于90°,如果大于可以把其中一个四元素反转,即-q
四元数在不同坐标系下变换
求${q}$姿态对应坐标系下z轴在极坐标系下的表示如下,只需要把全局坐标系中z轴(0,0,1)进行对应变换就可以(同旋转矩阵一样,可以理解为旋转算子或者姿态)
求两个四元素之间的中间变换对应的轴,比如${q_1}$到${q_0}$,
${q_0}q_1^*$,然后取出旋转轴就可以.如果想把轴转换到${q_0}$坐标系下,则旋转回来再提取轴
另外在franka程序 中看到换了成了$q_0^ * {q_1}$ ,然后增加负号并旋转变换到基坐标系下,这里推导只针对向量部分,即旋转轴,借助前面的结论普通四元数与纯四元数使用旋转公式后向量部分同
这里还使用了单位四元数的共轭就是逆,即把向量部分取负号
四元数可视化
参考3blue1brown的教程,四元数变换可以理解为对四维空间的变换然后投影到三维空间成我们见到的.
变换的形象理解是拉伸和旋转,考虑一个四元数对另一个四元数的作用(变换),简单理解就是对四元数的基1,i,j,k作用看效果
- 把位于原点的1拉伸到四元数乘子所在位置
- 绕轴旋转对应的角度
视频:
重点参考
文章内有对四元数的详细介绍,四元数插值部分也讲得非常清楚
引用
- 四元数
- 罗德里格旋转公式
- 干货 | 欧拉角,四元数?晕头转向的空间姿态表示法(下篇)
- quaternion by krasjet
- Understanding Quaternions 中文翻译《理解四元数》
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 yangbenbo@whu.edu.cn
文章标题:四元数
本文作者:杨本泊
发布时间:2020-11-25, 15:36:23
最后更新:2023-07-09, 07:10:12
原始链接:http://yangbenbo.github.io/2020/11/25/四元数/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。