1、首先订阅IMU、图像信息
ros::Subscriber sub_imu = n.subscribe(IMU_TOPIC, 2000, imu_callback, ros::TransportHints().tcpNoDelay());
ros::Subscriber sub_image = n.subscribe("/feature_tracker/feature", 2000, feature_callback);
2、在imu_callback、feature_callback中将数据压入buffer
m_buf.lock();
imu_buf.push(imu_msg);
m_buf.unlock();
con.notify_one();
m_buf.lock();
feature_buf.push(feature_msg);
m_buf.unlock();
con.notify_one();
3、在measurements函数中对两个buffer的数据进行对齐,大致地找到一帧图像左右的imu
while (true)
{
if (imu_buf.empty() || feature_buf.empty())
return measurements;
if (!(imu_buf.back()->header.stamp.toSec() > feature_buf.front()->header.stamp.toSec() + estimator.td))
{
//ROS_WARN("wait for imu, only should happen at the beginning");
sum_of_wait++;
return measurements;
}
//总的趋势来看,img是夹杂在imu数据中间的
if (!(imu_buf.front()->header.stamp.toSec() < feature_buf.front()->header.stamp.toSec() + estimator.td))
{
ROS_WARN("throw img, only should happen at the beginning");
feature_buf.pop();
continue;
}
sensor_msgs::PointCloudConstPtr img_msg = feature_buf.front();
feature_buf.pop();
std::vector<sensor_msgs::ImuConstPtr> IMUs;
while (imu_buf.front()->header.stamp.toSec() < img_msg->header.stamp.toSec() + estimator.td)
{
IMUs.emplace_back(imu_buf.front());
imu_buf.pop();
}
IMUs.emplace_back(imu_buf.front());//IMU的数量要比图像的数量多1
if (IMUs.empty())
ROS_WARN("no imu between two image");
measurements.emplace_back(IMUs, img_msg);
}
return measurements;
}
4、在得到的测量中,对IMU数据预积分处理(可能需要线性差值处理),针对图像数据,进行初始化,或者正常的里程计解算。