VINS-Mono-VIO初始化 (三:SFM中的三角化方法)

前面预积分对IMU的数据进行预处理,现在需要对视觉的信息进行处理,在VINS中视觉初始化的处理就是使用SFM,但是这里的三角化他没有用opencv给的函数,而是用自己的方法进行三角化。

这里SFM的方式就是现在滑窗里面找到枢纽帧,然后枢纽帧和最后一帧进行三角化获得3D点,然后通过PNP计算滑窗中其他关键帧的位姿,同时也三角化出更多新的点,顺序是先从枢纽帧向右再向左,然后再遍历只被中间帧看到的点进行三角化

三角化公式推导

公式如下
[ x , y , z ] T = [ R , t ] ⋅ p [x,y,z]^{T}=[R,t]·p [x,y,z]T=[R,t]p
其中 p p p 是世界点 p = [ x , y , z , 1 ] p=[x,y,z,1] p=[x,y,z,1] ,为了和变换矩阵齐次所以要有第4维为1, [ x , y , z ] [x,y,z] [x,y,z] 是在各自相机系下的观测,[R,t] 是两帧间的位姿变换关系,这里面总会有一帧定义为单位阵的,这样才能作为这个3D点的世界系。由于各自相机系下的观测一般都是归一化相机坐标系,所以 z = 1 z=1 z=1,所以公式变成
[ x , y , 1 ] T = a ⋅ [ R , t ] ⋅ p [x,y,1]^{T}=a·[R,t]·p [x,y,1]T=a[R,t]p
这个a系数可以理解为尺度的倒数 1 s \frac{1}{s} s1 ,就是为了让公式成立的,就是右边变换完后还进行了归一化操作
[ R t ] 属于 3 × 4 \begin{bmatrix} R &t\end{bmatrix}属于3×4 [Rt]属于3×4 矩阵
可以写成
[ R t ] = [ p 0 p 1 p 2 ] 3 × 4 M a t r i x \begin{bmatrix} R &t\end{bmatrix}=\begin{bmatrix} p_{0} \\ p_{1} \\p_{2}\end{bmatrix}_{3×4 Matrix} [Rt]= p0p1p2 3×4Matrix
p 0 , p 1 , p 2 属于 1 × 4 p_{0},p_{1},p_{2}属于1×4 p0,p1,p2属于1×4
与点 p = [ x , y , z , 1 ] p=[x,y,z,1] p=[x,y,z,1]相乘则有
[ x y 1 ] T = a [ p 0 ⋅ p p 1 ⋅ p p 2 ⋅ p ] 3 × 1 M a t r i x \begin{bmatrix} x&y&1 \end{bmatrix}^{T}=a\begin{bmatrix} p_{0}·p\\p_{1}·p\\p_{2}·p\end{bmatrix}_{3×1Matrix} [xy1]T=a p0pp1pp2p 3×1Matrix
两个向量满足 c ⃗ = a ⋅ b ⃗ \vec{c}=a·\vec{b} c =ab 那么则证明这两个向量平行
两个平行向量的叉乘为0,因为 c ⃗ × b ⃗ = ∣ c ⃗ ∣ ∣ b ⃗ ∣ s i n ( θ ) \vec{c}×\vec{b}=|\vec{c}||\vec{b}|sin(θ) c ×b =c ∣∣b sin(θ),都平行了这个θ肯定为0,所以整体为0,对上面两个向量进行叉乘则有
y p 2 p − p 1 p = 0 yp_{2}p-p_{1}p=0 yp2pp1p=0
p 0 p − x p 2 p = 0 p_{0}p-xp_{2}p=0 p0pxp2p=0
x p 1 p − y p 0 p = 0 xp_{1}p-yp_{0}p=0 xp1pyp0p=0
p p p 提出来得到
( y p 2 − p 1 ) p = 0 (yp_{2}-p_{1})p=0 (yp2p1)p=0
( p 0 − x p 2 ) p = 0 (p_{0}-xp_{2})p=0 (p0xp2)p=0
( x p 1 − y p 0 ) p = 0 (xp_{1}-yp_{0})p=0 (xp1yp0)p=0
根据 [ x y 1 ] T = a [ p 0 ⋅ p p 1 ⋅ p p 2 ⋅ p ] 3 × 1 M a t r i x \begin{bmatrix} x&y&1 \end{bmatrix}^{T}=a\begin{bmatrix} p_{0}·p\\p_{1}·p\\p_{2}·p\end{bmatrix}_{3×1Matrix} [xy1]T=a p0pp1pp2p 3×1Matrix x = a p 0 p x=ap_{0}p x=ap0p y = a p 1 p y=ap_{1}p y=ap1p,把这两个 x , y x,y x,y 代入到③中
则有 a p 0 p 1 − a p 1 p 0 = 0 ap_{0}p_{1}-ap_{1}p_{0}=0 ap0p1ap1p0=0,这里是向量点乘,这个式子必然成立,所以这个式子就没有意义了,公式就变成
( y p 2 − p 1 ) p = 0 (yp_{2}-p_{1})p=0 (yp2p1)p=0
( p 0 − x p 2 ) p = 0 (p_{0}-xp_{2})p=0 (p0xp2)p=0
一个位姿就会得到两个这个公式,三角化需要两帧,有两个位姿,所以代码中有4行这个公式
( y p 2 − p 1 ) ∈ 1 × 4 (yp_{2}-p_{1})∈1×4 (yp2p1)1×4
如果一个特征点可以被多帧看到的话,左边这个矩阵还能继续扩大,整个问题就是求解 A x = 0 Ax=0 Ax=0 的问题,用SVD求解去右奇异矩阵最后一个向量即可,具体原因见上一节。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Rhys___

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

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

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

打赏作者

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

抵扣说明:

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

余额充值