【机器人-基础知识】欧拉角、旋转矩阵和四元数

1. 欧拉角

在这里插入图片描述

1.1. 欧拉角的定义

欧拉角是一组三个角度,用于描述一个刚体在三维空间中的定向关系。具体来说,它们表示从一个固定参考坐标系到刚体坐标系的一系列旋转。常见的定义方式是将总体旋转分解为三个连续的简单旋转,每次旋转都绕着当前坐标系的某一固定轴进行。

例如,一种常用的欧拉角序列是 Z–Y–X(或称为航向、俯仰、滚转顺序),其含义如下:

  • Yaw 第一个旋转(航向/偏航):绕固定坐标系的 Z 轴旋转角度 ψ \psi ψ
  • Pitch 第二个旋转(俯仰):绕新坐标系的 Y 轴旋转角度 θ \theta θ
  • Roll 第三个旋转(滚转):绕再次更新后的 X 轴旋转角度 ϕ \phi ϕ

这种分解使得三维旋转问题转化为三个独立旋转角度的叠加。

1.2. 欧拉角的公式

以 Z–Y–X 顺序为例,刚体总旋转矩阵 R R R 可以写成三个旋转矩阵的乘积:

R = R x ( ϕ )    R y ( θ )    R z ( ψ ) R = R_x(\phi) \; R_y(\theta) \; R_z(\psi) R=Rx(ϕ)Ry(θ)Rz(ψ)

其中:

  • 绕 X 轴旋转的矩阵:

    R x ( ϕ ) = [ 1 0 0 0 cos ⁡ ϕ − sin ⁡ ϕ 0 sin ⁡ ϕ cos ⁡ ϕ ] R_x(\phi) = \begin{bmatrix} 1 & 0 & 0 \\ 0 & \cos\phi & -\sin\phi \\ 0 & \sin\phi & \cos\phi \end{bmatrix} Rx(ϕ)= 1000cosϕsinϕ0sinϕcosϕ

  • 绕 Y 轴旋转的矩阵:

    R y ( θ ) = [ cos ⁡ θ 0 sin ⁡ θ 0 1 0 − sin ⁡ θ 0 cos ⁡ θ ] R_y(\theta) = \begin{bmatrix} \cos\theta & 0 & \sin\theta \\ 0 & 1 & 0 \\ -\sin\theta & 0 & \cos\theta \end{bmatrix} Ry(θ)= cosθ0sinθ010sinθ0cosθ

  • 绕 Z 轴旋转的矩阵:

    R z ( ψ ) = [ cos ⁡ ψ − sin ⁡ ψ 0 sin ⁡ ψ cos ⁡ ψ 0 0 0 1 ] R_z(\psi) = \begin{bmatrix} \cos\psi & -\sin\psi & 0 \\ \sin\psi & \cos\psi & 0 \\ 0 & 0 & 1 \end{bmatrix} Rz(ψ)= cosψsinψ0sinψcosψ0001

将上述三个矩阵依次相乘,就可以得到描述刚体最终定向的旋转矩阵 R R R

1.3. 欧拉角的常见问题

在使用欧拉角描述旋转时,需要注意以下问题:

  1. 万向锁(Gimbal Lock)
    以常见的ZYX欧拉角为例,即首先绕全局z轴旋转,然后绕新的y轴旋转,最后绕新的x轴旋转。当第二次旋转(即绕y轴的旋转)旋转角(例如上例中的 θ \theta θ)达到 ± 9 0 ∘ \pm90^\circ ±90 时。
    第一次和第三次旋转将会围绕同一个轴。这意味着,在这些特殊的角度下,系统失去了一个自由度,因为两次旋转现在作用于相同的轴,不能独立地控制物体的方向。

  2. 多值性与奇异性
    欧拉角存在多值性,即不同的角度组合可能表示相同的旋转。此外,某些角度组合可能使反求公式退化,导致奇异性问题,增加了数值计算的复杂性。

2. 旋转矩阵

2.1. 旋转矩阵的定义

