相机成像原理以及旋转

1.相机成像原理

相机成像原理本质上就是点在世界坐标系、相机坐标系、像平面坐标系和像素平面坐标系四个坐标系中间的矩阵变换。
总体图如下:
在这里插入图片描述
矩阵关系可写作:
z c [ u v 1 ] = [ 1 d x 0 U 2 0 1 d y V 2 0 0 1 ] [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ R T 0 3 T 1 ] [ x w y w z w 1 ] z_c\begin{bmatrix} u \\ v \\ 1 \end{bmatrix}=\begin{bmatrix} \frac{1}{dx} & 0 & \frac{U}{2}\\ 0 & \frac{1}{dy} & \frac{V}{2} \\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \\ \end{bmatrix}\begin{bmatrix} R & T \\ 0^T_3 & 1 \end{bmatrix}\begin{bmatrix} x_w \\ y_w \\ z_w \\ 1 \end{bmatrix} zc uv1 = dx1000dy102U2V1 f000f0001000 [R03TT1] xwywzw1

  1. 世界坐标系——>相机坐标系:
    在这里插入图片描述

上述坐标的变换关系可以写为:
[ x c y c z c 1 ] = [ R T 0 3 T 1 ] [ x w y w z w 1 ] \begin{bmatrix} x_c \\ y_c \\ z_c \\ 1 \end{bmatrix} = \begin{bmatrix} R & T \\ 0^T_3 & 1 \end{bmatrix}\begin{bmatrix} x_w \\ y_w \\ z_w \\ 1 \end{bmatrix} xcyczc1 =[R03TT1] xwywzw1
2. 相机坐标系——>像平面坐标系
相机坐标系中的某点会投影在相机的成像平面上,利用针孔成像原理,空间任意一点 p c p_c pc与图像点 p p p之间的关系, p c p_c pc与相机光心 o c o_c oc的连线为 o c p c o_cp_c ocpc,与像面的交点p即为空间点 p c p_c pc在图像平面上的投影。
在这里插入图片描述

在已知相机焦距 f f f的情况下,可得:
x x c = y y c = f z c \frac{x}{x_c}=\frac{y}{y_c}=\frac{f}{z_c} xcx=ycy=zcf
p c p_c pc p p p的关系可以如下:
z c [ x y 1 ] = [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ x c y c z c 1 ] z_c\begin{bmatrix} x \\ y \\ 1 \end{bmatrix}=\begin{bmatrix} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \\ \end{bmatrix}\begin{bmatrix} x_c \\ y_c \\ z_c \\ 1 \end{bmatrix} zc xy1 = f000f0001000 xcyczc1
3. 像平面坐标系——>像素坐标系
像素坐标系和图像坐标系都在成像平面上,只是各自的原点和度量单位不一样。图像坐标系的原点为相机光轴与成像平面的交点,通常情况下是成像平面的中点。
在这里插入图片描述

由于图像坐标系的单位是mm,属于物理单位,而像素坐标系的单位是pixel,故两单位之间存在下面的变换关系:
1 p i x e l ∗ d x = 1 m m u 与 x 1 p i x e l ∗ d y = 1 m m v 与 y \begin{array}{ll} 1pixel * dx = 1mm & u与x\\ 1pixel * dy = 1mm & v与y \end{array} 1pixeldx=1mm1pixeldy=1mmuxvy
( u , v ) (u,v) (u,v) ( x , y ) (x,y) (x,y)之间的变换关系如下:
[ u v 1 ] = [ 1 d x 0 U 2 0 1 d y V 2 0 0 1 ] [ x y 1 ] \begin{bmatrix} u \\ v \\ 1 \end{bmatrix}=\begin{bmatrix} \frac{1}{dx} & 0 & \frac{U}{2}\\ 0 & \frac{1}{dy} & \frac{V}{2} \\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} x \\ y \\ 1 \end{bmatrix} uv1 = dx1000dy102U2V1 xy1

2 旋转平移

2.1 李群和李代数

2.2 罗德里格斯公式

  1. 旋转的分解:
    在这里插入图片描述
    由上图可知:
    v → = v → ∣ ∣ + v → ⊥ \overrightarrow{v}=\overrightarrow{v}_{||}+\overrightarrow{v}_\bot v =v ∣∣+v
    对与 v → ∣ ∣ \overrightarrow{v}_{||} v ∣∣来说,因为其与 u → \overrightarrow{u} u 平行,所以其旋转仍然为其本身。
    对于 v → ⊥ \overrightarrow{v}_{\bot} v 来说,看下图:
    在这里插入图片描述

