cartographer MapBuilder

所处:

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

猜你喜欢

转载自blog.csdn.net/xiaoma_bk/article/details/81368229
今日推荐