旋转矩阵是一种用于描述刚体或坐标系在欧几里得空间中旋转变换的矩阵。其主要特点包括:

  • 正交性:旋转矩阵 R R R 满足 R T R = I R^T R = I RTR=I,其中 R T R^T RT R R R 的转置, I I I 为单位矩阵。这一性质保证了向量的长度和旋转前后向量间的夹角不变。
  • 行列式为1:即 det ⁡ ( R ) = 1 \det(R) = 1 det(R)=1,这一性质表明旋转矩阵不含有镜像或反射分量。
  • 参数冗余性:在三维空间中,尽管旋转矩阵有 9 个元素,但由于正交性和行列式约束,其实际自由度仅为 3 个。

2.2. 常见旋转矩阵的公式

1. 二维旋转矩阵

在二维平面上,绕原点逆时针旋转角度 θ \theta θ 的旋转矩阵为:
R ( θ ) = [ cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ] R(\theta) = \begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix} R(θ)=[cosθsinθsinθcosθ]

2. 三维旋转矩阵

在三维空间中,常用的旋转矩阵包括绕各个坐标轴旋转的矩阵:

  • 绕 X 轴旋转角度 ϕ \phi ϕ 的矩阵

    R x ( ϕ ) = [ 1 0 0 0 cos ⁡ ϕ − sin ⁡ ϕ 0 sin ⁡ ϕ cos ⁡ ϕ ] R_x(\phi) = \begin{bmatrix} 1 & 0 & 0 \\ 0 & \cos\phi & -\sin\phi \\ 0 & \sin\phi & \cos\phi \end{bmatrix} Rx(ϕ)= 1000cosϕsinϕ0sinϕcosϕ

  • 绕 Y 轴旋转角度 θ \theta θ 的矩阵

    R y ( θ ) = [ cos ⁡ θ 0 sin ⁡ θ 0 1 0 − sin ⁡ θ 0 cos ⁡ θ ] R_y(\theta) = \begin{bmatrix} \cos\theta & 0 & \sin\theta \\ 0 & 1 & 0 \\ -\sin\theta & 0 & \cos\theta \end{bmatrix} Ry(θ)= cosθ0sinθ010sinθ0cosθ

  • 绕 Z 轴旋转角度 ψ \psi ψ 的矩阵

    R z ( ψ ) = [ cos ⁡ ψ − sin ⁡ ψ 0 sin ⁡ ψ cos ⁡ ψ 0 0 0 1 ] R_z(\psi) = \begin{bmatrix} \cos\psi & -\sin\psi & 0 \\ \sin\psi & \cos\psi & 0 \\ 0 & 0 & 1 \end{bmatrix} Rz(ψ)= cosψsinψ0sinψcosψ0001

2.3. 旋转矩阵的示例

1. 二维示例

设有一个二维向量 v = [ 1 0 ] \mathbf{v} = \begin{bmatrix} 1 \\ 0 \end{bmatrix} v=[10],我们希望将它逆时针旋转 9 0 ∘ 90^\circ 90(即 θ = π 2 \theta = \frac{\pi}{2} θ=2π)。

对应的旋转矩阵为:

R ( π 2 ) = [ cos ⁡ π 2 − sin ⁡ π 2 sin ⁡ π 2 cos ⁡ π 2 ] = [ 0 − 1 1 0 ] R\left(\frac{\pi}{2}\right) = \begin{bmatrix} \cos\frac{\pi}{2} & -\sin\frac{\pi}{2} \\ \sin\frac{\pi}{2} & \cos\frac{\pi}{2} \end{bmatrix} = \begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix} R(2π)=[cos2πsin2πsin2πcos2π]=[0110]

计算变换后的向量:

v ′ = R ( π 2 ) v = [ 0 − 1 1 0 ] [ 1 0 ] = [ 0 1 ] \mathbf{v}' = R\left(\frac{\pi}{2}\right) \mathbf{v} = \begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix} \begin{bmatrix} 1 \\ 0 \end{bmatrix} = \begin{bmatrix} 0 \\ 1 \end{bmatrix} v=R(2π)v=[0110][10]=[01]

