Rodrigues 公式推导

Rodrigues 公式推导

rodrigues公式计算旋转轴 k \mathbf{k} k 和旋转角度 θ \theta θ 得到旋转矩阵

分解 v \mathbf{v} v向量

k : 旋 转 轴 的 单 位 方 向 矢 量 v : 绕 k 旋 转 的 任 意 向 量 将 v 分 解 为 垂 直 和 平 行 于 旋 转 轴 k 的 两 个 向 量 v = v ∥ + v ⊥ − − ( 1 ) v ∥ = ( v ⋅ k ) ⋅ k − − ( 2 ) ( 括 号 部 分 是 v 在 k 上 的 投 影 , 外 部 份 单 位 向 量 k 赋 予 方 向 ) v ⊥ = v − v ∥ = v − ( v ⋅ k ) ⋅ k 根 据 公 式 : a × ( b × c ) = ( a ⋅ c ) ⋅ b − ( a ⋅ b ) ⋅ c ,   且 k ⋅ k = 1 ,   v ⋅ k = k ⋅ v v − ( v ⋅ k ) ⋅ k = v − ( k ⋅ v ) ⋅ k = − ( − k ⋅ k ) ⋅ v + ( − k ⋅ v ) ⋅ k = ( − k ⋅ v ) ⋅ k − ( − k ⋅ k ) ⋅ v = − k × ( k × v ) 即 有 : v ⊥ = − k × ( k × v ) − − ( 3 ) \begin{aligned} &\mathbf{k}:旋转轴的单位方向矢量\\ &\mathbf{v}:绕\mathbf{k}旋转的任意向量\\ &将\mathbf{v}分解为垂直和平行于旋转轴\mathbf{k}的两个向量\\ &\mathbf{v}=\mathbf{v_{\parallel }}+\mathbf{v_{\perp}} \quad\color{red}{--(1)}\\ &\mathbf{v_{\parallel}}=(\mathbf{v}\cdot\mathbf{k})\cdot\mathbf{k}\quad \color{red}{--(2)}\quad(括号部分是\mathbf{v}在\mathbf{k}上的投影,外部份单位向量\mathbf{k}赋予方向)\\ &\mathbf{v_{\perp}}=\mathbf{v}-\mathbf{v_{\parallel}}=\mathbf{v}-(\mathbf{v}\cdot\mathbf{k})\cdot\mathbf{k}\\ &根据公式:\mathbf{a}\times(\mathbf{b}\times\mathbf{c})=(\mathbf{a}\cdot\mathbf{c})\cdot\mathbf{b}-(\mathbf{a}\cdot\mathbf{b})\cdot\mathbf{c},\ 且\mathbf{k}\cdot\mathbf{k}=1,\ \mathbf{v}\cdot\mathbf{k}=\mathbf{k}\cdot\mathbf{v}\\ &\mathbf{v}-(\mathbf{v}\cdot\mathbf{k})\cdot\mathbf{k}\\ &\quad\quad\quad\quad\quad\quad =\mathbf{v}-(\mathbf{k}\cdot\mathbf{v})\cdot\mathbf{k}\\ &\quad\quad\quad\quad\quad\quad =-(-\mathbf{k}\cdot\mathbf{k})\cdot\mathbf{v}+(-\mathbf{k}\cdot\mathbf{v})\cdot\mathbf{k}\\ &\quad\quad\quad\quad\quad\quad =(-\mathbf{k}\cdot\mathbf{v})\cdot\mathbf{k}-(-\mathbf{k}\cdot\mathbf{k})\cdot\mathbf{v}\\ &\quad\quad\quad\quad\quad\quad =-\mathbf{k}\times(\mathbf{k}\times\mathbf{v})\\ &即有:\\ &\mathbf{v_{\perp}}=-\mathbf{k}\times(\mathbf{k}\times\mathbf{v}) \quad \color{red}{--(3)}\\ \end{aligned} k:v:kvkv=v+v(1)v=(vk)k(2)(vkk)v=vv=v(vk)ka×(b×c)=(ac)b(ab)c, kk=1, vk=kvv(vk)k=v(kv)k=(kk)v+(kv)k=(kv)k(kk)v=k×(k×v)v=k×(k×v)(3)

