视觉SLAM十四讲 第3讲 三维空间刚体运动

本文介绍了三维空间中旋转的几种表示方法,包括旋转矩阵、旋转向量和欧拉角,并详细阐述了四元数的概念、运算及与旋转矩阵之间的转换。内容涵盖机器人学的基础知识,探讨了不同表示方式的优缺点,特别是四元数的紧凑性和无奇异性使其在描述三维旋转中具有优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本节的部分内容在机器人学导论课程中都有讲述,相关的知识点在上学期的课后整理过,放在这里,机器人学的数理基础知识,本文将在此基础上做些补充。

一、旋转矩阵

点和向量,坐标系

坐标系间的欧式变换

二、旋转向量和欧拉角

旋转向量

旋转矩阵是一个行列式为1的正交矩阵,反之,行列式为1的正交矩阵也是一个旋转矩阵,所以可以把旋转矩阵的集合定义为如下:
S O ( n ) = { R ∈ R n × n ∣ R R T = I , d e t ( R ) = 1 } SO(n) = \{ R \in \mathbb{R}^{n\times n}|RR^T = I,det(R) = 1\} SO(n)={RRn×nRRT=I,det(R)=1}

S O ( n ) SO(n) SO(n)是特殊正交群(Special Orthogonal Group)的意思。
同时,对于齐次变换矩阵,左上角为旋转矩阵,右侧为平移分量,左下角为0,右下角为1,这种矩阵成为特殊欧式群(Special Euclidean Group)。
S E ( 3 ) = { T = [ R t 0 T 1 ] ∈ R 4 × 4 ∣ R ∈ S O ( 3 ) , t ∈ R 3 } SE(3) = \{T = \begin{bmatrix} R & t\\ 0^T & 1 \end{bmatrix} \in \mathbb{R}^{4\times 4}|R \in SO(3), t \in \mathbb{R}^3 \} SE(3)={T=[R0Tt1]R4×4RSO(3),tR3}
三维刚体运动有6个自由度,而SO(3)旋转矩阵有9个量,有些冗余,同时旋转矩阵自身还有约束。
于是有了一种更加紧凑的旋转表示方法,利用一个旋转轴和一个旋转角来表示任意的旋转。构造一种向量,使得其方向与旋转轴方向一致,而长度等于旋转角,这种向量称为旋转向量(轴角,Axis-Angle)

则绕旋转轴n旋转角度 θ \theta θ对应的旋转向量为 θ \theta θn,显然这里的n应该为单位向量。

旋转向量到旋转矩阵的变换过程由罗德里格斯公式给出:
R = c o s θ I + ( 1 − c o s θ ) n n T + s i n θ n ∧ R = cos\theta \mathbf{I} + (1-cos\theta) \mathbf{n} \mathbf{n}^T + sin\theta \mathbf{n} ^{\wedge} R=cosθI+(1cosθ)nnT+sinθn

欧拉角

欧拉角用三个分离的转角来描述旋转,最常用的描述方法是“偏航-俯仰-滚转”(yaw-pitch-roll)。但是其存在万向锁的问题,很少在SLAM中直接用来描述姿态。

三、四元数

四元数的定义

