mapping_state_serialization.cc
Go to the documentation of this file.
00001 /*
00002  * Copyright 2018 The Cartographer Authors
00003  *
00004  * Licensed under the Apache License, Version 2.0 (the "License");
00005  * you may not use this file except in compliance with the License.
00006  * You may obtain a copy of the License at
00007  *
00008  *      http://www.apache.org/licenses/LICENSE-2.0
00009  *
00010  * Unless required by applicable law or agreed to in writing, software
00011  * distributed under the License is distributed on an "AS IS" BASIS,
00012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013  * See the License for the specific language governing permissions and
00014  * limitations under the License.
00015  */
00016 
00017 #include "cartographer/io/internal/mapping_state_serialization.h"
00018 
00019 #include "cartographer/mapping/proto/serialization.pb.h"
00020 #include "cartographer/transform/transform.h"
00021 
00022 namespace cartographer {
00023 namespace io {
00024 namespace {
00025 using mapping::MapById;
00026 using mapping::NodeId;
00027 using mapping::PoseGraphInterface;
00028 using mapping::SubmapId;
00029 using mapping::TrajectoryNode;
00030 using mapping::proto::SerializedData;
00031 
00032 mapping::proto::AllTrajectoryBuilderOptions
00033 CreateAllTrajectoryBuilderOptionsProto(
00034     const std::vector<mapping::proto::TrajectoryBuilderOptionsWithSensorIds>&
00035         all_options_with_sensor_ids,
00036     const std::vector<int>& trajectory_ids_to_serialize) {
00037   mapping::proto::AllTrajectoryBuilderOptions all_options_proto;
00038   for (auto id : trajectory_ids_to_serialize) {
00039     *all_options_proto.add_options_with_sensor_ids() =
00040         all_options_with_sensor_ids[id];
00041   }
00042   return all_options_proto;
00043 }
00044 
00045 // Will return all trajectory ids, that have `state != DELETED`.
00046 std::vector<int> GetValidTrajectoryIds(
00047     const std::map<int, PoseGraphInterface::TrajectoryState>&
00048         trajectory_states) {
00049   std::vector<int> valid_trajectories;
00050   for (const auto& t : trajectory_states) {
00051     if (t.second != PoseGraphInterface::TrajectoryState::DELETED) {
00052       valid_trajectories.push_back(t.first);
00053     }
00054   }
00055   return valid_trajectories;
00056 }
00057 
00058 mapping::proto::SerializationHeader CreateHeader() {
00059   mapping::proto::SerializationHeader header;
00060   header.set_format_version(kMappingStateSerializationFormatVersion);
00061   return header;
00062 }
00063 
00064 SerializedData SerializePoseGraph(const mapping::PoseGraph& pose_graph,
00065                                   bool include_unfinished_submaps) {
00066   SerializedData proto;
00067   *proto.mutable_pose_graph() = pose_graph.ToProto(include_unfinished_submaps);
00068   return proto;
00069 }
00070 
00071 SerializedData SerializeTrajectoryBuilderOptions(
00072     const std::vector<mapping::proto::TrajectoryBuilderOptionsWithSensorIds>&
00073         trajectory_builder_options,
00074     const std::vector<int>& trajectory_ids_to_serialize) {
00075   SerializedData proto;
00076   *proto.mutable_all_trajectory_builder_options() =
00077       CreateAllTrajectoryBuilderOptionsProto(trajectory_builder_options,
00078                                              trajectory_ids_to_serialize);
00079   return proto;
00080 }
00081 
00082 void SerializeSubmaps(
00083     const MapById<SubmapId, PoseGraphInterface::SubmapData>& submap_data,
00084     bool include_unfinished_submaps, ProtoStreamWriterInterface* const writer) {
00085   // Next serialize all submaps.
00086   for (const auto& submap_id_data : submap_data) {
00087     if (!include_unfinished_submaps &&
00088         !submap_id_data.data.submap->insertion_finished()) {
00089       continue;
00090     }
00091     SerializedData proto;
00092     auto* const submap_proto = proto.mutable_submap();
00093     *submap_proto = submap_id_data.data.submap->ToProto(
00094         /*include_probability_grid_data=*/true);
00095     submap_proto->mutable_submap_id()->set_trajectory_id(
00096         submap_id_data.id.trajectory_id);
00097     submap_proto->mutable_submap_id()->set_submap_index(
00098         submap_id_data.id.submap_index);
00099     writer->WriteProto(proto);
00100   }
00101 }
00102 
00103 void SerializeTrajectoryNodes(
00104     const MapById<NodeId, TrajectoryNode>& trajectory_nodes,
00105     ProtoStreamWriterInterface* const writer) {
00106   for (const auto& node_id_data : trajectory_nodes) {
00107     SerializedData proto;
00108     auto* const node_proto = proto.mutable_node();
00109     node_proto->mutable_node_id()->set_trajectory_id(
00110         node_id_data.id.trajectory_id);
00111     node_proto->mutable_node_id()->set_node_index(node_id_data.id.node_index);
00112     *node_proto->mutable_node_data() =
00113         ToProto(*node_id_data.data.constant_data);
00114     writer->WriteProto(proto);
00115   }
00116 }
00117 
00118 void SerializeTrajectoryData(
00119     const std::map<int, PoseGraphInterface::TrajectoryData>&
00120         all_trajectory_data,
00121     ProtoStreamWriterInterface* const writer) {
00122   for (const auto& trajectory_data : all_trajectory_data) {
00123     SerializedData proto;
00124     auto* const trajectory_data_proto = proto.mutable_trajectory_data();
00125     trajectory_data_proto->set_trajectory_id(trajectory_data.first);
00126     trajectory_data_proto->set_gravity_constant(
00127         trajectory_data.second.gravity_constant);
00128     *trajectory_data_proto->mutable_imu_calibration() = transform::ToProto(
00129         Eigen::Quaterniond(trajectory_data.second.imu_calibration[0],
00130                            trajectory_data.second.imu_calibration[1],
00131                            trajectory_data.second.imu_calibration[2],
00132                            trajectory_data.second.imu_calibration[3]));
00133     if (trajectory_data.second.fixed_frame_origin_in_map.has_value()) {
00134       *trajectory_data_proto->mutable_fixed_frame_origin_in_map() =
00135           transform::ToProto(
00136               trajectory_data.second.fixed_frame_origin_in_map.value());
00137     }
00138     writer->WriteProto(proto);
00139   }
00140 }
00141 
00142 void SerializeImuData(const sensor::MapByTime<sensor::ImuData>& all_imu_data,
00143                       ProtoStreamWriterInterface* const writer) {
00144   for (const int trajectory_id : all_imu_data.trajectory_ids()) {
00145     for (const auto& imu_data : all_imu_data.trajectory(trajectory_id)) {
00146       SerializedData proto;
00147       auto* const imu_data_proto = proto.mutable_imu_data();
00148       imu_data_proto->set_trajectory_id(trajectory_id);
00149       *imu_data_proto->mutable_imu_data() = sensor::ToProto(imu_data);
00150       writer->WriteProto(proto);
00151     }
00152   }
00153 }
00154 
00155 void SerializeOdometryData(
00156     const sensor::MapByTime<sensor::OdometryData>& all_odometry_data,
00157     ProtoStreamWriterInterface* const writer) {
00158   for (const int trajectory_id : all_odometry_data.trajectory_ids()) {
00159     for (const auto& odometry_data :
00160          all_odometry_data.trajectory(trajectory_id)) {
00161       SerializedData proto;
00162       auto* const odometry_data_proto = proto.mutable_odometry_data();
00163       odometry_data_proto->set_trajectory_id(trajectory_id);
00164       *odometry_data_proto->mutable_odometry_data() =
00165           sensor::ToProto(odometry_data);
00166       writer->WriteProto(proto);
00167     }
00168   }
00169 }
00170 
00171 void SerializeFixedFramePoseData(
00172     const sensor::MapByTime<sensor::FixedFramePoseData>&
00173         all_fixed_frame_pose_data,
00174     ProtoStreamWriterInterface* const writer) {
00175   for (const int trajectory_id : all_fixed_frame_pose_data.trajectory_ids()) {
00176     for (const auto& fixed_frame_pose_data :
00177          all_fixed_frame_pose_data.trajectory(trajectory_id)) {
00178       SerializedData proto;
00179       auto* const fixed_frame_pose_data_proto =
00180           proto.mutable_fixed_frame_pose_data();
00181       fixed_frame_pose_data_proto->set_trajectory_id(trajectory_id);
00182       *fixed_frame_pose_data_proto->mutable_fixed_frame_pose_data() =
00183           sensor::ToProto(fixed_frame_pose_data);
00184       writer->WriteProto(proto);
00185     }
00186   }
00187 }
00188 
00189 void SerializeLandmarkNodes(
00190     const std::map<std::string, PoseGraphInterface::LandmarkNode>&
00191         all_landmark_nodes,
00192     ProtoStreamWriterInterface* const writer) {
00193   for (const auto& node : all_landmark_nodes) {
00194     for (const auto& observation : node.second.landmark_observations) {
00195       SerializedData proto;
00196       auto* landmark_data_proto = proto.mutable_landmark_data();
00197       landmark_data_proto->set_trajectory_id(observation.trajectory_id);
00198       landmark_data_proto->mutable_landmark_data()->set_timestamp(
00199           common::ToUniversal(observation.time));
00200       auto* observation_proto = landmark_data_proto->mutable_landmark_data()
00201                                     ->add_landmark_observations();
00202       observation_proto->set_id(node.first);
00203       *observation_proto->mutable_landmark_to_tracking_transform() =
00204           transform::ToProto(observation.landmark_to_tracking_transform);
00205       observation_proto->set_translation_weight(observation.translation_weight);
00206       observation_proto->set_rotation_weight(observation.rotation_weight);
00207       writer->WriteProto(proto);
00208     }
00209   }
00210 }
00211 
00212 }  // namespace
00213 
00214 void WritePbStream(
00215     const mapping::PoseGraph& pose_graph,
00216     const std::vector<mapping::proto::TrajectoryBuilderOptionsWithSensorIds>&
00217         trajectory_builder_options,
00218     ProtoStreamWriterInterface* const writer, bool include_unfinished_submaps) {
00219   writer->WriteProto(CreateHeader());
00220   writer->WriteProto(
00221       SerializePoseGraph(pose_graph, include_unfinished_submaps));
00222   writer->WriteProto(SerializeTrajectoryBuilderOptions(
00223       trajectory_builder_options,
00224       GetValidTrajectoryIds(pose_graph.GetTrajectoryStates())));
00225 
00226   SerializeSubmaps(pose_graph.GetAllSubmapData(), include_unfinished_submaps,
00227                    writer);
00228   SerializeTrajectoryNodes(pose_graph.GetTrajectoryNodes(), writer);
00229   SerializeTrajectoryData(pose_graph.GetTrajectoryData(), writer);
00230   SerializeImuData(pose_graph.GetImuData(), writer);
00231   SerializeOdometryData(pose_graph.GetOdometryData(), writer);
00232   SerializeFixedFramePoseData(pose_graph.GetFixedFramePoseData(), writer);
00233   SerializeLandmarkNodes(pose_graph.GetLandmarkNodes(), writer);
00234 }
00235 
00236 }  // namespace io
00237 }  // namespace cartographer


cartographer
Author(s): The Cartographer Authors
autogenerated on Thu May 9 2019 02:27:35