分解旋转后的向量 v r o t \mathbf{v_{rot}} vrot

分解了 v \mathbf{v} v向量之后,再来考虑旋转之后的向量, v r o t \mathbf{v_{rot}} vrot,同样的可以分为垂直和平行于旋转轴 k \mathbf{k} k的两个向量
v r o t = v ∥ r o t + v ⊥ r o t v ∥ r o t = v ∥ − − ( 4 ) ∣ v ⊥ r o t ∣ = ∣ v ⊥ ∣ 垂 直 的 分 量 旋 转 后 大 小 不 变 v ⊥ r o t = cos ⁡ θ ⋅ v ⊥ + sin ⁡ θ ⋅ k × v ⊥ − − ( 5 ) 可 以 看 做 平 面 向 量 的 绕 原 点 旋 转 上 式 中 的 k × v ⊥ 可 以 做 如 下 化 简 计 算 k × v ⊥ = k × ( v − v ∥ ) = k × v + k × v ∥ 显 然 后 一 项 中 的 两 个 向 量 是 平 行 的 结 果 为 0 向 量 = k × v − − ( 6 ) 因 此 公 式 ( 5 ) 改 写 为 : v ⊥ r o t = cos ⁡ θ ⋅ v ⊥ + sin ⁡ θ ⋅ k × v − − ( 7 ) 最 后 综 合 v r o t v r o t = v ∥ r o t + v ⊥ r o t = v ∥ + cos ⁡ θ ⋅ v ⊥ + sin ⁡ θ ⋅ k × v − − ( 8 ) \begin{aligned} &\mathbf{v}_{rot}=\mathbf{v}_{\parallel rot}+\mathbf{v}_{\perp rot}\\ &\mathbf{v}_{\parallel rot}=\mathbf{v}_{\parallel}\quad \color{red}{--(4)}\\ |&\mathbf{v}_{\perp rot} | =|\mathbf{v}_{\perp} | \quad垂直的分量旋转后大小不变\\ &\mathbf{v}_{\perp rot }=\cos \theta \cdot \mathbf{v}_{\perp}+\sin \theta\cdot \mathbf{k}\times \mathbf{v}_{\perp} \quad \color{red}{--(5)}\quad 可以看做平面向量的绕原点旋转\\ &上式中的\mathbf{k}\times \mathbf{v}_{\perp}可以做如下化简计算\\ &\mathbf{k}\times \mathbf{v}_{\perp}\\ &\quad\quad\quad=\mathbf{k}\times(\mathbf{v}-\mathbf{v}_{\parallel})\\ &\quad\quad\quad =\mathbf{k}\times\mathbf{v}+\mathbf{k}\times\mathbf{v}_{\parallel}\quad\quad 显然后一项中的两个向量是平行的结果为0向量\\ &\quad\quad\quad =\mathbf{k}\times\mathbf{v} \quad \color{red}{--(6)} &因此公式(5)改写为:\\ &\mathbf{v}_{\perp rot }=\cos \theta \cdot \mathbf{v}_{\perp}+\sin \theta\cdot \mathbf{k}\times \mathbf{v} \quad\color{red}{--(7)}\\ &最后综合\mathbf{v}_{rot}\\ &\mathbf{v}_{rot}\\ &\quad=\mathbf{v}_{\parallel rot}+\mathbf{v}_{\perp rot}\\ &\quad =\mathbf{v}_{\parallel}+\cos \theta \cdot \mathbf{v}_{\perp}+\sin \theta\cdot \mathbf{k}\times \mathbf{v} \quad \color{red}{--(8)} \end{aligned} vrot=vrot+vrotvrot=v(4)vrot=vvrot=cosθv+sinθk×v(5)k×vk×v=k×(vv)=k×v+k×v0=k×v(6)vrot=cosθv+sinθk×v(7)vrotvrot=vrot+vrot=v+cosθv+sinθk×v(8)5

综合化简

首先给出反对称阵skew,用于代替叉积计算,再将公式(8)化简形式为 v r o t = R ⋅ v \mathbf{v}_{rot}=\mathbf{R}\cdot\mathbf{v} vrot=Rv
反 对 称 阵 s k e w 令 K = [ 0 − k z k y k z 0 − k x − k y k x 0 ] 其 中 k = [ k x , k y , k z ] T 将 叉 积 转 换 为 矩 阵 乘 法 K ⋅ v = k × v − − ( 9 ) K ⋅ ( K ⋅ v ) = k × ( k × v ) = K 2 ⋅ v − − ( 10 ) \begin{aligned} &\small反对称阵skew\\ &\small令\mathbf{K}= \left[\begin{array}{ccc} 0 & -k_{z} & k_{y} \\ k_{z} & 0 & -k_{x} \\ -k_{y} & k_{x} & 0 \end{array}\right]\\ &\small其中\mathbf{k}=[k_{x},k_{y},k_{z}]^{T}\\ &{\small将叉积转换为矩阵乘法}\\ &\small\mathbf{K}\cdot\mathbf{v}=\mathbf{k}\times\mathbf{v}\quad \color{red}{--(9)}\\ &\small\mathbf{K}\cdot(\mathbf{K}\cdot\mathbf{v})=\mathbf{k}\times(\mathbf{k}\times\mathbf{v})=\mathbf{K}^{2}\cdot\mathbf{v}\quad \color{red}{--(10)} \end{aligned} skewK=[0kzkykz0kxkykx0]k=[kx,ky,kz]TKv=k×v(9)K(Kv)=k×(k×v)=K2v(10)

将公式9和10带入式8中
v r o t = v ∥ + cos ⁡ θ ⋅ v ⊥ + sin ⁡ θ ⋅ k × v = v − v ⊥ + cos ⁡ θ ⋅ v ⊥ + sin ⁡ θ ⋅ K ⋅ v = v − ( 1 − cos ⁡ θ ) ⋅ ( − k × ( k × v ) ) + sin ⁡ θ ⋅ K ⋅ v = v + sin ⁡ θ ⋅ K ⋅ v + ( 1 − cos ⁡ θ ) ⋅ K 2 ⋅ v = ( I + sin ⁡ θ ⋅ K + ( 1 − cos ⁡ θ ) ⋅ K 2 ) ⋅ v − − ( 11 ) R = I + sin ⁡ θ ⋅ K + ( 1 − cos ⁡ θ ) ⋅ K 2 − − ( 12 ) v r o t = R ⋅ v − − ( 13 ) \begin{aligned} &\mathbf{v}_{rot}\\ &\quad =\mathbf{v}_{\parallel}+\cos \theta \cdot \mathbf{v}_{\perp}+\sin \theta\cdot \mathbf{k}\times \mathbf{v}\\ &\quad =\mathbf{v}-\mathbf{v}_{\perp}+\cos \theta \cdot \mathbf{v}_{\perp}+\sin \theta\cdot \mathbf{K}\cdot \mathbf{v}\\ &\quad =\mathbf{v}-(1-\cos \theta)\cdot(-\mathbf{k}\times(\mathbf{k}\times\mathbf{v}))+\sin \theta\cdot \mathbf{K}\cdot \mathbf{v}\\ &\quad =\mathbf{v}+\sin \theta\cdot \mathbf{K}\cdot \mathbf{v}+(1-\cos \theta)\cdot\mathbf{K}^{2}\cdot\mathbf{v}\\ &\quad =(\mathbf{I}+\sin \theta\cdot \mathbf{K}+(1-\cos \theta)\cdot\mathbf{K}^{2})\cdot\mathbf{v}\quad\color{red}{--(11)}\\ \\ &\mathbf{R}=\mathbf{I}+\sin \theta\cdot \mathbf{K}+(1-\cos \theta)\cdot\mathbf{K}^{2}\quad\color{red}{--(12)}\\ &\mathbf{v}_{rot}=\mathbf{R}\cdot\mathbf{v}\quad\color{red}{--(13)}\\ \end{aligned} vrot=v+cosθv+sinθk×v=vv+cosθv+sinθKv=v(1cosθ)(k×(k×v))+sinθKv=v+sinθKv+(1cosθ)K2v=(I+sinθK+(1cosθ)K2)v(11)R=I+sinθK+(1cosθ)K2(12)vrot=Rv(13)

式11即为rodrigues公式,实现了旋转矩阵与旋转轴、旋转角度之间的转换

从旋转矩阵得到旋转轴和旋转角

求旋转角

通过公式12可以很容易根据旋转轴和旋转角得到相应的旋转向量
而反求则需要重新推导式12
v r o t = v ∥ + cos ⁡ θ ⋅ v ⊥ + sin ⁡ θ ⋅ k × v 此 时 分 解 v ⊥ = v ∥ + cos ⁡ θ ⋅ ( v − v ∥ ) + sin ⁡ θ ⋅ k × v = cos ⁡ θ ⋅ v + ( 1 − cos ⁡ θ ) ⋅ v ∥ + sin ⁡ θ ⋅ K ⋅ v 根 据 公 式 2 替 换 v ∥ = cos ⁡ θ ⋅ v + ( 1 − cos ⁡ θ ) ⋅ ( v ⋅ k ) ⋅ k + sin ⁡ θ ⋅ K ⋅ v 已 知 等 式 成 立 : ( v ⋅ k ) ⋅ k = k k T ⋅ v 原 式 = cos ⁡ θ ⋅ v + ( 1 − cos ⁡ θ ) ⋅ k k T ⋅ v + sin ⁡ θ ⋅ K ⋅ v = ( cos ⁡ θ + ( 1 − cos ⁡ θ ) ⋅ k k T + sin ⁡ θ ⋅ K ) ⋅ v R = cos ⁡ θ ⋅ I + ( 1 − cos ⁡ θ ) ⋅ k k T + sin ⁡ θ ⋅ K \begin{aligned} &\mathbf{v}_{rot}\\ &\quad =\mathbf{v}_{\parallel}+\cos \theta \cdot \mathbf{v}_{\perp}+\sin \theta\cdot \mathbf{k}\times \mathbf{v} \quad 此时分解\mathbf{v}_{\perp}\\ &\quad =\mathbf{v}_{\parallel}+\cos \theta \cdot (\mathbf{v}-\mathbf{v}_{\parallel})+\sin \theta\cdot \mathbf{k}\times \mathbf{v}\\ &\quad =\cos\theta\cdot\mathbf{v}+(1-\cos\theta)\cdot\mathbf{v}_{\parallel}+\sin \theta\cdot \mathbf{K}\cdot \mathbf{v} \quad 根据公式2替换\mathbf{v}_{\parallel}\\ &\quad =\cos\theta\cdot\mathbf{v}+(1-\cos\theta)\cdot(\mathbf{v}\cdot\mathbf{k})\cdot\mathbf{k}+\sin \theta\cdot \mathbf{K}\cdot \mathbf{v}\\ &已知等式成立:(\mathbf{v}\cdot\mathbf{k})\cdot\mathbf{k}=\mathbf{k}\mathbf{k}^{T}\cdot \mathbf{v}\\ &原式\\ &\quad =\cos\theta\cdot\mathbf{v}+(1-\cos\theta)\cdot\mathbf{k}\mathbf{k}^{T}\cdot \mathbf{v}+\sin \theta\cdot \mathbf{K}\cdot \mathbf{v}\\ &\quad =(\cos\theta+(1-\cos\theta)\cdot\mathbf{k}\mathbf{k}^{T}+\sin \theta\cdot \mathbf{K})\cdot \mathbf{v}\\ &\mathbf{R}=\cos\theta\cdot\mathbf{I}+(1-\cos\theta)\cdot\mathbf{k}\mathbf{k}^{T}+\sin \theta\cdot \mathbf{K} \end{aligned} vrot=v+cosθv+sinθk×vv=v+cosθ(vv)+sinθk×v=cosθv+(1cosθ)v+sinθKv2v=cosθv+(1cosθ)(vk)k+sinθKv(vk)k=kkTv=cosθv+(1cosθ)kkTv+sinθKv=(cosθ+(1cosθ)kkT+sinθK)vR=cosθI+(1cosθ)kkT+sinθK

