目录
2.2 void System::ProcessBackEnd()
(1)vector, ImgConstPtr>> measurements
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) |
|
|
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;
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循环中
另开一篇写