视觉SLAM——二维三维几何、三维空间刚体变换

本文深入探讨SLAM(同步定位与地图构建)中的关键三维几何概念,包括点、向量、坐标系变换及旋转表示,如旋转矩阵、欧拉角、四元数等,并解析罗德里格斯公式与四元数的左乘右乘、导数推导。

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

前言

本博客为主要学习《视觉SLAM十四讲》第3讲、《机器人学的状态估计》第6章三位几何学基础、《计算机视觉-算法和应用》第2章2.1几何基元变换等SLAM内容的总结与整理。
主要包括:
1、点、向量、坐标系、直线、平面等几何学基础
2、旋转矩阵、角轴、欧拉角、四元数等表示坐标系旋转的方法,罗德里格斯公式的证明,四元数左乘右乘、导数的推导
3、2D、3D空间的欧式、相似、仿射、射影变换性质


1、几何学基础

1.1 点

2D点,如图像中的像素坐标,可以用一对数值表示:x=(x,y)∈R2x =(x,y) \in \mathbf R^2x=(x,y)R2
也可以用齐次坐标表示:
x~=(x~,y~,w~)∈P2\widetilde x = (\widetilde x,\widetilde y,\widetilde w) \in \mathbf P^2x=(x,y,w)P2

其中仅在尺度上不同的矢量被视为等同的。P2=R3−(0,0,0)\mathbf P^2=\mathbf R^3-(0,0,0)P2=R3(0,0,0)称作2D投影空间。齐次矢量x~\widetilde xx可以通过除以最后一个元素w~\widetilde ww转换为非齐次矢量xxx,即x~=(x~,y~,w~)=w~(x,y,1)=w~xˉ\widetilde x = (\widetilde x,\widetilde y,\widetilde w)=\widetilde w(x,y,1)=\widetilde w \bar xx=(x,y,w)=w(x,y,1)=wxˉxˉ\bar xxˉ成为增广矢量。

3D点,也可以写成非齐次坐标x=(x,y,z)∈R3x =(x,y,z) \in \mathbf R^3x=(x,y,z)R3或齐次坐标x~=(x~,y~,z~,w~)=w~(x,y,z,1)∈P3\widetilde x = (\widetilde x,\widetilde y,\widetilde z,\widetilde w) =\widetilde w(x,y,z,1)\in \mathbf P^3x=(x,y,z,w)=w(x,y,z,1)P3

1.2 向量与坐标系

向量是线性空间中的一个元素,可以想象成从原点指向某处的一个箭头。只有当指定三维空间的坐标系时,才存在向量在此坐标系下的坐标。例如确定了三维空间中坐标系(e1,e2,e3)(e_1,e_2,e_3)(e1,e2,e3),向量在这组基下的坐标为:

a=[e1,e2,e3][a1a2a3]=a1e1+a2e2+a3e3a=[e_1,e_2,e_3]\left[ \begin{matrix} a_1 \\a_2\\a_3 \end{matrix} \right]=a_1e_1+a_2e_2+a_3e_3a=[e1,e2,e3]a1a2a3=a1e1+a2e2+a3e3

坐标系通常由3个正交的坐标系组成。右手坐标系即给定x轴和y轴时,z轴的方向可以通过右手法则由x×yx\times yx×y定义。

向量内积:
a⋅b=aTb=∑i=13aibi=∣a∣∣b∣cos&lt;a,b&gt;a \cdot b = a^Tb=\sum_{i=1}^{3}a_ib_i=|a||b|cos&lt;a,b&gt;ab=aTb=i=13aibi=abcos<a,b>

