上一节最多的是mian函数,run()函数如何从配置文件中获取配置参数,这一篇继续分析run(),由于刚开始深入接触cartographer,知识比较分散,后期整体代码吃透后再更新,还请读者谅解,多提问题,共同进步。
1.map_builder
cartographer::mapping::MapBuilder;cartographer::mapping::MapBuilder这个类在/src/cartographer/cartographer/mapping/map_builder.h中定义。牵涉cartographer内部核心,在这里大致分析
auto map_builder = absl::make_unique<cartographer::mapping::MapBuilder>(
//auto关键字:auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型,类似的关键字还有decltype。举个例子:int a = 10;auto au_a = a;//自动类型推断,au_a为int类型; cout << typeid(au_a).name() << endl;
node_options.map_builder_options);//cartographer::common::make_unique定义在common文件夹下的make_unique.h文件中。
//构造map_buider
auto map_builder = absl::make_unique<cartographer::mapping::MapBuilder>( //auto关键字:auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型,类似的关键字还有decltype。举个例子:int a = 10;auto au_a = a;//自动类型推断,au_a为int类型; cout << typeid(au_a).name() << endl;
node_options.map_builder_options);//cartographer::common::make_unique定义在common文件夹下的make_unique.h文件中。
//构造node
Node node(node_options, std::move(map_builder), &tf_buffer,//Node在/cartographer_ros/cartographer_ros/cartographer/node.h中定义;在该构造函数中订阅了很多传感器的topic。收集传感器数据
FLAGS_collect_metrics);
//从proto中加载之前离线保存的state(pbstream文件)
if (!FLAGS_load_state_filename.empty()) {
node.LoadState(FLAGS_load_state_filename, FLAGS_load_frozen_state);//加载数据包数据
}
// 以默认topics启动node,执行任务
if (FLAGS_start_trajectory_with_default_topics) {
node.StartTrajectoryWithDefaultTopics(trajectory_options);
}
/**
* ros::spin() 将会进入循环, 一直调用回调函数chatterCallback(),
*/
::ros::spin();
node.FinishAllTrajectories();//在node结束时执行的任务,任务1,finish trajectory
//node.RunFinalOptimization();//任务2.最终优化(最后一次优化)
if (!FLAGS_save_state_filename.empty()) { //任务3如果指定保存的最终状态,将PoseGraphbaoz保存下来
node.SerializeState(FLAGS_save_state_filename,
true /* include_unfinished_submaps */);
}
代码量确实过大,后续先分析核心代码流程后再对这部分详细补充
-----------------------------------------------------------------
参考文献