视觉SLAM数学基础

news2024/11/13 15:08:09

本文系统梳理从相机成像模型,通过不同图像帧之间的构造几何约束求解位姿变换,再根据位姿变换和匹配点还原三维坐标的过程,可以作为基于特征点法的视觉SLAM的数学基础。

1、相机成像模型
1.1、针孔相机模型

实际相机的成像方式通常很复杂,针孔模型是对这种复杂成像方式的简化描述,其原理如下图

在这里插入图片描述

图中, O − x − y − z O-x-y-z Oxyz为相机坐标系 { C } \{C\} {C},其 x x x轴, y y y轴位于针孔平面上,一般要求从相机后方看去 x x x轴向右, y y y轴向下, O O O是针孔模型中的针孔,也称为摄像机的光心; O ′ − x i m g − y i m g O^{\prime}-x^{\mathrm{img}}-y^{\mathrm{img}} Oximgyimg为物理成像坐标系,位于物理成像平面上。针孔平面与物理成像平面平行,二者之间距离为焦距 f f f,也即 O O ′ OO^{\prime} OO的距离。习惯上,规定从相机后侧看时, x , x i m g x,x^{\mathrm{img}} x,ximg轴向右, y , y i m g y,y^{\mathrm{img}} y,yimg轴向下, z z z轴向前。

从相机坐标系下的空间点 p = [ X , Y , Z ] T \mathbf{p}=[X,Y,Z]^{T} p=[X,Y,Z]T发出的光线,穿过针孔 O O O,落在物理成像平面上,成为点 [ X i m g , Y i m g ] T [X^\mathrm{img},Y^{\mathrm{img}}]^{T} [Ximg,Yimg]T,考虑到 X X X X i m g X^{\mathrm{img}} Ximg Y Y Y Y i m g Y^{\mathrm{img}} Yimg符号必定相反,根据三角形相似关系,可以得到
Z f = − X X i m g = − Y Y i m g (1) \frac{Z}{f}=-\frac{X}{X^{\mathrm{img}}}=-\frac{Y}{Y^{\mathrm{img}}}\tag{1} fZ=XimgX=YimgY(1)
整理得到物理成像平面上的坐标
X i m g = − f X Z Y i m g = − f Y Z X^{\mathrm{img}}=-f\frac{X}{Z}\\ Y^{\mathrm{img}}=-f\frac{Y}{Z} Ximg=fZXYimg=fZY
负号表示成像为倒向,在实际成像过程中,为方便起见,经过算法内部调整为正像,即将物理成像平面上的坐标变为
X i m g = f X Z Y i m g = f Y Z \begin{align*} X^{\mathrm{img}}=f\frac{X}{Z}\tag{2a}\\ Y^{\mathrm{img}}=f\frac{Y}{Z}\tag{2b} \end{align*} Ximg=fZXYimg=fZY(2a)(2b)

1.2、像素坐标系
pixel plane

