一、feature_tracker总体流程图解
先给出一张feature_tracker的总体流程图,让自己有一个全局意识。这张图真好,感谢原作者。基本这就是feature_tracker这个node搞的事情啦!重点关注它,对! 就是它!
图片转自:https://blog.csdn.net/qq_41839222/article/details/85797156
二、main()函数分析
开始进入feature_tracker–>src文件夹可以看到,里面的文件共6个,先看feature_tracker_node.cpp中的主函数main()
int main(int argc, char **argv)
{
//【1】初始化,设置句柄,设置logger级别
ros::init(argc, argv, "feature_tracker");
ros::NodeHandle n("~");
ros::console::set_logger_level(ROSCONSOLE_DEFAULT_NAME, ros::console::levels::Info);
//【2】从config-->euroc-->euroc_config.yaml文件中读取参数,包括话题,图像宽高,追踪的特征点数量等等
readParameters(n);
//【3】循环读取每个相机的内参
for (int i = 0; i < NUM_OF_CAM; i++) //NUM_OF_CAM=1
trackerData[i].readIntrinsicParameter(CAM_NAMES[i]);
//【4】如果是鱼眼相机,添加mask去除边缘噪声
if(FISHEYE)
{
for (int i = 0; i < NUM_OF_CAM; i++)
{
trackerData[i].fisheye_mask = cv::imread(FISHEYE_MASK, 0);
if(!trackerData[i].fisheye_mask.data)
{
ROS_INFO("load mask fail");
ROS_BREAK();
}
else
ROS_INFO("load mask success");
}
}
//【5】订阅话题IMAGE_TOPIC(/cam0/image_raw),执行回调函数img_callback
ros::Subscriber sub_img = n.subscribe(IMAGE_TOPIC, 100, img_callback);//当订阅的topic有新的信息时,激活回调函数
//【6】发布feature,实例feature_points,跟踪的特征点,给后端优化用
//发布feature_img,实例ptr,跟踪的特征点图,给RVIZ用和调试用
//发布restart
pub_img = n.advertise<sensor_msgs::PointCloud>("feature", 1000);
pub_match = n.advertise<sensor_msgs::Image>("feature_img",1000);
pub_restart = n.advertise<std_msgs::Bool>("restart",1000);
/*
if (SHOW_TRACK)
cv::namedWindow("vis", cv::WINDOW_NORMAL);
*/
ros::spin();//ros::spin() 在调用后不会再返回,也就是主程序到这儿就不往下执行了
return 0;
}
上面每一步都给出了详细的注释,其中步骤【2】读取参数的函数readParameters()如下:
void readParameters(ros::NodeHandle &n)
{
std::string config_file;
config_file = readParam<std::string>(n, "config_file");//ans-->config_file
std::cout&