四元数是紧凑的,没有奇异性的,可以用来表述三维空间旋转。
一个四元数q拥有一个实部和三个虚部:
q = q 0 + q 1 i + q 2 j + q 3 k \mathbf{q} = q_0 +q_1i + q_2j + q_3k q=q0+q1i+q2j+q3k
其中 i , j , k i,j,k i,j,k为四元数的三个虚部,满足
{ i 2 = j 2 = k 2 = − 1 i j = k , j i = − k j k = i , k j = − i k i = j , i k = − j \left\{ \begin{aligned} i^2=j^2=k^2=-1 \\ ij=k,ji=-k\\ jk=i,kj=-i\\ ki=j,ik=-j \end{aligned} \right. i2=j2=k2=1ij=k,ji=kjk=i,kj=iki=j,ik=j

四元数也可以表示为:
q = [ s , v ] , s = q 0 ∈ R , v = [ q 1 , q 2 , q 3 ] T ∈ R \mathbf{q} = [s, \mathbf{v}], s=q_0 \in \mathbb{R}, \mathbf{v}=[q_1, q_2,q_3]^T \in \mathbb{R} q=[s,v],s=q0R,v=[q1,q2,q3]TR

四元数的运算

对于两个四元数 q a = [ s a , v a ] = s a + x a i + y a j + z a k , q b = [ s b , v b ] = s b + x b i + y b j + z b k \mathbf{q}_a=[s_a,\mathbf{v}_a]=s_a+x_ai+y_aj+z_ak, \mathbf{q}_b=[s_b,\mathbf{v}_b]=s_b+x_bi+y_bj+z_bk qa=[sa,va]=sa+xai+yaj+zak,qb=[sb,vb]=sb+xbi+ybj+zbk

  • 加法和减法
    q a ± q b = [ s a ± s b , v a ± v b ] \mathbf{q}_a \pm\mathbf{q}_b = [s_a \pm s_b, \mathbf{v}_a \pm \mathbf{v}_b] qa±qb=[sa±sb,va±vb]
  • 乘法
    q a q b = [ s a s b − v a T v b , s a v b + s b v a + v a × v b ] \mathbf{q}_a\mathbf{q}_b=[s_as_b-\mathbf{v}_a^T\mathbf{v}_b,s_a\mathbf{v}_b+s_b\mathbf{v}_a+\mathbf{v}_a \times \mathbf{v}_b] qaqb=[sasbvaTvb,savb+sbva+va×vb]
  • 共轭
    q a ∗ = [ s a , − v a ] \mathbf{q}_a^*=[s_a, -\mathbf{v}_a] qa=[sa,va]
  • 模长
    ∣ ∣ q a ∣ ∣ = s a 2 + x a 2 + y a 2 + z a 2 ||\mathbf{q}_a|| = \sqrt{s_a^2+x_a^2+y_a^2+z_a^2} qa=sa2+xa2+ya2+za2

  • q − 1 = q ∗ / ∣ ∣ q ∣ ∣ 2 \mathbf{q}^{-1} = \mathbf{q}^*/||\mathbf{q}||^2 q1=q/q2
  • 数乘与点乘
    k q = [ k s , k v ] k\mathbf{q}=[ks,k\mathbf{v}] kq=[ks,kv]
    q a q b = s a s b + x a x b + y a y b + z a z b \mathbf{q}_a\mathbf{q}_b=s_as_b+x_ax_b+y_ay_b+z_az_b qaqb=sasb+xaxb+yayb+zazb

用四元数表示旋转

我们用虚四元数来表示三维空间中的一个点:
p = [ 0 , x , y , z ] = [ 0 , v ] \mathbf{p} = [0, x, y, z]=[0, \mathbf{v}] p=[0,x,y,z]=[0,v]
而对于一个由轴角 n \mathbf{n} n θ \theta θ指定的旋转,可以用四元数来表示为:
q = [ c o s θ 2 , n s i n θ 2 ] \mathbf{q} = [cos\frac{\theta}{2},\mathbf{n}sin\frac{\theta}{2}] q=[cos2θ,nsin2θ]
旋转后的点 p ′ \mathbf{p}\prime p可以表示为:
p ′ = q p q − 1 \mathbf{p}\prime = \mathbf{q}\mathbf{p}\mathbf{q}^{-1} p=qpq1

四元数到旋转矩阵的转换

同理可以推得四元数 q = q 0 + q 1 i + q 2 j + q 3 k \mathbf{q} = q_0 +q_1i+q_2j+q_3k q=q0+q1i+q2j+q3k对应的旋转矩阵 R \mathbf{R} R为:
R = [ 1 − 2 q 2 2 − 2 q 3 2 2 q 1 q 2 − 2 q 0 q 3 2 q 1 q 3 + 2 q 0 q 2 2 q 1 q 2 + 2 q 0 q 3 1 − 2 q 1 2 − 2 q 3 2 2 q 2 q 3 − 2 q 0 q 1 2 q 1 q 3 − 2 q 0 q 2 2 q 2 q 3 + 2 q 0 q 1 1 − 2 q 1 2 − 2 q 2 2 ] \mathbf{R} = \begin{bmatrix} 1-2q_2^2-2q_3^2 & 2q_1q_2-2q_0q_3 & 2q_1q_3+2q_0q_2\\ 2q_1q_2+2q_0q_3 & 1-2q_1^2-2q_3^2 & 2q_2q_3-2q_0q_1\\ 2q_1q_3-2q_0q_2 & 2q_2q_3+2q_0q_1 & 1-2q_1^2-2q_2^2 \end{bmatrix} R=12q222q322q1q2+2q0q32q1q32q0q22q1q22q0q312q122q322q2q3+2q0q12q1q3+2q0q22q2q32q0q112q122q22

同样的由旋转矩阵 R = { m i j } , i , j ∈ [ 1 , 2 , 3 ] \mathbf{R}=\{m_{ij}\},i,j \in[1, 2,3] R={mij},i,j[1,2,3]也可以得到四元数:
q 0 = t r ( R ) + 1 2 , q 1 = m 23 − m 32 4 q 0 , q 2 = m 31 − m 13 4 q 0 , q 3 = m 12 − m 21 4 q 0 q_0 = \frac{\sqrt{tr(\mathbf{R})+1}}{2}, q_1=\frac{m_{23}-m_{32}}{4q_0},q_2=\frac{m_{31}-m_{13}}{4q_0}, q_3=\frac{m_{12}-m_{21}}{4q_0} q0=2tr(R)+1 ,q1=4q0m23m32,q2=4q0m31m13,q3=4q0m12m21

往期链接
视觉SLAM十四讲 第2讲 初识slam

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YWL0720

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值