Assets writer refactoring (#814)
The assets writing method was split into several calls to sub-routines. RunAssetsWriterPipeline now calls sub-routines creating objects from files and then runs the pipeline using the created objects. This should increase readability of the method.master
							parent
							
								
									b4e7705159
								
							
						
					
					
						commit
						08cf9f072c
					
				|  | @ -54,6 +54,57 @@ namespace { | |||
| constexpr char kTfStaticTopic[] = "/tf_static"; | ||||
| namespace carto = ::cartographer; | ||||
| 
 | ||||
| std::tuple<carto::mapping::proto::PoseGraph, | ||||
|            carto::mapping::proto::AllTrajectoryBuilderOptions> | ||||
| LoadPoseGraph(const std::string& pose_graph_filename) { | ||||
|   carto::mapping::proto::PoseGraph pose_graph_proto; | ||||
|   carto::mapping::proto::AllTrajectoryBuilderOptions | ||||
|       all_trajectory_builder_options; | ||||
| 
 | ||||
|   carto::io::ProtoStreamReader reader(pose_graph_filename); | ||||
|   CHECK(reader.ReadProto(&pose_graph_proto)); | ||||
|   CHECK(reader.ReadProto(&all_trajectory_builder_options)); | ||||
|   return std::make_tuple(pose_graph_proto, all_trajectory_builder_options); | ||||
| } | ||||
| 
 | ||||
| std::unique_ptr<carto::io::PointsProcessorPipelineBuilder> | ||||
| CreatePipelineBuilder( | ||||
|     const std::vector<carto::mapping::proto::Trajectory>& trajectories, | ||||
|     const std::string file_prefix) { | ||||
|   const auto file_writer_factory = [file_prefix](const std::string& filename) { | ||||
|     return carto::common::make_unique<carto::io::StreamFileWriter>(file_prefix + | ||||
|                                                                    filename); | ||||
|   }; | ||||
|   auto builder = | ||||
|       carto::common::make_unique<carto::io::PointsProcessorPipelineBuilder>(); | ||||
|   carto::io::RegisterBuiltInPointsProcessors(trajectories, file_writer_factory, | ||||
|                                              builder.get()); | ||||
|   builder->Register(RosMapWritingPointsProcessor::kConfigurationFileActionName, | ||||
|                     [file_writer_factory]( | ||||
|                         carto::common::LuaParameterDictionary* const dictionary, | ||||
|                         carto::io::PointsProcessor* const next) | ||||
|                         -> std::unique_ptr<carto::io::PointsProcessor> { | ||||
|                       return RosMapWritingPointsProcessor::FromDictionary( | ||||
|                           file_writer_factory, dictionary, next); | ||||
|                     }); | ||||
|   return builder; | ||||
| } | ||||
| 
 | ||||
| std::unique_ptr<carto::common::LuaParameterDictionary> CreateLuaDictionary( | ||||
|     const std::string& configuration_directory, | ||||
|     const std::string& configuration_basename) { | ||||
|   auto file_resolver = | ||||
|       carto::common::make_unique<carto::common::ConfigurationFileResolver>( | ||||
|           std::vector<std::string>{configuration_directory}); | ||||
| 
 | ||||
|   const std::string code = | ||||
|       file_resolver->GetFileContentOrDie(configuration_basename); | ||||
|   auto lua_parameter_dictionary = | ||||
|       carto::common::make_unique<carto::common::LuaParameterDictionary>( | ||||
|           code, std::move(file_resolver)); | ||||
|   return lua_parameter_dictionary; | ||||
| } | ||||
| 
 | ||||
| template <typename T> | ||||
| std::unique_ptr<carto::io::PointsBatch> HandleMessage( | ||||
|     const T& message, const std::string& tracking_frame, | ||||
|  | @ -66,8 +117,8 @@ std::unique_ptr<carto::io::PointsBatch> HandleMessage( | |||
|   points_batch->start_time = start_time; | ||||
|   points_batch->frame_id = message.header.frame_id; | ||||
| 
 | ||||
|   ::cartographer::sensor::PointCloudWithIntensities point_cloud; | ||||
|   ::cartographer::common::Time point_cloud_time; | ||||
|   carto::sensor::PointCloudWithIntensities point_cloud; | ||||
|   carto::common::Time point_cloud_time; | ||||
|   std::tie(point_cloud, point_cloud_time) = | ||||
|       ToPointCloudWithIntensities(message); | ||||
|   CHECK_EQ(point_cloud.intensities.size(), point_cloud.points.size()); | ||||
|  | @ -97,68 +148,12 @@ std::unique_ptr<carto::io::PointsBatch> HandleMessage( | |||
|   return points_batch; | ||||
| } | ||||
| 
 | ||||
| }  // namespace
 | ||||
| 
 | ||||
| void RunAssetsWriterPipeline(const std::string& pose_graph_filename, | ||||
|                              const std::vector<std::string>& bag_filenames, | ||||
|                              const std::string& configuration_directory, | ||||
|                              const std::string& configuration_basename, | ||||
|                              const std::string& urdf_filename, | ||||
|                              const std::string& output_file_prefix, | ||||
|                              const bool use_bag_transforms) { | ||||
|   auto file_resolver = | ||||
|       carto::common::make_unique<carto::common::ConfigurationFileResolver>( | ||||
|           std::vector<std::string>{configuration_directory}); | ||||
|   const std::string code = | ||||
|       file_resolver->GetFileContentOrDie(configuration_basename); | ||||
|   carto::common::LuaParameterDictionary lua_parameter_dictionary( | ||||
|       code, std::move(file_resolver)); | ||||
| 
 | ||||
|   carto::io::ProtoStreamReader reader(pose_graph_filename); | ||||
|   carto::mapping::proto::PoseGraph pose_graph_proto; | ||||
|   CHECK(reader.ReadProto(&pose_graph_proto)); | ||||
|   ::cartographer::mapping::proto::AllTrajectoryBuilderOptions | ||||
|       all_trajectory_builder_options; | ||||
|   CHECK(reader.ReadProto(&all_trajectory_builder_options)); | ||||
|   CHECK_EQ(pose_graph_proto.trajectory_size(), bag_filenames.size()) | ||||
|       << "Pose graphs contains " << pose_graph_proto.trajectory_size() | ||||
|       << " trajectories while " << bag_filenames.size() | ||||
|       << " bags were provided. This tool requires one bag for each " | ||||
|          "trajectory in the same order as the correponding trajectories in the " | ||||
|          "pose graph proto."; | ||||
| 
 | ||||
|   const std::string file_prefix = !output_file_prefix.empty() | ||||
|                                       ? output_file_prefix | ||||
|                                       : bag_filenames.front() + "_"; | ||||
|   const auto file_writer_factory = [file_prefix](const std::string& filename) { | ||||
|     return carto::common::make_unique<carto::io::StreamFileWriter>(file_prefix + | ||||
|                                                                    filename); | ||||
|   }; | ||||
| 
 | ||||
|   // This vector must outlive the pipeline.
 | ||||
|   std::vector<::cartographer::mapping::proto::Trajectory> all_trajectories( | ||||
|       pose_graph_proto.trajectory().begin(), | ||||
|       pose_graph_proto.trajectory().end()); | ||||
| 
 | ||||
|   carto::io::PointsProcessorPipelineBuilder builder; | ||||
|   carto::io::RegisterBuiltInPointsProcessors(all_trajectories, | ||||
|                                              file_writer_factory, &builder); | ||||
|   builder.Register( | ||||
|       RosMapWritingPointsProcessor::kConfigurationFileActionName, | ||||
|       [file_writer_factory]( | ||||
|           ::cartographer::common::LuaParameterDictionary* const dictionary, | ||||
|           ::cartographer::io::PointsProcessor* const next) | ||||
|           -> std::unique_ptr<::cartographer::io::PointsProcessor> { | ||||
|         return RosMapWritingPointsProcessor::FromDictionary(file_writer_factory, | ||||
|                                                             dictionary, next); | ||||
|       }); | ||||
| 
 | ||||
|   std::vector<std::unique_ptr<carto::io::PointsProcessor>> pipeline = | ||||
|       builder.CreatePipeline( | ||||
|           lua_parameter_dictionary.GetDictionary("pipeline").get()); | ||||
| 
 | ||||
|   const std::string tracking_frame = | ||||
|       lua_parameter_dictionary.GetString("tracking_frame"); | ||||
| void RunPipeline( | ||||
|     const std::vector<std::unique_ptr<carto::io::PointsProcessor>>& pipeline, | ||||
|     const std::vector<std::string>& bag_filenames, | ||||
|     const carto::mapping::proto::PoseGraph& pose_graph_proto, | ||||
|     const std::string tracking_frame, const std::string& urdf_filename, | ||||
|     const bool use_bag_transforms) { | ||||
|   do { | ||||
|     for (size_t trajectory_id = 0; trajectory_id < bag_filenames.size(); | ||||
|          ++trajectory_id) { | ||||
|  | @ -241,4 +236,47 @@ void RunAssetsWriterPipeline(const std::string& pose_graph_filename, | |||
|            carto::io::PointsProcessor::FlushResult::kRestartStream); | ||||
| } | ||||
| 
 | ||||
| }  // namespace
 | ||||
| 
 | ||||
| void RunAssetsWriterPipeline(const std::string& pose_graph_filename, | ||||
|                              const std::vector<std::string>& bag_filenames, | ||||
|                              const std::string& configuration_directory, | ||||
|                              const std::string& configuration_basename, | ||||
|                              const std::string& urdf_filename, | ||||
|                              const std::string& output_file_prefix, | ||||
|                              const bool use_bag_transforms) { | ||||
|   carto::mapping::proto::PoseGraph pose_graph_proto; | ||||
|   carto::mapping::proto::AllTrajectoryBuilderOptions | ||||
|       all_trajectory_builder_options; | ||||
|   std::tie(pose_graph_proto, all_trajectory_builder_options) = | ||||
|       LoadPoseGraph(pose_graph_filename); | ||||
| 
 | ||||
|   CHECK_EQ(pose_graph_proto.trajectory_size(), bag_filenames.size()) | ||||
|       << "Pose graphs contains " << pose_graph_proto.trajectory_size() | ||||
|       << " trajectories while " << bag_filenames.size() | ||||
|       << " bags were provided. This tool requires one bag for each " | ||||
|          "trajectory in the same order as the correponding trajectories in the " | ||||
|          "pose graph proto."; | ||||
| 
 | ||||
|   // This vector must outlive the pipeline.
 | ||||
|   std::vector<carto::mapping::proto::Trajectory> all_trajectories( | ||||
|       pose_graph_proto.trajectory().begin(), | ||||
|       pose_graph_proto.trajectory().end()); | ||||
|   const std::string& file_prefix = !output_file_prefix.empty() | ||||
|                                        ? output_file_prefix | ||||
|                                        : bag_filenames.front() + "_"; | ||||
|   auto pipeline_builder = CreatePipelineBuilder(all_trajectories, file_prefix); | ||||
| 
 | ||||
|   auto lua_parameter_dictionary = | ||||
|       CreateLuaDictionary(configuration_directory, configuration_basename); | ||||
|   std::vector<std::unique_ptr<carto::io::PointsProcessor>> pipeline = | ||||
|       pipeline_builder->CreatePipeline( | ||||
|           lua_parameter_dictionary->GetDictionary("pipeline").get()); | ||||
|   const std::string& tracking_frame = | ||||
|       lua_parameter_dictionary->GetString("tracking_frame"); | ||||
| 
 | ||||
|   RunPipeline(pipeline, bag_filenames, pose_graph_proto, tracking_frame, | ||||
|               urdf_filename, use_bag_transforms); | ||||
| } | ||||
| 
 | ||||
| }  // namespace cartographer_ros
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue