3.1旋转矩阵
点、向量、坐标系
向量 a a a: a = e a e = Σ 1 3 a i e i a=e a_e = \Sigma_1^3 a_i e_i a=eae=Σ13aiei, e = [ e 1 , e 2 , e 3 ] e=[e_1, e_2, e_3] e=[e1,e2,e3]为三维空间的一组基(是一个矩阵,每个元素 e i e_i ei是一个列向量), a e a_e ae为 a a a在这组基下的坐标(是一个列向量)。
内积: a ⋅ b = a e T b e = Σ a i b i = ∣ a ∣ ∣ b ∣ c o s < a , b > a\cdot b = a_e^T b_e = \Sigma a_i b_i = |a| |b| cos<a,b> a⋅b=aeTbe=Σaibi=∣a∣∣b∣cos<a,b>,向量的坐标与基有关,所以右小角有一个 ⋅ e \cdot_e ⋅e,但向量的长度、夹角都与基无关,所以不加 ⋅ e \cdot_e ⋅e, a i , b i a_i,b_i ai,bi分别是 a e , b e a_e,b_e ae,be的元素。
外积: a × b = d e t ( [ e a e T b e T ] ) = [ a 2 b 3 − a 3 b 2 a 3 b 1 − a 1 b 3 a 1 b 2 − a 2 b 1 ] = [ 0 − a 3 a 2 a 3 0 − a 1 − a 2 a 1 0 ] b e a\times b = det(\begin{bmatrix} e \\ a_e^T \\ b_e^T \end{bmatrix}) = \begin{bmatrix} a_2b_3 - a_3b_2 \\ a_3b_1 - a_1b_3 \\ a_1b_2 - a_2b_1 \end{bmatrix} = \begin{bmatrix} 0 & -a_3 & a_2 \\ a_3 & 0 & -a_1 \\ -a_2 & a_1 & 0 \end{bmatrix} b_e a×b=det( eaeTbeT )= a2b3−a3b2a3b1−a1b3a1b2−a2b1 = 0a3−a2−a30a1a2−a10 be,
[ 0 − a 3 a 2 a 3 0 − a 1 − a 2 a 1 0 ] \begin{bmatrix} 0 & -a_3 & a_2 \\ a_3 & 0 & -a_1 \\ -a_2 & a_1 & 0 \end{bmatrix} 0a3−a2−a30a1a2−a10 是一个由 a e a_e ae改写成的反对称矩阵。
注:这么写有点麻烦,后面无特殊说明, a , b a,b a,b就指用同一组基表示的向量。
注:反对称矩阵满足 A T = − A A^T = -A AT=−A
坐标系间的欧式变换
世界坐标系或惯性坐标系是一个静坐标系,相机坐标系是一个动坐标系。
刚体运动:如果相机运动是一个刚体运动,则两个坐标系间的运动由一个旋转加一个平移组成。或者说两个坐标系间相差一个欧式变换(Euclidean Transform)。
向量 a a a在两个坐标系下的坐标为 a e , a e ′ a_e, a_{e'} ae,ae′,两个坐标系是经过一次旋转的关系,则有:
a e = R a e ′ a_e = R a_{e'} ae=Rae′,其中 R = e T e ′ R= e^T e' R=eTe′称为旋转矩阵或方向余弦矩阵(direction cosine)。
旋转矩阵是行列式为1的正交矩阵;行列式为1的正交矩阵是旋转矩阵。
注:正交矩阵满足 A T = A − 1 A^T=A^{-1} AT=A−1,则有 a e ′ = R − 1 a e a_{e'} = R^{-1} a_e ae′=R−1ae,矩阵求逆描述了反向旋转
注:行列式为-1的正交矩阵是瑕旋转矩阵(一次旋转加一次反射)。
n n n维旋转矩阵的集合: S O ( n ) = { R ∈ R n × n ∣ R R T = I , d e t ( R ) = I } SO(n) = \{R \in \mathbb R^{n\times n} | RR^T = I, det(R)=I \} SO(n)={R∈Rn×n∣RRT=I,det(R)=I}, S O ( n ) SO(n) SO(n)是特殊正交群的意思。
欧式变换:两个坐标系是一次旋转加一次平移的关系, a e ′ = R a e + t a_{e'} = R a_e + t ae′=Rae+t, t t t为平移向量
注:将 a e ′ = R a e + t a_{e'} = R a_e + t ae′=Rae+t简写为 a ′ = R a + t a' = R a + t a′=Ra+t
变换矩阵与齐次坐标
如果向量 a a a至 c c c经过两次欧式变换,则有: c = R 2 ( R 1 a + t 1 ) + t 2 c = R_2(R_1 a + t_1) + t_2 c=R2(R1a+t1)+t2
为了简便表示,引入齐次坐标,将 a ′ = R a + t a' = R a + t a′=Ra+t表示为:
[ a ′ 1 ] = [ R t 0 1 ] [ a 1 ] = T [ a 1 ] \begin{bmatrix} a' \\ 1 \end{bmatrix} = \begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix} \begin{bmatrix} a \\1 \end{bmatrix} = T \begin{bmatrix} a \\1 \end{bmatrix} [a′1]=[R0t1][a1]=T[a1]
用变换矩阵 T T T表示欧式变换, a a a用齐次坐标 [ a 1 ] \begin{bmatrix} a \\1 \end{bmatrix} [a1]代替(为简便表示, a a a就是齐次坐标),则两次欧式变换可写作: c = T 2 T 1 a c = T_2T_1 a c=T2T1a。
特殊欧式群: S E ( 3 ) = { T = [ R t 0 1 ] ∈ R 4 × 4 ∣ R ∈ S O ( 3 ) , t ∈ R 3 } SE(3) = \{T = \begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix} \in \mathbb{R}^{4\times 4} | R \in SO(3), t\in \mathbb{R}^3 \} SE(3)={T=[R0t1]∈R4×4∣R∈SO(3),t∈R3}。
欧式变换的逆: T − 1 = [ R T − R T t 0 1 ] T^{-1} = \begin{bmatrix} R^T & -R^Tt \\ 0 & 1 \end{bmatrix} T−1=[RT0−RTt1]
3.3 旋转向量与欧拉角
旋转向量
旋转矩阵有9个分量,但一次旋转只有3个自由度,是否有更紧凑的表达?
答:罗德里格斯公式(Rodrigues),用一个向量 n n n和一个标量 θ \theta θ表示
任意旋转都可以用一个旋转轴和一个旋转角表示,转轴是单位向量 n n n,转角为 θ \theta θ,则有:
R = c o s θ I + ( 1 − c o s θ ) n n T + s i n θ n s s m R = cos\theta I + (1-cos \theta) n n^T + sin \theta n^{ssm} R=cosθI+(1−cosθ)nnT+sinθnssm
其中, ⋅ s s m \cdot^{ssm} ⋅ssm表示向量的反对称矩阵
缺点:具有奇异性, θ = 0 \theta=0 θ=0时, R = I R=I R=I, n n n可以是任意向量,即转轴不唯一。
由 R R R计算 n , θ n,\theta n,θ:
θ = a r c c o s ( t r ( R ) − 1 2 ) \theta = arccos(\frac{tr(R) - 1}{2}) θ=arccos(2tr(R)−1)
因为 R n = n Rn=n Rn=n,所以 n n n是 R R R的特征值为1对应的特征向量。
欧拉角
欧拉角:将一个旋转分解为三次绕不同轴的旋转,最常见的是采用偏航-俯仰-滚转描述旋转。
偏航-俯仰-滚转:绕Z轴旋转 α \alpha α,绕旋转后的Y轴旋转 β \beta β,绕旋转后的X轴旋转 γ \gamma γ。
缺点:用三个标量表示旋转会出现奇异性问题(万向锁问题)。
万向锁:如果绕Y轴旋转90度,那么系统丢失一个自由度(绕X轴的旋转)。绕Z轴旋转 α \alpha α再绕旋转后的Y轴旋转 90 90 90再绕旋转后的X轴旋转 β \beta β 等于 绕Z轴旋转 α ± β \alpha \pm \beta α±β再绕旋转后的Y轴旋转 90 90 90。
欧拉角演示网站 https://danceswithcode.net/engineeringnotes/rotations_in_3d/demo3D/rotations_in_3d_tool.html
3.4 四元数
四元数即紧凑也没有奇异性
平面旋转可由单位复数描述 e i θ = c o s θ + i s i n θ e^{i \theta} = cos\theta + i sin\theta eiθ=cosθ+isinθ,三维旋转可由单位四元数描述。
四元数 q = [ s , v ] T , s = q 0 ∈ R , v = [ q 1 , q 2 , q 3 ] T ∈ R 3 q=[s,v]^T, s=q_0 \in \mathbb{R}, v=[q_1,q_2,q_3]^T \in \mathbb{R}^3 q=[s,v]T,s=q0∈R,v=[q1,q2,q3]T∈R3,四元数有三个虚部一个实部。
四元数的加减、乘、逆、数乘和复数类似。
用四元数描述旋转: p ′ = q p q − 1 p'=qpq^{-1} p′=qpq−1,等效为 p ′ = R p p'=Rp p′=Rp
其中,三维空间点 p = [ 0 , x , y , z ] T p=[0,x,y,z]^T p=[0,x,y,z]T(用虚四元数表示),单位四元数 q q q。
注:用四元数表示旋转,则 p p p为虚四元数;用旋转矩阵表示旋转,则 p p p为三维向量。需要读者带入当前语境中自行理解。
旋转即可用单位四元数 q = [ s , v ] T q=[s,v]^T q=[s,v]T表示,也可用旋转矩阵表示,则前者转换为后者的公式为:
R = v v T + s 2 I + 2 s v s s m + ( v s s m ) 2 R=vv^T + s^2 I + 2s v^{ssm} + (v^{ssm})^2 R=vvT+s2I+2svssm+(vssm)2
反过来的转换公式:
θ = 2 a r c c o s ( s ) , n = [ q 1 , q 2 , q 3 ] / s i n ( θ / 2 ) \theta = 2arccos(s), n=[q_1,q_2,q_3]/sin(\theta/2) θ=2arccos(s),n=[q1,q2,q3]/sin(θ/2)
3.5 相似、仿射、射影变换
相似变换比欧式变换多了一个自由度:缩放,变换矩阵为:
T S = [ s R t 0 1 ] T_S = \begin{bmatrix} sR & t \\ 0 & 1 \end{bmatrix} TS=[sR0t1]
用 S i m ( 3 ) Sim(3) Sim(3)表示三维相似变换的集合(相似变换群)
仿射变换(正交投影)仅要求 A A A是一个可逆矩阵,不是必须为一个可逆矩阵,变换矩阵为:
T A = [ A t 0 1 ] T_A = \begin{bmatrix} A & t \\ 0 & 1 \end{bmatrix} TA=[A0t1]
射影变换是最一般的变换,变换矩阵为:
T A = [ A t a T v ] T_A = \begin{bmatrix} A & t \\ a^T & v \end{bmatrix} TA=[AaTtv]
其中, A A A是一个可逆矩阵,左下角为缩放,右上角为平移
真实世界到相机照片的变换,如果焦距有限是射影变换,焦距无限是仿射变换。
欧式变换:保持长度、夹角、体积,6自由度;
相似变换:保持体积比,7自由度;
仿射变换:保持平行性、体积比,12自由度;
射影变换:保持接触平面的相交和相切,15自由度。
注:欧式变换的旋转矩阵有正交性,将其自由度缩减为3,再加上平移向量,共6个自由度。
注:射影变换右下角的 v = 0 v=0 v=0或 1 1 1,共15个自由度
有空继续补充一下,编程及其运行结果。