视觉SLAM十四讲--罗德里格斯公式(Rodrigues’s Formula)推导

前言

之前看了高博的《视觉SLAM十四讲》,里面有一段关于罗德里格斯公式,但是高博没有给出具体推导。然后我查了很多博主,都没有给出怎么推到
R=cosθI+(1cosθ)nnT+sinθn \boldsymbol{R}=\cos \theta \mathbf{I}+(1-\cos \theta) \boldsymbol{n} \boldsymbol{n}^{T}+\sin \theta \boldsymbol{n}^{\wedge}
怎么也没有弄懂 cosθI\cos \theta \mathbf{I} 是怎么来的。
因此我查了查维基给出的定义,然后自己再推一遍。
PS:潜水****多年,学到了不少东西,这篇是我的第一篇博客,分享些我自己的学习心得,如有错误的地方,请大家指正,谢谢大家。

旋转向量

旋转向量的概念

任意旋转都可以用一个旋转轴一个旋转角来表示。

假设有一个旋转轴为n\boldsymbol{n},角度为θ\theta 的旋转,则对应的旋转向量为:
θn\theta \boldsymbol{n}

旋转矩阵和旋转向量的关系

对于旋转矩阵R\boldsymbol{R} 和旋转向量θn\theta \boldsymbol{n}, 他们的关系有:
R=cosθI+(1cosθ)nnT+sinθn \boldsymbol{R}=\cos \theta \mathbf{I}+(1-\cos \theta) \boldsymbol{n} \boldsymbol{n}^{T}+\sin \theta \boldsymbol{n}^{\wedge}

符号\wedge是向量的反对称的转换符号:
n=[abc],n=[0cbc0aba0]\boldsymbol{n} = \left[\begin{matrix} a\\ b\\ c\\ \end{matrix}\right], 则\boldsymbol{n}^{\wedge} = \begin{bmatrix} 0 & -c & b\\ c & 0 & -a\\ -b& a & 0 \end{bmatrix}

罗德里格斯公式推导

假设v\mathbf{v}在三维空间中,绕单位旋转轴 k\mathbf{k},旋转θ\theta

视觉SLAM十四讲--罗德里格斯公式(Rodrigues’s Formula)推导

从上图可以看出,对于向量v\mathbf{v} 可以分出两个分向量:
v=v+v\mathbf{v}=\mathbf{v}_{\|}+\mathbf{v}_{\perp}

其中 v\mathbf{v}_{\|}平行于旋转轴k\mathbf{k}:
v=(vk)k\mathbf{v}_{\|}=(\mathbf{v} \cdot \mathbf{k}) \mathbf{k}

v\mathbf{v}_{\perp}垂直于旋转轴k\mathbf{k}:
v=vv=v(kv)k=k×(k×v) \mathbf{v}_{\perp}=\mathbf{v}-\mathbf{v}_{\|}=\mathbf{v}-(\mathbf{k} \cdot \mathbf{v}) \mathbf{k}=-\mathbf{k} \times(\mathbf{k} \times \mathbf{v})
在这里我们也可以得到:
v=(kv)kk×(k×v) \mathbf{v} = (\mathbf{k} \cdot \mathbf{v}) \mathbf{k} - \mathbf{k} \times(\mathbf{k} \times \mathbf{v})

向量 k×v\mathbf{k} \times \mathbf{v}可以看作 v\mathbf{v}_{\perp}k\mathbf{k} 反向旋转 9090^{\circ}

叉乘公式和点乘公式转换:
a×(b×c)=(ac)b(ab)c \mathbf{a} \times(\mathbf{b} \times \mathbf{c})=(\mathbf{a} \cdot \mathbf{c}) \mathbf{b}-(\mathbf{a} \cdot \mathbf{b}) \mathbf{c}

v\mathbf{v}_{\|}旋转后的为:
vrot =v \mathbf{v}_{\| \text {rot }}=\mathbf{v}_{\|}

v\mathbf{v}_{\perp}旋转后为:
vrot=vvrot=cosθv+sinθk×v \begin{aligned} \left|\mathbf{v}_{\perp r o t}\right| &=\left|\mathbf{v}_{\perp}\right| \\ \mathbf{v}_{\perp r o t} &=\cos \theta \mathbf{v}_{\perp}+\sin \theta \mathbf{k} \times \mathbf{v}_{\perp} \end{aligned}

其中:
k×v=k×(vv)=k×vk×v=k×v \mathbf{k} \times \mathbf{v}_{\perp}=\mathbf{k} \times\left(\mathbf{v}-\mathbf{v}_{\|}\right)=\mathbf{k} \times \mathbf{v}-\mathbf{k} \times \mathbf{v}_{\|}=\mathbf{k} \times \mathbf{v}

因此:
vrot=cosθv+sinθk×v \mathbf{v}_{\perp r o t}=\cos \theta \mathbf{v}_{\perp}+\sin \theta \mathbf{k} \times \mathbf{v}

