orb初始化阶段,从E H矩阵分解得到的 R t 如何选择?
checkRt 函数,计算在该Rt 情况下,三角化成功的点的数量。
三角化:
slam14讲中思路是:未知数只是该点在两个相机中的深度,两个未知数。只要满足对极几何,就可以求解。
多视图几何,以及orb中的思路:实际的像素坐标 , 和 重投影得到的像素坐标,肯定是同向的。叉乘为0。待求解未知数为 Pw ,是4维的,因为尺度等价性。
而且,在构建方程的时候,因为像素坐标是齐次,所以一个点可以提供2个方程,因为第三个可以由前面两个方程得到。
然后得到的结果是 Ax=0 4乘4的。利用SVD分解求解即可。
https://www.cnblogs.com/yepeichu/p/10792899.html
https://blog.csdn.net/weixin_43795395/article/details/93769148
关于三角化,这篇文章讲的太好了 https://www.zhihu.com/search?type=content&q=slam%20%E4%B8%89%E8%A7%92%E5%8C%96
生成新的地图点
在localBA中根据KF生成新的地图点,首先要保证匹配的点是对的。所以,要先进行匹配。虽然当前有匹配对,但是不一定正确,要通过bow来寻找。同时,要加上对极几何约束判断。
什么是对极几何判断?
先通过两个KF的已知姿态,计算相对姿态,构造出 F 基础矩阵。(不用再像初始化那样再求解一遍)
对极几何原理是:p2t F21 p1 = 0 根据点到直线的距离,我们认为,F21*p1 是 p1 投影到 camera2中的级线 l 。
判断是否符合对极几何约束,直接判断 p2 到 这个极限 l 的距离是否小于阈值就可以了。
https://www.cnblogs.com/clarenceliang/p/6704970.html
如何根据一对匹配成功的特征点恢复地图点?
只讨论单目的情况:
1. 检查视差是否足够大,否则不进行三角化;三角化的方法同上
2. 仅仅是三角化完成就OK了吗?不是的,还要检查三角化结果的正确性。
1)是否在两个相机的前方。(将地图点变换到对应的camera系,观察z是否为正)
2)z 值特别大也不OK。代表该点是特别远点
3)然后检查该地图点到两个相机的重投影误差不能太大,要满足阈值
4)然后检查尺度一致性。就是实际的两个光心到该点的距离之比,与 两个相机中特征点所在金字塔距离之比。 这两个尺度不能差别太大。
如果以上条件都满足,恭喜,三角化成功。