为了征服Lvi-sam, 今天先学习它的子部分,vins-mono.
第一次运行感觉,初始化的时候感觉很卡,原因不明,可能是因为在做自动标定?
无人机的数据集中,感觉主要还是包含纹理丰富的数据,在其他场景的性能确实不好说。
问题:
图像里的蓝点和红点是不是有什么不同的含义?=> 看了一下rostopic,有path_2和3两个。这是什么含义呢?
通过rqt_graph打印出node,可以看出,主要包括三个node,feature_tracker, vins_estimator和pose_graph三个节点。
再来看看全部的topic
重新看project代码
1.看makelists
2. 看launch file
3. 根据上图,先选择看主要的node,然后看每个subscriber对应的callback。先看后端node,需要留意多个线程锁的管理。
4. 然后看前端的node,还是要看cmakelists,可以看到针对img,主要的处理是进行了光流的跟踪,除此之外,还用到了good feature to track去寻找shi-omas角点。
关注一下图片处理的几个步骤,
1.自适应局部直方图均衡化
简单的理解:增加图像对比度。
深刻的理解:目前还没,大概就是把一幅图像的直方图分布变为近似均匀分布。
调节参数可以增加对比度,同时,也会增加噪点。好像它只能处理单通道图像?
cv::Mat dst;
//cv::cvtColor(img,dst,cv::COLOR_BGR2GRAY);
cv::Ptr clahe = cv::createCLAHE(30.0, cv::Size(8, 8));
clahe->apply(img, dst);
return dst;
接下来一个函数是calcOpticalFlowPyrLK
看了一下它对应的opencv_doc, 它的作用是根据光流法得到新的时刻的特征点的位置。
通过金字塔+ lk跟踪得到匹配点。
看一下函数的api,可以发现它的输出包括下一个时刻点的位置。
关于lk光流法,我认为它的问题在于它基于的假设在很多动态的slam场景都是不合适的。因为tracking point很有可能来自动态物体。
刚开始针对这个过程有个疑问,因为这个函数的输入是疏散的点,但是哪里能找到得到这些点呢,后来发现,track的提取是在之后进行的。。。也可能理解错了。
通过光流法得到异常点后,就可以通过F矩阵来去除异常点。注意,计算F矩阵有几种方式(8点法,ransac等),点多的话选择ransac是不错的。
接着,通过goodFeaturetoTrack获取其他点。 goodfeaturetotrack的作用,提取特征点...
来看一下,经过增加对比度后提取的特征点的样子。
经过测试发现,如果对比度增加过大,确实会导致噪点过多,然后被误识别成角点。
采用Harris角点检测,发现,效果和不启动Harris没有太大区别。
阶段性总结:
TODO