旋转后的向量vrot\mathbf{v}_{rot}为:
vrot=vrot+vrot \mathbf{v}_{\mathrm{rot}}=\mathbf{v}_{\| \mathrm{rot}}+\mathbf{v}_{\perp \mathrm{rot}}
vrot=v+cosθv+sinθk×v=v+cosθ(vv)+sinθk×v=cosθv+(1cosθ)v+sinθk×v=cosθv+(1cosθ)(kv)k+sinθk×v \begin{aligned} \mathbf{v}_{rot} &=\mathbf{v}_{\|}+\cos \theta \mathbf{v}_{\perp}+\sin \theta \mathbf{k} \times \mathbf{v} \\ &=\mathbf{v}_{\|}+\cos \theta\left(\mathbf{v}-\mathbf{v}_{\mathbf{\|}}\right)+\sin \theta \mathbf{k} \times \mathbf{v} \\ &=\cos \theta \mathbf{v}+(1-\cos \theta) \mathbf{v}_{\|}+\sin \theta \mathbf{k} \times \mathbf{v} \\ &=\cos \theta \mathbf{v}+(1-\cos \theta)(\mathbf{k} \cdot \mathbf{v}) \mathbf{k}+\sin \theta \mathbf{k} \times \mathbf{v} \end{aligned}

其中:
(kv)k=k(kv)=k(kTv)=(kkT)v \begin{aligned} (\mathbf{k} \cdot \mathbf{v}) \mathbf{k} & = \mathbf{k} (\mathbf{k} \cdot \mathbf{v}) &= \mathbf{k} (\mathbf{k}^\mathbf{T} \mathbf{v} ) & = (\mathbf{k} \mathbf{k}^\mathbf{T})\mathbf{v} \end{aligned}
所以 vrot=(cosθI+(1cosθ)kkT+sinθk)v\mathbf{v}_{rot} = (\cos \theta \mathbf{I} +(1 - \cos \theta) \mathbf{k} \mathbf{k}^\mathbf{T} + \sin \theta \mathbf{k}^{\wedge}) \mathbf{v}

注意:
如果在
vrot=v+cosθv+sinθk×v \mathbf{v}_{rot}=\mathbf{v}_{\|}+\cos \theta \mathbf{v}_{\perp}+\sin \theta \mathbf{k} \times \mathbf{v}
中将v\mathbf{v}_{\|} 替换为 vv\mathbf{v}- \mathbf{v}_{\perp} ,再将 v\mathbf{v}_{\perp} 替换为k×(k×v)-\mathbf{k} \times(\mathbf{k} \times \mathbf{v})则:
vrot=vv+cosθv+sinθk×v=v+k×(k×v)cosθk×(k×v)+sinθk×v=v+(1cosθ)k×(k×v)+sinθk×v=v+(1cosθ)K2v+sinθk×v=(I+(1cosθ)K2+sinθK)v \begin{aligned} \mathbf{v}_{rot} &= \mathbf{v}- \mathbf{v}_{\perp} + \cos \theta \mathbf{v}_{\perp} + \sin \theta \mathbf{k} \times \mathbf{v}\\ & = \mathbf{v} + \mathbf{k} \times(\mathbf{k} \times \mathbf{v}) - \cos \theta \mathbf{k} \times(\mathbf{k} \times \mathbf{v}) + \sin \theta \mathbf{k} \times \mathbf{v} \\ & = \mathbf{v} + (1- \cos \theta) \mathbf{k} \times(\mathbf{k} \times \mathbf{v}) + \sin \theta \mathbf{k} \times \mathbf{v} \\ & = \mathbf{v} + (1- \cos \theta) \mathbf{K}^2 \mathbf{v} + \sin \theta \mathbf{k} \times \mathbf{v}\\ &= (\mathbf{I}+ (1- \cos \theta) \mathbf{K}^2 + \sin \theta \mathbf{K}) \mathbf{v} \end{aligned}

K=k\mathbf{K} = \mathbf{k}^\mathbf{\wedge}k\mathbf{k} 的反对称矩阵。

从上述两种推导,我们可以得出罗德里格斯公式
R=cosθI+(1cosθ)kkT+sinθk=I+(1cosθ)K2+sinθK \begin{aligned} \boldsymbol{R} &= \cos \theta \mathbf{I} +(1 - \cos \theta) \mathbf{k} \mathbf{k}^\mathbf{T} + \sin \theta \mathbf{k}^{\wedge}\\ & = \mathbf{I}+ (1- \cos \theta) \mathbf{K}^2 + \sin \theta \mathbf{K} \end{aligned}

从上式子中,我们也可以得到:
kkT=K2+I \begin{aligned} \mathbf{k} \mathbf{k}^\mathbf{T} = \mathbf{K}^2 + \mathbf{I} \end{aligned}
这一步的推导,可以回到上面公式
v=(kv)kk×(k×v) \mathbf{v} = (\mathbf{k} \cdot \mathbf{v}) \mathbf{k} - \mathbf{k} \times(\mathbf{k} \times \mathbf{v})

(kv)k=k(kv)=k(kTv)=(kkT)v \begin{aligned} (\mathbf{k} \cdot \mathbf{v}) \mathbf{k} & = \mathbf{k} (\mathbf{k} \cdot \mathbf{v}) &= \mathbf{k} (\mathbf{k}^\mathbf{T} \mathbf{v} ) & = (\mathbf{k} \mathbf{k}^\mathbf{T})\mathbf{v} \end{aligned}
得到。