processMeasurements()
取出数据
将 featureBuf中,最早帧的feature取出:feature = featureBuf.front()
。
节点的接收IMU的消息再imu_callback中被放到了accBuf
和gryBuf
里,以{t,值}的形式存储。
上一帧时间为prevTime,本帧的时间为curTime,用getIMUInterval()
将该时间段内的IMU数据取出来存到accVector, gyrVector
中(然后Buf就pop掉取过的):
getIMUInterval(prevTime, curTime, accVector, gyrVector);
初始化
如果尚未对IMU初始化,先用initFirstIMUPose(accVector)
对齐重力,详见initFirstIMUPose
imu预积分
然后IMU预积分(输入为:时间 时间间隔 加速度(就当前一个值) 角速度(就一个值)),详见processIMU
for(size_t i = 0; i < accVector.size(); i++)IMU预积分(prevTime到curTime之间)
{
dt = accVector[i].first - accVector[i - 1].first;//求两个imu测量的时间间隔
processIMU(accVector[i].first, dt, accVector[i].second, gyrVector[i].second)
}
vins剩余部分
然后处理图像,包括检测关键帧,估计外部参数,初始化,状态估计,划窗等等,详见processImage
processImage(feature.second, feature.first)//输入:[id(id,xyz_uv_vxvy)], 时间
processImage得到位姿之后,进行发布
pubOdometry(*this, header); //odom和path,即Ps[WINDOW_SIZE]
pubKeyPoses(*this, header); //本次优化的10个关键帧位姿
pubCameraPose(*this, header); //WINDOW_SIZE - 1的相机位姿
pubPointCloud(*this, header); //所有的特征点
pubKeyframe(*this); //WINDOW_SIZE - 2的odom、出现次数满足要求的特征点
pubTF(*this, header); //发布Ps[WINDOW_SIZE],Rs[WINDOW_SIZE];