前言:2019年6月27日,我进行了网易伏羲实验室虚拟人方向的电话面试。在电话中,我支支吾吾连自己的项目都讲不清楚。不管最后面试结果如何,自己做过的东西起码自己要懂。
a ⋅ b = a T b = ∑ i = 1 3 a i b i = ∣ a ∣ ∣ b ∣ c o s < a , b > \bf{a} \cdot \bf{b}=\bf{a}^T\bf{b}=\sum_{i=1}^3a_ib_i=|\bf{a}||\bf{b}|cos<\bf{a,b}> a⋅b=aTb=i=1∑3aibi=∣a∣∣b∣cos<a,b>
a × b = [ i j k a 1 a 2 a 3 b 1 b 2 b 3 ] = [ a 2 b 3 − a 3 b 2 a 3 b 1 − a 1 b 3 a 1 b 2 − a 2 b 1 ] = [ 0 − a 3 a 2 a 3 0 − a 1 − a 2 a 1 0 ] b ≜ a ∧ b \bf{a} \times \bf{b} = \left[ \begin{array}{ccc} {\bf{i}} & {\bf{j}} & {\bf{k}}\\ {a_1} & {a_2} & {a_3}\\{b_1} & {b_2} & {b_3} \end{array} \right] = \left[ \begin{array}{c} {a_2b_3-a_3b_2}\\ {a_3b_1-a_1b_3}\\ {a_1b_2-a_2b_1} \end{array} \right] =\left[ \begin{array}{ccc} {0} & {-a_3} & {a_2}\\ {a_3} & {0} & {-a_1}\\ {-a_2} & {a_1} & {0} \end{array} \right] \bf{b} \triangleq \bf{a} ^\wedge \bf{b} a×b=⎣⎡ia1b1ja2b2ka3b3⎦⎤=⎣⎡a2b3−a3b2a3b1−a1b3a1b2−a2b1⎦⎤=⎣⎡0a3−a2−a30a1a2−a10⎦⎤b≜a∧b
相应的,有
a = [ a 1 i , a 2 j , a 3 k ] , a ∧ = A = [ 0 − a 3 a 2 a 3 0 − a 1 − a 2 a 1 0 ] , A ∨ = a \boldsymbol{a}=[a_1\boldsymbol{i},a_2\boldsymbol{j},a_3\boldsymbol{k}],\\\boldsymbol{a}^{\wedge}=\boldsymbol{A}=\left[\begin{matrix}0&-a_3&a_2\\a_3&0&-a_1\\-a_2&a_1&0\\\end{matrix}\right],\\\boldsymbol{A}^{\vee}=\boldsymbol{a} a=[a1i,a2j,a3k],a∧=A=⎣⎡0a3−a2−a30a1a2−a10⎦⎤,A∨=a
S O ( 3 ) = { R ∈ R 3 × 3 ∣ R R T = I , det ( R ) = 1 } SO(3)=\{R\in\mathbb{R}^{3\times3}|RR^T=I,\det(R)=1\} SO(3)={R∈R3×3∣RRT=I,det(R)=1}
(det为行列式)
S E ( 3 ) = { T = [ R t 0 T 1 ] ∈ R 4 × 4 ∣ R ∈ S O ( 3 ) , t ∈ R 3 } SE(3)=\{T=\left[ \begin{matrix} R&t\\ 0^T&1\\ \end{matrix} \right]\in\mathbb{R}^{4\times4}|R\in SO(3),t\in \mathbb{R}^3\} SE(3)={T=[R0Tt1]∈R4×4∣R∈SO(3),t∈R3}
在对 R R T = I RR^T=I RRT=I进行求导及整理之后,可以得到 R ( t ) ′ R ( t ) T R(t)^{'}R(t)^T R(t)′R(t)T是一个反对称矩阵,那么就用一个 ϕ ( t ) ∈ R 3 \phi(t)\in\mathbb{R}^3 ϕ(t)∈R3与之对应。有:
R ( t ) ′ R ( t ) T = ϕ ( t ) ∧ R(t)^{'}R(t)^T=\phi(t)^{\wedge} R(t)′R(t)T=ϕ(t)∧
之后求解微分方程,可以得到:
R ( t ) = e x p ( ϕ ∧ t ) R(t)=exp(\phi^{\wedge}t) R(t)=exp(ϕ∧t)
实际求解时利用到指数映射和对数映射。
左右相机只有在 x 轴上有位移,因此 P 的像也只在 x 轴(对应图像的 u 轴)上有差异。
z − f z = b − ( u L + u R ) b \frac{z-f}{z}=\frac{b-(u_{L}+u_{R})}{b} zz−f=bb−(uL+uR)
整理得:
z = f b d , d = u L − u R z=\frac{f b}{d}, \quad d=u_{L}-u_{R} z=dfb,d=uL−uR
[外链图片转存失败(img-OGj4i1u5-1562500349584)(03.jpg)]
两帧图像 I 1 , I 2 I_{1},I_{2} I1,I2,两个相机中心分别为 O 1 , O 2 O_{1},O_{2} O1,O2。 p 1 , p 2 p_{1},p_{2} p1,p2为互相匹配的特征点。
极平面:连线 O 1 p 1 → \overrightarrow{O_{1} p_{1}} O1p1和连线 O 2 p 2 → \overrightarrow{O_{2} p_{2}} O2p2在三维空间中会相交于点 P。这时候点 O 1 , O 2 , P O_{1}, O_{2}, P O1,O2,P三个点可以确定一个平面,该平面称极平面。
极点: O 1 O 2 O_{1} O_{2} O1O2连线与像平面 I 1 , I 2 I_{1},I_{2} I1,I2的交点被称为极点。
基线: O 1 , O 2 O_{1},O_{2} O1,O2的连线。
极线:极平面与两个像平面 I 1 , I 2 I_{1},I_{2} I1,I2之间的相交线 l 1 , l 2 l_{1},l_{2} l1,l2。
用途:双目匹配中,给定左图一个点,能将右图中对应的点的搜索空间缩减到一条线。
条件:需要八个或八个以上的点对
推导:设在第一帧的坐标系下,P坐标为: P = [ X , Y , Z ] T \boldsymbol{P}=[X, Y, Z]^{T} P=[X,Y,Z]T,两像素点 p 1 , p 2 p_{1},p_{2} p1,p2 **(齐次化坐标)**的像素位置为:
s 1 p 1 = K P , s 2 p 2 = K ( R P + t ) s_{1} \boldsymbol{p}_{1}=\boldsymbol{K} \boldsymbol{P}, \quad s_{2} \boldsymbol{p}_{2}=\boldsymbol{K}(\boldsymbol{R} \boldsymbol{P}+\boldsymbol{t}) s1p1=KP,s2p2=K(RP+t)
因为是齐次坐标,所以认为等式任意一边乘以非零常数,等式仍然成立。即:
p 1 = K P , p 2 = K ( R P + t ) \boldsymbol{p}_{1}=\boldsymbol{K} \boldsymbol{P}, \quad \boldsymbol{p}_{2}=\boldsymbol{K}(\boldsymbol{R} \boldsymbol{P}+\boldsymbol{t}) p1=KP,p2=K(RP+t)
取 x 1 , x 2 \boldsymbol{x}_{1}, \boldsymbol{x}_{2} x1,x2是两个像素点的归一化平面上的坐标:
x 1 = K − 1 p 1 , x 2 = K − 1 p 2 \boldsymbol{x}_{1}=\boldsymbol{K}^{-1} \boldsymbol{p}_{1}, \quad \boldsymbol{x}_{2}=\boldsymbol{K}^{-1} \boldsymbol{p}_{2} x1=K−1p1,x2=K−1p2
有:
x 2 = R x 1 + t \boldsymbol{x}_{2}=\boldsymbol{R} \boldsymbol{x}_{1}+\boldsymbol{t} x2=Rx1+t
同时左乘 t ∧ t^{\wedge} t∧,相当于同时与 t t t做外积。
t ∧ x 2 = t ∧ R x 1 \boldsymbol{t}^{\wedge} \boldsymbol{x}_{2}=\boldsymbol{t}^{\wedge} \boldsymbol{R} \boldsymbol{x}_{1} t∧x2=t∧Rx1
同时左乘 x 2 T \boldsymbol{x}_{2}^{T} x2T
x 2 T t ∧ x 2 = x 2 T t ∧ R x 1 \boldsymbol{x}_{2}^{T} \boldsymbol{t}^{\wedge} \boldsymbol{x}_{2}=\boldsymbol{x}_{2}^{T} \boldsymbol{t}^{\wedge} \boldsymbol{R} \boldsymbol{x}_{1} x2Tt∧x2=x2Tt∧Rx1
因 t ∧ x 2 t^{\wedge} x_{2} t∧x2垂直于 x 2 T \boldsymbol{x}_{2}^{T} x2T或 t t t,因此左侧为0。***极线约束***即:
x 2 T t ∧ R x 1 = 0 \boldsymbol{x}_{2}^{T} \boldsymbol{t}^{\wedge} \boldsymbol{R} \boldsymbol{x}_{1}=0 x2Tt∧Rx1=0
将 x 1 = K − 1 p 1 , x 2 = K − 1 p 2 \boldsymbol{x}_{1}=\boldsymbol{K}^{-1} \boldsymbol{p}_{1}, \quad \boldsymbol{x}_{2}=\boldsymbol{K}^{-1} \boldsymbol{p}_{2} x1=K−1p1,x2=K−1p2代回,可得***极线约束***的另一种形式:
p 2 T K − T t ∧ R K − 1 p 1 = 0 \boldsymbol{p}_{2}^{T} \boldsymbol{K}^{-T} \boldsymbol{t}^{\wedge} \boldsymbol{R} \boldsymbol{K}^{-1} \boldsymbol{p}_{1}=0 p2TK−Tt∧RK−1p1=0
意义:
O 1 , P , O 2 O_{1}, P, O_{2} O1,P,O2三点共面, t ∧ R x 1 \boldsymbol{t}^{\wedge} \boldsymbol{R} \boldsymbol{x}_{1} t∧Rx1表示极线,且极线一定通过 x 2 \boldsymbol{x}_{2} x2。
本质矩阵为:
E = t ∧ R \boldsymbol{E}=\boldsymbol{t}^{\wedge} \boldsymbol{R} E=t∧R
特点:
基本矩阵为:
F = K − T E K − 1 \boldsymbol{F}=\boldsymbol{K}^{-T} \boldsymbol{E} \boldsymbol{K}^{-1} F=K−TEK−1
特点:
单应矩阵是齐次矩阵,有8个未知数,需要四个对应点。
A Flexible New Technique for Camera Calibration
摘要:张正友标定法只需要相机观察几个(至少两个)不同方向上显示的平面图案。相机或平面图案都可以自由移动。且相机或标定板的运动不需要知道。张正友标定法对径向透镜畸变进行了建模。该方法由一个封闭形式的解组成,然后根据最大似然准则进行非线性改进。
符号 | 含义 |
---|---|
m = [ u , v ] T m=[u,v]^T m=[u,v]T | 二维点 |
M = [ X , Y , Z ] T M=[X,Y,Z]^T M=[X,Y,Z]T | 三维点 |
m ~ = [ u , v , 1 ] T \widetilde{m}=[u,v,1]^T m =[u,v,1]T | 二维点齐次坐标 |
M ~ = [ X , Y , Z , 1 ] T \widetilde{M}=[X,Y,Z,1]^T M =[X,Y,Z,1]T | 三维点齐次坐标 |
s | 随机尺度因子 |
( R , t ) \bf{(R,t)} (R,t) | 外参,即将世界坐标系和相机坐标系联系起来的旋转矩阵和位移向量 |
A \bf{A} A | 相机内参矩阵 |
α , β \alpha,\beta α,β | 分别为图像u轴和v轴的尺度因子 |
u 0 , v 0 u_0,v_0 u0,v0 | 光心的图像坐标系坐标 |
γ \gamma γ | 描述图像轴u,v之间的倾斜 |
s m ~ = A [ R t ] M ~ s \widetilde{\bf{m}} = \bf{A[R\quad t]\widetilde{M}} sm =A[Rt]M
其中,
A = [ α γ u 0 0 β v 0 0 0 1 ] A = \left[ \begin{array}{ccc} {\alpha} & {\gamma} & {u_0}\\ {0} & {\beta} & {v_0}\\ {0} & {0} & {1}\end{array}\right] A=⎣⎡α00γβ0u0v01⎦⎤
这里假设标定板所在的平面为空间坐标系下的 Z = 0 Z=0 Z=0。
符号 | 含义 |
---|---|
r i \bf{r_i} ri | 旋转矩阵 R \bf{R} R的第i列 |
s [ u v 1 ] = A [ r 1 r 2 r 3 t ] [ X Y 0 1 ] = A [ r 1 r 2 t ] [ X Y 1 ] s\left[\begin{array}{c}{u}\\{v}\\{1}\end{array}\right]=\bf{A}[\begin{array}{cccc}{\bf{r_1}}&{\bf{r_2}}&{\bf{r_3}}&{\bf{t}}\end{array}]\left[\begin{array}{c}{X}\\{Y}\\{0}\\{1}\end{array}\right]=A[\begin{array}{ccc}{\bf{r_1}}&{\bf{r_2}}&{\bf{t}}\end{array}]\left[\begin{array}{c}{X}\\{Y}\\{1}\end{array}\right] s⎣⎡uv1⎦⎤=A[r1r2r3t]⎣⎢⎢⎡XY01⎦⎥⎥⎤=A[r1r2t]⎣⎡XY1⎦⎤
即:
s m ~ = H M ~ s\widetilde{\bf{m}}=\bf{H\widetilde{M}} sm =HM
其中, H \bf{H} H为单应矩阵, H = A [ r 1 r 2 t ] \bf{H=A[\begin{array}{ccc}{\bf{r_1}}&{\bf{r_2}}&{\bf{t}}\end{array}]} H=A[r1r2t]。
假设 H = [ h 1 h 2 h 3 ] \bf{H}=\left[\begin{array}{ccc}{\bf{h_1}}&{\bf{h_2}}&{\bf{h_3}}\end{array}\right] H=[h1h2h3],根据单应关系有:
[ h 1 h 2 h 3 ] = λ A [ r 1 r 2 t ] \left[\begin{array}{ccc}{\bf{h_1}}&{\bf{h_2}}&{\bf{h_3}}\end{array}\right]=\lambda \bf{A}[\begin{array}{ccc}{\bf{r_1}}&{\bf{r_2}}&{\bf{t}}\end{array}] [h1h2h3]=λA[r1r2t]
可推出
r 1 = λ A − 1 h 1 \mathbf{r}_{1}=\lambda \mathbf{A}^{-1} \mathbf{h}_{1} r1=λA−1h1
r 2 = λ A − 1 h 2 \mathbf{r}_{2}=\lambda \mathbf{A}^{-1} \mathbf{h}_{2} r2=λA−1h2
r 3 = r 1 × r 2 \mathbf{r}_{3}=\mathbf{r}_{1} \times \mathbf{r}_{2} r3=r1×r2
t = λ A − 1 h 3 \mathbf{t}=\lambda \mathbf{A}^{-1} \mathbf{h}_{3} t=λA−1h3
λ = 1 ∥ A − 1 h 1 ∥ = 1 ∥ A − 1 h 2 ∥ \lambda=\frac{1}{\left\|\mathbf{A}^{-1} \mathbf{h}_{1}\right\|}=\frac{1}{\left\|\mathbf{A}^{-1} \mathbf{h}_{2}\right\|} λ=∥A−1h1∥1=∥A−1h2∥1
根据 r 1 \bf{r_1} r1和 r 2 \bf{r_2} r2正交,根据
有:
h 1 T A − T A − 1 h 2 = 0 h_1^TA^{-T}A^{-1}h_2=0 h1TA−TA−1h2=0
h 1 T A − T A − 1 h 1 = h 2 T A − T A − 1 h 2 h_1^TA^{-T}A^{-1}h_1= h_2^TA^{-T}A^{-1}h_2 h1TA−TA−1h1=h2TA−TA−1h2
需要大于等于三张图像才能确定唯一解。
设 x 1 , x 2 x_1 ,x_2 x1,x2 为两个特征点的归一化坐标,那么它们满足:
s 1 x 1 = s 2 R x 2 + t s_{1} \boldsymbol{x}_{1}=s_{2} \boldsymbol{R} \boldsymbol{x}_{2}+\boldsymbol{t} s1x1=s2Rx2+t
现在我们已经知道了 R , t \boldsymbol{R}, \boldsymbol{t} R,t,想要求解的是两个特征点的深度 s 1 , s 2 s_{1}, s_{2} s1,s2。
可以左侧使用 x 1 x_1 x1进行叉乘,使左侧为0,即可求得 s 2 s_2 s2:
s 1 x 1 ∧ x 1 = 0 = s 2 x 1 ∧ R x 2 + x 1 ∧ t s_{1} \boldsymbol{x}_{1}^{\wedge} \boldsymbol{x}_{1}=0=s_{2} \boldsymbol{x}_{1}^{\wedge} \boldsymbol{R} \boldsymbol{x}_{2}+\boldsymbol{x}_{1}^{\wedge} \boldsymbol{t} s1x1∧x1=0=s2x1∧Rx2+x1∧t
求 s 1 s_1 s1时同理。
求解 3D 到 2D 点对运动的问题。特征点的 3D 位置可以由三角化,或者由 RGB-D 相机的深度图确定。在单目视觉里程计中,必须先进行初始化,然后才能使用 PnP。
System类生成一个对象slam,初始化slam对象,设置三个线程:Tracking ,LocalMapping ,LoopClosing
订阅 GrabImage() ——> TrackMonocular()——>GrabImageMonocular()——>Track()
MapPoint类表示 路标点,Map类用Hash表管理 路标点和关键帧。
track local map:
更新局部地图,包括局部关键帧和关键点
对局部MapPoints进行投影匹配
根据匹配对估计当前帧的姿态
根据姿态剔除误匹配
keyFrame decision
LocalMapping线程处理的关键帧都是Tracking线程发过来的
A. 通过求解的Sim3以及相对姿态关系,调整与当前帧相连的关键帧位姿以及这些关键帧观测到的MapPoints的位置;
B. 将闭环帧以及 与闭环帧相连的关键帧的MapPoints和与当前帧相连的关键帧的点进行匹配;
C. 通过MapPoints的匹配关系更新这些帧之间的连接关系,即更新covisibility graph
D. 对Essential Graph(Pose Graph)进行优化,MapPoints的位置则根据优化后的位姿做相对应的调整
E. 创建线程进行全局Bundle Adjustment
main->构造SLAM对象,在构造函数中设置线程。
读取图像,循环调用trackMonocular,在其中先检查状态是否改变,再调用
GrabImageMonocular
构造了CurrentFrame,最后进行Track