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:绕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⋅vv−(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)
分解旋转后的向量 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=v∥rot+v⊥rotv∥rot=v∥−−(4)v⊥rot∣=∣v⊥∣垂直的分量旋转后大小不变v⊥rot=cosθ⋅v⊥+sinθ⋅k×v⊥−−(5)可以看做平面向量的绕原点旋转上式中的k×v⊥可以做如下化简计算k×v⊥=k×(v−v∥)=k×v+k×v∥显然后一项中的两个向量是平行的结果为0向量=k×v−−(6)v⊥rot=cosθ⋅v⊥+sinθ⋅k×v−−(7)最后综合vrotvrot=v∥rot+v⊥rot=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=R⋅v
反
对
称
阵
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}
反对称阵skew令K=[0kz−ky−kz0kxky−kx0]其中k=[kx,ky,kz]T将叉积转换为矩阵乘法K⋅v=k×v−−(9)K⋅(K⋅v)=k×(k×v)=K2⋅v−−(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=v−v⊥+cosθ⋅v⊥+sinθ⋅K⋅v=v−(1−cosθ)⋅(−k×(k×v))+sinθ⋅K⋅v=v+sinθ⋅K⋅v+(1−cosθ)⋅K2⋅v=(I+sinθ⋅K+(1−cosθ)⋅K2)⋅v−−(11)R=I+sinθ⋅K+(1−cosθ)⋅K2−−(12)vrot=R⋅v−−(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×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=kkT⋅v原式=cosθ⋅v+(1−cosθ)⋅kkT⋅v+sinθ⋅K⋅v=(cosθ+(1−cosθ)⋅kkT+sinθ⋅K)⋅vR=cosθ⋅I+(1−cosθ)⋅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+(1−cosθ)⋅kkT+sinθ⋅K)tr(R)=cosθ⋅tr(I)+(1−cosθ)⋅tr(kkT)+sinθ⋅tr(K)tr(I)=3,tr(kkT)=kTk=1,tr(K)=0tr(R)=3cosθ+(1−cosθ)=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
即可求得旋转轴的单位向量