1.processImg前的数据操作
TicToc t_s;
map<int, vector<pair<int, Eigen::Matrix<double, 7, 1>>>> image;
//遍历img_msg中的特征点
for (unsigned int i = 0; i < img_msg->points.size(); i++)
{
int v = img_msg->channels[0].values[i] + 0.5;
int feature_id = v / NUM_OF_CAM;
int camera_id = v % NUM_OF_CAM;
//获取img_msg中第i个点的x,y,z坐标,这个是归一化后的坐标值
double x = img_msg->points[i].x;
double y = img_msg->points[i].y;
double z = img_msg->points[i].z;
//获取像素的坐标值
double p_u = img_msg->channels[1].values[i];
double p_v = img_msg->channels[2].values[i];
//获取像素点在x,y方向上的速度
double velocity_x = img_msg->channels[3].values[i];
double velocity_y = img_msg->channels[4].values[i];
ROS_ASSERT(z == 1);
Eigen::Matrix<double, 7, 1> xyz_uv_velocity;
xyz_uv_velocity << x, y, z, p_u, p_v, velocity_x, velocity_y;
//建立每个特征点的image map,索引为feature_id
//image中每个特征点在帧中的位置信息和坐标轴上的速度信息按照feature_id为索引存入image中
image[feature_id].emplace_back(camera_id, xyz_uv_velocity);
}
//图像特征处理,包括初始化和非线性优化
将特征点id、camera_id(哪个camera拍的)、该特征点在三维世界中的x,y,z坐标值、该特征点在二维图像帧中的像素坐标值u,v、该特征点在像素坐标上x,y方向上的速度。将这些属性组织起来按照特征点的id值为index存放在map类型中,然后调用processImage的时候将image作为参数传入。
2.processImg主要流程