这表明向量 v \mathbf{v} v 被成功旋转到 ( 0 , 1 ) (0,1) (0,1) 的位置。

2. 三维示例

考虑在三维空间中,绕 Z 轴旋转 9 0 ∘ 90^\circ 90 的情况。旋转矩阵为:

R z ( π 2 ) = [ cos ⁡ π 2 − sin ⁡ π 2 0 sin ⁡ π 2 cos ⁡ π 2 0 0 0 1 ] = [ 0 − 1 0 1 0 0 0 0 1 ] R_z\left(\frac{\pi}{2}\right) = \begin{bmatrix} \cos\frac{\pi}{2} & -\sin\frac{\pi}{2} & 0 \\ \sin\frac{\pi}{2} & \cos\frac{\pi}{2} & 0 \\ 0 & 0 & 1 \end{bmatrix} = \begin{bmatrix} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{bmatrix} Rz(2π)= cos2πsin2π0sin2πcos2π0001 = 010100001

对向量 v = [ 1 0 0 ] \mathbf{v} = \begin{bmatrix} 1 \\ 0 \\ 0 \end{bmatrix} v= 100 进行变换,得到:

v ′ = R z ( π 2 ) v = [ 0 − 1 0 1 0 0 0 0 1 ] [ 1 0 0 ] = [ 0 1 0 ] \mathbf{v}' = R_z\left(\frac{\pi}{2}\right) \mathbf{v} = \begin{bmatrix} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 \\ 0 \\ 0 \end{bmatrix} = \begin{bmatrix} 0 \\ 1 \\ 0 \end{bmatrix} v=Rz(2π)v= 010100001 100 = 010

这样,原本沿 X 轴的向量被旋转到 Y 轴方向。

2.4. 旋转矩阵的问题

  1. 数值稳定性
    在计算机中进行数值运算时,由于舍入误差,得到的旋转矩阵可能不再严格满足正交性(即 R T R R^T R RTR 不完全等于 I I I),这会引起累积误差。为解决这一问题,通常需要使用正交化算法(如 Gram-Schmidt 或 SVD 方法)对矩阵进行修正。

  2. 冗余参数
    在三维空间中,旋转矩阵有 9 个元素,但实际只有 3 个自由度。这种冗余性在一些优化问题和数据融合算法中可能增加额外的计算复杂度。

  3. 直观性不足
    虽然旋转矩阵在数学上精确且易于组合(例如多个旋转矩阵相乘可以得到总体旋转),但其 9 个元素之间的关系较难直观理解和解释。在需要直观展示旋转状态(例如动画、用户界面设计)时,欧拉角或四元数可能更为直观。

  4. 从旋转矩阵到其他表示的转换问题
    将旋转矩阵转换为欧拉角或轴—角表示时,可能会遇到奇异性问题(例如万向锁现象),导致数值计算不稳定或多值性问题。特别是在旋转角接近特定值(如 ± 9 0 ∘ \pm90^\circ ±90)时,反求过程可能会出现退化情况。

3. 四元数

3.1. 四元数的定义

一个四元数通常表示为

q = w + x   i + y   j + z   k q = w + x\,i + y\,j + z\,k q=w+xi+yj+zk

其中, w , x , y , z w, x, y, z w,x,y,z 均为实数,而 i , j , k i, j, k i,j,k 是满足以下乘法规则的虚数单位:

i 2 = j 2 = k 2 = i j k = − 1 i^2 = j^2 = k^2 = ijk = -1 i2=j2=k2=ijk=1

并且具有以下非交换性(例如: i j = k ij = k ij=k,但 j i = − k ji = -k ji=k)。四元数构成一个四维实向量空间,是一个非交换的除环,常用于描述三维空间的旋转。

3.2. 四元数的运算

1. 加法与标量乘法

  • 加法:两个四元数按各个分量相加
    q 1 + q 2 = ( w 1 + w 2 ) + ( x 1 + x 2 ) i + ( y 1 + y 2 ) j + ( z 1 + z 2 ) k q_1 + q_2 = (w_1 + w_2) + (x_1 + x_2)i + (y_1 + y_2)j + (z_1 + z_2)k q1+q2=(w1+w2)+(x1+x2)i+(y1+y2)j+(z1+z2)k
  • 标量乘法:对四元数的每个分量乘以一个实数 λ \lambda λ
    λ q = λ w + λ x   i + λ y   j + λ z   k \lambda q = \lambda w + \lambda x\,i + \lambda y\,j + \lambda z\,k λq=λw+λxi+λyj+λzk

2. 乘法

给定两个四元数

q 1 = w 1 + x 1   i + y 1   j + z 1   k , q 2 = w 2 + x 2   i + y 2   j + z 2   k , q_1 = w_1 + x_1\,i + y_1\,j + z_1\,k,\quad q_2 = w_2 + x_2\,i + y_2\,j + z_2\,k, q1=w1+x1i+y1j+z1k,q2=w2+x2i+y2j+z2k,

它们的乘积 q = q 1 q 2 q = q_1q_2 q=q1q2 可以写成

q =   ( w 1 w 2 − x 1 x 2 − y 1 y 2 − z 1 z 2 ) + ( w 1 x 2 + x 1 w 2 + y 1 z 2 − z 1 y 2 ) i + ( w 1 y 2 − x 1 z 2 + y 1 w 2 + z 1 x 2 ) j + ( w 1 z 2 + x 1 y 2 − y 1 x 2 + z 1 w 2 ) k . \begin{aligned} q =\,& (w_1w_2 - x_1x_2 - y_1y_2 - z_1z_2) \\ &+ (w_1x_2 + x_1w_2 + y_1z_2 - z_1y_2)i \\ &+ (w_1y_2 - x_1z_2 + y_1w_2 + z_1x_2)j \\ &+ (w_1z_2 + x_1y_2 - y_1x_2 + z_1w_2)k. \end{aligned} q=(w1w2x1x2y1y2z1z2)+(w1x2+x1w2+y1z2z1y2)i+(w1y2x1z2+y1w2+z1x2)j+(w1z2+x1y2y1x2+z1w2)k.

注意,四元数乘法满足结合律和分配律,但不满足交换律。

3.3. 四元数在旋转变换中的应用

在三维旋转表示中避免欧拉角的万向锁问题,同时在旋转插值(如 Slerp)中表现良好。

1. 旋转表示

一个单位四元数可用于表示三维空间中的旋转。设旋转轴为单位向量 n = ( n x , n y , n z ) \mathbf{n} = (n_x, n_y, n_z) n=(nx,ny,nz),旋转角度为 θ \theta θ,对应的单位四元数为

q = cos ⁡ θ 2 + sin ⁡ θ 2 ( n x   i + n y   j + n z   k ) . q = \cos\frac{\theta}{2} + \sin\frac{\theta}{2}(n_x\,i + n_y\,j + n_z\,k). q=cos2θ+sin2θ(nxi+nyj+nzk).

2. 旋转操作

给定一个需要旋转的三维向量 v \mathbf{v} v(将其表示为纯四元数,即实部为 0: v = 0 + v x   i + v y   j + v z   k v = 0 + v_x\,i + v_y\,j + v_z\,k v=0+vxi+vyj+vzk),通过四元数进行旋转的公式为

v ′ = q   v   q − 1 , v' = q\, v\, q^{-1}, v=qvq1,

其中 v ′ v' v 为旋转后的四元数,对应的向量部分即为旋转后的三维向量。通过这种方式,可以将旋转变换高效地应用到向量上。

3. 旋转的组合与插值

  • 组合旋转:多个旋转可以通过四元数乘法进行组合。若有两个旋转分别对应的单位四元数 q 1 q_1 q1 q 2 q_2 q2,则先后执行这两个旋转的总体旋转由 q = q 2 q 1 q = q_2q_1 q=q2q1 表示(注意乘法的顺序)。
  • 旋转插值(Slerp):四元数还可以用于球面线性插值(Spherical Linear Interpolation),这在计算机图形学和动画中用于平滑过渡旋转。

4. 相比旋转矩阵的计算效率高

当使用旋转矩阵进行连续旋转时,通常需要进行多次矩阵乘法。每次矩阵乘法涉及大量的浮点运算,对于3x3矩阵而言,这通常意味着27次乘法和18次加法。相比之下,四元数的乘法仅需要16次乘法和12次加法,减少了计算量。

5. 单位四元数的意义

  • 单位四元数用于表示纯旋转,但非单位四元数可以用来表示带有缩放因子的旋转。
  • 在实际应用中,如果需要将非单位四元数转换为单位四元数(比如用于表示旋转),通常需要对其进行归一化处理,即将其除以自身的模长,使其成为一个单位四元数

4. 四元数、旋转矩阵和变换矩阵

1. 四元数 -> 旋转矩阵

给定一个单位四元数
q = w + x   i + y   j + z   k , q = w + x\,i + y\,j + z\,k, q=w+xi+yj+zk,
其对应的旋转矩阵 R R R(通常用于右手坐标系)可写为

R = [ 1 − 2 ( y 2 + z 2 ) 2 ( x y − w z ) 2 ( x z + w y ) 2 ( x y + w z ) 1 − 2 ( x 2 + z 2 ) 2 ( y z − w x ) 2 ( x z − w y ) 2 ( y z + w x ) 1 − 2 ( x 2 + y 2 ) ] . R = \begin{bmatrix} 1-2(y^2+z^2) & 2(xy-wz) & 2(xz+wy) \\ 2(xy+wz) & 1-2(x^2+z^2) & 2(yz-wx) \\ 2(xz-wy) & 2(yz+wx) & 1-2(x^2+y^2) \end{bmatrix}. R= 12(y2+z2)2(xy+wz)2(xzwy)2(xywz)12(x2+z2)2(yz+wx)2(xz+wy)2(yzwx)12(x2+y2) .

2. 旋转矩阵 -> 四元数

设旋转矩阵为

R = [ r 11 r 12 r 13 r 21 r 22 r 23 r 31 r 32 r 33 ] . R = \begin{bmatrix} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r_{32} & r_{33} \end{bmatrix}. R= r11r21r31r12r22r32r13r23r33 .

已知旋转矩阵 R R R 后,可以通过矩阵的迹(trace)[矩阵的对角线元素之和] 来恢复对应的四元数。一种常用方法如下:

  1. 计算迹: t r ( R ) = r 11 + r 22 + r 33 . \mathrm{tr}(R) = r_{11}+r_{22}+r_{33}. tr(R)=r11+r22+r33.
  2. t r ( R ) > 0 , \mathrm{tr}(R) > 0, tr(R)>0, 则令
    w = 1 2 1 + t r ( R ) , w = \frac{1}{2}\sqrt{1+\mathrm{tr}(R)}, w=211+tr(R) ,
    并用下面的公式求其它分量:
    x = r 32 − r 23 4 w , y = r 13 − r 31 4 w , z = r 21 − r 12 4 w . x = \frac{r_{32}-r_{23}}{4w},\quad y = \frac{r_{13}-r_{31}}{4w},\quad z = \frac{r_{21}-r_{12}}{4w}. x=4wr32r23,y=4wr13r31,z=4wr21r12.
  3. 否则,当旋转矩阵的迹 t r ( R ) ≤ 0 \mathrm{tr}(R) \le 0 tr(R)0 时,根据矩阵对角线元素的大小,选择最大的那个来计算四元数的分量。
    • 如果 r 11 r_{11} r11 是最大的对角元素:
      x = 1 2 1 + r 11 − r 22 − r 33 , x = \frac{1}{2}\sqrt{1 + r_{11} - r_{22} - r_{33}}, x=211+r11r22r33 ,
      然后计算:
      w = r 32 − r 23 4 x , y = r 12 + r 21 4 x , z = r 13 + r 31 4 x . w = \frac{r_{32} - r_{23}}{4x},\quad y = \frac{r_{12} + r_{21}}{4x},\quad z = \frac{r_{13} + r_{31}}{4x}. w=4xr32r23,y=4xr12+r21,z=4xr13+r31.

    • 如果 r 22 r_{22} r22 是最大的对角元素:
      y = 1 2 1 + r 22 − r 11 − r 33 , y = \frac{1}{2}\sqrt{1 + r_{22} - r_{11} - r_{33}}, y=211+r22r11r33 ,
      然后计算:
      w = r 13 − r 31 4 y , x = r 12 + r 21 4 y , z = r 23 + r 32 4 y . w = \frac{r_{13} - r_{31}}{4y},\quad x = \frac{r_{12} + r_{21}}{4y},\quad z = \frac{r_{23} + r_{32}}{4y}. w=4yr13r31,x=4yr12+r21,z=4yr23+r32.

    • 如果 r 33 r_{33} r33 是最大的对角元素:
      z = 1 2 1 + r 33 − r 11 − r 22 , z = \frac{1}{2}\sqrt{1 + r_{33} - r_{11} - r_{22}}, z=211+r33r11r22 ,
      然后计算:
      w = r 21 − r 12 4 z , x = r 13 + r 31 4 z , y = r 23 + r 32 4 z . w = \frac{r_{21} - r_{12}}{4z},\quad x = \frac{r_{13} + r_{31}}{4z},\quad y = \frac{r_{23} + r_{32}}{4z}. w=4zr21r12,x=4zr13+r31,y=4zr23+r32.

