1. 输入IMU和相机信息
从上一节,我们知道主函数rosNodeTest.cpp从IMU和相机结点获取了IMU和相机的信息,并传入到位姿估计器 estimator中,使用的函数分别是
- inputIMU
- inputImage
1.1 inputIMU
1.1.1 fastPredictIMU
1.1.1.1 Utility::deltaQ
在更新旋转Q时,使用了函数Utility::deltaQ
- 在使用Eigen库的时候,常常会使用Curiously recurring template pattern,这个后续有待继续研究!!!!
- 函数deltaQ使用了一个函数模板,用四元数表示旋转,逻辑是按照公式3来的。MatrixBase在Eigen中是一个基类,使用模板不指定变量的具体类型的时侯可以使用该类。
- 函数deltaQ是一个静态成员函数,本质上就是一个全局函数,写在Utiliy这个类里是为了易于理解。
- Scalar_t: 矩阵中存储的类型 。
利用typename Derived::Scalar s 来声明变量s。
Eigen::Quaternion<Scalar_t>则表示四元数内的数据类型是Scalar_t即typename Derived::Scalar。
参考:http://www.360doc.com/content/17/1001/12/1489589_691553336.shtml
1.1.2 pubLatestOdometry
知识点 pair
- std::pair主要的作用是将两个数据组合成一个数据,两个数据可以是同一类型或者不同类型
- 容器类别map和multimap就是使用pairs来管理其健值/实值(key/value)的成对元素。
- 一般std::make_pair都使用在需要pair做参数的位置,可以直接调用make_pair生成pair对象
- std::pair<int, float>(1, 1.1);
std::make_pair(1, 1.1);
1.2 inputImage
1.2.1 FeatureTracker::trackImage
1.2.1.1 cv::goodFeaturesToTrack提取特征点
1.2.1.2 cv::calcOpticalFlowPyrLK 光流跟踪到特征点
1.2.1.3 把提取到的当前帧的特帧点信息构建featureFrame
1.2.1.4 在当前帧图像上标记特征点,并发布出去
1) drawTrack()
2) pubTrackImage()
思考
对以vins代码的解读,我现在的体会是:要从物理层面出发,从物理背景出发,这样才能更好地理解代码的整体架构。以trackImage()的代码为例子,如果从代码的第一行一步步解析到最后一行,这样很难体他的逻辑,只有站在较高的角度才能更好地解读他,把他先分成几个子功能模块,再分析这几个子功能模块的作用。只有这样的分析,才能更好地理解代码。