向量外积
a×b=∥ijka1a2a3b1b2b3∥=[a2b3−a3b2a3b1−a1b3a1b2−a2b1]=[0−a3a2a30−a1−a2a10]b≜a∧ba \times b=\left\| \begin{matrix} i&amp;j&amp;k \\a_1&amp;a_2&amp;a_3\\b_1&amp;b_2&amp;b_3 \end{matrix} \right\|=\left[ \begin{matrix} a_2b_3-a_3b_2 \\a_3b_1-a_1b_3\\a_1b_2-a_2b_1 \end{matrix} \right]=\left[ \begin{matrix} 0&amp;-a_3&amp;a_2 \\a_3&amp;0&amp;-a_1\\-a_2&amp;a_1&amp;0 \end{matrix} \right]b \triangleq a^\land ba×b=ia1b1ja2b2ka3b3=a2b3a3b2a3b1a1b3a1b2a2b1=0a3a2a30a1a2a10bab

引入^符号,将a写成一个反对称矩阵,将向量的外积转变为向量与矩阵的乘法。外积只对向量存在定义。

在三维几何中,向量a和向量b的外积结果是垂直于a和b向量构成平面的法向量,大小为向量a和向量b构成的平行四边形的面积。

1.3 2D直线

2D直线也可以用齐次坐标表达l~=(a,b,c)\widetilde l=(a,b,c)l=(a,b,c)。对应的直线方程为:
xˉl~=ax+by+c=0\bar x \widetilde l=ax+by+c=0xˉl=ax+by+c=0

也可以规范化直线方程,使得
l=(n^x,n^y,d)=(n^,d),∣∣n^∣∣=1l=(\hat n_x,\hat n_y,d)=(\hat n,d),||\hat n||=1l=(n^x,n^y,d)=(n^,d)n^=1

此时n^\hat nn^是垂直于直线的法向量,d是其到原点的距离。但是这样有个例外,就是无穷远处的直线l~=(0,0,1)\widetilde l=(0,0,1)l=(0,0,1),它包含了所有无穷远处的点。

使用齐次坐标系,可以计算两条直线的角点:
x~=l~1×l~2\widetilde x=\widetilde l_1 \times \widetilde l_2x=l1×l2

计算两点的直线:
l~=x~1×x~2\widetilde l = \widetilde x_1 \times \widetilde x_2l=x1×x2

点到直线的距离
1)对于点(x0,y0)(x_0,y_0)(x0,y0),到直线ax+by+c=0ax+by+c=0ax+by+c=0的距离d可以如下计算:
d=∣ax0+by0+ca2+b2∣d=|\frac{ax_0+by_0+c}{\sqrt{a^2+b^2}}|d=a2+b2ax0+by0+c

2)对于点A、B、C,求点A到直线BC的距离还可以这样算:
d=∣AB×BC∣∣BC∣d=\frac{|AB \times BC|}{|BC|}d=BCAB×BC

1.4 3D平面

3D平面也可以表达为齐次坐标m^=(a,b,c,d)\hat m=(a,b,c,d)m^=(a,b,c,d),对应的平面方程为:
xˉ⋅m^=ax+by+cz+d=0\bar x \cdot \hat m=ax +by+cz+d=0xˉm^=ax+by+cz+d=0

也可以规范化平面方程,使得
l=(n^x,n^y,n^z,d)=(n^,d),∣∣n^∣∣=1l=(\hat n_x,\hat n_y,\hat n_z,d)=(\hat n,d),||\hat n||=1l=(n^x,n^y,n^z,d)=(n^,d)n^=1

此时n^\hat nn^是垂直于平面的法向量,d是其到原点的距离。同样有个例外,就是无穷远处的平面l~=(0,0,0,1)\widetilde l=(0,0,0,1)l=(0,0,0,1),它包含了所有无穷远处的点。

点到平面的距离
1)对于点(x0,y0)(x_0,y_0)(x0,y0),到平面ax+by+cz+d=0ax+by+cz+d=0ax+by+cz+d=0的距离d可以如下计算:
d=∣ax0+by0+cz0+da2+b2+c2∣d=|\frac{ax_0+by_0+cz_0+d}{\sqrt{a^2+b^2+c^2}}|d=a2+b2+c2ax0+by0+cz0+d

2)对于点A、B、C、D,求点A到平面BCD的距离还可以这样算:
d=∣(BC×BD)⋅AB∣∣BC×BD∣d=\frac{|(BC \times BD)\cdot AB|}{|BC \times BD|}d=BC×BD(BC×BD)AB