这些分支确保了当迹小于等于零时,能够避免数值不稳定问题,并正确提取出最大的旋转分量,从而稳定地计算出四元数。

3. 旋转矩阵 -> 变换矩阵

在齐次坐标下,三维变换矩阵通常是 4 × 4 4\times4 4×4 的,其形式为

T = [ R t 0 T 1 ] , T = \begin{bmatrix} R & \mathbf{t} \\ \mathbf{0}^T & 1 \end{bmatrix}, T=[R0Tt1],

其中:

  • R R R 3 × 3 3\times3 3×3 的旋转矩阵;
  • t = [ t x t y t z ] \mathbf{t} = \begin{bmatrix} t_x \\ t_y \\ t_z \end{bmatrix} t= txtytz 为平移向量;
  • 下排 0 T = [ 0 0 0 ] \mathbf{0}^T = [0\quad 0\quad 0] 0T=[000]

4. 变换矩阵 -> 旋转矩阵

若给定变换矩阵 T T T,只需取出左上角 3 × 3 3\times3 3×3 部分,即为旋转矩阵 R R R

R = T ( 1 : 3 , 1 : 3 ) . R = T(1:3,1:3). R=T(1:3,1:3).

5. 变换矩阵的解析

5.1. 变换矩阵的示例

当坐标系A沿 x轴正方向平移1y轴正方向平移2z轴正方向平移3 时,B到A的变换矩阵为:
T B → A = [ 1 0 0 1 0 1 0 2 0 0 1 3 0 0 0 1 ] T_{B \to A} = \begin{bmatrix} 1 & 0 & 0 & 1 \\ 0 & 1 & 0 & 2 \\ 0 & 0 & 1 & 3 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix} TBA= 1000010000101231
B坐标系的点可以通过 B到A的变换矩阵 T B → A T_{B \to A} TBA得到在A坐标系的表达
P A = T B → A P B P_A = T_{B \to A} P_B PA=TBAPB
T B → A T_{B \to A} TBA求逆得到A到B的变换矩阵为:
T A → B = [ 1 0 0 − 1 0 1 0 − 2 0 0 1 − 3 0 0 0 1 ] T_{A \to B} = \begin{bmatrix} 1 & 0 & 0 & -1 \\ 0 & 1 & 0 & -2 \\ 0 & 0 & 1 & -3 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix} TAB= 1000010000101231
P B = T A → B P A P_B = T_{A \to B} P_A PB=TABPA
例如,将A的原点(0,0,0)带入得到 其在B坐标系的坐标是(-1,-2,-3)

5.2. 变换矩阵的意义

