96SEO 2026-02-19 09:29 17
序本篇系列文章参照高翔老师《视觉SLAM十四讲从理论到实践》讲解三维空间刚体运动为读者打下坚实的数学基础。

博文将原第三讲分为五部分来讲解其中四元数部分较多较复杂又分为四部分。
如果读者急于实践可直接阅读第五部分的机器人运动轨迹此部分详细讲解了安装准备工作。
此系列总体目录如下
旋转矩阵和变换矩阵旋转向量表示旋转欧拉角表示旋转四元数包括以下部分
四元数线性插值方法LinEuler/LinMat/Lerp/Nlerp/Slerp
四元数多点离散数值解插值方法Sping。
实践SLAM中显示机器人运动轨迹及相机位姿。
任意单位四元数描述了一个旋转该旋转也可用旋转向量、旋转矩阵或欧拉角描述。
现在来考察四元数与旋转向量、旋转矩阵以及欧拉角的相互转换关系。
绕坐标轴的多次旋转可以等效为绕某一转轴旋转一定的角度。
假设已知等效旋转轴方向单位旋转向量
θ。
根据3.2.3推导的定理3D旋转公式一般情况四元数型设其等效的单位四元数为
q_{1}u_{x}sin(\frac{1}{2}\***ta
q_{2}u_{y}sin(\frac{1}{2}\***ta
q_{3}u_{z}sin(\frac{1}{2}\***ta
⎧q0cos(21θ)q1uxsin(21θ)q2uysin(21θ)q3uzsin(21θ)(4.1)
[u_{x},u_{y},u_{z}]^{T}[q_{1},q_{2},q_{3}]^{T}/\sin(\frac{\***ta}{2})
{θ2arccosq0[ux,uy,uz]T[q1,q2,q3]T/sin(2θ)(4.2)
q根据博文《三维空间刚体运动2旋转向量与罗德里格斯公式》中的罗德里格斯公式展开式2.3及本文公式4.2将单位旋转向量
1−2q22−2q322(q1q2q0q3)2(q1q3−q0q2)2(q1q2−q0q3)1−2q12−2q322(q2q3q0q1)2(q1q3q0q2)2(q2q3−q0q1)1−2q12−2q22
r11r21r31r12r22r32r13r23r33
q_{0}\frac{1}{2}\sqrt{1r_{11}r_{22}r_{33}}\\
q_{1}\frac{r_{32}-r_{23}}{4q_{0}}\\
q_{2}\frac{r_{13}-r_{31}}{4q_{0}}\\
q_{3}\frac{r_{21}-r_{12}}{4q_{0}}
q14q0r32−r23q24q0r13−r31q34q0r21−r12(4.4)
那么将Z-Y-X欧拉角或RPY角绕固定坐标系的X-Y-Z依次旋转α,β,γ角转换为四元数
\cos\frac{\alpha}{2}\cos\frac{\beta}{2}\cos\frac{\gamma}{2}\sin\frac{\alpha}{2}\sin\frac{\beta}{2}\sin\frac{\gamma}{2}\\
\sin\frac{\alpha}{2}\cos\frac{\beta}{2}\cos\frac{\gamma}{2}-\cos\frac{\alpha}{2}\sin\frac{\beta}{2}\sin\frac{\gamma}{2}\\
\cos\frac{\alpha}{2}\sin\frac{\beta}{2}\cos\frac{\gamma}{2}\sin\frac{\alpha}{2}\cos\frac{\beta}{2}\sin\frac{\gamma}{2}\\
\cos\frac{\alpha}{2}\cos\frac{\beta}{2}\sin\frac{\gamma}{2}-\sin\frac{\alpha}{2}\sin\frac{\beta}{2}\cos\frac{\gamma}{2}
cos2αcos2βcos2γsin2αsin2βsin2γsin2αcos2βcos2γ−cos2αsin2βsin2γcos2αsin2βcos2γsin2αcos2βsin2γcos2αcos2βsin2γ−sin2αsin2βcos2γ
atan2(2(q_{0}q_{1}q_{2}q_{3}),1-2(q^{2}_{1}q^{2}_{2}))\\
atan2(2(q_{0}q_{3}q_{1}q_{2}),1-2(q^{2}_{2}q^{2}_{3}))
atan2(2(q0q1q2q3),1−2(q12q22))arcsin(2(q0q2−q1q3)atan2(2(q0q3q1q2),1−2(q22q32))
atan2(y,x)是一个函数在C语言里返回的是指方位角函数原型为
另外需要注意的就是奇异性问题即万向锁下面分析这种情况。
当刚体绕Y轴旋转了
90°俯仰角pitch90时如何计算横滚角roll和偏航角yaw这时会发生自由度丢失的情况即Yaw和Roll会变为一个自由度。
此时再使用上面的公式根据四元数计算欧拉角会出现问题
2(q0q2−q1q3)±0.5时在程序中浮点数不能直接进行等于判断要使用合理的阈值俯仰角
(q0,q1,q2,q3)然后可以发现逆向公式中atan2函数中的参数全部为0即出现了
0.707(\cos\frac{\alpha}{2}\cos\frac{\gamma}{2}\sin
0.707(\sin\frac{\alpha}{2}\cos\frac{\gamma}{2}-\cos\frac{\alpha}{2}\sin
0.707(\cos\frac{\alpha}{2}\cos\frac{\gamma}{2}\sin
0.707(\cos\frac{\alpha}{2}\sin\frac{\gamma}{2}-\sin
\frac{\alpha}{2}\cos\frac{\gamma}{2})
0.707(cos2αcos2γsin2αsin2γ)0.707(sin2αcos2γ−cos2αsin2γ)0.707(cos2αcos2γsin2αsin2γ)0.707(cos2αsin2γ−sin2αcos2γ)
0.707cos2α−γ0.707sin2α−γ0.707cos2α−γ−0.707sin2α−γ
\frac{q_{1}}{q_{0}}-\frac{q_{3}}{q_{2}}\tan\frac{\alpha
β为-90°即刚体竖直向下时的情况也与之类似可以推导出奇异姿态时的计算公式。
将四元数转换为欧拉角的代码可以参考附件。
需要注意欧拉角有12种旋转次序而上面推导的公式是按照Z-Y-X顺序进行的所以有时会在网上看到不同的转换公式因为对应着不同的旋转次序在使用时一定要注意旋转次序是什么。
比如ADAMS软件里就默认Body
3-1-3次序即Z-X-Z欧拉角而VREP中则按照X-Y-Z欧拉角旋转。
另外万向锁问题代码的Z-Y-X欧拉角代码见类CameraSpacePoint。
为更全面理解四元数和方便引入slerp插值这一节补充四元数的其它性质旋转复合、双倍覆盖和指数形式。
q^{2}qq[cos(2\***ta),sin(2\***ta)u]
q2qq[cos(2θ),sin(2θ)u]的时候就已经涉及到一点了但是这里我们考虑的是更一般的情况。
v^{}q_{2}v^{}q^{*}_{2}q_{2}q_{1}vq^{*}_{1}q^{*}_{2}q_{net}vq^{*}_{net}
v′′q2v′q2∗q2q1vq1∗q2∗qnetvqnet∗其中
q^{*}_{1}q^{*}_{2}(q_{2}q_{1})^{*}
注意四元数乘法的顺序这和矩阵、复数的复合非常相似都是从右向左叠加。
另外要注意的是
q2的两个旋转轴进行的两次旋转它是沿着一个全新的旋转轴进行的一个等价旋转仅仅只有旋转的结果相同。
q[cos(\frac{1}{2}\***ta),sin(\frac{1}{2}\***ta)u]
[-cos(\frac{1}{2}\***ta),-sin(\frac{1}{2}\***ta)u]
\frac{1}{2}\***ta)(-u)]\end{aligned}
−q[−cos(21θ),−sin(21θ)u][cos(π−21θ),sin(π−21θ)(−u)]所以这个四元数旋转的角度为
2(π−21θ)2π−θ从下面的图中我们可以看到这两个旋转是完全等价的
(-q)v(-q)^{*}(-1)^{2}qvq^{*}qvq^{*}
(−q)v(−q)∗(−1)2qvq∗qvq∗所以我们经常说单位四元数与3D旋转有一个「2对1满射同态」(2-1
Cover)了3D旋转。
它的严格证明会用到一些李群的知识这里不再拓展。
−q是两个不同的四元数但是由于旋转矩阵中的每一项都包含了四元数两个分量的乘积它们的旋转矩阵是完全相同的即旋转矩阵并不会出现双倍覆盖的问题。
e^{u\***ta}cos(\***ta)u_{q}sin(\***ta)cos(\***ta)usin(\***ta)
euθcos(θ)uqsin(θ)cos(θ)usin(θ)这也就是说
euθ。
这个公式的证明与欧拉公式的证明非常类似直接使用级数展开就可以了这里不再扩展。
i是非常类似的。
有了指数型的表示方式我们就能够将之前四元数的旋转公式改写为指数形式了由此可得到定义
w^{}e^{u_{q}\frac{\***ta}{2}}ve^{-u_{q}\frac{\***ta}{2}}
w′euq2θve−uq2θ有了四元数的指数定义我们就能够定义四元数的更多运算了。
首先是自然对数
log(q)log(e^{u_{q}\***ta})[0,{u\***ta}]
log(q)log(euqθ)[0,uθ]接下来是单位四元数的幂运算
q^{t}(e^{u_{q}\***ta})^{t}e^{u_{q}(t\***ta)}[cos(tθ),
qt(euqθ)teuq(tθ)[cos(tθ),sin(tθ)u]可以看到一个单位四元数的
t结合。
这些运算会在之后讨论四元数插值时非常有用。
限于篇幅四元数插值的讲解见下一篇博客《三维空间刚体运动4-2四元数插值lerpNlerpSlerpSquad等》
上面给出四元数的指数形式后可推导出一个重要的指函数性质这一性质下一篇将用到。
首先看推论
\mathbb{H}_{1},p[a,b\mathbf{v}]
\mathbb{R},\mathbf{v}\in\mathbb{R}^{3}
q[r,\mathbf{v}]q^{*}[r,\mathbf{v^{}}]
q[a,b\mathbf{v}]q^{*}[a,b\mathbf{v^{}}]
\begin{aligned}qpq^{*}q[a,b\mathbf{v}]q^{*}\\qb[\frac{a}{b},\mathbf{v}]q^{*}\\b[\frac{a}{b},\mathbf{v^{}}]\\[a,b\mathbf{v^{}}]\end{aligned}
qpq∗q[a,bv]q∗qb[ba,v]q∗b[ba,v′][a,bv′]根据推论得出以下定理
\mathbb{H}_{1},p[\cos\***ta,\sin\***ta\mathbf{v}],t\in\mathbb{R}
q[\cos\***ta,\sin\***ta\mathbf{v}]q^{*}[\cos\***ta,\sin\***ta\mathbf{v^{}}]
q[cosθ,sinθv]q∗[cosθ,sinθv′]因此得到
q(\exp(t[0,\***ta\mathbf{v}]))q^{*}
q(\exp[0,t\***ta\mathbf{v}])q^{*}
qptq∗q(exp(tlogp))q∗q(exp(t[0,θv]))q∗q(exp[0,tθv])q∗q([costθ,sintθv])q∗[costθ,sintθv′]exp(t[0,θv′])exp(tlog[cosθ,sinθv′])exp(tlog(qpq∗))(qpq∗)t
现在我们通过两个小程序实际演练四元数的运算。
其中四元数的基础运算和高阶运算程序实现放在下一讲Slerp中。
第一个小程序是演示四元数的常规运算包括与旋转矩阵、旋转向量的转换以及用四元数旋转一个向量如下所示
#includeeigen3/Eigen/Geometryusing
**argv){//Eigen/Geometry模块提供了各种旋转和平移的表示3D旋转矩阵直接使用Matrix3d或Matrix3fMatrix3d
Matrix3d::Identity();//旋转向量使用AngleAxis它底层不直接是Matrix但运算可以当做矩阵因为重载了运算符AngleAxisd
1));//设置输出精度cout.precision(3);coutrotation
\nrotation_matrixendl;coutrotation
\nrotation_vector.matrix()endl;//旋转向量转换的矩阵可以直接赋值给旋转矩阵rotation_matrix
rotation_vector.toRotationMatrix();coutrotation
\nrotation_matrixendl;//旋转向量Vector3d
v.transpose()endl;//四元数可以直接把AngleAxis赋值给四元数反之亦然Quaterniond
Quaterniond(rotation_vector);//coeffs:多项式系数coefficients)其顺序为(x,y,z,w)w为实部xyz为虚部coutquaternion
q.coeffs().transpose()endl;//也可以直接把旋转矩阵赋给它q
Quaterniond(rotation_matrix);coutquaternion
q.coeffs().transpose()endl;//使用四元数旋转一个向量使用重载的乘法即可//注意q*v在数学上是qvq^{-1}v_rotated
v_rotated.transpose()endl;//用常规向量乘法表示qvq^{-1}则计算如下Quaterniond
q*Quaterniond(0,1,0,0)*q.inverse();coutshould
q_rotate_v.coeffs().transpose()endl;return
0请读者注意程序代码通常和数学表示有一些细微的差别。
例如通过运算符重载四元数和三维向量可以直接计算乘法但在数学上则需要先把向量转成虚四元数再利用四元数乘法进行计算同样的情况也适用于变换矩阵乘三维向量的情况。
总体而言程序中的用法会比数学公式更灵活。
例子设有小萝卜一号和小萝卜二号位于世界坐标系中。
记世界坐标系为
TRk,W,k1,2也就是世界坐标系到相机坐标系的变换关系。
现在小萝卜一号看到某个点在自身的坐标系下坐标为
pR1[0.5,0,0.2]T求该向量在小萝卜二号坐标系下的坐标。
这是一个非常简单但又具有代表性的例子。
在实际场景中你经常需要在同一个机器人的不同部分或者不同机器人之间转换坐标。
计算过程也很简单只需计算
p_{R_{2}}T_{R_{2},W}T_{W,R_{1}}p_{R_{1}}
#includeeigen3/Eigen/Geometryusing
0.2);coutq1.coeffs\nq1.coeffs()endl;coutq2.coeffs\nq2.coeffs()endl;//四元数转换为旋转矩阵coutq1.matrix\nq1.matrix()endl;coutq2.matrix\nq2.matrix()endl;//归一化转换为单位四元数q1.normalize();q2.normalize();coutq1.normalizeq1.matrix()endl;coutq2.normalizeq2.matrix()endl;//位移向量t1,t2,小萝卜一号下的坐标pr1Vector3d
0.2);//Eigen::Isometry3d:欧式变换矩阵4*4Isometry3d
Tr2w(q2);coutTwr1.matrixTwr1.matrix()endl;coutTr2w.matrixTr2w.matrix()endl;//坐标转换计算TRatTwr1.pretranslate(t1);Tr2w.pretranslate(t2);//先将pr1转换为世界坐标系然后转换为小萝卜二号下的坐标pr2Vector3d
Twr1.inverse()*pr1;coutpr2.transposepr2.transpose()endl;return
本文基于《视觉SLAM十四讲从理论到实践》和《Quaternions,
Animation》编写但相对于原文会适当精简同时为便于全面理解会收集其他网络好文根据作者理解加入一些注解和扩展知识点如果您觉得还不错请一键四连点赞关注收藏评论让更多的人看到。
《视觉SLAM十四讲从理论到实践》高翔、张涛等著中国工信出版社Quaternions,
Animation四元数与三维旋转四元数与欧拉角RPY角的相互转换如何形象地理解四元数
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback