相机成像原理以及旋转_摄像机平移旋转的原理-程序员宅基地

技术标签: 计算机视觉  人工智能  nerf的依赖知识  数码相机  

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sundabenshi/article/details/130725773

智能推荐

Oracle-----约束简介&非空约束&唯一约束&主键约束-程序员宅基地

文章浏览阅读2.1k次,点赞2次,收藏4次。上一篇????:Oracle-----为表重命名&数据表删除&闪回技术&修改表结构文章目录1、约束简介2、非空约束(not null、nk)2.1 范例1:使用非空约束2.2 范例2:正确地增加语句2.3 范例3:错误地增加语句3、唯一约束(unique、uk)3.1 范例1:使用唯一约束3.2 范例2:正确地增加语句3.3 范例3:错误地增加语句3.4 范例4:查询user...

CamVid数据集(智能驾驶场景的语义分割)_camvid数据集11类别-程序员宅基地

文章浏览阅读3.3k次,点赞2次,收藏7次。前言CamVid 数据集是由剑桥大学公开发布的城市道路场景的数据集。CamVid全称:The Cambridge-driving Labeled Video Database,它是第一个具有目标类别语义标签的视频集合。数据集包 括 700 多张精准标注的图片用于强监督学习,可分为训练集、验证集、测试集。同时, 在 CamVid 数据集中通常使用 11 种常用的类别来进行分割精度的评估,分别为:道路 (Road)、交通标志(Symbol)、汽车(Car)、天空(Sky)、行人道(Sidewalk)、电_camvid数据集11类别

ESP32 LVGL8.1 实现太空人显示(29)_lv_img_declare-程序员宅基地

文章浏览阅读8.7k次,点赞11次,收藏90次。文章目录一、ESP32 LVGL工程配置1.1从库中下载LVGL代码1.2配置适合ESP32 液晶屏1.3编译下载测试二、GIF图片处理2.1下载gif图片2.2将gif图片按照帧率导出成图片2.lvgl animimg对象实现图片的播放1.3下载测试 注:本博客作为学习笔记,有错误的地方希望指正一、ESP32 LVGL工程配置首先要通过液晶屏显示太空人,我们这里主要有两种方式可以实现,第一种直接使用厂家只带的液晶屏幕驱动去实现图片的显示,另外使用其他的GUI提供的控件去实现,嵌入式常见的GUI挺多_lv_img_declare

最小权顶点覆盖问题-程序员宅基地

文章浏览阅读1.5w次,点赞7次,收藏30次。问题描述:给定一个赋权无向图G=(V,E),每个顶点v∈V都有一个权值w(v)。如果UV,且对任意(u,v)∈E有u∈U或v∈U,就称U为图G的一个顶点覆盖。G的最小权顶点覆盖是指G中所含顶点权之和最小的顶点覆盖。问题解决:用优先队列分支限界方法解最小权顶点覆盖,在算法的搜索的进程中保存当前已构造出的部分解空间树,在算法搜索达到叶节点时,其最优值对应的最优解同时保存下来。优先队列的优先_最小权顶点覆盖

matlab如何导入map,matlab添加M_map工具箱-程序员宅基地

文章浏览阅读517次。首先试了matlab自带的worldmap,感觉画出来的图形不尽如人意,比较杂乱。如下图。查阅了些资料,请教了Liangjing,一致推荐m_map。为了达到想要的效果,这次只要不再偷懒,下载M-Map工具箱(http://www.eos.ubc.ca/~rich/map.html)并进行安装。所幸过程比较顺利,现记录如下,回头把画出的效果图再添上。其他matlab的toolbox安装,也可参考进..._mmap工具包如何安装

iOS学习:iOS代码规范_ios replaceobjectsinrange-程序员宅基地

文章浏览阅读5.7k次,点赞4次,收藏5次。作者感言阅读前言iOS代码规范Import规范Define规范Paragma Mark 规范Interface规范implementation规范实例规范NSDictionary规范NSArray规范函数规范If-Else规范For-In For 规范Block规范运算符规范命名规范实例命名规范Property命名规范Interface-class命名规范B_ios replaceobjectsinrange

随便推点

Google Chrome 浏览器 开发者工具 使用教程-程序员宅基地

文章浏览阅读354次。Google Chrome 浏览器 开发者工具 使用教程 12,912 9 3.83 / 5 53.83分(6票)8对于Chrome 浏览器,除了占用内存的缺点,其他都很不错。对于Chrome 浏览器的开发者工具,Jeff 除了Elements、Resources、Network..._开发者使用教程

maven 依赖文件 pom.xml 编译 mvn compile 运行 不用mvn exec:java -Dexec.mainClass="hello.HelloWorld"...-程序员宅基地

文章浏览阅读289次。使用maven编译Java项目http://blog.csdn.net/yaya1943/article/details/48464371使用"mvn clean"命令清除编译结果,也就是把编译生成的target文件夹删掉如果你想安装您的项目的JAR文件到本地Maven仓库,那么你应该调用下面语句:mvn install此时,你的项目代码将会经过编译、测试、打..._maven 编译不使用本地依赖包

巧用ChatGPT快速提高职场晋升力、搞定数据分析玩、转新媒体运营-程序员宅基地

文章浏览阅读7.6k次,点赞147次,收藏134次。在日常工作中巧用ChatGPT可以帮助我们提高工作效率、创造价值并降低成本。通过合理地利用ChatGPT的功能和应用场景,企业和个人可以更好地实现工作目标、提升竞争力并取得更大的成功。随着人工智能技术的不断进步和发展我们相信巧用ChatGPT将成为未来工作中的一种常态化工具为我们的职业生涯和生活带来更多便利和价值。本书是一本关于数据分析与ChatGPT应用的实用指南,旨在帮助读者了解数据分析的基础知识及利用ChatGPT进行高效的数据处理和分析。_巧用chatgpt快速提高职场晋升力

vscode同步git代码时源代码管理出现10k+更改如何处理?_git init 代码有 10k+ 更新-程序员宅基地

文章浏览阅读2.7k次。vscode出现10k+更改需要处理_git init 代码有 10k+ 更新

机器学习算法之K-means(K均值聚类)算法_k-means聚类算法的anchors_num的最大值-程序员宅基地

文章浏览阅读6.1k次,点赞5次,收藏124次。聚类聚类,简单来说,就是将一个庞杂数据集中具有相似特征的数据自动归类到一起,称为一个簇,簇内的对象越相似,聚类的效果越好。它是一种无监督的学习(Unsupervised Learning)方法,不需要预先标注好的训练集。聚类与分类最大的区别就是分类的目标事先已知,例如猫狗识别,你在分类之前已经预先知道要将它分为猫、狗两个种类;而在你聚类之前,你对你的目标是未知的,同样以动物为例,对于一个动物集来..._k-means聚类算法的anchors_num的最大值

edu教育邮箱免费申请注册Google drive无限网盘和微软OneDrive经验分享_onedrive a5-程序员宅基地

文章浏览阅读1.6w次,点赞2次,收藏15次。前言介绍很多萌新小白初涉国外云盘对Google云盘和微软OneDrive云盘到底容量有多大、数据隐私是否安全、自己免费申请白嫖的账户可用多久都没有清晰准确的认识和了解,又加上网上博客文章大多都是很多年前的方法和政策,完全给不了网友实质上的建议,本文来帮大家屡屡头绪。产品认识Google DriveGoogle Drive云端硬盘提供了15G 的免费容量,对于一般文档是够用了。Google drive唯一的好处就说分享资源超级方便,共享也很容易。Google 照片提供不限容量的照片存储_onedrive a5

推荐文章

热门文章

相关标签