三维重建、图形学、SLAM、机器人运动控制中有一个基础而又硬核的知识点--旋转与平移。他们经常在一个系统内部交替使用,以发挥它们各自在不同计算阶段的优势。不同的表示方法在内存占用、插值平滑度、求导计算(优化)以及直观理解上有着截然不同的特性。另外这个概念与数学中的李群紧密结合,本文试图以大家看得懂的模式娓娓道来。

一、四元数
旋转矩阵(9参数)太冗余,容易产生舍入误差导致矩阵不再正交!欧拉角(3参数)虽然直观,却存在 万向节死锁(Gimbal Lock)的奇异性。四元数以 4 个参数的代价,完美平衡了计算效率、紧凑性与连续性,它是描述三维旋转最"优雅"的代数形式。
1.0 楔子------刚体旋转与欧拉旋转定理
1.0.1 刚体旋转
在 SLAM、机器人运动学和三维重建中,我们处理的对象通常是刚体(Rigid Body)------比如一台无人机、一个机器人的机械臂,或者三维扫描得到的一个石膏像。
刚体旋转 (Rigid Body Rotation)是指刚体在空间中绕某一点或某根轴做转动,且在转动过程中,刚体内部任意两点之间的距离保持不变。
核心几何特性:
- 保距性(Isometry):物体不会变大,也不会变小,更不会发生扭曲。
- 保角性:物体内部的夹角保持不变。
- 手性保持:左手坐标系旋转后依然是左手坐标系,不会变成镜像。
在数学上,这意味着描述刚体旋转的算子(无论是旋转矩阵还是四元数),必须是一个特殊正交算子(Special Orthogonal Operator),其模长(或行列式)必须严格等于 1。
我们定义的旋转即绕某一个对象进行旋转,并且这里约定后续:在二维空间中,旋转是围绕一个二维点的旋转,实际上在二维平面 中,所有的运动都被限制在 xy 平面内。当你进行旋转时,平面内唯一不动的"锚点"就是圆心。
从二维升一维,在三维空间中,旋转是围绕一个旋转轴的旋转,二维空间围绕点旋转就是从三维空间中围绕一个轴旋转的俯视。
1.0.2 欧拉旋转定理
在 1775 年,莱昂哈德·欧拉(Leonhard Euler)提出了一个关于定义:
不管一个三维刚体经过了多么复杂的连续翻滚、旋转(只要不发生平移),它最终的姿态,都可以等效为绕着空间中某一根特定的轴,旋转了一个特定的角度。
后面我们还要提到。
1.1 开头------从坐标到算子
在二维平面中,一个复数也就是点 (x,y) z=x+iy 在复平面上既是一个点,也是一个从原点出发的向量。 当我们想让这个点旋转 θ 时,最直观的想法是使用 2×2 旋转矩阵。然而,复数提供了一种更优雅的工具:单位复数算子 q=cosθ+isinθ。
根据欧拉公式
,
,r是模长,旋转后的新位置即为:

也即:

矩阵形式,把上式展开:

如果我们将实部和虚部重新写成向量形式
,它完全等同于二维旋转矩阵的操作:

这也就是复数乘法的几何意义:模长相乘,幅角相加。
- 由于 q 是单位复数,其模长为 1,这意味着乘以 q 不会拉伸向量(保模性)。
- 乘法动作直接作用于相位角,将 θ 叠加到原有的相位上。
欧拉公式不仅是一个优美的等式,它实际上是将三角函数的加法定理 封装进了一个简单的指数符号中。它告诉我们:复数乘法在代数上的自洽性,刚好完美契合了欧拉平面上的几何旋转。
【思考🤔】 :这种"一个乘法解决一个旋转"的算子化思想极其迷人。我们是否能直接迁移这个逻辑到三维空间?比如,给复数再加一个虚轴 j,构造一个三元数?数学家哈密顿曾为此苦恼了十年,直到他意识到三维旋转的本质比二维要复杂得多。
1.2 几何过渡------罗德里格斯公式的深度拆解
在三维空间中,旋转不再是绕着一个"点",而是绕着一根"轴" u。在引入四元数之前,我们必须先从几何层面理解旋转到底发生了什么。
剧透介绍一下这个公式:
罗德里格斯公式描述了三维向量绕单位旋转轴旋转θ角后的结果。

