Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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
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
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 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 }
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 }
00237 }