Skip to content

第3讲 三维空间刚体运动

3.1 旋转矩阵

3.1.1 点和向量,坐标系

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

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

向量:

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

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

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

内积:ab=ab 。另外,内积的结果与坐标系的选取无关

外积: a×b=|e1e2e3a1a2a3b1b2b3|=[0a3a2a30a1a2a10]b=ab

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

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

记号的性质:

  • ab=ba (叉乘交换顺序,方向为负)
  • aIa=Iaa.

3.1.2 坐标系间的坐标变换

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

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

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

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

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

a=[e1,e2,e3][a1a2a3]=[e1,e2,e3][a1a2a3]

左右两边同时左乘:[e1e2e3],得:

[a1a2a3]=[e1e1e1e2e1e3e2e1e2e2e2e3e3e1e3e2e3e3][a1a2a3]=Ra

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

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

SO(n)={RRn×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

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

[a1]=[Rt01][a1]=T[a1]

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

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

定义特殊欧氏群:

SE(3)={T=[Rt01]R4×4|RSO(3),tR3}

反向的变换:

T1=[RRt01]

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+1Rck1Rbck1k+1tbk=(k+1RckRcbk)k+1tck=Rbck+1k+1tck

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

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

3.3 旋转向量和欧拉角

3.3.1旋转向量

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

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

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

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

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

R=cosθI+(1cosθ)nn+sinθn

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

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

这是因为有如下等式:

nn(n)2=Itr(R)=cosθtr(I)+(1cosθ)tr(nn)+sinθtr(n)=3cosθ+(1cosθ)=1+2cosθθ=arccos[tr(R1)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 中直接使用欧拉角表达姿态,同样不会在滤波或优化中使用欧拉角表达旋转。

(补充)

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

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

  • 外旋: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对应着旋转180i2=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=[sasbvavb,savb+sbva+va×vb]

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

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

3.4.3 用四元数表示旋转

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

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

p=qpq1

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

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

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

R=[12q222q322q1q22q0q32q1q3+2q0q22q1q2+2q0q312q122q322q2q32q0q12q1q32q0q22q2q3+2q0q112q122q22]

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

q0=tr(R)+12q1=m23m324q0q2=m31m134q0q3=m12m214q0
  • 由于 qq 表示同一个旋转,一个 R 对应的四元数表示并不是唯一的
  • 除此还存在其他几种计算方法
  • q0接近0,其余3个分量非常大

3.5 相似、仿射、射影变换

  1. 相似变换:比欧氏变换多了一个自由度,允许物体进行均匀缩放
  2. 仿射变换:只要求A 是可逆矩阵。变换后立方体不再是方形,各个面仍然是平行四边形
  3. 射影变换:
    • A 是可逆矩阵,t 是平移矩阵,左下角缩放 av0 可以对整个矩阵 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α010sinα0cosα][1000cosβsinβ0sinβcosβ][cosγsinγ0sinγcosγ0001]=[c10s1010s10c1][1000c2s20s2c2][c3s30s3c30001]=[c1s1s2s1c20c2s2s1c1s2c1c2][c3s30s3c30001]=[c1c3+s1s2s3c3s1s2c1s3c2s1c2s3c2c3s2c1s2s3s1c3s1s3+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.