Skip to content

第3讲 三维空间刚体运动 ​

3.1 旋转矩阵 ​

3.1.1 点和向量,坐标系 ​

点和点之间可以组成向量。点本身可以由原点指向它的向量来描述。和坐标不同,是空间中的一样东西。

坐标是向量在坐标系下的表示

向量:

a=[e1,e2,e3][a1a2a3]=a1e1+a2e2+a3e3

坐标系:由3个正交的轴组成,构成线性空间的一组基。

通过叉乘来确定z轴:左手系(Unity、Direct3D)和右手系(大部分3D程序,如:OpenGL、3D Max)

内积:a⋅b=a⊤b 。另外,内积的结果与坐标系的选取无关

外积: a×b=|e1e2e3a1a2a3b1b2b3|=[0−a3a2a30−a1−a2a10]b=a∧b

引入 ∧ 记号,表示向量所对应的反对称矩阵 bij放的下标为k,下三角为正,上三角看(−1)i+j

外积还可以用于旋转(方向)

∧ 记号的性质:

  • a∧b=−b∧a (叉乘交换顺序,方向为负)
  • a∧Ia∧⊤=I−aa⊤.

3.1.2 坐标系间的坐标变换 ​

如何计算同一个向量在不同坐标系里的坐标?

SLAM中,由固定的世界坐标系和移动的机器人坐标系。机器人坐标系随着机器人运动而改变,每个时刻都有新的坐标系

变换:原点间的平移以及三个轴的旋转(刚体是只有这些)

欧氏变换:同一个向量在各个坐标系下的长度和夹角都不会发生变化。

假设单位正交基从(e1,e2,e3)经过一次旋转变成了(e1′,e2′,e3′),对于同一个向量是没有运动的,其坐标为:

a=[e1,e2,e3][a1a2a3]=[e1′,e2′,e3′][a1′a2′a3′]

左右两边同时左乘:[e1⊤e2⊤e3⊤],得:

[a1a2a3]=[e1⊤e1′e1⊤e2′e1⊤e3′e2⊤e1′e2⊤e2′e2⊤e3′e3⊤e1′e3⊤e2′e3⊤e3′][a1′a2′a3′]=Ra′

R称为旋转矩阵,是一个行列式为1的正交矩阵。

定义特殊正交群SO(n)来作为旋转矩阵的集合:

SO(n)={R∈Rn×n|RR⊤=I,det(R)=1}

旋转矩阵可以描述相机的旋转

其逆(即转置R⊤)描述了一个相反的旋转

a1=R12a2

将旋转和平移合在一起有:

a′=Ra+t

注:

  • 在《ROS机器人编程》中,对旋转矩阵的解释为:坐标轴各分量在另一坐标轴上的分量。
  • 对于平移向量的理解:转换后坐标系的原点,指向转换前坐标系的原点,得到的向量,在转换后坐标系下的表示

3.1.3 变换矩阵与齐次坐标 ​

做2次变换:

b=R1a+t1,c=R2b+t2,c=R2(R1a+t1)+t2

多次变换过于复杂,引入齐次坐标和变换矩阵:

[a′1]=[Rt0⊤1][a1]=T[a1]

将三维向量的末尾添加1,变成四维向量,成为齐次坐标。T 称为变换矩阵。

齐次坐标是射影几何的概念,多了一个自由度,但是允许将变换写成线性的形式。将某个点的每个分量同乘一个非 0 常数 k 后仍然表示同一个点。因此,一个点的具体坐标值不是唯一的。强制最后一项为 1,从而得到一个点的唯一坐标表示。

定义特殊欧氏群:

SE(3)={T=[Rt0⊤1]∈R4×4|R∈SO(3),t∈R3}

反向的变换:

T−1=[R⊤−R⊤t0⊤1]

TWR 的是机器人坐标系到世界坐标系的转换,平移部分描述机器人坐标系在世界坐标系下的平移

例1:世界坐标系的一个点 p,在相机坐标系下的坐标为 Rcbp+tcb。由于相机会随着机器人移动,所以世界坐标系到相机坐标系的转换随着机器人移动而变化,是定位所需要求解的。

在 k 时刻有 Rcbk,tcbk,又有在相机坐标系下 k 时刻到 k+1 时刻的变换 k+1Rck,k+1tck,则 k+1 时刻世界坐标系到相机坐标系的转换为:

Rcbk+1=k+1RckRcbk,tcbk+1=k+1Rcktcbk+k+1tck

世界坐标系下 k 时刻到 k+1 时刻的变换为:

k+1Rbk=Rbck+1k+1RckRcbk=Rbck+1Rck+1Rck−1Rbck−1k+1tbk=(k+1RckRcbk)⊤k+1tck=Rbck+1k+1tck

例2:两个世界坐标系下的 pose R1,t1;R2,t2,求它们的相对pose

考虑坐标系的2个点 t1,t2 作为2个pose,则相对旋转为 R2R1−1,相对平移为 t2−t1 (因为这个可以表示成世界坐标系下的坐标,在同一个坐标系下,就不需要带旋转了,直接向量相减)

3.3 旋转向量和欧拉角 ​

3.3.1旋转向量 ​

  • SO(3) 的旋转矩阵有9个量,但一次旋转只有3个自由度。同理,变换矩阵用16个量表达了6自由度的变换

  • 旋转矩阵自身带有约束,必须是正交矩阵,且行列式为1

任意旋转都可以用一个旋转轴和一个旋转角来刻画。旋转轴可以使用一个向量表示,长度等于旋转角。这种向量称为旋转向量(或轴角 Axis-Angle)。只需一个三维向量可以描述旋转。(李代数)

对于变换矩阵,使用一个旋转向量和一个平移向量即可表达一个变换。

假设有一个旋转轴为n,角度为θ的旋转,对应的旋转向量为θn。通过罗德里格斯公式(Rodrigues's formula)实现旋转向量到旋转矩阵的转换。

R=cos⁡θI+(1−cos⁡θ)nn⊤+sin⁡θn∧

Rodrigues公式在ORB-SLAM3的表述如下:

R=I+(1−cos⁡θ)(n∧)2+sin⁡θn∧

这是因为有如下等式:

nn⊤−(n∧)2=Itr(R)=cos⁡θtr(I)+(1−cos⁡θ)tr(nn⊤)+sin⁡θtr(n∧)=3cos⁡θ+(1−cos⁡θ)=1+2cos⁡θθ=arccos⁡[tr(R−1)2]

由于旋转轴上的向量在旋转后不发生改变,说明:

Rn=n

转轴n是矩阵R特征值1对应的特征向量。

两个转换公式正是SO(3)上李群和李代数的对应关系

3.3.2 欧拉角 ​

因为旋转矩阵、旋转向量不直观,所以使用3个分离的转角把一个旋转分解成3次绕不同轴的旋转。还需要区分每次是绕固定轴旋转还是绕旋转之后的轴旋转的。

偏航-俯仰-滚转(yaw-pitch-roll) ZYX 轴的旋转,旋转之后的轴

rpy 角比较常用,使用 [r,p,y]⊤ 表示三维向量的任意旋转

使用欧拉角会出现一个著名的万向锁(Gimbal lock)问题:俯仰角为 ±90∘ 时,第一次旋转与第三次旋转将使用同一个轴,使得系统丢失了一个自由度(3次旋转变为2次旋转)。这称为奇异性问题。

理论上,只要想用3个实数表达三维旋转,都会不可避免碰到奇异性问题。因此,欧拉角不适用于插值和迭代,往往只用于人机交互中。也很少在 SLAM 中直接使用欧拉角表达姿态,同样不会在滤波或优化中使用欧拉角表达旋转。

(补充)

  • 内旋:每一次旋转都会改变下一次旋转的轴(物体空间的轴)
  • 外旋:轴固定(惯性系的轴)

内在旋转与外在旋转的转换关系:互换第一次和第三次旋转的位置则两者结果相同。例如 Z−Y−X 旋转的内部旋转和 X−Y−Z 旋转的外部旋转的旋转矩阵相同。

  • 外旋:B 绕 A 的 X 轴旋转 γ 角,再绕 A 的 Y 轴旋转 β 角,最后绕 A 的 Z 轴旋转 α 角,完成旋转。整个过程,A 不动 B 动。
    • 旋转矩阵的计算方法如下:R=RzRyRx,乘法顺序:从右向左,依次旋转X轴Y轴Z轴。常用的右前上坐标系 yaw(z)-pitch(x)-roll(y) 就是 R=RyRxRz
  • 内旋:B 绕 B 的 Z 轴旋转 α 角,再绕 B 的 Y 轴旋转 β 角,最后绕 B 的 X 轴旋转 γ 角,完成旋转。整个过程,A 不动 B 动。
    • 旋转矩阵的计算方法如下:R=RzRyRx。乘法顺序:从左向右

3.4 四元数 ​

3.4.1 四元数的定义 ​

  • 旋转矩阵带有冗余性
  • 欧拉角和旋转向量具有奇异性
    • 类似于用两个坐标表示地球表面(经度和纬度),必定存在奇异性(纬度为±90∘经度无意义)

四元数是一种扩展的复数,既紧凑也没有奇异性。缺点是不直观,运算稍复杂

一个四元数拥有一个实部和3个虚部:

q=q0+q1i+q2j+q3k

满足:

i2=j2=k2=−1ij=k,ji=−kjk=i,kj=−iki=j,ik=−j

有时也用一个标量和一个向量表示:q=[s,v],分别称为实部和虚部

类似于模长为1的复数表示复平面上的纯旋转,用单位四元数表示三维空间上的任意旋转。乘i对应着旋转180∘,i2=−1表示绕 i 轴旋转360∘得到一个相反的东西

先看旋转向量:假设某个旋转是绕旋转向量 n=[nx,ny,nz] 进行了角度为 θ 的旋转,则四元数形式为:

q=[cos⁡θ2,nxsin⁡θ2,nysin⁡θ2,nzsin⁡θ2]

给 θ 加上 2π ,得到相同的旋转,但是对应的四元数变成了 −q。因此,在四元数中,任意的旋转可以由2个互为相反数的四元数表示

3.4.2 四元数的运算 ​

现有2个四元数 qa,qb ,向量表示为 [sa,va],[sb,vb]

  1. 加法和减法

    qa±qb=[sa±sb,va±vb]
  2. 乘法

    qaqb=[sasb−va⊤vb,savb+sbva+va×vb]

2个实的四元数相乘也是实的,由于最后一项外积的存在,四元数乘法通常不可交换

  1. 共轭 q∗ 实部不变,虚部取相反数。
q∗q=qq∗=[sa2+va⊤va,0]
  1. 模长||qa||=sa2+xa2+ya2+za2
||qaqb||=||qa||||qb||
  1. 逆q−1=q∗/||q||2
qq−1=q−1q=1
  1. 数乘和点乘 和向量一样

3.4.3 用四元数表示旋转 ​

  1. 将三维空间点用一个虚四元数描述:
p=[0,x,y,z]=[0,v]
  1. 用四元数 q 表示这个旋转:q=[cos⁡θ2,nsin⁡θ2]

旋转后的点p′即可表示为这样的乘积:

p′=qpq−1

计算结果实部为0,虚部的3个坐标即为旋转后的点的坐标

3.4.4 四元数到旋转矩阵的转换 ​

这里直接给出四元数 [q0,q1i,q2j,q3k] 到旋转矩阵的转换方式:

R=[1−2q22−2q322q1q2−2q0q32q1q3+2q0q22q1q2+2q0q31−2q12−2q322q2q3−2q0q12q1q3−2q0q22q2q3+2q0q11−2q12−2q22]

假设旋转矩阵R={mij},i,j∈[1,2,3],则对应的四元数q由下式给出:

q0=tr(R)+12q1=m23−m324q0q2=m31−m134q0q3=m12−m214q0
  • 由于 q 和 −q 表示同一个旋转,一个 R 对应的四元数表示并不是唯一的
  • 除此还存在其他几种计算方法
  • 当q0接近0,其余3个分量非常大

3.5 相似、仿射、射影变换 ​

  1. 相似变换:比欧氏变换多了一个自由度,允许物体进行均匀缩放
  2. 仿射变换:只要求A 是可逆矩阵。变换后立方体不再是方形,各个面仍然是平行四边形
  3. 射影变换:
    • A 是可逆矩阵,t 是平移矩阵,左下角缩放 a⊤ 。 v≠0 可以对整个矩阵 v 得到一个右下角为 1 的矩阵。
    • 2D 的射影变换一共有8个自由度,3D 的射影变换一共有15个自由度。
    • 真实世界到相机照片的变换可以看成一个射影变换
变换名称矩阵形式自由度不变性质
欧氏变换[Rt0T1]6长度、夹角、体积
相似变换[sRt0T1]7体积比
仿射变换[At0T1]12平行性、体积比
射影变换[AtaTv]15接触平面的相交和相切

3.6(补充)三维旋转转换 ​

参考资料:三维旋转:欧拉角、四元数、旋转矩阵、轴角之间的转换-知乎

欧拉角转旋转矩阵 ​

欧拉角声明:

  1. 采用ZXY顺规(Roll (γ) -Pitch (β) -Yaw (α))
  2. 列主向量
  3. 外旋
R(α,β,γ)=Ry(α)Rx(β)Rz(γ)=[cos⁡α0sin⁡α010−sin⁡α0cos⁡α][1000cos⁡β−sin⁡β0sin⁡βcos⁡β][cos⁡γ−sin⁡γ0sin⁡γcos⁡γ0001]=[c10s1010−s10c1][1000c2−s20s2c2][c3−s30s3c30001]=[c1s1s2s1c20c2−s2−s1c1s2c1c2][c3−s30s3c30001]=[c1c3+s1s2s3c3s1s2−c1s3c2s1c2s3c2c3−s2c1s2s3−s1c3s1s3+c1c3s2c1c2]

欧拉角转四元数 ​

欧拉角声明:

  1. 采用ZXY顺规(Roll (γ) -Pitch (β) -Yaw (α))
  2. 列主向量
  3. 外旋
q(α,β,γ)=qy(α)qx(β)qz(γ)=[0sin⁡α/20cos⁡α/2][sinβ/200cos⁡β/2][00sin⁡γ/2cos⁡γ/2]=[cos⁡(α/2)sin⁡(β/2)sin⁡(α/2)cos⁡(β/2)−sin⁡(α/2)sin⁡(β/2)cos⁡(α/2)cos⁡(β/2)][00sin⁡γ/2cos⁡γ/2]=[cos⁡(α/2)sin⁡(β/2)cos⁡(γ/2)+sin⁡(α/2)cos⁡(β/2)sin⁡(γ/2)sin⁡(α/2)cos⁡(β/2)cos⁡(γ/2)−cos⁡(α/2)sin⁡(β/2)sin⁡(γ/2)−sin⁡(α/2)sin⁡(β/2)cos⁡(γ/2)+cos⁡(α/2)cos⁡(β/2)sin⁡(γ/2)cos⁡(α/2)cos⁡(β/2)cos⁡(γ/2)+sin⁡(α/2)sin⁡(β/2)sin⁡(γ/2)]

如果欧拉角带有不确定性,并使用协方差 P=diag(σα,σβ,σγ) 表示,则以四元数表示,其协方差为:

P′=HPH⊤

其中 H 为Jacobian矩阵:

H=12[−sin⁡(α/2)sin⁡(β/2)cos⁡(γ/2)+cos⁡(α/2)cos⁡(β/2)sin⁡(γ/2)cos⁡(α/2)cos⁡(β/2)cos⁡(γ/2)−sin⁡(α/2)sin⁡(β/2)sin⁡(γ/2)−cos⁡(α/2)sin⁡(β/2)sin⁡(γ/2)+sin⁡(α/2)cos⁡(β/2)cos⁡(γ/2)cos⁡(α/2)cos⁡(β/2)cos⁡(γ/2)+sin⁡(α/2)sin⁡(β/2)sin⁡(γ/2)−sin⁡(α/2)sin⁡(β/2)cos⁡(γ/2)−cos⁡(α/2)cos⁡(β/2)sin⁡(γ/2)−sin⁡(α/2)cos⁡(β/2)sin⁡(γ/2)−cos⁡(α/2)sin⁡(β/2)cos⁡(γ/2)−cos⁡(α/2)sin⁡(β/2)cos⁡(γ/2)−sin⁡(α/2)cos⁡(β/2)sin⁡(γ/2)−sin⁡(α/2)cos⁡(β/2)cos⁡(γ/2)−cos⁡(α/2)sin⁡(β/2)sin⁡(γ/2)sin⁡(α/2)sin⁡(β/2)sin⁡(γ/2)+cos⁡(α/2)cos⁡(β/2)cos⁡(γ/2)−sin⁡(α/2)cos⁡(β/2)cos⁡(γ/2)+cos⁡(α/2)sin⁡(β/2)sin⁡(γ/2)−cos⁡(α/2)sin⁡(β/2)cos⁡(γ/2)+sin⁡(α/2)cos⁡(β/2)sin⁡(γ/2)−cos⁡(α/2)cos⁡(β/2)sin⁡(γ/2)+sin⁡(α/2)sin⁡(β/2)cos⁡(γ/2)]

Released under the MIT License.