本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1.关于参数 max_solver_time
最大求解时间
在VINS中默认为0.04,迭代次数最多为8次,在实际使用中该参数需要根据性能调试,确保迭代次数足够,否则很难有一个很好的优化结果!
2.在IMU参数中,噪声和随机游走会直接影响到IMU的协方差矩阵,关于IMU的噪声,在标定的情况下是静止的,但是在运动时使用,因此一般将此扩大10~15倍去使用。
3.关于IMU和Cam的时间戳同步,理想的情况下是实现时间戳的硬同步。
4.在IMU、图像、后端三个线程中,后端需要处理IMU和图像,找到合适的图像和图像之间的IMU数据。因此该三个线程共用一个 m_buf
线程互斥锁。在后端process()
中通过调用wait()
自动调用m_buf.lock()
来加锁,然后去寻找数据。如果未得到则线程被阻塞,自动调用m_buf.unlock()
释放锁,使得IMU和图像的线程可以继续向BUF中添加数据,每当添加数据后都会调用con.notify_one
唤醒process()
线程。
5.在readImage对图像处理中,关于直方图均衡化,可增强图像的对比度。
cv::Ptr<cv::CLAHE> clahe = cv::createCLAHE(3.0, cv::Size(8, 8));
在VINS中默认为3.0,如果将其增大,对比度会增加,同时噪声点也会增加。
6.在VINS中的光流跟踪也是直接调用
opencv
中的函数,其中两个关键参数,一个为maxLevel
为金字塔层数,还有一个则为flags
,设置下一帧特征点的初始位置,如果为空则表示与上一帧相同。
cv::calcOpticalFlowPyrLK(cur_img, forw_img, cur_pts, forw_pts, status, err, cv::Size(21, 21), 3);
在VINS-MONO中设置为空。
7.协方差矩阵即不确定性,随着IMU帧数的增加,噪声的不确定性也增加。在IMU和视觉之间,通过对比协方差矩阵来判断更相信谁,其两者为一个相对的关系。
8.对于每一帧得到的图像,将当前帧看到的特征点image
放到特征点管理器f_manager
中,然后进行滑窗优化。image
表示当前帧跟踪到上一帧的特征点集合。放入特征点管理器中,将当前帧与地图中的其他帧建立数据关联,若为已知点,则加到共视关系中,若为新点,则新建立一个特征点。
9.在SLAM后端中,首先确定所有的约束关系,然后针对每个约束确定三个要素:误差项、优化变量、协方差。然后计算Jacobian,调用GN、LM等求解BA。
10.在更新滑动窗口的过程中,要不去掉最老帧,要不去掉次新帧。在去掉最老帧的时候,该帧所看到的路标点需要更新该路标点的第一帧,IMU预积分信息舍弃掉。而在去掉次新帧时,次新帧上一帧到下一帧的两段预积分合并。