其中,第一项是向量在旋转轴垂直方向的分量按角度旋转,第二项是向量在旋转轴方向的分量保持不变,第三项是向量与旋转轴的叉积产生的旋转分量,。
1.2.1 向量的正交分解
假设我们要绕单位轴 u 旋转向量 v。罗德里格斯公式的第一步是将 v 分解:
- 平行分量 v∥ :它是 v 在 u 方向上的投影。在旋转中,它像轴心一样不动。

- 垂直分量 v⊥ :它是 v 垂直于轴的部分。旋转的本质,就是这个分量在垂直平面内的二维运动。



1.2.2 构造旋转平面
为了描述 v⊥ 的旋转,我们需要在该平面内找到另一个基向量。通过叉积 w=u×v ,我们得到了一个与 **v⊥** 等长且垂直的向量。此时,旋转后的垂直分量可以表示为:

俯视图看刚才的旋转
最终,合成旋转后的向量:

罗德里格斯公式虽然直观,但它是一堆向量运算(点积、叉积、加法)的集合。它缺乏复数那种"一个乘法搞定一切"的代数简洁性。而四元数的出现,就是为了把这串复杂的几何投影封装进一个四维代数系统里。
1.3 代数跃迁------四元数的诞生与哈密顿规则
1843 年之前,哈密顿一直苦苦寻找一种"三维复数"(超复数),形式上他希望它是 a+bi+cj。他认为,既然二维旋转需要一个实部和一个虚轴(1 和 i),那么三维旋转理应需要一个实部和两个虚轴(1、i 和 j)。哈密顿意识到三维旋转无法在三维代数内封闭。
如果我们要定义三元数 q=a+bi+cj,那么计算两个三元数的乘法时,必然会产生一个项:i×j。
- 在二维复数中,i×i=−1,依然留在系统内。
- 在三维构想中,i×j 等于什么?如果它等于某个常数,或者回到 a,i,j 之中,会发现逻辑无法自洽。这样的构造没有意义!
- i×j 必须指向一个全新的维度 。1843年,他跳出思维定式,引入了第四个维度。这个新维度既不是 i,也不是 j,而是垂直于它们的 k。
这里我们暂且先不讨论四元数的几何意义,后面会提到的!
1.3.1 定义与核心规则
四元数 q 由一个实部 w 和一个三维向量部分 v 组成:

其基本规则
蕴含了非交换性
,这里的乘法是叉积。

1.3.2 乘法中隐藏的几何
设两个四元数分别为 q1=[w1,v1] 和 q2=[w2,v2](其中 w 是实部,v 是虚部向量)。
当我们计算两个四元数乘积
时,

我们先看实部,

这里的点积项 v1⋅v2 对应的是几何中的投影 。在罗德里格斯公式中,我们需要处理平行分量(投影),而四元数通过实部自动结算了这些投影产生的重叠部分。
再看结果的虚部为:

注意那个叉积项! 它正是罗德里格斯公式中 u×v 项的代数来源。在罗德里格斯公式中,u×v 的作用是在三维空间中临时构建一个垂直于轴的虚轴 。 在四元数乘法里,i,j,k 三者的乘法规则(如 i×j=k)本质上就是单位向量的叉积 。 当 v1 和 v2 相乘时,算子自动通过叉积项 v1×v2 找到了那个垂直于它们的"第三维度"。这说明四元数乘法天生就具备描述三维空间旋转关系的"几何直觉"。
1.3.3 对齐罗德里格斯公式
回头看看齐罗德里格斯公式

如果我们让 q 作为一个旋转算子,令 w=cosθ 且 ∣v∣=sinθ(暂且不考虑 θ/2),我们发现前面的:

项处理的是旋转中与原向量平行或共面 的线性组合。后面还会提到
项则直接接管了罗德里格斯公式中那个让向量跳出原始方向、进入垂直平面的动力。
四元数乘法里的叉积项不是数学家的随意发明,它正是为了捕获那个'绕轴旋转'时必须产生的垂直分量。哈密顿通过引入 k 这个维度,强行让原本在三维里'无法封闭'的叉积运算,变成了一个自给自足的代数闭环!
- 在罗德里格斯公式中,u×v 的作用是在三维空间中临时构建一个"虚轴",好让向量在垂直平面内旋转。
- 而在四元数定义中,哈密顿规定 i×j=k,j×k=i...。当你计算两个虚部向量 v1 和 v2 的乘积时,四元数代数强制要求产生一个叉积项。
不妨这样说,四元数乘法本质上就是一套高度自动化的罗德里格斯公式计算器。
四元数乘法自带的叉积性质,完美承接了罗德里格斯公式中"跳出原始维度"的需求。它不是凑巧长得像,而是四元数代数在设计之初,就内嵌了三维空间旋转的几何手性(Right-hand rule)。
四元数乘法与这个公式的关系,下一节会详细推出!
有了这套代数系统,我们终于可以像操作复数一样操作三维旋转了。但这里有一个巨大的陷阱:如果我们直接左乘一个四元数,结果会产生一个"四维残留",让我们的点跑出三维空间。请接着看下一节。
1.4核心奥义------三明治变换与"半角"之谜
这一节,我们会从公式计算来得出一个惊艳的巧合:三明治变换凑齐了齐罗德里格斯公式!!!
1.4.1 纯四元数
引入四元数以后,三维空间的点 p 被表示为实部为 0 的纯四元数 p=[0,v](三维空间三个维度)。
如果我们定义旋转算子(这个说法类比前面二维复数的情况)
(这里先用 α 代替角度 ,悬念留到最后),直接执行左乘
根据四元数乘法公式(实部相乘减点积,标量乘向量加叉积),结果是:

化简:

看看这个实部,变成了 −sinα(u⋅v )。除非我们的原始向量 v 刚好垂直于旋转轴 u(此时点积为 0),否则这个实部绝不为零 。这意味着经过一次单边乘法,我们的三维空间点p"跑出了三维世界,被强行挤入了第四维度(实数轴)! 它不再是一个纯向量了,这就叫维度的污染。
1.4.2 三明治结构的"洗涤"作用
为了解决维度污染,也就是把这个跑到四维空间的向量"拉回来",我们需要一个反向操作。
对于单位四元数,它的逆
刚好等于它的共轭(即实部不变,虚部向量取反):

1.实部
我们执行双边操作:

我们顺着刚才的
继续算:


根据四元数乘法公式
:


最终实部 :

这是一个非常可观的结果,右乘产生的点积项刚好和左乘留下的实部完全抵消,这个乘积使得结果的实部恢复到了0!
2.虚部
再看虚部
,为了逻辑清晰,我们把 v 分解为 v∥ 和 **v⊥** 来观察:

把所有虚部项加起来:

化简:
- 平行部分: (sin2α+cos2α)v∥ =v∥
- 垂直部分: (cos2α−sin2α)v⊥ =cos(2α)v⊥
- 叉积部分: (2sinαcosα)(u×v )=sin(2α)(u×v)

于是:
=[0,
]
3.合起来
我们计算出结果发现:
- 实部归零 :证明了双边操作
是三维空间纯洁性的'洗涤剂',保证了三维向量p仍在三维空间内。 - 2α:在虚部化旋转效果发生了叠加。化简出了旋转的二倍角!这意味着,如果想让向量旋转 θ,给四元数的初值 α 必须减半。
这个角度叠加可以类比于二维复数旋转算子的情况,一个复数经过旋转算子,得到的值是模不变,角度叠加!
另外,这里的 双边操作
被称为三明治变换!
这个结果是非常惊艳的,注意看这个虚部,和前面的齐罗德里格斯公式比较:

我们发现,三明治变换的结果的虚部就是齐罗德里格斯公式!实际上, 罗德里格斯公式是四元数旋转的几何原型 ,而四元数乘法是罗德里格斯公式在四维空间里的高效封装实现。
- "如果罗德里格斯公式是手动挡,你需要自己分解平行与垂直分量、自己计算叉积、自己组合各项;
- 那么四元数乘法就是自动挡 。你只需要把旋转轴和角度封装进 q,把坐标封装进 p,执行一次
,四元数代数内部的'齿轮'(点积控制实部、叉积控制虚部)就会自动完成所有复杂的几何投影和旋转合并
4.**奇妙的对称性,**为什么是 θ/2?
因为 p 在公式中被左右各"操作"了一次,旋转角会叠加。为了得到总角度 θ,我们构造 q 时必须使用半角:

这不仅解决了代数封闭性,还引出了四元数的双倍覆盖(Double Cover)特性:q 和 −q 在三明治变换下对 p的作用是完全一样的:在三明治变换
中,如果我们把 q 替换为 −q,

所以,从代数结果看,q 和 −q 对向量 p 产生的位移完全一致。但在四元数空间里,q 和 −q 却是两个截然不同的点(互为镜像)。
5.还有一个问题
到这里,我们做了:从二维复平面举例了围绕点的旋转算子,在三维空间中回顾了齐罗德里格斯公式 ,然后跟着哈密顿定义了四元数,并且发现这个定义导致了三明治变换的虚部=齐罗德里格斯公式,
为什么我们要对一个纯四元数来进行这样乌漆嘛黑费尽巴脑的操作? 简单直接的回答是:因为"纯四元数"就是三维向量在四元数空间里的唯一合法化身。
只有当 p 是纯四元数时,这个变换才表现为"完美的刚体旋转"。如果你传入一个实部不为 0 的普通四元数 P=[w,v],三明治变换的结果会变成:

实部 w 根本没有变! 三明治变换就像一个"滤波器",它会自动跳过实部,只对虚部(向量部分)进行旋转叠加。
既然实部在旋转中完全不参与演化,我们为了计算三维空间的点,自然就令起始实部为 0,这样结果的实部也是 0,省去了处理多余维度的麻烦。
这是代数意义上的,从直观上讲,三明治变换**
** 得到的虚部,就是齐罗德里格斯公式的代数实现!当然这个实现是基于哈密顿构造的四元数!所以我们不用关心这个p的实部。
6. 例子
假设你要将向量
绕单位轴
旋转角度 θ。
由三明治变换公式
=[0,
],
第一步:构造旋转四元数 q(算子化)
这是将旋转意图包装成四元数。根据半角公式:

注意: 轴 u 必须是单位向量(模长为 1)。如果不是,请先进行归一化。
第二步:构造纯四元数 p(向量化)
将你要旋转的空间向量 v 包装成实部为 0 的形式,不需要再归一化:
p=[0,x,y,z]
第三步:执行"三明治"变换
计算旋转后的四元数 p′:

由于 q 是单位四元数,其逆 q−1 等于共轭
,
旋转后的新位置 v′ 就藏在 p′ 的虚部(后三个分量)中:

1.5 它到底是什么样子?------直观意义
1. 4D 空间中的"单位矢量
如果说复数 是"带有旋转性质的数字",那么四元数 在几何上就是:三维空间中"旋转算子"的终极封装。
四元数 q=[w,x,i,j] 几何上存在于一个四维空间中的一个单位球面:
- 单位约束:所有的旋转四元数都落在四维空间的"单位超球壳"(3-Sphere)上。
- 几何直觉:你可以把四元数想象成一根从四维原点指向超球面上某个点的"指针"。
- 旋转的本质 :这个指针在四维球面上的位置,唯一确定了三维空间中物体的一个姿态。
2."轴-角"描述的代数化身
四元数的四个分量并不是孤立的,它们是对旋转几何要素的重新编码:
-
实部 w=cos(θ/2):代表了旋转的"量"。它决定了旋转在四维空间中向"实轴"偏移的程度。
-
虚部 v=sin(θ/2)u:代表了旋转的"质"。它的方向完全指向旋转轴 u,其长度则取决于旋转角度的大小。
3."坐标系变换"的传送门
这是工程中最核心的几何意义。
-
单边 qp:几何上相当于把向量 v 从我们的三维世界"踢"向了四维空间的一个中间状态。
-
双边 qpq−1 :几何上是一场镜像对称操作。左乘 q 开启了旋转,右乘 q−1 像一面镜子一样,把所有偏离三维空间的"分量"全部反射回来,并在旋转平面内完成了角度的叠加。
1.6现代工程的利器------Slerp 插值
在 SLAM 相机轨迹优化或 3D 动画中,我们需要在两个姿态 q0 和 q1 之间平滑过渡。
1.6.1 线性插值(Lerp)的局限
直接对 4 个分量取平均再归一化(Nlerp),虽然简单,但会导致角速度不均匀(中间快,两头慢),在精密传感器融合中会导致畸变。
1.6.2 球面线性插值(Slerp)
由于单位四元数分布在一个四维超球面上,Slerp 沿着球面的大圆弧进行等弧长滑动。

这种方式保证了匀角速度旋转。
二、旋转矩阵
2.1 基本知识
旋转矩阵 (Rotation Matrix) 是三维视觉、计算机图形学和机器人学中最基础的数学工具之一。它在代数上是一个矩阵,但在几何上,它完美地描述了刚体在空间中的姿态变化,或者两个坐标系之间的相对朝向。
在数学上,三维空间中的旋转矩阵属于特殊正交群 SO(3) (Special Orthogonal Group)。
2.1. 1 核心数学性质
我们类比前面二维空间中的旋转,

类似地,一个 3×3 的矩阵 R 要想成为一个旋转矩阵,必须严格满足以下两个条件:

2.1.2. 几何直觉:旋转矩阵的列向量就是"新基底"
很多人觉得旋转矩阵是一堆枯燥的三角函数组合。但其实,理解旋转矩阵最直观的方式是把它看作三个列向量的组合:

当你用旋转矩阵 R 乘以一个坐标轴的单位向量(比如 X 轴 [1,0,0]T)时,得到的结果正是 rx。
- 旋转矩阵的第一列,就是旋转后的新 X 轴在原坐标系下的坐标;第二列是新 Y 轴的坐标;第三列是新 Z 轴的坐标。
- 这也解释了为什么它必须是正交矩阵:因为现实中刚体的 X、Y、Z 轴永远是互相垂直且长度为 1 的,所以 R 的三个列向量也必须是互相正交的单位向量。
2.2 再探欧拉旋转定理
欧拉旋转定理 (Euler's Rotation Theorem) 是刚体运动学和三维空间几何中一个非常核心且优雅的定理。简单来说,它证明了三维空间中任何两个共原点的参考系,都可以通过绕某一个固定轴的一次旋转来相互转换。
换句话说:不管一个三维刚体经过了多么复杂的连续翻滚、旋转(只要不发生平移),它最终的姿态,都可以等效为绕着空间中某一根特定的轴,旋转了一个特定的角度。
2.2. 1数学表述与几何直觉
欧拉旋转定理 (Euler's Rotation Theorem) 是刚体运动学和三维空间几何中一个非常核心且优雅的定理。简单来说,它证明了三维空间中任何两个共原点的参考系,都可以通过绕某一个固定轴的一次旋转来相互转换。
换句话说:不管一个三维刚体经过了多么复杂的连续翻滚、旋转(只要不发生平移),它最终的姿态,都可以等效为绕着空间中某一根特定的轴,旋转了一个特定的角度。
在数学上,三维空间中的旋转通常由一个 3×3 的正交矩阵 R 来表示,且满足 det(R)=1(特殊正交群 SO(3))。欧拉旋转定理的本质是指出:
对于任何旋转矩阵 R,必然存在一个非零向量 v,使得:

这意味着:
- 这个向量 v 在旋转操作下保持不变。
- 这个保持不变的方向,就是旋转轴。
- 既然 Rv =1⋅v ,说明旋转矩阵 R 必然有一个特征值为 λ=1,而旋转轴就是对应于这个特征值的特征向量。
2.2.2轴角、罗德里格斯与四元数
欧拉旋转定理直接奠定了三维旋转的轴角表示法 (Axis-Angle Representation) 的理论基础。既然任何旋转都可以用一个单位向量 u(旋转轴)和一个标量 θ(旋转角)来描述,我们就可以衍生出极为强大的数学工具:
罗德里格斯旋转公式 (Rodrigues' Rotation Formula): 欧拉定理告诉我们轴和角的存在,而罗德里格斯公式则提供了从三维向量 v 绕轴 u 旋转 θ 角度后的精确代数计算方法,并能直接推导出等效的旋转矩阵 R。它建立起了轴角和旋转矩阵之间的显式桥梁。


四元数 (Quaternions): 轴角表示法可以非常自然地转化为单位四元数 q=(cos2θ,usin2θ)。在处理大规模三维重建和视觉定位任务时(例如 Structure from Motion 中的全局 Bundle Adjustment,或 3D Gaussian Splatting 的位姿优化),直接对 3×3 的旋转矩阵进行梯度下降是非常困难的,因为很难保持矩阵的正交性。而四元数利用了欧拉定理的本质,不仅计算极其高效、避免了万向节死锁,还能提供平滑的连续梯度(通过球面线性插值 Slerp 等方式),这是现代 3D 视觉算法的基石。

2.4 到底是哪个?绕轴旋转还是新坐标系基底
答案:两者描述的是同一件事情的过程与结果,绕轴旋转是过程,新坐标系基底是结果,我们设原始三维空间坐标系也就是世界坐标系为w1,无论是坐标系中的一个刚体还是坐标系中某个点,绕某个轴旋转得到新的坐标位置,都相当于这个刚体和该点进入了新的坐标系w2,而w1转换到w2的矩阵,还是这个旋转矩阵!旋转矩阵的列向量构成了w2的基底。
我们还可以这样理解,刚体和坐标系原点就是绑定的,刚体围绕转轴旋转也就相当于坐标系在旋转!

2.4 旋转矩阵与四元数的转换
2.4.1 四元数到旋转矩阵(q→R)
由单位四元数构造旋转矩阵是一个纯代数多项式展开的过程,完全避免了三角函数的计算,因此在计算图(如 CUDA 并行渲染或神经网络前向传播)中执行效率极高。
设单位四元数为 q=[w,x,y,z]T。将其与欧拉旋转定理中的轴角参数化对齐:w=cos(2θ),[x,y,z]T=usin(2θ)。通过将其代入罗德里格斯公式并利用半角公式化简,可以直接得到对应的 3×3 旋转矩阵 R:

在 3DGS 等基于可微渲染的大规模场景重建算法中,为了保证 3D 高斯的协方差矩阵
始终半正定,通常将旋转状态定义为 4 个独立的可优化参数(四元数)。在每次前向传播渲染时,底层 CUDA 代码会强制对这 4 个参数进行 L2 归一化(使其成为单位四元数),随后直接套用上述公式生成旋转矩阵 R,进而完成后续的投影计算。这种参数化不仅计算极快,且天然保证了反向传播时梯度的连续性。
2.3.2 旋转矩阵到四元数(R→q)
从 3×3 矩阵
反推四元数的过程,本质上是求解上述方程组的逆问题。由于 q 和 −q 代表三维空间中的同一个物理旋转(双重覆盖性质),因此反解结果会有符号上的多态性。
为了求解,我们首先观察矩阵的迹(Trace):

由此可解得实部 w:

观察非对角线元素的差值,可以分离出 x,y,z:

在实际的程序实现(如 Eigen 库或 Ceres Solver 的底层实现)中,直接使用上述公式除以 4w 是极度危险的。当旋转角接近 180∘ 时,w→0(即 Tr(R)→−1),会导致严重的除零溢出。
因此,严谨的 R→q 算法必须引入分支逻辑(Pivoting),寻找模长最大的四元数分量作为分母来计算其他分量,具体在这里不做展开了,现在大多数第三方库都有对应方法。
2.5 colmap中的R与t
2.5.1 w2c与c2w
作为3DGS的研究者,我们不得不提一下SfM,他的目的是利用已有图像的特征,来估计相机位姿R与t以及据此进行三维重建。这里的旋转矩阵利用点就是坐标系的转换,比如,我们在colmap界面查看的时候,是从世界坐标系来看的,所以相机姿态R是一个world to camera(w2c)矩阵,也就是任意点被w2c左乘都会把这个点变换到相机坐标系下,
X_cam = * X_world +
反之,为c2w矩阵,也就是相机坐标系下任意点,被c2w左乘,都会变到世界坐标系下:
X_world = * X_cam +
2.5.2齐次坐标
我之前的mvg篇提到过,不同于SLAM和机器人领域,计算机视觉中设定了这个R与t是在射影空间内,也就是欧式空间加了一个scale的"属性",这样使得空间变得完整并且符合我们人类肉眼的感知,也就是任意两条直线必相交!但在欧式空间内两条直线还有可能平行。
射影空间下坐标为齐次坐标,我们因此也把旋转与平移放在一起:

展开后等价于:
。 这清晰地展示了:点首先被旋转,然后被平移。
由于 R 是正交矩阵,齐次矩阵的逆
具有解析解,不需要进行复杂的矩阵求逆:

2.5.3 colmap gui
推导那么多干什么呢?主要是为了直观展示colmap gui界面中的相机外参,尤其是位置。
我们打开一个点云,注意看世界坐标系原点rgb轴的位置,在鸟头顶的附近:

打开图片:

里面rotation为相机旋转的四元数转换过去就是
,transiation是
我们在看一下这个公式:X_cam = * X_world +
,把世界坐标系的原点带入,就会发现,原点在相机坐标系的位置刚好就是这个
!!!
所以说,我们以图片为坐标中心去看刚才那个世界坐标系原点的时候,这个点就位于=[0.00302111,-1.2168,3.41264],也就是,这个点在相机坐标系原点的上方偏左的位置。

那么,相机中心位于世界坐标系的位置呢?答案是:camera_center = -R^T * t,这是根据前面的公式计算的:

2.5.4 相机内外参的计算
相机内参包括cx,cy(图片分辨率的一半),fx,fy(x,y方向的焦距),外参数就是R,t,我们如何估计他们呢,一般来说内参包含在图片信息中可以获取,在colmap中也可以估计,我们假设内参已知,梳理一下估计外参的过程,根据极几何

首先,通过PnP(Perspective-n-Point)算法通过几对特征点x来求解基础矩阵F(3*3矩阵):
F自由度为8,故可以用8对特征点来求解。这个F包含了相机内参K和外参的信息,利用图像间的特征点匹配关系,我们可以得到一个本质矩阵E,E 在代数上隐式包含了平移和旋转:

然后SVD分解得到R,t:

有了相对位姿,就可以通过三角化 (Triangulation) 算出初始的 3D 点云,这就为后续新图片的 PnP 估计打下了基础。
2.5.5 colmap的bundle adjustment简介
在处理类似 COLMAP 的稀疏重建任务时,我们面对的是一堆完全未知的图片,内参(包括畸变)、外参、3D 点坐标全都是未知的。这就是所谓的自标定 (Self-Calibration) 过程。

就是让所有 3D 点投影回 2D 图像上的位置(算子),与 SuperPoint/SIFT 提取出的真实 2D 像素位置
之间的误差,在整体上达到最小。
经过 Ceres Solver 等后端优化器的多次雅可比矩阵求导和迭代更新,最初"粗糙"的 cx,cy,fx,fy 会慢慢收敛到最符合真实物理镜头的精确值,甚至能精准捕捉到微小的畸变系数。