在相机中,最终获得的是 [ X i m g , Y i m g ] T [X^\mathrm{img},Y^{\mathrm{img}}]^{T} [Ximg,Yimg]T对应的像素坐标 [ ⌊ U ⌋ , ⌊ V ⌋ ] T [\lfloor{U}\rfloor,\lfloor{V}\rfloor]^{T} [⌊U,V]T,其中
{ U = α X i m g + c x V = β Y i m g + c y (3) \left\{ \begin{align*} U&=\alpha{X}^{\mathrm{img}}+c_{x}\\ V&=\beta{Y}^{\mathrm{img}}+c_{y} \end{align*} \right.\tag{3} {UV=αXimg+cx=βYimg+cy(3)
其中, α , β \alpha,\beta α,β表示 u , v u,v u,v轴上单位距离对应的像素数, c x , c y c_{x},c_{y} cx,cy是相机光心的像素坐标
{ U = f x X Z + c x V = f y Y Z + c y (4) \left\{ \begin{align*} U&=f_{x}\frac{X^{\mathrm{}}}{Z}+c_{x}\\ V&=f_{y}\frac{Y}{Z}+c_{y} \end{align*} \right.\tag{4} UV=fxZX+cx=fyZY+cy(4)
其中 f x = α f f_{x}=\alpha{f} fx=αf f y = β f f_{y}=\beta{f} fy=βf

根据以上关系,可以得到下式,其中左侧是齐次坐标,右侧是非齐次坐标
[ U V 1 ] = 1 Z [ f x 0 c x 0 f y c y 0 0 1 ] [ X Y Z ] (5) \left[\begin{align*} U\\V\\1 \end{align*}\right]= \frac{1}{Z}\left[ \begin{array}{ccc} f_{x}&0&c_{x}\\ 0&f_{y}&c_{y}\\ 0&0&1 \end{array} \right] \left[ \begin{array}{ccc} X\\Y\\Z \end{array} \right]\tag{5} UV1 =Z1 fx000fy0cxcy1 XYZ (5)
定义相机的内参数矩阵
K = [ f x 0 c x 0 f y c y 0 0 1 ] (6) \mathbf{K}=\left[\begin{array}{ccc} f_{x}&0&c_{x}\\ 0&f_{y}&c_{y}\\ 0&0&1 \end{array}\right]\tag{6} K= fx000fy0cxcy1 (6)
因为 f x , f y ≠ 0 f_{x},f_{y}\neq0 fx,fy=0,容易看出,相机的内参数矩阵是可逆的,该矩阵通常右生产厂商标定,在出厂后不会再发生变化

q = [ U , V , 1 ] T \mathbf{q}=[U,V,1]^{T} q=[U,V,1]T,则
q = 1 Z K p (7) \mathbf{q}=\frac{1}{Z}\mathbf{K}\mathbf{p}\tag{7} q=Z1Kp(7)
实际的像素坐标对求出的 q \mathbf{q} q取整即可。

设初始相机坐标系 { C 0 } \{C_{0}\} {C0}为世界坐标系 { W } \{W\} {W},若已知 { W } \{W\} {W}到相机坐标系相机坐标系 { C k } , k ⩾ 0 \{C_{k}\},k\geqslant0 {Ck},k0的位姿,当得到新一帧图像 I m g k + 1 \mathrm{Img}_{k+1} Imgk+1后,根据拍摄到的图像帧估计从相机坐标系 { C k } \{C_{k}\} {Ck} { C k + 1 } \{C_{k+1}\} {Ck+1}的旋转矩阵和平移向量 R c k + 1 c k , t c k + 1 c k c k + 1 \mathbf{R}_{c_{k+1}c_{k}},\mathbf{t}^{c_{k+1}}_{c_{k+1}c_{k}} Rck+1ck,tck+1ckck+1,这两个量在后文中简记作 R , t \mathbf{R},\mathbf{t} R,t,是计算的目标

1.3、等价成像模型

成像模型可以做两处等价。
在这里插入图片描述

第一处等价:根据 ( 2 ) (2) (2),把“将倒向调整为正像的过程”等价为将成像平面对称地放到针孔平面前方,成像位置位于针孔 p \mathbf{p} p与针孔 O O O的连线与对称的成像平面的交点上;

第二处等价:根据 ( 7 ) (7) (7),成像过程可等价为先将空间点 p = [ X , Y , Z ] T \mathbf{p}=[X,Y,Z]^{T} p=[X,Y,Z]T转换到归一化平面 z = 1 z=1 z=1上的 p ‾ \overline{\mathbf{p}} p,即令
p ‾ = [ X ‾ , Y ‾ , 1 ] T = [ X Z , Y Z , 1 ] T (8) \overline{\mathbf{p}}=\begin{bmatrix}\overline{X},\overline{Y},1\end{bmatrix}^{T}=\begin{bmatrix}\frac{X}{Z},\frac{Y}{Z},1\end{bmatrix}^{T}\tag{8} p=[X,Y,1]T=[ZX,ZY,1]T(8)
再根据第一处等价投影到对称的成像平面,成为下面的坐标后再取整数
q = K p ‾ (9) \mathbf{q}=\mathbf{K}\overline{\mathbf{p}}\tag{9} q=Kp(9)
上述等价过程的示意图如下:

在这里插入图片描述

2、已知2D-2D匹配数据估算相机运动
2.1、2D-2D存在的约束
2.1.1、对极约束

在这里插入图片描述

设三维空间点 P P P在两帧相机坐标系下坐标为 p 1 , p 2 \mathbf{p}_{1},\mathbf{p}_{2} p1,p2,二者的归一化坐标为 p ‾ 1 , p ‾ 2 \overline{\mathbf{p}}_{1},\overline{\mathbf{p}}_{2} p1,p2,这两个归一化坐标对应的空间点分别为 P 1 , P 2 P_{1},P_{2} P1,P2,容易看出 O 1 , O 2 , P , P 1 , P 2 O_{1},O_{2},P,P_{1},P_{2} O1,O2,P,P1,P2位于同一平面上,故
O 2 P 2 → ⋅ ( O 2 O 1 → × O 1 P 1 → ) = 0 (10) \overrightarrow{O_{2}P_{2}}\cdot\left(\overrightarrow{O_{2}O_{1}}\times\overrightarrow{O_{1}P_{1}}\right)=0\tag{10} O2P2 (O2O1 ×O1P1 )=0(10)
下面在 { C 2 } \{C_{2}\} {C2}坐标系下表示 ( 8 ) (8) (8),在 { C 2 } \{C_{2}\} {C2}坐标系下, O 2 P 2 → = p ‾ 2 \overrightarrow{O_{2}P_{2}}=\overline{\mathbf{p}}_{2} O2P2 =p2 O 2 O 1 → = t \overrightarrow{O_{2}O_{1}}=\mathbf{t} O2O1 =t O 1 P 1 → = R p ‾ 1 + t \overrightarrow{O_{1}P_{1}}=\mathbf{R}\overline{\mathbf{p}}_{1}+\mathbf{t} O1P1 =Rp1+t,故 ( 8 ) (8) (8)可改写为
p ‾ 2 T ( t ∧ ( R p ‾ 1 + t ) ) = 0 \overline{\mathbf{p}}_{2}^{T}\left(\mathbf{t}^{\wedge}(\mathbf{R}\overline{\mathbf{p}}_{1}+\mathbf{t})\right)=0 p2T(t(Rp1+t))=0
进一步化简可得
p ‾ 2 T ( t ∧ R ) p ‾ 1 = 0 (11) \overline{\mathbf{p}}_{2}^{T}\left(\mathbf{t}^{\wedge}\mathbf{R}\right)\overline{\mathbf{p}}_{1}=0\tag{11} p2T(tR)p1=0(11)
根据归一化坐标和像素坐标的转换关系,得到
q 2 T [ ( K − 1 ) T ( t ∧ R ) K − 1 ] q 1 = 0 (12) \mathbf{q}_{2}^{T}\left[(\mathbf{K}^{-1})^{T}(\mathbf{t}^{\wedge}\mathbf{R})\mathbf{K}^{-1}\right]\mathbf{q}_{1}=0\tag{12} q2T[(K1)T(tR)K1]q1=0(12)
称下面的矩阵为本质矩阵(Essential Matrix)
E = t ∧ R \mathbf{E}=\mathbf{t}^{\wedge}\mathbf{R} E=tR
需要说明,一个矩阵能够成为本质矩阵当且仅当其的奇异值为 σ , σ , 0 \sigma,\sigma,0 σ,σ,0,其中 σ \sigma σ为任意实数

称下面的矩阵为基础矩阵(Fundamental Matrix)
F = ( K − 1 ) T E K − 1 \mathbf{F}=(\mathbf{K}^{-1})^{T}\mathbf{E}\mathbf{K}^{-1} F=(K1)TEK1
( 11 ) (11) (11)可改写为
p ‾ 2 T E p ‾ 1 = 0 \begin{align*} \overline{\mathbf{p}}_{2}^{T}\mathbf{E}\overline{\mathbf{p}}_{1}=0\tag{13}\\ \end{align*} p2TEp1=0(13)
( 12 ) (12) (12)可改写为
q 2 T F q 1 = 0 (14) \mathbf{q}_{2}^{T}\mathbf{F}\mathbf{q}_{1}=0\tag{14} q2TFq1=0(14)
( 11 ) , ( 12 ) (11),(12) (11),(12) ( 13 ) , ( 14 ) (13),(14) (13),(14)称为对极约束

2.2、约束矩阵的计算

本质矩阵,基础矩阵,单应矩阵都可以做为相机运动过程中存在的约束,可以通过已知的匹配点可计算这些约束矩阵

2.2.1、基础矩阵的计算

( 14 ) (14) (14)的矩阵乘法写成元素形式
[ U 2 V 2 1 ] [ f 1 f 2 f 3 f 4 f 5 f 6 f 7 f 8 f 9 ] [ U 1 V 1 1 ] = 0 \begin{bmatrix} U_{2}&V_{2}&1 \end{bmatrix} \begin{bmatrix} f_{1}&f_{2}&f_{3}\\ f_{4}&f_{5}&f_{6}\\ f_{7}&f_{8}&f_{9} \end{bmatrix} \begin{bmatrix} U_{1}\\ V_{1}\\ 1 \end{bmatrix}= 0 [U2V21] f1f4f7f2f5f8f3f6f9 U1V11 =0
f = [ f 1 , ⋯   , f 9 ] T \mathbf{f}=[f_{1},\cdots,f_{9}]^{T} f=[f1,,f9]T,经过整理,上式可以等价地改写为
[ U 1 U 2 U 2 V 1 U 2 V 2 U 1 V 1 V 2 V 2 U 1 V 1 1 ] f = 0 (15) \begin{bmatrix} U_{1}U_{2}&U_{2}V_{1}&U_{2}&V_{2}U_{1}&V_{1}V_{2}&V_{2}&U_{1}&V_{1}&1 \end{bmatrix} \mathbf{f}=0\tag{15} [U1U2U2V1U2V2U1V1V2V2U1V11]f=0(15)
通常限定 ∥ f ∥ = 1 \|\mathbf{f}\|=1 f=1保证尺度确定,根据上式可以看出,一组匹配点可以构造出一项约束

设匹配点组成的系数矩阵为 A ∈ R n × 9 \mathbf{A}\in\mathbb{R}^{n\times9} ARn×9 n n n为匹配点对数,则基础矩阵的约束方程 ( 20 ) (20) (20)可改写为
A f = 0 ∥ f ∥ = 1 (16) \mathbf{A}\mathbf{f}=\mathbf{0}\quad\|\mathbf{f}\|=1\tag{16} Af=0f=1(16)
当匹配点较少时, r a n k ( A ) < 8 \mathrm{rank}(\mathbf{A})<8 rank(A)<8时, ( 23 ) (23) (23)为欠定问题,具有多个解;当 r a n k ( A ) = 8 \mathrm{rank}(\mathbf{A})=8 rank(A)=8时, ( 21 ) (21) (21)为适定问题,具有唯一解,可直接通过解线性方程组获得;当匹配点较多时, r a n k ( A ) > 8 \mathrm{rank}(\mathbf{A})>8 rank(A)>8时, ( 23 ) (23) (23)变为超定问题,线性方程组无解,故可以构造如下优化问题求近似解
f ~ = a r g min ⁡ f : ∥ f ∥ = 1   1 2 ∥ A f ∥ 2 (17) \begin{align*} \tilde{\mathbf{f}} &=\underset{\mathbf{f}:\|\mathbf{f}\|=1}{\mathrm{arg}\min}\,\frac{1}{2}\|\mathbf{A}\mathbf{f}\|^{2}\\ \end{align*}\tag{17} f~=f:f=1argmin21Af2(17)
A \mathbf{A} A做奇异值分解
A = U Σ V T \mathbf{A}=\mathbf{U}\mathbf{\Sigma}\mathbf{V}^{T} A=VT
其中 V = [ v 1 , ⋯   , v 9 ] \mathbf{V}=[\mathbf{v}_{1},\cdots,\mathbf{v}_{9}] V=[v1,,v9]按照特征值降序排列,容易知道 f ~ \tilde{\mathbf{f}} f~可取为
f ~ = ± v 9 (18) \tilde{\mathbf{f}}=\pm\mathbf{v}_{9}\tag{18} f~=±v9(18)
f ~ \tilde{\mathbf{f}} f~转变为 F ~ \tilde{\mathbf{F}} F~得到基础矩阵,并根据定义求出 E ~ = K T F ~ K \tilde{\mathbf{E}}=\mathbf{K}^{T}\tilde{\mathbf{F}}\mathbf{K} E~=KTF~K。但受误差影响此时 E ~ \tilde{\mathbf{E}} E~不一定满足成为本质矩阵的充要条件,需要进一步变换,首先对 E ~ \tilde{\mathbf{E}} E~做SVD分解
E ~ = U ~ d i a g ( σ ~ 1 , σ ~ 2 , σ ~ 3 ) V ~ T \tilde{\mathbf{E}}=\tilde{\mathbf{U}}\mathrm{diag}(\tilde{\sigma}_{1},\tilde{\sigma}_{2},\tilde{\sigma}_{3})\tilde{\mathbf{V}}^{T} E~=U~diag(σ~1,σ~2,σ~3)V~T
可令
E ∗ = U ~ d i a g ( σ ~ 1 + σ ~ 2 2 , σ ~ 1 + σ ~ 2 2 , 0 ) V ~ T (19) \mathbf{E}^{\ast}=\tilde{\mathbf{U}}\mathrm{diag}(\frac{\tilde{\sigma}_{1}+\tilde{\sigma}_{2}}{2},\frac{\tilde{\sigma}_{1}+\tilde{\sigma}_{2}}{2},0)\tilde{\mathbf{V}}^{T}\tag{19} E=U~diag(2σ~1+σ~2,2σ~1+σ~2,0)V~T(19)
为最终所求的本质矩阵, E ∗ \mathbf{E}^{\ast} E满足成为本质矩阵的充要条件

2.3、基于约束矩阵的运动恢复

得到约束矩阵后,可通过分解约束矩阵来恢复运动

2.3.1、基于基础矩阵的运动恢复

得到基础矩阵 F \mathbf{F} F后,可以根据相机内参数矩阵转换为本质矩阵 E = K T F K \mathbf{E}=\mathbf{K}^{T}\mathbf{F}\mathbf{K} E=KTFK

E \mathbf{E} E进行奇异值分解
E = U Σ V T \mathbf{E}=\mathbf{U}\boldsymbol\Sigma\mathbf{V}^{T} E=UΣVT
满足 E = t ∧ R \mathbf{E}=\mathbf{t}^{\wedge}\mathbf{R} E=tR t \mathbf{t} t R \mathbf{R} R各有两个可行解,具体形式如下
t ∧ = { U W Σ U T U W T Σ U T R = { U W ′ V T U W ′ W ′ T V T (20) \begin{align*} \mathbf{t}^{\wedge}=\left\{\begin{array}{ll}\mathbf{U}\mathbf{W}\boldsymbol\Sigma\mathbf{U}^{T}\\\mathbf{U}\mathbf{W}^{T}\boldsymbol\Sigma\mathbf{U}^{T}\end{array}\right.\quad \mathbf{R}=\left\{\begin{array}{ll}\mathbf{U}\mathbf{W}^{\prime}\mathbf{V}^{T}\\\mathbf{U}\mathbf{W}^{\prime}\vphantom{\mathbf{W}^{\prime}}^{T}\mathbf{V}^{T}\end{array}\right. \end{align*}\tag{20} t={UWΣUTUWTΣUTR={UWVTUWWTVT(20)
其中 W = [ 0 − 1 0 1 0 0 0 0 1 ] \mathbf{W}=\begin{bmatrix}0&-1&0\\1&0&0\\0&0&1\end{bmatrix} W= 010100001 W ′ = { W det ⁡ ( U V ) = 1 − W det ⁡ ( U V ) = − 1 \mathbf{W}^{\prime}=\left\{\begin{array}{cl}\mathbf{W}&\det(\mathbf{U}\mathbf{V})=1\\-\mathbf{W}&\det(\mathbf{U}\mathbf{V})=-1\end{array}\right. W={WWdet(UV)=1det(UV)=1以保证 det ⁡ ( R ) = 1 \det(\mathbf{R})=1 det(R)=1。满足 E = t ∧ R \mathbf{E}=\mathbf{t}^{\wedge}\mathbf{R} E=tR ( R , t ) (\mathbf{R},\mathbf{t}) (R,t)共有四个可行解,为 t \mathbf{t} t R \mathbf{R} R各自可行解的两两组合。

可以证明,若本质矩阵正确,则四个解中有且仅有一个解使得在两相机中都可见的空间中点在两个相机中的深度均为正值,实践中可以通过比较三角化成功的点的数量找到正确的解。

3、三角化

已知第一幅图像对应的世界坐标系下的相机位姿 ( R 1 , t 1 ) (\mathbf{R}_{1},\mathbf{t}_{1}) (R1,t1),得到两幅图像对应的相机相对运动 R , t \mathbf{R},\mathbf{t} R,t后,可以计算第二幅图像对应的世界坐标系下的相机位姿 ( R 2 , t 2 ) (\mathbf{R}_{2},\mathbf{t}_{2}) (R2,t2),知两幅图像的二维匹配点对 q 1 , q 2 \mathbf{q}_{1},\mathbf{q}_{2} q1,q2,可以计算从世界坐标系下的三维点到像素坐标的投影矩阵 Ψ 1 = K [ R 1 , t 1 ] , Ψ 2 = K [ R 2 , t 2 ] \boldsymbol\Psi_{1}=\mathbf{K}[\mathbf{R}_{1},\mathbf{t}_{1}],\boldsymbol\Psi_{2}=\mathbf{K}[\mathbf{R}_{2},\mathbf{t}_{2}] Ψ1=K[R1,t1],Ψ2=K[R2,t2]。三角化即根据 Ψ 1 , Ψ 2 , q 1 , q 2 \boldsymbol\Psi_{1},\boldsymbol\Psi_{2},\mathbf{q}_{1},\mathbf{q}_{2} Ψ1,Ψ2,q1,q2估计二维匹配点对应的世界坐标系下的齐次空间点 X = [ x 1 ] ∈ R 4 \mathbf{X}=\begin{bmatrix}\mathbf{x}\\1\end{bmatrix}\in\mathbb{R}^{4} X=[x1]R4,即恢复场景中点的真实三维位置的。因为从几何意义上看,如前图,三角化的过程即为寻找两条从相机光心 O 1 , O 2 O_{1},O_{2} O1,O2出发,穿过归一化平面上的投影点的射线在空间中的交点 P P P的过程,此时 O 1 , O 2 , P O_{1},O_{2},P O1,O2,P组成了一个三角形,故称为三角化。

在这里插入图片描述

暂忽略下标,根据上面的讨论可求出相机坐标系下的归一化坐标
q = 1 Z Ψ X (21) \mathbf{q}=\frac{1}{Z}\boldsymbol\Psi\mathbf{X}\tag{21} q=Z1ΨX(21)
其中 Z Z Z [ R , t ] X [\mathbf{R},\mathbf{t}]\mathbf{X} [R,t]X的最后一维坐标

在上式等号两侧同时左乘 q ∧ \mathbf{q}^{\wedge} q,得到
q ∧ Ψ X = 0 (22) \mathbf{q}^{\wedge}\boldsymbol\Psi\mathbf{X}=\mathbf{0}\tag{22} qΨX=0(22)
不妨令 Ψ = [ Ψ 1 Ψ 2 Ψ 3 ] \boldsymbol\Psi=\begin{bmatrix}\boldsymbol\Psi^{1}\\\boldsymbol\Psi^{2}\\\boldsymbol\Psi^{3}\end{bmatrix} Ψ= Ψ1Ψ2Ψ3 ,即 Ψ 1 , Ψ 2 , Ψ 3 \boldsymbol\Psi^{1},\boldsymbol\Psi^{2},\boldsymbol\Psi^{3} Ψ1,Ψ2,Ψ3 Ψ \boldsymbol\Psi Ψ的行向量,此时 ( 22 ) (22) (22)可以写成
[ 0 − 1 V 1 0 − U − V U 0 ] [ Ψ 1 Ψ 2 Ψ 3 ] X = 0 \begin{bmatrix} 0&-1&V\\ 1&0&-U\\ -V&U&0 \end{bmatrix} \begin{bmatrix}\boldsymbol\Psi^{1}\\\boldsymbol\Psi^{2}\\\boldsymbol\Psi^{3}\end{bmatrix} \mathbf{X}=\mathbf{0} 01V10UVU0 Ψ1Ψ2Ψ3 X=0
进一步可写为
[ V Ψ 3 − Ψ 2 Ψ 1 − U Ψ 3 U Ψ 2 − V Ψ 1 ] X = 0 \begin{bmatrix} V\boldsymbol\Psi^{3}-\boldsymbol\Psi^{2}\\ \boldsymbol\Psi^{1}-U\boldsymbol\Psi^{3}\\ U\boldsymbol\Psi^{2}-V\boldsymbol\Psi^{1} \end{bmatrix} \mathbf{X}=\mathbf{0} VΨ3Ψ2Ψ1UΨ3UΨ2VΨ1 X=0
上式中系数矩阵的第三行可以通过前两行消去,即得到
[ V Ψ 3 − Ψ 2 Ψ 1 − U Ψ 3 ] X = 0 \begin{bmatrix} V\boldsymbol\Psi^{3}-\boldsymbol\Psi^{2}\\ \boldsymbol\Psi^{1}-U\boldsymbol\Psi^{3}\\ \end{bmatrix} \mathbf{X}=\mathbf{0} [VΨ3Ψ2Ψ1UΨ3]X=0
考虑到两个匹配点各自能产生一个上述方程组,故一对匹配点可以提供 4 4 4个约束方程
[ V 1 Ψ 1 3 − Ψ 1 2 Ψ 1 1 − U 1 Ψ 1 3 V 2 Ψ 2 3 − Ψ 2 2 Ψ 2 1 − U 2 Ψ 2 3 ] X = 0 (23) \begin{bmatrix} V_{1}\boldsymbol\Psi_{1}^{3}-\boldsymbol\Psi^{2}_{1}\\ \boldsymbol\Psi^{1}_{1}-U_{1}\boldsymbol\Psi^{3}_{1}\\ V_{2}\boldsymbol\Psi_{2}^{3}-\boldsymbol\Psi^{2}_{2}\\ \boldsymbol\Psi^{1}_{2}-U_{2}\boldsymbol\Psi^{3}_{2}\\ \end{bmatrix} \mathbf{X}=\mathbf{0}\tag{23} V1Ψ13Ψ12Ψ11U1Ψ13V2Ψ23Ψ22Ψ21U2Ψ23 X=0(23)
设匹配点组成的系数矩阵为 A ∈ R 4 n × 4 \mathbf{A}\in\mathbb{R}^{4n\times4} AR4n×4 n n n为匹配点对数,则空间坐标的约束方程 ( 29 ) (29) (29)可写为
A X = 0 (24) \mathbf{A}\mathbf{X}=\mathbf{0}\tag{24} AX=0(24)
r a n k ( A ) < 4 \mathrm{rank}(\mathbf{A})<4 rank(A)<4时, ( 30 ) (30) (30)为欠定问题,具有多个解;当 r a n k ( A ) = 4 \mathrm{rank}(\mathbf{A})=4 rank(A)=4时, ( 30 ) (30) (30)为适定问题,具有唯一解,可直接通过解线性方程组获得,也可等价地通过SVD分解进行求解,先构造如下优化问题求近似解
X ~ = a r g min ⁡ X : ∥ X ∥ = 1   1 2 ∥ A X ∥ 2 (25) \begin{align*} \tilde{\mathbf{X}} &=\underset{\mathbf{X}:\|\mathbf{X}\|=1}{\mathrm{arg}\min}\,\frac{1}{2}\|\mathbf{A}\mathbf{X}\|^{2}\\ \end{align*}\tag{25} X~=X:X=1argmin21AX2(25)
A \mathbf{A} A做奇异值分解
A = U Σ V T \mathbf{A}=\mathbf{U}\mathbf{\Sigma}\mathbf{V}^{T} A=VT
其中 V = [ v 1 , ⋯   , v 4 ] \mathbf{V}=[\mathbf{v}_{1},\cdots,\mathbf{v}_{4}] V=[v1,,v4]按照特征值降序排列,容易知道 P ~ \tilde{\mathbf{P}} P~可取为
X ~ = ± v 4 (26) \tilde{\mathbf{X}}=\pm\mathbf{v}_{4}\tag{26} X~=±v4(26)
α \alpha α X ~ \tilde{\mathbf{X}} X~在第四维上的分量,若 α = 0 \alpha=0 α=0,则认为三角化失败,否则为保证所求结果为齐次坐标,即第四维度上值为 1 1 1,可令
X ∗ = 1 α X ~ (27) \mathbf{X}^{\ast}=\frac{1}{\alpha}\tilde{\mathbf{X}}\tag{27} X=α1X~(27)
求出 X ∗ \mathbf{X}^{\ast} X后应继续检验三角化是否失败,若对应的在三维点在两相机坐标系下的深度小于等于 0 0 0,即 [ R 1 , t 1 ] X ∗ [\mathbf{R}_{1},\mathbf{t}_{1}]\mathbf{X}^{\ast} [R1,t1]X [ R 2 , t 2 ] X ∗ [\mathbf{R}_{2},\mathbf{t}_{2}]\mathbf{X}^{\ast} [R2,t2]X在第三个维度上的数值小于等于 0 0 0,则认为三角化失败。

4、已知3D-2D匹配数据估算相机运动

已知世界坐标系下的3D空间点坐标和其在相机中投影的2D像素坐标,估计世界坐标系到相机坐标系的位姿变换的问题称为PnP(Perspective-n-Point)问题。

4.1、DLT

已知空间点在世界坐标系下的齐次坐标为 X ∈ R 4 \mathbf{X}\in\mathbb{R}^{4} XR4,和其对应的像素坐标 q = [ U , V , 1 ] T \mathbf{q}=[U,V,1]^{T} q=[U,V,1]T,现计算从世界坐标系下的齐次坐标到相机坐标系的位姿变换 R , t \mathbf{R},\mathbf{t} R,t

设从世界坐标系下的三维点到像素坐标的投影矩阵 Ψ = K [ R , t ] \boldsymbol\Psi=\mathbf{K}[\mathbf{R},\mathbf{t}] Ψ=K[R,t],并令

根据 ( 21 ) (21) (21)
Z [ U V 1 ] = [ Ψ 1 Ψ 2 Ψ 3 ] X (28) Z\begin{bmatrix} U\\V\\1 \end{bmatrix} =\begin{bmatrix}\boldsymbol\Psi^{1}\\\boldsymbol\Psi^{2}\\\boldsymbol\Psi^{3}\end{bmatrix}\mathbf{X}\tag{28} Z UV1 = Ψ1Ψ2Ψ3 X(28)
( 36 ) (36) (36)可以化简为
Ψ 1 X = Z U Ψ 2 X = Z V Ψ 3 X = Z \begin{align*} \boldsymbol\Psi^{1}\mathbf{X}&=ZU\\ \boldsymbol\Psi^{2}\mathbf{X}&=ZV\\ \boldsymbol\Psi^{3}\mathbf{X}&=Z \end{align*} Ψ1XΨ2XΨ3X=ZU=ZV=Z
因此可以得到
Ψ 1 X − U Ψ 3 X = 0 Ψ 2 X − V Ψ 3 X = 0 \begin{align*} \boldsymbol\Psi^{1}\mathbf{X}-U\boldsymbol\Psi^{3}\mathbf{X}&=0\\ \boldsymbol\Psi^{2}\mathbf{X}-V\boldsymbol\Psi^{3}\mathbf{X}&=0\\ \end{align*} Ψ1XUΨ3XΨ2XVΨ3X=0=0
不妨令 ψ = [ Ψ 1 1 T Ψ 2 2 T Ψ 3 3 T ] \boldsymbol\psi=\begin{bmatrix}\boldsymbol\Psi^{1}\vphantom{^{1}}^{T}\\\boldsymbol\Psi^{2}\vphantom{^{2}}^{T}\\\boldsymbol\Psi^{3}\vphantom{^{3}}^{T}\end{bmatrix} ψ= Ψ11TΨ22TΨ33T ,写出关于 ψ \boldsymbol\psi ψ的方程组,有
[ X T 0 T − U X T 0 T X T − V X T ] ψ = 0 (29) \begin{bmatrix} \mathbf{X}^{T}&\mathbf{0}^{T}&-U\mathbf{X}^{T}\\ \mathbf{0}^{T}&\mathbf{X}^{T}&-V\mathbf{X}^{T}\\ \end{bmatrix}\boldsymbol\psi=\mathbf{0}\tag{29} [XT0T0TXTUXTVXT]ψ=0(29)
可以看到,每对3D-2D匹配的特征点能提供两个关于 ψ \boldsymbol\psi ψ的约束

设匹配点组成的系数矩阵为 A ∈ R 2 n × 12 \mathbf{A}\in\mathbb{R}^{2n\times12} AR2n×12 n n n为匹配点对数,则增广矩阵的约束方程可写为
A ψ = 0 (30) \mathbf{A}\boldsymbol\psi=\mathbf{0}\tag{30} Aψ=0(30)
当匹配点较少, r a n k ( A ) < 12 \mathrm{rank}(\mathbf{A})<12 rank(A)<12时, ( 38 ) (38) (38)为欠定问题,具有多个解;当 r a n k ( A ) = 12 \mathrm{rank}(\mathbf{A})=12 rank(A)=12时, ( 38 ) (38) (38)为适定问题,具有唯一解,可直接通过解线性方程组获得;当匹配点较多时, r a n k ( A ) > 12 \mathrm{rank}(\mathbf{A})>12 rank(A)>12时, ( 38 ) (38) (38)变为超定问题,线性方程组无解,故可以构造如下优化问题求近似解
ψ ~ = a r g min ⁡ ψ : ∥ ψ ∥ = 1   1 2 ∥ A ψ ∥ 2 (31) \begin{align*} \tilde{\boldsymbol\psi} &=\underset{\boldsymbol\psi:\|\boldsymbol\psi\|=1}{\mathrm{arg}\min}\,\frac{1}{2}\|\mathbf{A}\boldsymbol\psi\|^{2}\\ \end{align*}\tag{31} ψ~=ψ:ψ=1argmin21Aψ2(31)
A \mathbf{A} A做奇异值分解
A = U Σ V T \mathbf{A}=\mathbf{U}\mathbf{\Sigma}\mathbf{V}^{T} A=VT
其中 V = [ v 1 , ⋯   , v 12 ] \mathbf{V}=[\mathbf{v}_{1},\cdots,\mathbf{v}_{12}] V=[v1,,v12]按照特征值降序排列,容易知道 ψ ~ \tilde{\boldsymbol\psi} ψ~可取为
ψ ~ = ± v 12 (32) \tilde{\boldsymbol\psi}=\pm\mathbf{v}_{12}\tag{32} ψ~=±v12(32)
ψ ~ \tilde{\boldsymbol\psi} ψ~转变 Ψ ~ \tilde{\boldsymbol\Psi} Ψ~为再转变为 [ R ~ , t ~ ] = K − 1 Ψ ~ [\tilde{\mathbf{R}},\tilde{\mathbf{t}}]=\mathbf{K}^{-1}\tilde{\boldsymbol\Psi} [R~,t~]=K1Ψ~即得到所求增广矩阵的初步估计,但所求得的旋转矩阵 R ~ \tilde{\mathbf{R}} R~不一定在 S O ( 3 ) SO(3) SO(3)中,可以构造如下优化问题
min ⁡     − t r ( R R ~ T ) s u b j e c t   t o     R T R = I det ⁡ ( R ) = 1 \begin{align*} \min\,\,\,&-\mathrm{tr}\left(\mathbf{R}\tilde{\mathbf{R}}^{T}\right)\\ \mathrm{subject\,to}\,\,\,&\mathbf{R}^T\mathbf{R}=\mathbf{I}\quad\det(\mathbf{R})=1\\ \end{align*} minsubjecttotr(RR~T)RTR=Idet(R)=1
首先对 R ~ \tilde{\mathbf{R}} R~进行SVD分解
R ~ = U ~ Σ ~ V ~ T \tilde{\mathbf{R}}=\tilde{\mathbf{U}}\tilde{\boldsymbol{\Sigma}}\tilde{\mathbf{V}}^{T} R~=U~Σ~V~T
根据§1中KKT条件,可以证明,在任何情况下,使 ( 6 ) (6) (6)中目标函数最优的旋转矩阵 R ∗ \mathbf{R}^{\ast} R总可以取为下述值
R ∗ = U ~ [ 1 1 det ⁡ ( U ~ ) det ⁡ ( V ~ ) ] V ~ T \begin{align*} \mathbf{R}^{\ast}=\tilde{\mathbf{U}} \begin{bmatrix} 1&&\\ &1&\\ &&\det(\tilde{\mathbf{U}})\det(\tilde{\mathbf{V}}) \end{bmatrix} \tilde{\mathbf{V}}^{T} \end{align*} R=U~ 11det(U~)det(V~) V~T

4.2、最小重投影误差

求解PnP问题还可以将每个三维点坐标投影到像素平面得到的坐标与对应的实际观测到的像素坐标做差得到的重投影误差,再通过优化重投影误差得到最优的从世界坐标系到相机坐标系的位姿变换 T ∈ S E ( 3 ) \mathbf{T}\in SE(3) TSE(3),即

T ∗ = arg ⁡ min ⁡ T ∑ i = 1 n ∥ q i − 1 Z i K ( T X i ) 1 : 3 ∥ 2 = arg ⁡ min ⁡ T ∑ i = 1 n ∥ e i ( T ) ∥ 2 (33) \begin{align*} \mathbf{T}^{\ast} &=\underset{\mathbf{T}}{\arg\min}\sum_{i=1}^{n}\left\|\mathbf{q}_{i}-\frac{1}{Z_{i}}\mathbf{K}(\mathbf{T}\mathbf{X}_{i})_{1:3}\right\|^{2}\\ &=\underset{\mathbf{T}}{\arg\min}\sum_{i=1}^{n}\left\|\mathbf{e}_{i}(\mathbf{T})\right\|^{2}\\ \end{align*} \tag{33} T=Targmini=1n qiZi1K(TXi)1:3 2=Targmini=1nei(T)2(33)
下面暂时省略下标 i i i,世界坐标系下的三维点在相机坐标系下的表示为
p = ( T X ) 1 : 3 = [ X , Y , Z ] T (34) \mathbf{p}=(\mathbf{T}\mathbf{X})_{1:3}=[X,Y,Z]^{T}\tag{34} p=(TX)1:3=[X,Y,Z]T(34)
误差取两维
e = ( q − 1 Z K p ) 1 : 2 = [ U V ] − 1 Z [ f x 0 c x 0 f y c y ] [ X Y Z ] = [ U − f x X Z + c y V − f y Y Z + c y ] (35) \begin{align*} \mathbf{e}&= \left(\mathbf{q}-\frac{1}{Z}\mathbf{K}\mathbf{p}\right)_{1:2} =\begin{bmatrix} U\\ V\\ \end{bmatrix}-\frac{1}{Z}\begin{bmatrix} f_{x}&0&c_{x}\\ 0&f_{y}&c_{y}\\ \end{bmatrix}\begin{bmatrix} X\\ Y\\ Z \end{bmatrix} =\begin{bmatrix}U-f_{x}\frac{X}{Z}+c_{y}\\ V-f_{y}\frac{Y}{Z}+c_{y}\end{bmatrix} \end{align*}\tag{35} e=(qZ1Kp)1:2=[UV]Z1[fx00fycxcy] XYZ =[UfxZX+cyVfyZY+cy](35)
根据链式法则得到
∂ e ∂ T = − ∂ q ′ ∂ p ∂ p ∂ T (36) \begin{align*} \frac{\partial\mathbf{e}}{\partial\mathbf{T}}&=-\frac{\partial\mathbf{q}^{\prime}}{\partial\mathbf{p}}\frac{\partial\mathbf{p}}{\partial\mathbf{T}}\\ \end{align*}\tag{36} Te=pqTp(36)
( 34 ) , ( 35 ) (34),(35) (34),(35)
∂ e ∂ p = [ − f x Z 0 f x X Z 2 0 − f y Z f x Y Z 2 ] (37) \frac{\partial\mathbf{e}}{\partial\mathbf{p}}= \begin{bmatrix} -\frac{f_{x}}{Z}&0&\frac{f_{x}X}{Z^{2}}\\ 0&-\frac{f_{y}}{Z}&\frac{f_{x}Y}{Z^{2}} \end{bmatrix}\tag{37} pe=[Zfx00ZfyZ2fxXZ2fxY](37)
设位姿更新方式为 T ← E x p ( Δ T ) T , Δ T ∈ R 6 \mathbf{T}\leftarrow\mathrm{Exp}(\Delta\mathbf{T})\mathbf{T},\Delta\mathbf{T}\in\mathbb{R}^{6} TExp(ΔT)T,ΔTR6,则可以通过左乘扰动求导方法计算
∂ p ∂ T = ( ∂ T X ∂ T ) 1 : 3 = [ I , − p ∧ ] (38) \frac{\partial\mathbf{p}}{\partial\mathbf{T}}=\left(\frac{\partial\mathbf{T}\mathbf{X}}{\partial\mathbf{T}}\right)_{1:3}=[\mathbf{I},-\mathbf{p}^{\wedge}]\tag{38} Tp=(TTX)1:3=[I,p](38)
( 36 ) , ( 37 ) , ( 38 ) (36),(37),(38) (36),(37),(38)可计算
∂ e ∂ T = [ − f x Z 0 f x X Z 2 f x X Y Z 2 − f x − f x X 2 Z 2 f x Y Z 0 − f y Z f x Y Z 2 f y + f y Y 2 Z 2 − f x X Y Z 2 − f x X Z ] (39) \frac{\partial\mathbf{e}}{\partial\mathbf{T}}=\begin{bmatrix} -\frac{f_{x}}{Z}&0&\frac{f_{x}X}{Z^{2}}&\frac{f_{x}XY}{Z^{2}}&-f_{x}-\frac{f_{x}X^{2}}{Z^{2}}&\frac{f_{x}Y}{Z}\\ 0&-\frac{f_{y}}{Z}&\frac{f_{x}Y}{Z^{2}}&f_{y}+\frac{f_{y}Y^{2}}{Z^{2}}&-\frac{f_{x}XY}{Z^{2}}&-\frac{f_{x}X}{Z} \end{bmatrix}\tag{39} Te=[Zfx00ZfyZ2fxXZ2fxYZ2fxXYfy+Z2fyY2fxZ2fxX2Z2fxXYZfxYZfxX](39)
问题 ( 33 ) (33) (33)的雅可比矩阵
J i = ∂ e i ∂ T (40) \mathbf{J}_{i}=\frac{\partial\mathbf{e}_{i}}{\partial\mathbf{T}}\tag{40} Ji=Tei(40)
得到
H k = ∑ i = 1 n J i T J i b k = ∑ i = 1 n J i T e i \begin{align*}\mathbf{H}_{k}=\sum_{i=1}^{n}\mathbf{J}_{i}^{T}\mathbf{J}_{i}\quad\quad\mathbf{b}_{k}&=\sum_{i=1}^{n}\mathbf{J}_{i}^{T}\mathbf{e}_{i}\end{align*} Hk=i=1nJiTJibk=i=1nJiTei
则更新量可以通过下式计算
H k Δ T k = − b k \mathbf{H}_{k}\Delta\mathbf{T}_{k}=-\mathbf{b}_{k} HkΔTk=bk

并通过下式更新
T k + 1 = E x p ( Δ T k ) T k \mathbf{T}_{k+1}=\mathrm{Exp}(\Delta\mathbf{T}_{k})\mathbf{T}_{k} Tk+1=Exp(ΔTk)Tk
最终得到最优的位姿变换

附录

§1、尺度意义下相等

x 1 , x 2 \mathbf{x}_{1},\mathbf{x}_{2} x1,x2为某种代数结构,若存在 s ∈ R s\in\mathbb{R} sR,使得
s x 1 = x 2 (A1) s\mathbf{x}_{1}=\mathbf{x}_{2}\tag{A1} sx1=x2(A1)
则称 x 1 \mathbf{x}_{1} x1 x 2 \mathbf{x}_{2} x2在尺度意义下相等,记作
x 1 ⋍ x 2 (A2) \mathbf{x}_{1}\backsimeq\mathbf{x}_{2}\tag{A2} x1x2(A2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2238636.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

书生大模型第四期闯关任务与笔记

书生大模型第四期闯关任务与笔记 入门岛第一关 Linux闯关任务&#xff1a;完成SSH连接与端口映射并运行hello_world.py笔记与过程SSH端口映射linux文件管理命令linux进程管理命令 第二关 Python闯关任务&#xff1a;Leetcode 383(笔记中提交代码与leetcode提交通过截图)闯关任务…

【React】深入理解 JSX语法

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 深入理解 JSX语法1. JSX 简介2. JSX 的基本语法2.1 基本结构2.2 与普通 JavaScr…

MyBatis——增删查改(XML 方式)

1. 查询 1.1. 简单查询 使用注解的方式主要是完成一些简单的增删查改功能&#xff0c;如果要实现复杂的 SQL 功能&#xff0c;还是建议使用 XML 来配置映射语句&#xff0c;将 SQL 语句写在 XML 配置文件中 如果要操作数据库&#xff0c;需要做以下的配置&#xff0c;与注解…

YJN5216 手提式升降工作灯

YJN5216 手提式升降工作灯 产品简介&#xff1a; 适用于防汛应急抢修、铁路工务、电务、供电、运输等场所小范围检修、施工照明&#xff0c;也适用于电网、公消等行业小方位应急照明使用。 性能特点&#xff1a; 灯具体积小、重量轻,可以实现手提、背行两种携带方式。 灯具…

LeetCode题练习与总结:完美矩形--391

一、题目描述 给你一个数组 rectangles &#xff0c;其中 rectangles[i] [xi, yi, ai, bi] 表示一个坐标轴平行的矩形。这个矩形的左下顶点是 (xi, yi) &#xff0c;右上顶点是 (ai, bi) 。 如果所有矩形一起精确覆盖了某个矩形区域&#xff0c;则返回 true &#xff1b;否则…

Mac中安装OhMyZsh

Mac中安装OhMyZsh 文章目录 Mac中安装OhMyZsh一、Homebrew二、OhMyZsh1、Oh-My-Zsh配置1.1&#xff1a;主题配置1.2&#xff1a;插件配置&#xff08;语法高亮和自动提示&#xff09;1、zsh-autosuggestions&#xff08;需下载安装&#xff09;&#xff1a;高亮显示所有支持的命…

计算机毕业设计Python+图神经网络考研院校推荐系统 考研分数线预测 考研推荐系统 考研爬虫 考研大数据 Hadoop 大数据毕设 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Llama旋转位置编码代码实现及详解

旋转位置编码RoPE 在旋转位置编码与Transformer和BERT之间的区别中介绍了旋转位置编码&#xff08;RoPE&#xff09;的特点和优势&#xff0c;这种输入长度动态可变的优势使得在Llama编码时&#xff0c;不需要掩码将多余的嵌入掩住。为了详细了解RoPE是如何实现的&#xff0c;…

如何保证Redis与MySQL双写一致性

什么是双写一致性问题&#xff1f; 双写一致性主要指在一个数据同时存在于缓存&#xff08;如Redis&#xff09;和持久化存储&#xff08;如MySQL&#xff09;的情况下&#xff0c;任何一方的数据更新都必须确保另一方数据的同步更新&#xff0c;以保持双方数据的一致状态。这一…

STM32获取SHT3X温湿度芯片数据

目录 一、概述 二、单次数据采集模式的测量 1、配置说明 2、代码实现方式 三、周期性数据采集模式的测量 1、配置说明 2、代码实现方式 四、完整代码下载链接 一、概述 SHT3X是Sensirion公司推出的一款高精度、完全校准的温湿度传感器&#xff0c;基于CMOSens技术。它提…

计算机新手练级攻略——善用搜索引擎

计算机学生新手练级攻略——善用搜索引擎 在信息爆炸的时代&#xff0c;计算机专业的学生如何有效地自我提升&#xff1f;答案可能就藏在一个简单却强大的工具——搜索引擎中。搜索引擎不仅是获取知识的入口&#xff0c;更是解决问题的利器。下面&#xff0c;我将分享一些善用搜…

【MySQL】数据库表连接简明解释

未经许可,不得转载。 文章目录 表连接表连接的类型内连接与外连接结合 WHERE 条件交叉连接(cross join)表连接 在关系型数据库中,建模是数据组织的核心难点。数据库建模需要将数据关系理清,构建出适合存储和查询的结构。 所谓“模型”包括实体(entity) 和关系(relati…

Unity 网格模型及优化

一个模型中可以包含很多网格&#xff0c;一个模型可以由多个网格组成。在Unity3D中一个网格可以由多个子网格&#xff08;Sub-Mesh)组成。 在渲染引擎的时候&#xff0c;每个子网格都要匹配一个材质球来做渲染&#xff0c;实际上一个子网格本身就是一个个普通的模型&#xff0…

恒源云使用手册记录:从服务器下载数据到本地

文章目录 一、xftp下载二、通过Xftp客户端连接站点 一、xftp下载 先下载xftp&#xff1a;下载连接 二、通过Xftp客户端连接站点 右击文件&#xff0c;点击新建 名称可以任意 主机、端口号、用户名 点击这里的复制登录命令 比如我这里得到ssh -p 41604 rooti-2.gpushare.co…

ReactPress:功能全面的开源发布平台

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎Star。 此项目是用于构建博客网站的&#xff0c;包含前台展示、管理后台和后端。 此项目是基于 React antd NestJS NextJS MySQL 的&#xff0c;项目已经开源&#xff0c;项目地址在 …

【LLM】3:从零开始训练大语言模型(预训练、微调、RLHF)

一、 大语言模型的训练过程 预训练阶段&#xff1a;PT&#xff08;Pre training&#xff09;。使用公开数据经过预训练得到预训练模型&#xff0c;预训练模型具备语言的初步理解&#xff1b;训练周期比较长&#xff1b;微调阶段1&#xff1a;SFT&#xff08;指令微调/有监督微调…

Android CarrierConfig 参数项和正则匹配逻辑

背景 在编写CarrierConfig的时候经常出现配置不生效的情况&#xff0c;比如运营商支持大范围的imsi&#xff0c;或者是测试人员写卡位数的问题等等&#xff0c;因此就需要模式匹配&#xff08;包含但不限于正则表达式&#xff09;。 基本概念: 模式匹配涉及定义一个“模式”&a…

Golang | Leetcode Golang题解之第557题反转字符串中的单词III

题目&#xff1a; 题解&#xff1a; func reverseWords(s string) string {length : len(s)ret : []byte{}for i : 0; i < length; {start : ifor i < length && s[i] ! {i}for p : start; p < i; p {ret append(ret, s[start i - 1 - p])}for i < le…

运行WHTools批量启动游戏房间工具提示要安装.Net Framework3.5解决

确认电脑能正常上网 点击下载并安装此功能&#xff0c;开始安装.Net Framework 3.5 安装成功 成功启动WHTools

Xcode 16 使用 pod 命令报错解决方案

原文请点击这个跳转 一、问题现象&#xff1a; 有人会遇到 Xcode 升级到 16 后&#xff0c;新建应用然后使用 pod init 命令会报错如下&#xff1a; Stack Ruby : ruby 3.3.5 (2024-09-03 revision ef084cc8f4) [x86_64-darwin23]RubyGems : 3.5.22Host : macOS 15.0 (24A335…