1.5 3D直线

3D的直线表达可以用直线上的两个点(p,q)(p,q)(p,q),直线上的其他点可以表示为这两个点的线性组合:
r=(1−λ)p+λq,r~=(1−λ)p~+λq~r=(1-\lambda)p+\lambda q,\widetilde r=(1-\lambda)\widetilde p+\lambda \widetilde qr=(1λ)p+λqr=(1λ)p+λq

一种特殊情况是当第二个点位于无穷远时,即q~=(d^x,d^y,d^z,0)=(d^,0)\widetilde q=(\hat d_x,\hat d_y,\hat d_z,0)=(\hat d,0)q=(d^x,d^y,d^z,0)=(d^,0)。这里d^\hat dd^即为直线的方向。可以讲非齐次坐标的3D直线方程重写为:
r=p+λq^r=p+\lambda \hat qr=p+λq^


2、旋转表示方法

2.1 旋转矩阵与欧式变换

假设某个单位正交基(e1,e2,e3)(e_1,e_2,e_3)(e1,e2,e3)经过一次旋转变成了(e1′,e2′,e3′)(e&#x27;_1,e&#x27;_2,e&#x27;_3)(e1,e2,e3),对于同一个向量a,它在两个坐标系下的坐标为[a1,a2,a3]T[a_1,a_2,a_3]^T[a1,a2,a3]T[a1′,a2′,a3′]T[a&#x27;_1,a&#x27;_2,a&#x27;_3]^T[a1,a2,a3]T,有:
[e1,e2,e3][a1a2a3]=[e1′,e2′,e3′][a1′a2′a3′][e_1,e_2,e_3]\left[ \begin{matrix} a_1 \\a_2\\a_3 \end{matrix} \right]=[e&#x27;_1,e&#x27;_2,e&#x27;_3]\left[ \begin{matrix} a&#x27;_1 \\a&#x27;_2\\a&#x27;_3 \end{matrix} \right][e1,e2,e3]a1a2a3=[e1,e2,e3]a1a2a3

[a1a2a3]=[e1Te1′e1Te2′e1Te3′e2Te1′e2Te2′e2Te3′e3Te1′e3Te2′e3Te3′][a1′a2′a3′]≜Ra′\left[ \begin{matrix} a_1 \\a_2\\a_3 \end{matrix} \right]=\left[ \begin{matrix}e_1^Te&#x27;_1 &amp; e_1^Te&#x27;_2&amp;e_1^Te&#x27;_3\\e_2^Te&#x27;_1 &amp; e_2^Te&#x27;_2&amp;e_2^Te&#x27;_3\\e_3^Te&#x27;_1 &amp; e_3^Te&#x27;_2&amp;e_3^Te&#x27;_3\end{matrix} \right] \left[ \begin{matrix} a&#x27;_1 \\a&#x27;_2\\a&#x27;_3 \end{matrix} \right] \triangleq Ra&#x27;a1a2a3=e1Te1e2Te1e3Te1e1Te2e2Te2e3Te2e1Te3e2Te3e3Te3a1a2a3Ra

旋转矩阵R为行列式为1的正交矩阵,其集合定义如下:
SO(n)={R∈Rn×n∣RRT=I,det(R)=1}SO(n)=\{R∈R^{n\times n}|RR^T=I,det(R)=1\}SO(n)={RRn×nRRT=I,det(R)=1}

SO(n)为特殊正交群(Special Orthogonal Group)。

欧拉旋转定理:刚体在三维空间里的一般运动可以分解为刚体上方某一点的平移,和绕经过此点的旋转轴的转动。

欧式变换可以使用旋转矩阵R和平移向量t完整地描述:
a′=Ra+ta&#x27;=Ra+ta=Ra+t

引入齐次坐标,重写变换矩阵为:
[a′1]=[RT0T1][a1]≜T[a1]\left[ \begin{matrix} a&#x27; \\1 \end{matrix} \right] =\left[ \begin{matrix} R&amp;T\\0^T&amp;1 \end{matrix} \right]\left[ \begin{matrix} a \\1 \end{matrix} \right] \triangleq T\left[ \begin{matrix} a \\1 \end{matrix} \right][a1]=[R0TT1][a1]T[a1]

变换矩阵T又被称为特殊欧式群(Special Euclidean Group):
SE(3)={T=[Rt0T1]∈R4×4∣R∈SO(3),t∈R3}SE(3)=\{T=\left[ \begin{matrix} R&amp;t\\0^T&amp;1 \end{matrix} \right]\in R^{4\times 4}|R\in SO(3),t \in R^3\}SE(3)={T=[R0Tt1]R4×4RSO(3),tR3}

变换矩阵的逆为:[RT−RTt0T1]\left[ \begin{matrix} R^T&amp;-R^Tt\\0^T&amp;1 \end{matrix} \right][RT0TRTt1]

习惯上我们采用旋转矩阵R12R_{12}R12或者R21R^1_2R21表示从坐标系2到坐标系1的旋转矩阵:
a1=R12a2a_1=R_{12}a_2a1=R12a2


对SLAM来说,我们会用到相机坐标系和世界坐标系。

TwcT_{wc}Twc表示相机坐标系到世界坐标系的变换,常用来表示相机的位姿,因为更加直观:其平移部分是相机原点在世界坐标系下的坐标:
pw=Twcpc=Twc0=twcp_w=T_{wc} p_c=T_{wc} 0=t_{wc}pw=Twcpc=Twc0=twc

TcwT_{cw}Tcw表示世界坐标系到相机坐标系的变换,在SLAM输出的结果中更加常用。

假设世界坐标系到相机坐标系的变换Rt,相机中心在世界坐标系中的位置:

Rpw+t=pc=0⇒pw=−RTtRp_w+t=p_c=0\Rightarrow p_w=-R^TtRpw+t=pc=0pw=RTt

相机朝向(Z轴)在世界坐标系下的方向为:
rc=Zc−Ocamc,Zc=(0,0,1)T,Ocamc=(0,0,0)Tr^c=Z^c-O^c_{cam},Z^c=(0,0,1)^T,O^c_{cam}=(0,0,0)^Trc=ZcOcamc,Zc=(0,0,1)T,Ocamc=(0,0,0)T

rw=(RTZc−RTt)−(RTOcamc−RTt)=RT(001)r^w=(R^TZ^c-R^Tt)-(R^TO^c_{cam}-R^Tt)=R^T \left( \begin{matrix} 0\\0\\1 \end{matrix} \right)rw=(RTZcRTt)(RTOcamcRTt)=RT001

即旋转矩阵的第三行。


2.2 旋转向量

任意旋转可以用一个旋转轴和一个旋转角表示。定义旋转轴为单位向量n=[a1,a2,a3]Tn=[a_1,a_2,a_3]^Tn=[a1,a2,a3]T,满足:
nTn=a12+a22+a32=1n^Tn=a^2_1+a^2_2+a^2_3=1nTn=a12+a22+a32=1

定义旋转角为θ\thetaθ,得到三维的旋转向量θn\theta nθn(或角轴Angle-Axis)来描述旋转。

从旋转向量到旋转矩阵的转换有罗德里格斯公式
R=cosθI+(1−cosθ)nnT+sinθn∧R=cos\theta I+(1-cos\theta)nn^T+sin \theta n^{\land}R=cosθI+(1cosθ)nnT+sinθn


罗德里格斯公式的证明:
假设初始向量 vvv 绕旋转轴 kkk(单位向量) 旋转 θ\thetaθ 角得到 vrotv_{rot}vrot
在这里插入图片描述
对v进行向量分解:v=v⊥+v∥v = v_{\perp} +v_{\parallel}v=v+v,其中v∥=(v⋅k)kv_{\parallel} = (v\cdot k)kv=(vk)k

由旋转过程平行向量不变性得:vrot∥=v∥v_{rot\parallel}=v_{\parallel}vrot=v

vrot⊥=cosθv⊥+(sinθ∣v⊥∣)k×v⊥∣v⊥∣=cosθv⊥+sinθk×vv_{rot\perp}=cos\theta v_{\perp} + (sin\theta|v_{\perp}|) k\times \frac{v_{\perp}}{|v_{\perp}|}=cos\theta v_{\perp} + sin\theta k\times vvrot=cosθv+(sinθv)k×vv=cosθv+sinθk×v

因此

vrot=vrot∥+vrot⊥=v∥+cosθv⊥+sinθk×vv_{rot}=v_{rot\parallel}+v_{rot\perp}=v_{\parallel}+cos\theta v_{\perp} + sin\theta k\times vvrot=vrot+vrot=v+cosθv+sinθk×v

=cosθv+(1−cosθ)(v⋅k)k+sinθk×v=cos\theta v+(1-cos\theta)(v\cdot k)k+ sin\theta k\times v=cosθv+(1cosθ)(vk)k+sinθk×v

其中(v⋅k)k=k(v⋅k)=k(kTv)=kkTv(v\cdot k)k=k(v\cdot k)=k(k^Tv)=kk^Tv(vk)k=k(vk)=k(kTv)=kkTv
所以vrot=cosθv+(1−cosθ)kkTv+sinθk∧v=Rtv_{rot}=cos\theta v+(1-cos\theta)kk^Tv+ sin\theta k^{\land} v=Rtvrot=cosθv+(1cosθ)kkTv+sinθkv=Rt

R=cosθI+(1−cosθ)kkT+sinθk∧R=cos\theta I +(1-cos\theta)kk^T+ sin\theta k^{\land} R=cosθI+(1cosθ)kkT+sinθk

如果用叉乘来表示v⊥v_{\perp}v,有:v⊥=−k×(k×v)v_{\perp}=-k \times(k \times v)v=k×(k×v)

vrot=vrot∥+vrot⊥=v∥+cosθv⊥+sinθk×vv_{rot}=v_{rot\parallel}+v_{rot\perp}=v_{\parallel}+cos\theta v_{\perp} + sin\theta k\times vvrot=vrot+vrot=v+cosθv+sinθk×v

=v+(1−cosθ)k×(k×v)+sinθk×v= v+(1-cos\theta) k \times(k \times v)+sin\theta k\times v=v+(1cosθ)k×(k×v)+sinθk×v

=(I+(1−cosθ)k∧k∧+sinθk∧)v= (I+(1-cos \theta)k^{\land}k^{\land}+sin\theta k^{\land})v=(I+(1cosθ)kk+sinθk)v

罗德里格斯公式也可以写成:

R=I+(1−cosθ)k∧k∧+sinθk∧R=I +(1-cos\theta)k^{\land}k^{\land} +sin\theta k^{\land} R=I+(1cosθ)kk+sinθk


同时可以得到旋转矩阵到旋转向量的变换:
两边取迹:

tr(R)=cosθtr(I)+(1−cosθ)tr(nnT)+sinθtr(n∧)=3cosθ+1−cosθ=1+2cosθtr(R)=cos\theta tr(I)+(1-cos\theta)tr(nn^T)+sin \theta tr(n^{\land})\\ =3cos\theta+1-cos\theta=1+2cos\thetatr(R)=cosθtr(I)+(1cosθ)tr(nnT)+sinθtr(n)=3cosθ+1cosθ=1+2cosθ

因此:

θ=arccos(tr(R)−12)\theta=arccos(\frac{tr(R)-1}{2})θ=arccos(2tr(R)1)

对于转轴nnn,由于旋转轴上的向量在旋转后不变,有:
Rn=nRn=nRn=n

因此也可以说,转轴是旋转矩阵的特征值1所对应的特征向量。

2.3 欧拉角

欧拉角(Euler Angles),将旋转分解为三个方向上的转动。分解方式有多种,同时根据绕固定轴还是绕旋转后的轴旋转也会有不一样的定义方式。
比如按Z-Y-X顺序转动得到yaw(偏航角)-pitch(俯仰角)-roll(滚转角),用[r,p,y]T[r,p,y]^T[r,p,y]T表示

欧拉角的缺点是会遇到万向锁问题:在俯仰角为±90°时,第一次旋转与第三次旋转将使用同一个轴,使得系统丢失一个自由度。这被成为奇异性问题。因此欧拉角不适于插值和迭代,往往用于人机交互中。

理论可以证明,对于只有三个参数的表示形式,则必然会存在奇异点。所以没有完美的旋转表示形式。

2.4 四元数

四元数的相关知识推荐看《Quaternion kinematics for the error-state Kalman filter》,这里只对重要的性质做简单介绍。

四元数具有一个实部和三个虚部,常用一个标量和一个向量来表示:
q=q0+q1i+q2j+q3k=[s,v]T,s=q0∈R,v=[q1,q2,q3]T∈R3q=q_0+q_1i+q_2j+q_3k=[s,v]^T,s=q_0\in R,v=[q_1,q_2,q_3]^T\in R^3q=q0+q1i+q2j+q3k=[s,v]Ts=q0Rv=[q1,q2,q3]TR3

四元数的性质

这里主要讨论四元数的左右乘和求导。

四元数的乘法有:
p⊗q=[spsq−vpTvqspvq+sqvp+vp×vq]=[p]Lq=[q]Rpp\otimes q=\left[ \begin{matrix} s_ps_q-v^T_pv_q\\s_pv_q+s_qv_p+v_p \times v_q \end{matrix} \right]=[p]_Lq=[q]_Rppq=[spsqvpTvqspvq+sqvp+vp×vq]=[p]Lq=[q]Rp

其中:
[p]L=[sp−vpTvpspI+vp∧]=spI+[0−vpTvpvp∧],[p]R=[sq−vqTvqsqI−vq∧]=sqI+[0−vqTvq−vq∧][p]_L=\left[ \begin{matrix} s_p&amp;-v_p^T\\v_p&amp;s_pI+v_p^{\land} \end{matrix} \right]=s_pI+\left[ \begin{matrix} 0&amp;-v_p^T\\v_p&amp;v_p^{\land} \end{matrix} \right],[p]_R=\left[ \begin{matrix} s_q&amp;-v_q^T\\v_q&amp;s_qI-v_q^{\land} \end{matrix} \right]=s_qI+\left[ \begin{matrix} 0&amp;-v_q^T\\v_q&amp;-v_q^{\land} \end{matrix} \right][p]L=[spvpvpTspI+vp]=spI+[0vpvpTvp][p]R=[sqvqvqTsqIvq]=sqI+[0vqvqTvq]

注意如果写成虚部在前实部在后的四元数形式,左乘和右乘矩阵的符号有所变化。

同时有性质:
[p]L[q]R=[q]R[p]L[p]_L[q]_R=[q]_R[p]_L[p]L[q]R=[q]R[p]L

单位四元数满足:qTq=1q^Tq=1qTq=1

四元数与旋转

假设某旋转是绕着单位向量n=[nx,ny,nz]n=[n_x,n_y,n_z]n=[nx,ny,nz]进行角度为θ\thetaθ的旋转,那么四元数可表示为:
q=[cosθ2,nxsinθ2,nysinθ2,nzsinθ2]Tq=[cos\frac{\theta}{2},n_xsin\frac{\theta}{2},n_ysin\frac{\theta}{2},n_zsin\frac{\theta}{2}]^Tq=[cos2θ,nxsin2θ,nysin2θ,nzsin2θ]T

反之:
θ=2arccosq0,n=[q1,q2,q3]T/sinθ2\theta = 2arccos q_0,n=[q_1,q_2,q_3]^T/sin\frac{\theta}{2}θ=2arccosq0n=[q1,q2,q3]T/sin2θ

在四元数中,任意的旋转都可以由两个相反的四元数表示。假设空间三维点p=[x,y,z]T∈R3p=[x,y,z]^T\in R^3p=[x,y,z]TR3经过轴角nθn\thetanθ变为p′p&#x27;p。首先将三维空间点用虚四元数表示:
p=[0,x,y,z]T=[0,v]Tp=[0,x,y,z]^T=[0,v]^Tp=[0,x,y,z]T=[0,v]T

用四元数表示旋转:
q=[cosθ2,nsinθ2],p′=qpq−1q=[cos\frac{\theta}{2},nsin\frac{\theta}{2}],p&#x27;=qpq^{-1}q=[cos2θ,nsin2θ]p=qpq1

结果仍为纯虚四元数,虚部的三个分量表示旋转后的3D点坐标。

四元数的导数

首先需要注意的是,对于用任何方式表示旋转时,对一个旋转再进行旋转有左乘和右乘两种形式,分别代表不同的意义。

首先定义四元数的导数有:

q˙≜lim⁡Δt→0q(t+Δt)−q(t)Δt=lim⁡Δt→0q⊗ΔqL−qΔt=lim⁡Δt→0ΔqG⊗q−qΔt\dot q\triangleq \lim_{\Delta t \to0}\frac{q(t+\Delta t )-q(t)}{\Delta t }=\lim_{\Delta t \to0}\frac{q\otimes \Delta q_L-q}{\Delta t }=\lim_{\Delta t \to0}\frac{ \Delta q_G\otimes q-q}{\Delta t }q˙Δt0limΔtq(t+Δt)q(t)=Δt0limΔtqΔqLq=Δt0limΔtΔqGqq

其中ΔqL\Delta q_LΔqL表示局部坐标系中的角度扰动,而ΔqG\Delta q_GΔqG表示全局(世界)坐标系中的角度扰动。我们实际测量的角速度往往是在物体坐标系下的角速度www(例如VIO中通过IMU陀螺仪获得),故常采用四元数右乘形式。

测量的角速度可以定义为:

wL(t)≜dϕL(t)dt≜lim⁡Δt→0ΔϕLΔtw_L(t)\triangleq \frac{d\phi_L(t)}{dt}\triangleq \lim_{\Delta t \to0}\frac{\Delta \phi_L}{\Delta t }wL(t)dtdϕL(t)Δt0limΔtΔϕL

那么有:

q˙≜lim⁡Δt→0q⊗ΔqL−qΔt=lim⁡Δt→0q⊗([1ΔϕL2]−[10])Δt\dot q \triangleq \lim_{\Delta t \to0}\frac{q\otimes \Delta q_L-q}{\Delta t } = \lim_{\Delta t \to0}\frac{q\otimes (\left[ \begin{matrix} {1}\\ \frac{\Delta \phi_L}{2}\end{matrix} \right]-\left[ \begin{matrix} 1\\ 0\end{matrix} \right])}{\Delta t } q˙Δt0limΔtqΔqLq=Δt0limΔtq([12ΔϕL][10])

=lim⁡Δt→0q⊗[0ΔϕL2]Δt=12q⊗[0wL]=\lim_{\Delta t \to0}\frac{q\otimes \left[ \begin{matrix} {0}\\ \frac{\Delta \phi_L}{2}\end{matrix} \right]}{\Delta t } =\frac{1}{2}q \otimes \left[ \begin{matrix} {0}\\ w_L\end{matrix} \right] =Δt0limΔtq[02ΔϕL]=21q[0wL]

因此有:

q˙=12q⊗wL=12Ω(wL)q,Ω(w)≜[w]R=[0−wTw−w∧]\dot q=\frac{1}{2}q \otimes w_L=\frac{1}{2} \Omega(w_L)q,\Omega(w) \triangleq [w]_R=\left[ \begin{matrix} 0&amp;-w^T\\w&amp;-w^{\land} \end{matrix} \right]q˙=21qwL=21Ω(wL)qΩ(w)[w]R=[0wwTw]

如果是左乘形式,即将角速度转换到世界坐标系下,有:

q˙=12wG⊗q\dot q=\frac{1}{2}w_G \otimes qq˙=21wGq

3、坐标变换性质

3.1 2D坐标变换

在这里插入图片描述

变换矩阵自由度保持图标
平移[I∣t]2×3[I\vert t]_{2\times3}[It]2×32方向正方形
欧式[R∣t]2×3[R\vert t]_{2\times3}[Rt]2×33长度旋转的正方形
相似[sR∣t]2×3[sR\vert t]_{2\times3}[sRt]2×34夹角旋转缩放的正方形
仿射[A]2×3[A]_{2\times3}[A]2×36平行性平行四边形
投影[H~]3×3[\widetilde H]_{3\times3}[H]3×38直线性四边形

其中R=[cosθsinθ−sinθcosθ]R=\left[ \begin{matrix} cos\theta &amp; sin\theta \\ -sin\theta &amp;cos\theta \end{matrix} \right]R=[cosθsinθsinθcosθ]

3.2 3D坐标变换

变换名称矩阵形式自由度不变性之
平移变换[It0T1]\left[ \begin{matrix}I &amp; t \\0^T &amp;1 \end{matrix} \right][I0Tt1]3方向
欧式变换[Rt0T1]\left[ \begin{matrix}R &amp; t \\0^T &amp;1 \end{matrix} \right][R0Tt1]6长度、体积
相似变换[sRt0T1]\left[ \begin{matrix}sR &amp; t \\0^T &amp;1 \end{matrix} \right][sR0Tt1]7夹角
仿射变换[At0T1]\left[ \begin{matrix}A &amp; t \\0^T &amp;1 \end{matrix} \right][A0Tt1]12平行性、体积比
射影变换[AtaTv]\left[ \begin{matrix}A &amp; t \\a^T &amp;v \end{matrix} \right][AaTtv]15接触平面的相交和相切

从世界坐标系到相机照片的变换是一个射影变换,如果相机焦距无穷远则为仿射变换。

### 激光SLAM三维点云建图方法 #### 三维激光雷达的工作原理 三维激光雷达通过发射并接收反射回来的激光束来测量目标的距离和角度信息,进而构建出环境的三维模型。具体来说,二维激光雷达配合精密同步云台可以获取不同方向上的距离数据,这些数据组合起来形成密集的点云[^1]。 #### 数据采集与预处理 为了获得高质量的三维点云图像,通常会利用安装于移动平台上(如汽车顶部)的大范围室外环境三维激光扫描仪进行连续的数据采集。在此过程中,除了激光雷达外,还会配备其他辅助传感器,比如RTK-GNSS用于提供绝对位置参考,IMU用来补偿运动带来的姿态变化以及轮速计记录行驶速度等参数,以此提升整体系统的鲁棒性和准确性[^4]。 #### 点云配准与优化 当收集到足够的原始点云后,则需对其进行一系列处理才能得到最终的地图表示形式。这其中包括去除噪声、滤除异常值、分割平面区域等一系列预处理步骤;随后基于ICP(Iterative Closest Point)或其他相似度量准则完成相邻帧之间的刚体变换估计——即所谓的“配准”。对于大规模场景而言,还可以引入全局几何一致性约束条件进一步改善局部累积漂移现象,并借助图优化技术求解最优路径配置问题[^2]。 #### 开源工具推荐 针对上述流程的具体实现细节,hdl_graph_slam作为一个优秀的开源项目提供了完整的解决方案。该项目不仅支持多种主流品牌型号的3D LiDAR设备接入,而且内置了高效的前端里程计算法及后端图形优化机制,能够很好地满足实际应用需求[^3]。 ```python import numpy as np from hdl_graph_slam import HdlGraphSlam def process_point_cloud(point_cloud_data): slam_system = HdlGraphSlam() # Add point cloud data to the system and perform SLAM processing. result_map = slam_system.add_scan_and_process(point_cloud_data) return result_map ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值