MapBuilder包含前端(TrajectoryBuilders,scan to submap) 与 后端(用于查找回环的PoseGraph) 的完整的SLAM,其位置位于cartographer/mapping/map_builder.h
本文将简要介绍一下他的构造函数,大致内容为
- 保存配置参数,
- 根据给定的参数初始化线程池,
- 初始化posegraph 与sensorcollator
下面为构造函数的全部代码内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| MapBuilder::MapBuilder(const proto::MapBuilderOptions& options) : options_(options), thread_pool_(options.num_background_threads()) { CHECK(options.use_trajectory_builder_2d() ^ options.use_trajectory_builder_3d());
if (options.use_trajectory_builder_2d()) { pose_graph_ = absl::make_unique<PoseGraph2D>( options_.pose_graph_options(), absl::make_unique<optimization::OptimizationProblem2D>( options_.pose_graph_options().optimization_problem_options()), &thread_pool_); } if (options.use_trajectory_builder_3d()) { pose_graph_ = absl::make_unique<PoseGraph3D>( options_.pose_graph_options(), absl::make_unique<optimization::OptimizationProblem3D>( options_.pose_graph_options().optimization_problem_options()), &thread_pool_); }
if (options.collate_by_trajectory()) { sensor_collator_ = absl::make_unique<sensor::TrajectoryCollator>(); } else { sensor_collator_ = absl::make_unique<sensor::Collator>(); } }
|
代码解析
^
为异或操作,只有两个数不一样才会返回true。因此use_trajectory_builder_2d和use_trajectory_builder_3d中必须要有一个为true。并且也不可以同时为true或者为false。
1 2
| CHECK(options.use_trajectory_builder_2d() ^ options.use_trajectory_builder_3d());
|
后续根据是2d还是3d建立不同的pose_graph。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| if (options.use_trajectory_builder_2d()) { pose_graph_ = absl::make_unique<PoseGraph2D>( options_.pose_graph_options(), absl::make_unique<optimization::OptimizationProblem2D>( options_.pose_graph_options().optimization_problem_options()), &thread_pool_); }
if (options.use_trajectory_builder_3d()) { pose_graph_ = absl::make_unique<PoseGraph3D>( options_.pose_graph_options(), absl::make_unique<optimization::OptimizationProblem3D>( options_.pose_graph_options().optimization_problem_options()), &thread_pool_); }
|
可以看到map_builder在进行构造的时候,是在node_main.cc的时候,后端就可以构造了,还没有传感器数据输入的时候,后端已经初始化好了,四个线程也已经在执行了
后续对sensor_collator进行设置, 而options.collate_by_trajectory()是定义在map_builder.lua文件中,一般不需要配置,因此他实际使用的是absl::make_unique<sensor::Collator>()
1 2 3 4 5 6 7 8
|
if (options.collate_by_trajectory()) { sensor_collator_ = absl::make_unique<sensor::TrajectoryCollator>(); } else { sensor_collator_ = absl::make_unique<sensor::Collator>(); }
|