以相机坐标系到世界坐标系的变换矩阵 T c 2 w T_{c2w} Tc2w 为例,其核心作用是描述相机坐标系相对于世界坐标系的位姿(位置和姿态)。


一、几何描述
变换矩阵 T c 2 w T_{c2w} Tc2w 是一个 4×4 齐次矩阵,由 旋转矩阵 R R R 和 平移向量 t t t 组成:
T c 2 w = [ R t 0 T 1 ] T_{c2w} = \begin{bmatrix} R & t \\ 0^T & 1 \end{bmatrix} Tc2w=[R0Tt1]

  • 几何意义:

    1. 旋转矩阵 R R R:描述相机坐标系的坐标轴在世界坐标系中的方向。例如,若相机绕 Z 轴旋转 θ 角,则 R R R 为绕 Z 轴的旋转矩阵。
    2. 平移向量 t t t表示相机坐标系原点在世界坐标系中的位置。
  • 符号惯例: T c 2 w T_{c2w} Tc2w 表示从相机坐标系到世界坐标系的变换,与 T w c T_{wc} Twc(世界到相机的变换)互为逆矩阵。

二、坐标转换
变换矩阵 T c 2 w T_{c2w} Tc2w 可将相机坐标系中的点 P c P_c Pc 转换为世界坐标系中的点 P w P_w Pw P w = T c 2 w ⋅ P c P_w = T_{c2w} \cdot P_c Pw=Tc2wPc
公式推导:

  1. 齐次坐标表示:

    • 相机坐标系中的点 P c = [ X c , Y c , Z c , 1 ] T P_c = [X_c, Y_c, Z_c, 1]^T Pc=[Xc,Yc,Zc,1]T
    • 世界坐标系中的点 P w = [ X w , Y w , Z w , 1 ] T P_w = [X_w, Y_w, Z_w, 1]^T Pw=[Xw,Yw,Zw,1]T
  2. 转换过程:
    [ X w Y w Z w 1 ] = [ R t 0 T 1 ] ⋅ [ X c Y c Z c 1 ] = [ R ⋅ [ X c Y c Z c ] + t 1 ] \begin{bmatrix} X_w \\ Y_w \\ Z_w \\ 1 \end{bmatrix} = \begin{bmatrix} R & t \\ 0^T & 1 \end{bmatrix} \cdot \begin{bmatrix} X_c \\ Y_c \\ Z_c \\ 1 \end{bmatrix} = \begin{bmatrix} R \cdot \begin{bmatrix} X_c \\ Y_c \\ Z_c \end{bmatrix} + t \\ 1 \end{bmatrix} XwYwZw1 =[R0Tt1] XcYcZc1 = R XcYcZc +t1

  • 示例:
    若相机坐标系中点 P c = [ 1 , 0 , 0 ] T P_c = [1, 0, 0]^T Pc=[1,0,0]T,则世界坐标系中的坐标为:
    P w = R ⋅ [ 1 , 0 , 0 ] T + t = [ cos ⁡ 45 ° ⋅ 1 + sin ⁡ 45 ° ⋅ 0 0 ⋅ 1 + 1 ⋅ 0 − sin ⁡ 45 ° ⋅ 1 + cos ⁡ 45 ° ⋅ 0 ] + [ 2 0 0 ] = [ cos ⁡ 45 ° + 2 0 − sin ⁡ 45 ° ] P_w = R \cdot [1, 0, 0]^T + t = \begin{bmatrix} \cos45° \cdot 1 + \sin45° \cdot 0 \\ 0 \cdot 1 + 1 \cdot 0 \\ -\sin45° \cdot 1 + \cos45° \cdot 0 \end{bmatrix} + \begin{bmatrix} 2 \\ 0 \\ 0 \end{bmatrix} = \begin{bmatrix} \cos45° + 2 \\ 0 \\ -\sin45° \end{bmatrix} Pw=R[1,0,0]T+t= cos45°1+sin45°001+10sin45°1+cos45°0 + 200 = cos45°+20sin45°