其旋转为:
w → = u → × v → ⊥ v → ⊥ ′ = v → v + v → w ′ = c o s θ v → ⊥ + s i n θ w → = c o s θ v → ⊥ + s i n θ ( u → × v → ⊥ ) \begin{array}{ll} \overrightarrow{w}=\overrightarrow{u}\times \overrightarrow{v}_{\bot} \\ \begin{aligned} \overrightarrow{v}_{\bot}^{'}&=\overrightarrow{v}_{v}+\overrightarrow{v}_{w}^{'}\\&=cos\theta\overrightarrow{v}_{\bot}+sin\theta\overrightarrow{w}\\&=cos\theta\overrightarrow{v}_{\bot}+sin\theta(\overrightarrow{u}\times\overrightarrow{v}_{\bot}) \end{aligned} \end{array} w =u ×v v =v v+v w=cosθv +sinθw =cosθv +sinθ(u ×v )

也就是说 v → ⊥ \overrightarrow{v}_{\bot} v 旋转 θ \theta θ角度后的结果如下:
v → ⊥ ′ = c o s θ v → ⊥ + s i n θ ( u → × v → ⊥ ) \overrightarrow{v}^{'}_{\bot}=cos\theta\overrightarrow{v}_{\bot}+sin\theta(\overrightarrow{u}\times\overrightarrow{v}_{\bot}) v =cosθv +sinθ(u ×v )

又因为:
v → ∣ ∣ ′ = v → ∣ ∣ = ( u → ⋅ v → ) u → v → ⊥ = v → − ( u → ⋅ v → ) u → u → × v → ⊥ = u → × v → \begin{aligned} &\overrightarrow{v}^{'}_{||}=\overrightarrow{v}_{||}=(\overrightarrow{u}\cdot \overrightarrow{v} )\overrightarrow{u} \\ &\overrightarrow{v}_{\bot}=\overrightarrow{v}-(\overrightarrow{u}\cdot \overrightarrow{v} )\overrightarrow{u} \\ &\overrightarrow{u}\times\overrightarrow{v}_{\bot}=\overrightarrow{u}\times\overrightarrow{v} \end{aligned} v ∣∣=v ∣∣=(u v )u v =v (u v )u u ×v =u ×v
通过上述可得:
v ′ = v ∣ ∣ ′ + v ⊥ ′ = ( u ⋅ v ) u + c o s θ ( v − ( u ⋅ v ) u ) + s i n θ ( u × v ) = c o s θ v + ( 1 − c o s θ ) ( u ⋅ v ) u + s i n θ ( u × v ) = v + ( 1 − c o s θ ) ∗ u × ( u ⋅ v ) + s i n θ ( u × v ) \begin{array}{ll} \begin{aligned} \mathbf{v}^{'}&=\mathbf{v}^{'}_{||}+\mathbf{v}_{\bot}^{'} \\ &=(\mathbf{u}\cdot \mathbf{v} )\mathbf{u}+ cos\theta(\mathbf{v}-(\mathbf{u}\cdot \mathbf{v} )\mathbf{u})+sin\theta(\mathbf{u}\times\mathbf{v})\\ &=cos\theta\mathbf{v}+(1-cos\theta)(\mathbf{u}\cdot\mathbf{v})\mathbf{u}+sin\theta(\mathbf{u}\times\mathbf{v})\\ &=v+(1-cos\theta)*\mathbf{u}\times(\mathbf{u}\cdot\mathbf{v})+sin\theta(\mathbf{u}\times\mathbf{v}) \end{aligned} \end{array} v=v∣∣+v=(uv)u+cosθ(v(uv)u)+sinθ(u×v)=cosθv+(1cosθ)(uv)u+sinθ(u×v)=v+(1cosθ)u×(uv)+sinθ(u×v)

上述公式称作罗德里格斯公式。

2.3 2D旋转

在进行2D旋转讨论之前,我们首先要了解复数和矩阵之间的关系:

  • 复数乘法和矩阵之间的关系:

    z 1 = a + b i z 2 = c + d i 𝑧 1 𝑧 2 = 𝑎 𝑐 − 𝑏 𝑑 + 𝑎 𝑑 𝑖 + 𝑏 𝑐 𝑖 = 𝑎 𝑐 − 𝑏 𝑑 + ( 𝑏 𝑐 + a d ) i \begin{array}{ll} z_1 = a + bi\\ z_2 = c + di \\ 𝑧_1𝑧_2 = 𝑎𝑐 − 𝑏𝑑 + 𝑎𝑑𝑖 + 𝑏𝑐𝑖= 𝑎𝑐 − 𝑏𝑑+ (𝑏𝑐 + ad)i \end{array} z1=a+biz2=c+diz1z2=acbd+adi+bci=acbd+(bc+ad)i
    如果仔细观察就能发现,复数相乘的结果其实也是一个矩阵与向量相乘的
    结果,也就是说:
    z 1 z 2 = 𝑎 𝑐 − 𝑏 𝑑 + ( 𝑏 𝑐 + a d ) i = [ a − b b a ] [ c d ] z_1z_2 = 𝑎𝑐 − 𝑏𝑑+ (𝑏𝑐 + ad)i = \begin{bmatrix} a & -b \\ b & a \end{bmatrix}\begin{bmatrix} c \\ d \end{bmatrix} z1z2=acbd+(bc+ad)i=[abba][cd]

    [ c d ] \begin{bmatrix} c \\ d \end{bmatrix} [cd]为z_2的向量形式, [ a − b b a ] \begin{bmatrix} a & -b \\ b & a \end{bmatrix} [abba]为z_1的矩阵形式。接下来如果我们将 z 1 z_1 z1 z 2 z_2 z2用矩阵形式表示并相乘的话,可以得到下式:
    z 1 z 2 = [ a − b b a ] [ c − d d c ] = [ a c − b d − ( b c + a d ) b c + a d a c − b d ] z_1z_2=\begin{bmatrix} a & -b \\ b & a \end{bmatrix}\begin{bmatrix} c & -d \\ d & c \end{bmatrix}=\begin{bmatrix} ac - bd & -(bc + ad) \\ bc + ad & ac - bd \end{bmatrix} z1z2=[abba][cddc]=[acbdbc+ad(bc+ad)acbd]
    可以观察到结果 [ a c − b d − ( b c + a d ) b c + a d a c − b d ] \begin{bmatrix} ac - bd & -(bc + ad) \\ bc + ad & ac - bd \end{bmatrix} [acbdbc+ad(bc+ad)acbd] a c − b d + ( b c + a d ) i ac - bd + (bc+ad)i acbd+(bc+ad)i的矩阵形式。
    所以我们可以所以矩阵的乘法来表示复数的乘法。
    下面为1和i的矩阵形式:
    1 = [ 1 0 0 1 ] i = [ 0 − 1 1 0 ] \begin{array}{ll} 1 = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} \\ i = \begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix} \end{array} 1=[1001]i=[0110]

  • 复数相乘和2D旋转的联系

    通过上面的推导我们可以发现,复数相乘和矩阵相乘是可以等价的,那么也就可以将复数与2D旋转联系到一起。
    在这里插入图片描述
    观察上图我们可得:
    z = a + b i = [ a − b b a ] = a 2 + b 2 [ a a 2 + b 2 − b a 2 + b 2 b a 2 + b 2 a a 2 + b 2 ] = a 2 + b 2 [ c o s θ − s i n θ s i n θ c o s θ ] = [ a 2 + b 2 0 0 a 2 + b 2 ] [ c o s θ − s i n θ s i n θ c o s θ ] = [ ∣ ∣ z ∣ ∣ 0 0 ∣ ∣ z ∣ ∣ ] [ c o s θ − s i n θ s i n θ c o s θ ] \begin{aligned} z &= a + bi = \begin{bmatrix} a & -b \\ b & a \end{bmatrix} \\&= \sqrt{a^2 + b^2}\begin{bmatrix} \frac{a}{\sqrt{a^2 + b^2}} & \frac{-b}{\sqrt{a^2 + b^2}} \\ \frac{b}{\sqrt{a^2 + b^2}} & \frac{a}{\sqrt{a^2 + b^2}} \end{bmatrix} \\ &= \sqrt{a^2 + b^2}\begin{bmatrix} cos\theta & -sin\theta \\ sin\theta & cos\theta \end{bmatrix}\\&= \begin{bmatrix} \sqrt{a^2 + b^2} & 0\\ 0 & \sqrt{a^2 + b^2} \end{bmatrix}\begin{bmatrix} cos\theta & -sin\theta \\ sin\theta & cos\theta \end{bmatrix} \\ &= \begin{bmatrix} ||z|| & 0\\ 0 & ||z|| \end{bmatrix}\begin{bmatrix} cos\theta & -sin\theta \\ sin\theta & cos\theta \end{bmatrix} \end{aligned} z=a+bi=[abba]=a2+b2 [a2+b2 aa2+b2 ba2+b2 ba2+b2 a]=a2+b2 [cosθsinθsinθcosθ]=[a2+b2 00a2+b2 ][cosθsinθsinθcosθ]=[∣∣z∣∣00∣∣z∣∣][cosθsinθsinθcosθ]

    我们将原本的矩阵变形为了两个变换矩阵的复合,其中左边的 [ ∣ ∣ z ∣ ∣ 0 0 ∣ ∣ z ∣ ∣ ] \begin{bmatrix} ||z|| & 0\\ 0 & ||z|| \end{bmatrix} [∣∣z∣∣00∣∣z∣∣]
    是缩放矩阵,而右边的 [ c o s θ − s i n θ s i n θ c o s θ ] \begin{bmatrix} cos\theta & -sin\theta \\ sin\theta & cos\theta \end{bmatrix} [cosθsinθsinθcosθ]则是我们熟悉的2D旋转矩阵。

    接下来我们测试一下,旋转矩阵对1和i的影响,也就是 [ 1 0 ] \begin{bmatrix} 1 \\ 0 \end{bmatrix} [10] [ 0 1 ] \begin{bmatrix} 0 \\ 1 \end{bmatrix} [01]

    [ c o s θ − s i n θ s i n θ c o s θ ] [ 1 0 ] = [ c o s θ s i n θ ] − − − − − − − − − − − − − [ c o s θ − s i n θ s i n θ c o s θ ] [ 0 1 ] = [ − s i n θ c o s θ ] \begin{array}{ll} \begin{bmatrix} cos\theta & -sin\theta \\ sin\theta & cos\theta \end{bmatrix}\begin{bmatrix} 1 \\ 0 \end{bmatrix}=\begin{bmatrix} cos\theta \\ sin\theta \end{bmatrix} \end{array} \\ ------------- \\ \begin{bmatrix} cos\theta & -sin\theta \\ sin\theta & cos\theta \end{bmatrix}\begin{bmatrix} 0 \\ 1 \end{bmatrix}=\begin{bmatrix} -sin\theta \\ cos\theta \end{bmatrix} [cosθsinθsinθcosθ][10]=[cosθsinθ][cosθsinθsinθcosθ][01]=[sinθcosθ]

    旋转图如下:
    在这里插入图片描述

    也就是说,单位旋转矩阵会将被旋转向量逆时针旋转 θ \theta θ

    如果不是单位旋转矩阵的话,会对被旋转向量进行一个尺度的缩放。

    总结上述推导,可以得出:复数的相乘其实是旋转与缩放变换的复合.如果有一个复数 z = a + b 𝑖 z = a+b𝑖 z=a+bi
    那么 z z z 与任意一个复数 c c c相乘都会将 c c c逆时针旋转 θ = a t a n 2 ( b , a ) \theta = atan2(b, a) θ=atan2(b,a),并将
    其缩放 ∣ ∣ z ∣ ∣ = a 2 + b 2 ||z||=\sqrt{a^2+b^2} ∣∣z∣∣=a2+b2 倍。

  • 复数的极坐标形式:

    根据欧拉公式可知:
    c o s θ + i s i n θ = e i θ cos\theta + isin\theta = e^{i\theta} cosθ+isinθ=eiθ
    也就是说:
    z = a + b i = = ∣ ∣ z ∣ ∣ ( c o s θ + i s i n θ ) = ∣ ∣ z ∣ ∣ e i θ z = a + bi = =||z||(cos\theta + isin\theta)=||z||e^{i\theta} z=a+bi==∣∣z∣∣(cosθ+isinθ)=∣∣z∣∣eiθ
    如果我们定义 r = ∣ ∣ z ∣ ∣ r=||z|| r=∣∣z∣∣,我们就得到了复数的极坐标形式:
    z = r e i θ z=re^{i\theta} z=reiθ
    现在复数的定义就与实部与虚部的两个分量 a a a, b b b无关了,我们可以使用一
    个缩放因子 r r r 和旋转角度 θ \theta θ的形式来定义任意一个复数,而且它旋转与缩放的性质仍然存在。
    v ′ = r e i θ v v^{'} = re^{i\theta}v v=reiθv

2.4 3D旋转

加粗的符号为向量

  • 1.欧拉角

  • 2.轴角式

    通常情况下,如果我们说绕着一个向量 u 旋转,我们其实指的是绕着 u u u所指的方向进行旋转。向量是同时具有大小和方向的量,但是在旋转中,其大小并不重要。我们可以说绕着 u 1 = [ 0 0 1 ] T u_1 = \begin{bmatrix} 0 & 0 & 1 \end{bmatrix}^T u1=[001]T这个轴进行旋转,也可以说绕着 u 2 = [ 0 0 2 ] T u_2 = \begin{bmatrix} 0 & 0 & 2 \end{bmatrix}^T u2=[002]T旋转。即使这两个向量完全不同,但是它们指向的都是同一个方向(即 𝑧 轴的方向)

    轴角式的旋转和罗德里格斯公式的推导一致。

  • 3.四元数

    • 四元数的定义

      四元数的定义和复数非常类似,唯一的区别就是四元数一共有三个虚部,而复数只有一个。所有的四元数 q ∈ H q\isin{H} qH( H H H代表四元数的发现者 William Rowan Hamilton)都可以。
      q = a + b i + c j + d k q=a + bi + cj + dk q=a+bi+cj+dk
      其中
      i 2 = j 2 = k 2 = i j k = − 1 i^2=j^2=k^2=ijk=-1 i2=j2=k2=ijk=1
      与复数类似,四元数可以写作向量形式:
      q = [ a b c d ] q=\begin{bmatrix} a\\ b\\ c\\ d \end{bmatrix} q= abcd

      在描述四元数时,我们经常将四元数写作:
      q = [ s , v ] q=[s, \mathbf{v}] q=[s,v]
      将实部和虚部分开,表示为标量和向量的有序对形式。

    • 四元数的性质

      1. 模长

        和复数类似,四元数的模长(范数)可以表示为:
        ∣ ∣ q ∣ ∣ = a 2 + b 2 + c 2 + d 2 ||q||=\sqrt{a^2+b^2+c^2+d^2} ∣∣q∣∣=a2+b2+c2+d2

      2. 四元数乘法和矩阵之间的联系

        四元数不满足乘法交换律。和复数类似,四元数之间的乘法也可以写作矩阵的形式:
        q 1 q 2 = ( a + b i + c j + d k ) ( e + f i + g j + h k ) = a e + a f i + a g j + a h k + 𝑏 𝑒 𝑖 + 𝑏 𝑓 𝑖 2 + 𝑏 𝑔 𝑖 𝑗 + 𝑏 h 𝑖 𝑘 + 𝑐 𝑒 𝑗 + 𝑐 𝑓 𝑗 𝑖 + 𝑐 𝑔 𝑗 2 + 𝑐 h 𝑗 𝑘 + 𝑑 𝑒 𝑘 + 𝑑 𝑓 𝑘 𝑖 + 𝑑 𝑔 𝑘 𝑗 + 𝑑 h 𝑘 2 \begin{aligned} q_1q_2&=(a+bi+cj+dk)(e+fi+gj+hk)\\ &=ae+afi+agj+ahk+𝑏𝑒𝑖+ 𝑏𝑓𝑖^2\\&+𝑏𝑔𝑖𝑗+𝑏ℎ𝑖𝑘+𝑐𝑒𝑗 + 𝑐𝑓𝑗𝑖 +𝑐𝑔𝑗2 \\&+ 𝑐ℎ𝑗𝑘+𝑑𝑒𝑘 + 𝑑𝑓𝑘𝑖 + 𝑑𝑔𝑘𝑗 + 𝑑ℎ𝑘2 \end{aligned} q1q2=(a+bi+cj+dk)(e+fi+gj+hk)=ae+afi+agj+ahk+bei+bfi2+bgij+bhik+cej+cfji+cgj2+chjk+dek+dfki+dgkj+dhk2
        化简得:
        q 1 q 2 = ( 𝑎 𝑒 − 𝑏 𝑓 − 𝑐 𝑔 − 𝑑 h ) + ( 𝑏 𝑒 + 𝑎 𝑓 − 𝑑 𝑔 + 𝑐 h ) 𝑖 + ( 𝑐 𝑒 + 𝑑 𝑓 + 𝑎 𝑔 − 𝑏 h ) 𝑗 + ( 𝑑 𝑒 − 𝑐 𝑓 + 𝑏 𝑔 + 𝑎 h ) k \begin{aligned} q_1q_2=&(𝑎𝑒 − 𝑏 𝑓 − 𝑐𝑔 − 𝑑ℎ)+\\ &(𝑏𝑒 + 𝑎 𝑓 − 𝑑𝑔 + 𝑐ℎ)𝑖+\\ &(𝑐𝑒 + 𝑑 𝑓 + 𝑎𝑔 − 𝑏ℎ)𝑗+\\ &(𝑑𝑒 − 𝑐 𝑓 + 𝑏𝑔 + 𝑎ℎ)k\\ \end{aligned} q1q2=(aebfcgdh)+(be+afdg+ch)i+(ce+df+agbh)j+(decf+bg+ah)k
        写成矩阵*向量的形式为:
        q 1 q 2 = [ a − b − c − d b a − d c c d a − b d − c b a / ] [ e f g h ] q_1q_2=\begin{bmatrix} a & -b & -c & -d\\ b & a & -d & c\\ c & d & a & -b\\ d & -c & b & a/ \end{bmatrix}\begin{bmatrix} e \\ f\\ g\\ h \end{bmatrix} q1q2= abcdbadccdabdcba/ efgh
        由于四元数不满足乘法交换律,故 q 2 q 1 q_2q_1 q2q1如果将 q 1 q_1 q1表示成矩阵的形式为不同的形式:
        q 2 q 1 = [ a − b − c − d b a d − c c − d a b d c − b a ] [ e f g h ] q_2q_1=\begin{bmatrix} a & -b & -c & -d\\ b & a & d & -c\\ c & -d & a & b\\ d & c & -b & a \end{bmatrix}\begin{bmatrix} e\\ f\\ g\\ h \end{bmatrix} q2q1= abcdbadccdabdcba efgh

      3. Graßmann积
        假设 q 1 = [ a , b , c , d ] T = [ a v ] q_1=[a,b,c,d]^T=\begin{bmatrix} a \\ \mathbf{v} \end{bmatrix} q1=[a,b,c,d]T=[av] q 2 = [ e , f , g , h ] T = [ e u ] q_2=[e,f,g,h]^T=\begin{bmatrix} e \\ \mathbf{u} \end{bmatrix} q2=[e,f,g,h]T=[eu],
        那么根据上面四元数的乘积可以得出:
        q 1 q 2 = [ a e − v ⋅ u a u + e v + v × u ] q_1q_2=\begin{bmatrix} ae- \mathbf{v}\cdot\mathbf{u} \\ a\mathbf{u}+e\mathbf{v}+\mathbf{v}\times\mathbf{u} \end{bmatrix} q1q2=[aevuau+ev+v×u]
        其中:
        v ⋅ u = b f + c g + d h v × u = ( 𝑐 h − 𝑑 𝑔 ) i − ( 𝑏 h − 𝑑 𝑓 ) j + ( 𝑏 𝑔 − 𝑐 𝑓 ) k \begin{aligned} \mathbf{v}\cdot\mathbf{u}&=bf+cg+dh \\ \mathbf{v}\times\mathbf{u}&= (𝑐 ℎ − 𝑑𝑔)i − (𝑏 ℎ − 𝑑𝑓 )j + (𝑏 𝑔 − 𝑐 𝑓 )k \end{aligned} vuv×u=bf+cg+dh=(chdg)i(bhdf)j+(bgcf)k

      4. 纯四元数乘积

        v u = [ 0 − v ⋅ u 0 + v × u ] = [ − v ⋅ u v × u ] vu=\begin{bmatrix} 0-\mathbf{v}\cdot\mathbf{u}\\ 0+\mathbf{v}\times\mathbf{u} \end{bmatrix}=\begin{bmatrix} -\mathbf{v}\cdot\mathbf{u}\\ \mathbf{v}\times\mathbf{u} \end{bmatrix} vu=[0vu0+v×u]=[vuv×u]

      5. 共轭和逆
        共轭:

        q = a + b i + c j + d k q ∗ = a − b i − c j − d k q = [ s v ] q ∗ = [ s − v ] q=a+bi+cj+dk \\ q^*=a-bi-cj-dk\\ q=\begin{bmatrix} s \\ \mathbf{v} \end{bmatrix}\\ q^*=\begin{bmatrix} s \\ -\mathbf{v} \end{bmatrix} q=a+bi+cj+dkq=abicjdkq=[sv]q=[sv]
        共轭四元数有个重要的性质:
        q q ∗ = [ s 2 + v ⋅ v 0 ] qq^*=\begin{bmatrix} s^2 + \mathbf{v}\cdot\mathbf{v} \\ 0 \end{bmatrix} qq=[s2+vv0]
        也就是说结果为一个实数: q q ∗ = s 2 + x 2 + y 2 + z 2 = ∣ ∣ q ∣ ∣ 2 qq^*=s^2+x^2+y^2+z^2=||q||^2 qq=s2+x2+y2+z2=∣∣q2
        同理可以得到: q ∗ q = s 2 + x 2 + y 2 + z 2 = ∣ ∣ q ∣ ∣ 2 = q q ∗ q^*q=s^2+x^2+y^2+z^2=||q||^2=qq^* qq=s2+x2+y2+z2=∣∣q2=qq

        也就是说这个特殊的乘法是遵守交换律的。而且可以通过这个性质获得逆。

        逆:
        q − 1 = q ∗ ∣ ∣ q ∣ ∣ 2 q^{-1}=\frac{q^*}{||q||^2} q1=∣∣q2q
        如果 ∣ ∣ q ∣ ∣ 2 ||q||^2 ∣∣q2等于1,那么: q − 1 = q ∗ q^{-1}=q^* q1=q

    进行推导前,先说出四元数旋转的结论:
    任何向量 v v v沿着以单位向量定义的旋转轴 u u u旋转 θ \theta θ度之后的 v ′ v^{'} v可以使用四元数乘法来获得。令 v = [ 0 v ] v=\begin{bmatrix} 0 \\ \mathbf{v} \end{bmatrix} v=[0v], q = [ c o s ( 1 2 θ ) s i n ( 1 2 θ ) u ] q=\begin{bmatrix} cos(\frac{1}{2}\theta) \\ sin(\frac{1}{2}\theta)\mathbf{u} \end{bmatrix} q=[cos(21θ)sin(21θ)u],那么:
    v ′ = q v q ∗ = q v q − 1 v^{'}=qvq*=qvq^{-1} v=qvq=qvq1
    注意这里仅仅使用向量形式表示四元数而已,下面的运算是四元数的运算,不是所谓的向量运算。

    接下来进行推导:
    首先 v = [ 0 v ] v=\begin{bmatrix} 0 \\ \mathbf{v} \end{bmatrix} v=[0v] u = [ 0 u ] u=\begin{bmatrix} 0 \\ \mathbf{u} \end{bmatrix} u=[0u] v = v ⊥ + v ∣ ∣ = [ 0 v ⊥ ] + [ 0 v ∣ ∣ ] v=v_{\perp}+v_{||}=\begin{bmatrix} 0 \\ \mathbf{v}_\perp \end{bmatrix}+\begin{bmatrix} 0 \\ \mathbf{v}_{||} \end{bmatrix} v=v+v∣∣=[0v]+[0v∣∣]

    第一步对 v ∣ ∣ v_{||} v∣∣旋转:
    v ∣ ∣ v_{||} v∣∣旋转不变。

    第二步对 v ⊥ v_{\perp} v旋转:
    在前面轴角式的推到中,我们得到:
    v ⊥ ′ = c o s θ v ⊥ + s i n θ ( u × v ⊥ ) \mathbf{v}^{'}_{\bot}=cos\theta\mathbf{v}_{\bot}+sin\theta(\mathbf{u}\times\mathbf{v}_{\bot}) v=cosθv+sinθ(u×v)
    由于:
    u v ⊥ = [ − u ⋅ v ⊥ u × v ⊥ ] uv_{\bot}=\begin{bmatrix} -\mathbf{u}\cdot\mathbf{v}_{\bot}\\ \mathbf{u}\times\mathbf{v}_{\bot} \end{bmatrix} uv=[uvu×v]
    因为 v ⊥ \mathbf{v}_{\bot} v正交与 u \mathbf{u} u,所以上述公式可以变为:

    u v ⊥ = [ 0 u × v ⊥ ] = u × v ⊥ uv_{\bot}=\begin{bmatrix} 0\\ \mathbf{u}\times\mathbf{v}_{\bot} \end{bmatrix}=\mathbf{u}\times\mathbf{v}_{\bot} uv=[0u×v]=u×v

    所以:
    v ⊥ ′ = c o s θ v ⊥ + s i n θ ( u v ⊥ ) = ( c o s θ + u s i n θ ) v ⊥ {v}^{'}_{\bot}=cos\theta{v}_{\bot}+sin\theta(uv_{\bot})=(cos\theta+usin\theta)v_{\bot} v=cosθv+sinθ(uv)=(cosθ+usinθ)v

    q = c o s θ + u s i n θ q=cos\theta+usin\theta q=cosθ+usinθ,上式变为:
    v ′ = q v ⊥ v^{'}=qv_{\bot} v=qv

    如果我们能构造一个四元数 q q q,那么我们就能完成这个旋转了。
    q = c o s θ + u s i n θ = c o s θ + i u x s i n θ + j u y s i n θ + k u z s i n θ q=cos\theta+usin\theta=cos\theta+iu_{x}sin\theta+ju_{y}sin\theta+ku_{z}sin\theta q=cosθ+usinθ=cosθ+iuxsinθ+juysinθ+kuzsinθ
    如果 u \mathbf{u} u的模长为1,那么构造的q为单位四元数,它所代表的变换并不会对原向量进行缩放,是一个纯旋转。

    第三步获得 v ′ v^{'} v的结果:
    v ′ = v ∣ ∣ ′ + v ⊥ ′ = v ∣ ∣ + q v ⊥ v^{'}=v^{'}_{||}+v^{'}_{\bot}=v_{||}+qv_{\bot} v=v∣∣+v=v∣∣+qv
    其中 q = [ c o s θ u s i n θ ] q=\begin{bmatrix} cos\theta\\ usin\theta \end{bmatrix} q=[cosθusinθ]

    第四步将化简为最终结果:
    因为:
    v ′ = v ∣ ∣ + q v ⊥ = 1 v ∣ ∣ + q v ⊥ = p p − 1 v ∣ ∣ + p p v ⊥ v^{'}=v_{||}+qv_{\bot}=1v_{||}+qv_{\bot}=pp^{-1}v_{||}+ppv_{\bot} v=v∣∣+qv=1v∣∣+qv=pp1v∣∣+ppv
    其中 q = p 2 q=p^2 q=p2,则 p = [ c o s ( 1 2 θ ) u s i n ( 1 2 θ ) ] p=\begin{bmatrix}cos(\frac{1}{2}\theta) \\ usin(\frac{1}{2}\theta) \end{bmatrix} p=[cos(21θ)usin(21θ)]
    因为 u u u为单位3维向量,则 p p p为单位四元数,故可得:
    p − 1 = p ∗ p^{-1}=p^{*} p1=p

    将上式带入之前的等式可得:
    v ′ = p p − 1 v ∣ ∣ + p p v ⊥ = p p ∗ v ∣ ∣ + p p v ⊥ v^{'}=pp^{-1}v_{||}+ppv_{\bot}=pp^{*}v_{||}+ppv_{\bot} v=pp1v∣∣+ppv=ppv∣∣+ppv

    在化简上述公式之前,我们还需要知道两个性质:

    1. 假设 v ∣ ∣ = [ 0 v ] v_{||}=\begin{bmatrix}0 \\ \mathbf{v} \end{bmatrix} v∣∣=[0v]是一个纯四元数,而 q = [ α β u ] q=\begin{bmatrix}\alpha \\ \beta\mathbf{u} \end{bmatrix} q=[αβu],其中 u u u是一个单位向量,𝛼, 𝛽 ∈ R.在这种条件下,如果 v ∣ ∣ v_{||} v∣∣ 平行于 u u u,那么 𝑞 𝑣 ∣ ∣ = 𝑣 ∣ ∣ 𝑞 𝑞𝑣_{||} = 𝑣_{||} 𝑞 qv∣∣=v∣∣q

    2. 假设 v ⊥ = [ 0 v ] v_{\bot}=\begin{bmatrix}0 \\ \mathbf{v} \end{bmatrix} v=[0v]是一个纯四元数,而 q = [ α β u ] q=\begin{bmatrix}\alpha \\ \beta\mathbf{u} \end{bmatrix} q=[αβu],其中 u u u是一个单位向量,𝛼, 𝛽 ∈ R.在这种条件下,如果 v ⊥ v_{\bot} v正交于 u u u,那么 𝑞 𝑣 ∣ ∣ = 𝑣 ∣ ∣ 𝑞 ∗ 𝑞𝑣_{||} = 𝑣_{||}𝑞^{*} qv∣∣=v∣∣q

    通过上述得到的引理,我们可以将 v ′ = p p ∗ v ∣ ∣ + p p v ⊥ v^{'}=pp^{*}v_{||}+ppv_{\bot} v=ppv∣∣+ppv化简为:
    v ′ = p p ∗ v ∣ ∣ + p p v ⊥ = p v ∣ ∣ p ∗ + p v ⊥ p ∗ = p ( v ∣ ∣ + v ⊥ ) p ∗ = p v p ∗ v^{'}=pp^{*}v_{||}+ppv_{\bot}=pv_{||}p^{*}+pv_{\bot}p^{*}=p(v_{||}+v_{\bot})p^{*}=pvp^{*} v=ppv∣∣+ppv=pv∣∣p+pvp=p(v∣∣+v)p=pvp
    其中 p = [ c o s ( 1 2 θ ) u s i n ( 1 2 θ ) ] p=\begin{bmatrix}cos(\frac{1}{2}\theta) \\ usin(\frac{1}{2}\theta) \end{bmatrix} p=[cos(21θ)usin(21θ)], u u u为单位3维向量。

    推导完成。

    如果我们想要获得角度,只需要:
    θ 2 = a r c c o s ( a ) \frac{\theta}{2}=arccos(a) 2θ=arccos(a)
    如果要求单位向量:
    u = b s i n ( a r c c o s ( a ) ) \mathbf{u}=\frac{\mathbf{b}}{sin(arccos(a))} u=sin(arccos(a))b

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值