重新推导后的R与原来的形式结果是一致的
然后使用矩阵的迹求解旋转角
t r ( R ) = t r ( cos ⁡ θ ⋅ I + ( 1 − cos ⁡ θ ) ⋅ k k T + sin ⁡ θ ⋅ K ) t r ( R ) = cos ⁡ θ ⋅ t r ( I ) + ( 1 − cos ⁡ θ ) ⋅ t r ( k k T ) + sin ⁡ θ ⋅ t r ( K ) t r ( I ) = 3 , t r ( k k T ) = k T k = 1 , t r ( K ) = 0 t r ( R ) = 3 cos ⁡ θ + ( 1 − cos ⁡ θ ) = 1 + 2 cos ⁡ θ θ = arccos ⁡ ( t r ( R ) − 1 2 ) \begin{aligned} &tr(\mathbf{R})=tr(\cos\theta\cdot\mathbf{I}+(1-\cos\theta)\cdot\mathbf{k}\mathbf{k}^{T}+\sin \theta\cdot \mathbf{K})\\ &tr(\mathbf{R})=\cos\theta \cdot tr(\mathbf{I})+(1-\cos\theta)\cdot tr(\mathbf{k}\mathbf{k}^{T})+\sin \theta\cdot tr( \mathbf{K})\\ &\quad\quad\quad tr(\mathbf{I})=3 ,\quad tr(\mathbf{k}\mathbf{k}^{T})=\mathbf{k}^{T}\mathbf{k}=1,\quad tr(\mathbf{K})=0\\ &tr(\mathbf{R})=3\cos\theta+(1-\cos\theta)=1+2\cos\theta\\ &\theta=\arccos (\frac{tr(\mathbf{R})-1}{2} ) \end{aligned} tr(R)=tr(cosθI+(1cosθ)kkT+sinθK)tr(R)=cosθtr(I)+(1cosθ)tr(kkT)+sinθtr(K)tr(I)=3,tr(kkT)=kTk=1,tr(K)=0tr(R)=3cosθ+(1cosθ)=1+2cosθθ=arccos(2tr(R)1)

求旋转轴

通过matlab的符号运算可以得到R的各个元素表示

clear;
clc;
s=sym('s'); %sin theta
c=sym('c'); %cos theta
kx=sym('kx');
ky=sym('ky');
kz=sym('kz');
K=[0,-kz,ky;kz,0,-kx;-ky,kx,0];
I=eye(3);
R=I+s*K+(1-c)*K*K;

得到的R =

[ (c - 1)ky^2 + (c - 1)kz^2 + 1, - kzs - kxky*(c - 1), kys - kxkz*(c - 1)]
[ kzs - kxky*(c - 1), (c - 1)kx^2 + (c - 1)kz^2 + 1, - kxs - kykz*(c - 1)]
[ - kys - kxkz*(c - 1), kxs - kykz*(c - 1), (c - 1)*kx^2 + (c - 1)*ky^2 + 1]

可以发现其对角线左右的元素相减可以得到kx ky kz
R ( 3 , 2 ) − R ( 2 , 3 ) = 2 sin ⁡ θ ⋅ k x R ( 1 , 3 ) − R ( 3 , 1 ) = 2 sin ⁡ θ ⋅ k y R ( 2 , 1 ) − R ( 1 , 2 ) = 2 sin ⁡ θ ⋅ k z \begin{aligned} &\mathbf{R}(3,2)-\mathbf{R}(2,3)= 2\sin\theta\cdot k_{x}\\ &\mathbf{R}(1,3)-\mathbf{R}(3,1)= 2\sin\theta\cdot k_{y}\\ &\mathbf{R}(2,1)-\mathbf{R}(1,2)= 2\sin\theta\cdot k_{z}\\ \end{aligned} R(3,2)R(2,3)=2sinθkxR(1,3)R(3,1)=2sinθkyR(2,1)R(1,2)=2sinθkz
即可求得旋转轴的单位向量

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值