所处:
MapBuilder cartographer/mapping/map_builder.cc /.h中
MapBuilder 类在 node_main.cc(主函数) 中 Run()函数中被构造
主要函数:
1.LoadState
被 map_builder_bridge.cc调用 map_builder_->LoadState(&stream, load_frozen_state);
std::map<int, int> MapBuilder::LoadState(
io::ProtoStreamReaderInterface* const reader, bool load_frozen_state)
1、定义 io::ProtoStreamDeserializer 对象
2、创建一个pose_graph_proto(类型proto::PoseGraph)的副本,这样我们就可以重新编写了轨迹ids。
3、mapping::proto::AllTrajectoryBuilderOptions 定义all_builder_options_proto 变量
4、根据保存地图的总共ID ,保存的数据进行重新生成新的轨迹id, 并且使用这些轨迹id进行轨迹重建
5、如果加载的数据是冻结的,我们将data_(PoseGraphData)中轨迹的状态设置成 TrajectoryState::FROZEN
6、根据.pbstream中保存的约束,将轨迹中重新加载约束
7、加载node_poses submap_poses.Insert(SubmapId{trajectory_proto.trajectory_id(),
submap_proto.submap_index()},
transform::ToRigid3(submap_proto.pose()));
8、加载node_poses node_poses.Insert(
NodeId{trajectory_proto.trajectory_id(), node_proto.node_index()},
transform::ToRigid3(node_proto.pose()));
9、设置全局landmarks pose
10、加载一系列的数据 SerializedData::kPoseGraph || SerializedData::kAllTrajectoryBuilderOptions ||
case SerializedData::kSubmap || SerializedData::kNode || SerializedData::kTrajectoryData ||
SerializedData::kImuData || SerializedData::kOdometryData SerializedData::kFixedFramePoseData ||
SerializedData::kLandmarkData
11、如果是冻结状态 AddNodeToSubmap添加有关哪些节点属于哪个子图的信息。 3D纯粹本地化需要。
当加载未冻结的轨迹时,'AddSerializedConstraints'会负责添加有关哪些节点属于哪个节点的信息子图。
2.AddTrajectoryBuilder
int MapBuilder::AddTrajectoryBuilder(
const std::set<SensorId>& expected_sensor_ids,
const proto::TrajectoryBuilderOptions& trajectory_options,
LocalSlamResultCallback local_slam_result_callback)
1、计算但他跟前添加的轨迹id = trajectory_builders_.size()
2、判断是2d还是3d,我们这儿是二维
3、定于LocalTrajectoryBuilder2D 对象指针,并且进行构造 //局部slam
4、push一个CollatorInterface整理传感器数据,然后将其传递给一个map :: TrajectoryBuilderInterface,
在此过程中创建了 CreateGlobalTrajectoryBuilder2D(std::move(local_trajectory_builder), trajectory_id, static_cast<PoseGraph2D*>(pose_graph_.get()), local_slam_result_callback))
5、如果子图有重叠的部分时,进行修剪
6、2 if 判断完成,可能需要添加纯被地话的修剪器
7、如果轨迹位姿有初值,我们设置轨迹的初值
pose_graph_->SetInitialTrajectoryPose( trajectory_id, initial_trajectory_pose.to_trajectory_id(),
transform::ToRigid3(initial_trajectory_pose.relative_pose()),common::FromUniversal(initial_trajectory_pose.timestamp()));
8、options_with_sensor_ids_proto.add_sensor_id() = ToProto(sensor_id);
9、返回轨迹的ID trajectory_id