前言
之前看了高博的《视觉SLAM十四讲》,里面有一段关于罗德里格斯公式,但是高博没有给出具体推导。然后我查了很多博主,都没有给出怎么推到
R=cosθI+(1−cosθ)nnT+sinθn∧
怎么也没有弄懂 cosθI 是怎么来的。
因此我查了查维基给出的定义,然后自己再推一遍。
PS:潜水****多年,学到了不少东西,这篇是我的第一篇博客,分享些我自己的学习心得,如有错误的地方,请大家指正,谢谢大家。
旋转向量
旋转向量的概念
任意旋转都可以用一个旋转轴和一个旋转角来表示。
假设有一个旋转轴为n,角度为θ 的旋转,则对应的旋转向量为:
θn
旋转矩阵和旋转向量的关系
对于旋转矩阵R 和旋转向量θn, 他们的关系有:
R=cosθI+(1−cosθ)nnT+sinθn∧
符号∧是向量的反对称的转换符号:
n=⎣⎡abc⎦⎤,则n∧=⎣⎡0c−b−c0ab−a0⎦⎤
罗德里格斯公式推导
假设v在三维空间中,绕单位旋转轴 k,旋转θ。

从上图可以看出,对于向量v 可以分出两个分向量:
v=v∥+v⊥
其中 v∥平行于旋转轴k:
v∥=(v⋅k)k
v⊥垂直于旋转轴k:
v⊥=v−v∥=v−(k⋅v)k=−k×(k×v)
在这里我们也可以得到:
v=(k⋅v)k−k×(k×v)
向量 k×v可以看作 v⊥ 绕k 反向旋转 90∘。
叉乘公式和点乘公式转换:
a×(b×c)=(a⋅c)b−(a⋅b)c
v∥旋转后的为:
v∥rot =v∥
v⊥旋转后为:
∣v⊥rot∣v⊥rot=∣v⊥∣=cosθv⊥+sinθk×v⊥
其中:
k×v⊥=k×(v−v∥)=k×v−k×v∥=k×v
因此:
v⊥rot=cosθv⊥+sinθk×v
旋转后的向量vrot为:
vrot=v∥rot+v⊥rot
vrot=v∥+cosθv⊥+sinθk×v=v∥+cosθ(v−v∥)+sinθk×v=cosθv+(1−cosθ)v∥+sinθk×v=cosθv+(1−cosθ)(k⋅v)k+sinθk×v
其中:
(k⋅v)k=k(k⋅v)=k(kTv)=(kkT)v
所以 vrot=(cosθI+(1−cosθ)kkT+sinθk∧)v
注意:
如果在
vrot=v∥+cosθv⊥+sinθk×v
中将v∥ 替换为 v−v⊥ ,再将 v⊥ 替换为−k×(k×v)则:
vrot=v−v⊥+cosθv⊥+sinθk×v=v+k×(k×v)−cosθk×(k×v)+sinθk×v=v+(1−cosθ)k×(k×v)+sinθk×v=v+(1−cosθ)K2v+sinθk×v=(I+(1−cosθ)K2+sinθK)v
K=k∧ 为 k 的反对称矩阵。
从上述两种推导,我们可以得出罗德里格斯公式
R=cosθI+(1−cosθ)kkT+sinθk∧=I+(1−cosθ)K2+sinθK
从上式子中,我们也可以得到:
kkT=K2+I
这一步的推导,可以回到上面公式
v=(k⋅v)k−k×(k×v)
和
(k⋅v)k=k(k⋅v)=k(kTv)=(kkT)v
得到。