前言:本系列文章以VINS-Mono+Fusion源码流程为导向,对源码进行了详细的逐行注释,并结合原理首推IMU预积分,对滑动窗口、边缘化等进行了详细阐述,旨在细致入微地对VINS-Mono+Fusion做一个全面整体的了解。
1. VINS-Mono数据流思维导图
下图为VINS-Mono思维导图,梳理了其中的数据流,对里面的函数和功能做了通俗的解释,可以对VINS-Mono的整体流程有一个清晰的了解,后面就以该数据流为导向,对其中的重点部分代码和原理进行详细解释。
2. 视觉前端流程
(1)节点流程图
(2)视觉前端的作用
视觉前端为后端提供图片的特征点信息,这里的特征点信息包括:第一,由特征点提取算法获取的像素坐标;第二,由特征点去畸变算法获取的去畸变后归一化坐标;第三,通过光流追踪算法获取不同帧上特征点的id;第四,获取特征点速度,用来进行相机和IMU的时间矫正。
3. 视觉前端实现代码
3.1 主函数(feature_tracker_node.cpp)
(1)主函数大致内容
- 初始化ros节点
- readParameters读取配置文件
- readIntrinsicParameter读取相机内参
- 订阅topic,触发img_callback回调函数
- 注册publisher
- 发布/feature_tracker/feature,用于后端优化
- 发布/feature_tracker/feature_img,用于rviz可视化
- 发布/feature_tracker/restart,用于重启
(2)主函数代码实现
int main(int argc, char **argv)
{
ros::init(argc, argv, "feature_tracker"); // ros节点初始化
// 声明一个句柄,消息的收发、通过参数服务器获取参数等都是通过句柄来实现的
// ~代表这个节点的命名空间,后续句柄n操作的节点是在feature_tracker下实现的
ros::NodeHandle n("~");
// 设置ros log级别
ros::console::set_logger_level(ROSCONSOLE_DEFAULT_NAME, ros::cons