VINS-Mono无ROS版本代码阅读(2)

目录

2 后端线程

2.1 .h文件和.cpp文件的关系

2.2 void System::ProcessBackEnd()

(1)vector, ImgConstPtr>> measurements

(2)ImgConstPtr

IMG_MSG结构体

(3)unique_lock 多线程运行

(4)获取观测数据,包括imu数据和图像数据

(5)getMeasurements函数

while内部函数(1)

queue 定义

while内部函数(2)

这个函数的主要目的:获取观测数据:


2 后端线程

std::thread thd_BackEnd(&System::ProcessBackEnd, pSystem);

2.1 .h文件和.cpp文件的关系

参考:C++中的 .h 和 .cpp 区别详解_deeplan_1994的博客-CSDN博客_.cpp .h

总的来说,申明(declaration)写在.h文件,定义(definition)实现写在.cpp文件

头文件(.h)实现文件(.cpp)
  • 类的定义

  • 类函数成员和数据成员的申明(在类内部)

  • 类定义内的函数定义(相当于inline)

  • static const限定符的数据成员在类内部的初始化

  • inline限定符的类定义外的函数定义

  • 类函数成员的定义

  • 类带static限定符的数据成员的初始化

2.2 void System::ProcessBackEnd()

while(bStart_backend)//bStart_backend 在最开始定义为true
{

}
//该循环是函数内的大循环

(1)vector<pair<vector<ImuConstPtr>, ImgConstPtr>> measurements

vector<pair<vector<ImuConstPtr>, ImgConstPtr>> measurements;

vector<d> measurements;
d=pair<vector<ImuConstPtr>, ImgConstPtr>

pair<a, b>
a=vector<ImuConstPtr>
b=ImgConstPtr
std::vector<std::pair<std::vector<sensor_msgs::ImuConstPtr>, sensor_msgs::PointCloudConstPtr>> measurements;

estimator_node.cpp中getMeasurements()函数将对imu和图像数据进行初步对齐得到的数据结构,确保图像关联着对应时间戳内的所有IMU数据
sensor_msgs::PointCloudConstPtr 表示某一帧图像的feature_points
std::vector<sensor_msgs::ImuConstPtr> 表示当前帧和上一帧时间间隔中的所有IMU数据
将两者组合成一个数据结构,并构建元素为这种结构的vector进行存储

vector:表示对象的集合,是一个存放任意类型的动态数组 

此处定义了一个measurements的vector,里面存储了pair对,一个是vector(ImgConstptr)类型,一个是ImgConstptr类型。

该类型是一个指向IMG_MSG的动态指针。而IMG_MSG是一个结构体。

pair的用法:将2个数据组合成一组数据。具体参考:

C++ pair的基本用法总结(整理)_sevenjoin的博客-CSDN博客_c++ pair

C++中vector的基本方法_你的代码没bug的博客-CSDN博客

当我们只想存储pair对,不需要对其排序时,就可以用到vector,将pair对插入其中即可:

声明vector:
vector<pair<int,int> >vec

也就是说,vector(ImgConstptr)和ImgConstptr都属于一种类型

(2)ImgConstPtr

在头文件中

typedef std::shared_ptr <IMG_MSG const > ImgConstPtr;

定义了一个新类型ImgConstptr

之后应编一个程序用于测试,参考:typedef std::shared_ptr<Frame> Ptr理解_slam让我头疼的博客-CSDN博客

IMG_MSG结构体

struct IMG_MSG {
    double header;
    vector<Vector3d> points;
    vector<int> id_of_point;
    vector<float> u_of_point;
    vector<float> v_of_point;
    vector<float> velocity_x_of_point;
    vector<float> velocity_y_of_point;
};
typedef std::shared_ptr <IMG_MSG const > ImgConstPtr;

(3)unique_lock 多线程运行

unique_lock<mutex> lk(m_buf);

是个类模板,定义为:

std::unique_lock<std::mutex> munique(mlock);

其中mutex是一个类,它表示互斥量

这里还没看懂

(4)获取观测数据,包括imu数据和图像数据

con.wait(lk, [&] {
            return (measurements = getMeasurements()).size() != 0;
        });
        if( measurements.size() > 1){
        cout << "1 getMeasurements size: " << measurements.size() 
            << " imu sizes: " << measurements[0].first.size()
            << " feature_buf size: " <<  feature_buf.size()
            << " imu_buf size: " << imu_buf.size() << endl;
        }

//---------------代码分析:
return (measurements = getMeasurements()).size() != 0
return ().size() != 0 //如果满足返回的字符串长度不等于0
measurements = getMeasurements()

(5)进入到:getMeasurements函数

// 返回类型是vector<pair<vector<ImuConstPtr>, ImgConstPtr>>

vector<pair<vector<ImuConstPtr>, ImgConstPtr>> System::getMeasurements()
{
    vector<pair<vector<ImuConstPtr>, ImgConstPtr>> measurements;//定义一个vector

    while (true)
    {

    }
    return measurements;
}

while内部函数(1)

前面的几个if判断,都是用来判断图像数据和imu数据是不是都有的

        if (imu_buf.empty() || feature_buf.empty())
        {
            // cerr << "1 imu_buf.empty() || feature_buf.empty()" << endl;
            return measurements;
        }

queue 定义

    std::queue<ImuConstPtr> imu_buf;
    std::queue<ImgConstPtr> feature_buf;

参考:C++ queue(STL queue)用法详解

queue 模板类需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque 类型。

此处是定义了一个队列(也是一个容器,对于任何需要用 FIFO 准则处理的序列来说,使用 queue 容器适配器都是好的选择),一个队列里的类型是ImuConstPtr,动态指针类型,指向的是IMU_MSG这个结构体;第2个队列存储的是图像信息

C++队列Queue类成员函数如下:

back() 返回最后一个元素

empty() 如果队列空则返回真

front() 返回第一个元素

pop() 删除第一个元素

push() 在末尾加入一个元素

size() 返回队列中元素的个数

emplace_back():在容器尾部添加一个元素

while内部函数(2)

        ImgConstPtr img_msg = feature_buf.front();
        feature_buf.pop();

问题:什么时候给feature_buf赋值的???之后需要把代码一步一步的调一遍。

这里是把图像观测数据的第一个值(结构体)赋值给img_msg。

        vector<ImuConstPtr> IMUs;
        while (imu_buf.front()->header < img_msg->header + estimator.td)
        {
            IMUs.emplace_back(imu_buf.front());//这里把imu数据的顺序取反,存到了IMUS里面。
            imu_buf.pop();
        }

参考:细说C++(十一):成员访问运算符_GeniusIOTboy的博客-CSDN博客_c++成员访问运算符

箭头运算符“->”, ,箭头运算获取指针指向对象的成员  取结构体指针变量指向的元素值;箭头运算符作用一个指针的运算对象,结果为左值 

表达式ptr->men等价于(*ptr).mem:

header在什么时候的赋值呢?

这个函数的主要目的:获取观测数据:

 measurements.emplace_back(IMUs, img_msg);

(6)然后进入for循环中

另开一篇写

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值