参考博文链接:vins-fusion代码解读
程序入口
VINS-Fusion/vins-estimator/rosNodeTest.cpp
程序顺序解读
首先,定义了几个全局变量:
1.Estimator estimator;
自动执行该类的构造函数,其中两条重要的语句如下:
initThreadFlag = false;
clearState();
本质上不仅清除了状态,而且为诸多变量赋初值。
(这里std::mutex
似乎和C++11 的并发和多线程编程有关,留待后续了解)
2.queue<sensor_msgs::ImuConstPtr> imu_buf; queue<sensor_msgs::PointCloudConstPtr> feature_buf; queue<sensor_msgs::ImageConstPtr> img0_buf; queue<sensor_msgs::ImageConstPtr> img1_buf; std::mutex m_buf;
然后,进入了main()
函数:
readParameters(config_file);
estimator.setParameter();
读取参数并配置参数
- 这部分的逻辑是这样的,配置参数一开始存放在
.yaml
文件中,通过parameters.h
文件中的readParameters()
函数(该文件中只有这一个函数),将该文件中声明的所有变量赋值(这些变量定义在parameters.cpp
文件中!且变量名全部大写,然后使用extern
修饰并放在parameters.h
中,可以想象当该.h
文件被其他文件#include
则可以直接使用这些值了),而estimator.setParameter()
是从parameters.h
文件中获得相应的配置参数。 - 除此之外,
processThread = std::thread(&Estimator::processMeasurements, this);
开启了一个新线程。
最后,订阅了几个topic
,分别是IMU_TOPIC
,两个相机图像IMAGE0_TOPIC, IMAGE1_TOPIC
,和feature_tracker
所提供的跟踪光流点?
同时开启了一个新线程sync_process
。??线程的作用:如果图像buffer里面有数据的话,读入数据并且添加到estimator中。为什么不在相机图像的回调函数就input,我的理解在于对于双目的话,能够检测同步问题,能够将同样时间戳的两帧图片同时放入estimator中。所以对于Imu以及feature直接在回调函数中进行添加。
这里有几句