三、运动表示
变换矩阵可描述相机的运动特性,其核心性质包括:

  1. 组合运动:多个变换可通过矩阵乘法组合。
    T c 2 w ( 总 ) = T c 2 w ( 1 ) ⋅ T c 2 w ( 2 ) T_{c2w}^{(总)} = T_{c2w}^{(1)} \cdot T_{c2w}^{(2)} Tc2w()=Tc2w(1)Tc2w(2)

  2. 逆运动:从世界坐标系到相机坐标系的变换为 T w 2 c = T c 2 w − 1 T_{w2c} = T_{c2w}^{-1} Tw2c=Tc2w1,满足:
    T w 2 c = [ R T − R T t 0 T 1 ] T_{w2c} = \begin{bmatrix} R^T & -R^T t \\ 0^T & 1 \end{bmatrix} Tw2c=[RT0TRTt1]

  3. 动态解释:
    • 旋转:相机坐标系的姿态变化(如旋转角度)。

    • 平移:相机坐标系原点的位置偏移。

### 关于欧拉角奇异点及其解决方案 #### 欧拉角简介 欧拉角是一种常用的描述物体在三维空间中姿态的方式,通过依次绕三个轴旋转来表示一个坐标系相对于另一个坐标系的姿态。然而,在某些特殊情况下,这种表示方式会出现奇异性问题。 #### 奇异点现象 当使用欧拉角表示旋转时,存在所谓的万向锁(gimbal lock)现象[^1]。具体来说,当第二个角度(通常称为俯仰角pitch)接近±90°时,第一个第三个旋转轴会重合,导致丢失了一个自由度。此时,原本独立的两个旋转动作变得不可区分,从而造成数据失真或计算错误。 #### 数值稳定性分析 为了提高算法的数值稳定性并解决上述提到的奇异性问题,研究者们探索了几种替代方案: - **四元数**:作为一种无奇点的参数化方法,四元数能够有效地避免传统欧拉角带来的局限性。其优势在于只需要四个变量即可唯一确定任意方向,并且不存在任何死区。此外,四元数还支持高效的插值运算,这使得它们非常适合用于动画制作以及实时控制系统当中[^2]。 - **旋转向量/指数映射**:该方法利用李群理论中的SO(3),即正交行列式等于1的所有3×3实方阵构成的空间来进行旋转操作。相比于其他形式而言,这种方式具有更好的解析性质,而且不会遭遇类似的退化解情况。 - **修正后的欧拉角序列**:虽然标准的XYZ顺序容易引发奇异性,但如果采用不同的组合比如ZYX,则可以在一定程度上缓解这个问题。不过需要注意的是,这只是权宜之计而非根本性的改进措施。 ```python import numpy as np def quaternion_from_euler(ai, aj, ak, axes='sxyz'): """Convert Euler angles to Quaternion. Args: ai (float): First rotation angle about first axis (in radians). aj (float): Second rotation angle about second axis (in radians). ak (float): Third rotation angle about third axis (in radians). axes (str): A string specifying the sequence of rotations. Returns: tuple: Four floats representing a unit quaternion. """ try: firstaxis, parity, repetition, frame = _AXES2TUPLE[axes.lower()] except (AttributeError, KeyError): raise ValueError('Invalid input axes string') i = firstaxis + 1 j = _NEXT_AXIS[i+parity-1] + 1 k = _NEXT_AXIS[i-parity] + 1 if frame: ai, ak = ak, ai if parity: aj = -aj si, sj, sk = map(math.sin, (ai / 2.0, aj / 2.0, ak / 2.0)) ci, cj, ck = map(math.cos, (ai / 2.0, aj / 2.0, ak / 2.0)) cc, cs = ci * ck, ci * sk sc, ss = si * ck, si * sk q = np.empty((4,)) if repetition: q[0] = cj * (cc - ss) q[i] = cj * (cs + sc) q[j] = sj * (cc + ss) q[k] = sj * (cs - sc) else: q[0] = cj*cc + sj*ss q[i] = sj*sc - cj*ss q[j] = sj*cs + cj*sc q[k] =cj*ss - sj*cc if parity: q[j] *= -1 return q.tolist() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值