diff --git a/cartographer/mapping/collated_trajectory_builder.cc b/cartographer/mapping/collated_trajectory_builder.cc index 6b41222..74e386a 100644 --- a/cartographer/mapping/collated_trajectory_builder.cc +++ b/cartographer/mapping/collated_trajectory_builder.cc @@ -46,15 +46,6 @@ CollatedTrajectoryBuilder::CollatedTrajectoryBuilder( CollatedTrajectoryBuilder::~CollatedTrajectoryBuilder() {} -int CollatedTrajectoryBuilder::num_submaps() { - return wrapped_trajectory_builder_->num_submaps(); -} - -TrajectoryBuilder::SubmapData CollatedTrajectoryBuilder::GetSubmapData( - const int submap_index) { - return wrapped_trajectory_builder_->GetSubmapData(submap_index); -} - const TrajectoryBuilder::PoseEstimate& CollatedTrajectoryBuilder::pose_estimate() const { return wrapped_trajectory_builder_->pose_estimate(); diff --git a/cartographer/mapping/collated_trajectory_builder.h b/cartographer/mapping/collated_trajectory_builder.h index 1b1f13c..1f14ea6 100644 --- a/cartographer/mapping/collated_trajectory_builder.h +++ b/cartographer/mapping/collated_trajectory_builder.h @@ -49,8 +49,6 @@ class CollatedTrajectoryBuilder : public TrajectoryBuilder { CollatedTrajectoryBuilder& operator=(const CollatedTrajectoryBuilder&) = delete; - int num_submaps() override; - SubmapData GetSubmapData(int submap_index) override; const PoseEstimate& pose_estimate() const override; void AddSensorData(const string& sensor_id, diff --git a/cartographer/mapping/global_trajectory_builder_interface.h b/cartographer/mapping/global_trajectory_builder_interface.h index abc4d4d..9f6e895 100644 --- a/cartographer/mapping/global_trajectory_builder_interface.h +++ b/cartographer/mapping/global_trajectory_builder_interface.h @@ -39,7 +39,6 @@ namespace mapping { class GlobalTrajectoryBuilderInterface { public: using PoseEstimate = TrajectoryBuilder::PoseEstimate; - using SubmapData = TrajectoryBuilder::SubmapData; GlobalTrajectoryBuilderInterface() {} virtual ~GlobalTrajectoryBuilderInterface() {} @@ -49,8 +48,6 @@ class GlobalTrajectoryBuilderInterface { GlobalTrajectoryBuilderInterface& operator=( const GlobalTrajectoryBuilderInterface&) = delete; - virtual int num_submaps() = 0; - virtual SubmapData GetSubmapData(int submap_index) = 0; virtual const PoseEstimate& pose_estimate() const = 0; virtual void AddRangefinderData(common::Time time, diff --git a/cartographer/mapping/map_builder.cc b/cartographer/mapping/map_builder.cc index ae2141d..6896926 100644 --- a/cartographer/mapping/map_builder.cc +++ b/cartographer/mapping/map_builder.cc @@ -104,25 +104,25 @@ int MapBuilder::GetBlockingTrajectoryId() const { return sensor_collator_.GetBlockingTrajectoryId(); } -string MapBuilder::SubmapToProto(const int trajectory_id, - const int submap_index, +string MapBuilder::SubmapToProto(const mapping::SubmapId& submap_id, proto::SubmapQuery::Response* const response) { - if (trajectory_id < 0 || trajectory_id >= num_trajectory_builders()) { - return "Requested submap from trajectory " + std::to_string(trajectory_id) + - " but there are only " + std::to_string(num_trajectory_builders()) + - " trajectories."; + if (submap_id.trajectory_id < 0 || + submap_id.trajectory_id >= num_trajectory_builders()) { + return "Requested submap from trajectory " + + std::to_string(submap_id.trajectory_id) + " but there are only " + + std::to_string(num_trajectory_builders()) + " trajectories."; } - const int num_submaps = trajectory_builders_.at(trajectory_id)->num_submaps(); - if (submap_index < 0 || submap_index >= num_submaps) { - return "Requested submap " + std::to_string(submap_index) + - " from trajectory " + std::to_string(trajectory_id) + + const int num_submaps = + sparse_pose_graph_->num_submaps(submap_id.trajectory_id); + if (submap_id.submap_index < 0 || submap_id.submap_index >= num_submaps) { + return "Requested submap " + std::to_string(submap_id.submap_index) + + " from trajectory " + std::to_string(submap_id.trajectory_id) + " but there are only " + std::to_string(num_submaps) + " submaps in this trajectory."; } - const auto submap_data = - trajectory_builders_.at(trajectory_id)->GetSubmapData(submap_index); + const auto submap_data = sparse_pose_graph_->GetSubmapData(submap_id); CHECK(submap_data.submap != nullptr); submap_data.submap->ToResponseProto(submap_data.pose, response); return ""; diff --git a/cartographer/mapping/map_builder.h b/cartographer/mapping/map_builder.h index 445e54e..7806d65 100644 --- a/cartographer/mapping/map_builder.h +++ b/cartographer/mapping/map_builder.h @@ -27,6 +27,7 @@ #include "cartographer/common/lua_parameter_dictionary.h" #include "cartographer/common/port.h" #include "cartographer/common/thread_pool.h" +#include "cartographer/mapping/id.h" #include "cartographer/mapping/proto/map_builder_options.pb.h" #include "cartographer/mapping/proto/submap_visualization.pb.h" #include "cartographer/mapping/proto/trajectory_builder_options.pb.h" @@ -71,10 +72,9 @@ class MapBuilder { // unblocked. int GetBlockingTrajectoryId() const; - // Fills the SubmapQuery::Response corresponding to 'submap_index' from - // 'trajectory_id'. Returns an error string on failure, or an empty string on - // success. - string SubmapToProto(int trajectory_id, int submap_index, + // Fills the SubmapQuery::Response corresponding to 'submap_id'. Returns an + // error string on failure, or an empty string on success. + string SubmapToProto(const SubmapId& submap_id, proto::SubmapQuery::Response* response); int num_trajectory_builders() const; diff --git a/cartographer/mapping/sparse_pose_graph.cc b/cartographer/mapping/sparse_pose_graph.cc index d4863a5..6ff1d47 100644 --- a/cartographer/mapping/sparse_pose_graph.cc +++ b/cartographer/mapping/sparse_pose_graph.cc @@ -64,6 +64,7 @@ proto::SparsePoseGraph SparsePoseGraph::ToProto() { std::map node_id_remapping; // Due to trimming. const auto all_trajectory_nodes = GetTrajectoryNodes(); + const auto all_submap_data = GetAllSubmapData(); for (size_t trajectory_id = 0; trajectory_id != all_trajectory_nodes.size(); ++trajectory_id) { const auto& single_trajectory_nodes = all_trajectory_nodes[trajectory_id]; @@ -86,12 +87,9 @@ proto::SparsePoseGraph SparsePoseGraph::ToProto() { } if (!single_trajectory_nodes.empty()) { - const int num_submaps_in_trajectory = num_submaps(trajectory_id); - for (int submap_index = 0; submap_index != num_submaps_in_trajectory; - ++submap_index) { - const SubmapId submap_id{static_cast(trajectory_id), submap_index}; + for (const auto& submap_data : all_submap_data[trajectory_id]) { *trajectory_proto->add_submap()->mutable_pose() = - transform::ToProto(GetSubmapTransform(submap_id)); + transform::ToProto(submap_data.pose); } } } diff --git a/cartographer/mapping/sparse_pose_graph.h b/cartographer/mapping/sparse_pose_graph.h index 903169b..86c3ddb 100644 --- a/cartographer/mapping/sparse_pose_graph.h +++ b/cartographer/mapping/sparse_pose_graph.h @@ -28,6 +28,7 @@ #include "cartographer/mapping/pose_graph_trimmer.h" #include "cartographer/mapping/proto/sparse_pose_graph.pb.h" #include "cartographer/mapping/proto/sparse_pose_graph_options.pb.h" +#include "cartographer/mapping/submaps.h" #include "cartographer/mapping/trajectory_node.h" #include "cartographer/transform/rigid_transform.h" @@ -61,6 +62,11 @@ class SparsePoseGraph { enum Tag { INTRA_SUBMAP, INTER_SUBMAP } tag; }; + struct SubmapData { + std::shared_ptr submap; + transform::Rigid3d pose; + }; + SparsePoseGraph() {} virtual ~SparsePoseGraph() {} @@ -80,8 +86,12 @@ class SparsePoseGraph { // Return the number of submaps for the given 'trajectory_id'. virtual int num_submaps(int trajectory_id) = 0; - // Returns the current optimized transform for the given 'submap_id'. - virtual transform::Rigid3d GetSubmapTransform(const SubmapId& submap_id) = 0; + // Returns the current optimized transform and submap itself for the given + // 'submap_id'. + virtual SubmapData GetSubmapData(const SubmapId& submap_id) = 0; + + // Returns data for all Submaps by trajectory. + virtual std::vector> GetAllSubmapData() = 0; // Returns the transform converting data in the local map frame (i.e. the // continuous, non-loop-closed frame) into the global map frame (i.e. the diff --git a/cartographer/mapping/trajectory_builder.h b/cartographer/mapping/trajectory_builder.h index 2dccce5..258fc72 100644 --- a/cartographer/mapping/trajectory_builder.h +++ b/cartographer/mapping/trajectory_builder.h @@ -53,19 +53,12 @@ class TrajectoryBuilder { sensor::PointCloud point_cloud; }; - struct SubmapData { - std::shared_ptr submap; - transform::Rigid3d pose; - }; - TrajectoryBuilder() {} virtual ~TrajectoryBuilder() {} TrajectoryBuilder(const TrajectoryBuilder&) = delete; TrajectoryBuilder& operator=(const TrajectoryBuilder&) = delete; - virtual int num_submaps() = 0; - virtual SubmapData GetSubmapData(int submap_index) = 0; virtual const PoseEstimate& pose_estimate() const = 0; virtual void AddSensorData(const string& sensor_id, diff --git a/cartographer/mapping_2d/global_trajectory_builder.cc b/cartographer/mapping_2d/global_trajectory_builder.cc index 7fcf596..a13b85d 100644 --- a/cartographer/mapping_2d/global_trajectory_builder.cc +++ b/cartographer/mapping_2d/global_trajectory_builder.cc @@ -28,19 +28,6 @@ GlobalTrajectoryBuilder::GlobalTrajectoryBuilder( GlobalTrajectoryBuilder::~GlobalTrajectoryBuilder() {} -int GlobalTrajectoryBuilder::num_submaps() { - return sparse_pose_graph_->num_submaps(trajectory_id_); -} - -GlobalTrajectoryBuilder::SubmapData GlobalTrajectoryBuilder::GetSubmapData( - const int submap_index) { - // TODO(hrapp): Get rid of this function and query the sparse pose graph - // directly. - const mapping::SubmapId submap_id{trajectory_id_, submap_index}; - return {sparse_pose_graph_->GetSubmap(submap_id), - sparse_pose_graph_->GetSubmapTransform(submap_id)}; -} - void GlobalTrajectoryBuilder::AddRangefinderData( const common::Time time, const Eigen::Vector3f& origin, const sensor::PointCloud& ranges) { diff --git a/cartographer/mapping_2d/global_trajectory_builder.h b/cartographer/mapping_2d/global_trajectory_builder.h index 474569e..422adbf 100644 --- a/cartographer/mapping_2d/global_trajectory_builder.h +++ b/cartographer/mapping_2d/global_trajectory_builder.h @@ -35,8 +35,6 @@ class GlobalTrajectoryBuilder GlobalTrajectoryBuilder(const GlobalTrajectoryBuilder&) = delete; GlobalTrajectoryBuilder& operator=(const GlobalTrajectoryBuilder&) = delete; - int num_submaps() override; - SubmapData GetSubmapData(int submap_index) override; const mapping::GlobalTrajectoryBuilderInterface::PoseEstimate& pose_estimate() const override; diff --git a/cartographer/mapping_2d/sparse_pose_graph.cc b/cartographer/mapping_2d/sparse_pose_graph.cc index 1acac5b..6a66895 100644 --- a/cartographer/mapping_2d/sparse_pose_graph.cc +++ b/cartographer/mapping_2d/sparse_pose_graph.cc @@ -424,12 +424,6 @@ SparsePoseGraph::GetTrajectoryNodes() { return trajectory_nodes_.data(); } -std::shared_ptr SparsePoseGraph::GetSubmap( - const mapping::SubmapId& submap_id) { - common::MutexLocker locker(&mutex_); - return submap_data_.at(submap_id).submap; -} - std::vector SparsePoseGraph::constraints() { common::MutexLocker locker(&mutex_); return constraints_; @@ -455,24 +449,29 @@ int SparsePoseGraph::num_submaps(const int trajectory_id) { return submap_data_.num_indices(trajectory_id); } -transform::Rigid3d SparsePoseGraph::GetSubmapTransform( +mapping::SparsePoseGraph::SubmapData SparsePoseGraph::GetSubmapData( const mapping::SubmapId& submap_id) { common::MutexLocker locker(&mutex_); - // We already have an optimized pose. - if (submap_id.trajectory_id < - static_cast(optimized_submap_transforms_.size()) && - submap_id.submap_index < static_cast(optimized_submap_transforms_ - .at(submap_id.trajectory_id) - .size())) { - return transform::Embed3D( - optimized_submap_transforms_.at(submap_id.trajectory_id) - .at(submap_id.submap_index) - .pose); + return GetSubmapDataUnderLock(submap_id); +} + +std::vector> +SparsePoseGraph::GetAllSubmapData() { + common::MutexLocker locker(&mutex_); + std::vector> + all_submap_data(submap_data_.num_trajectories()); + for (int trajectory_id = 0; trajectory_id < submap_data_.num_trajectories(); + ++trajectory_id) { + all_submap_data[trajectory_id].reserve( + submap_data_.num_indices(trajectory_id)); + for (int submap_index = 0; + submap_index < submap_data_.num_indices(trajectory_id); + ++submap_index) { + all_submap_data[trajectory_id].emplace_back(GetSubmapDataUnderLock( + mapping::SubmapId{trajectory_id, submap_index})); + } } - // We have to extrapolate. - return ComputeLocalToGlobalTransform(optimized_submap_transforms_, - submap_id.trajectory_id) * - submap_data_.at(submap_id).submap->local_pose(); + return all_submap_data; } transform::Rigid3d SparsePoseGraph::ComputeLocalToGlobalTransform( @@ -493,6 +492,26 @@ transform::Rigid3d SparsePoseGraph::ComputeLocalToGlobalTransform( .inverse(); } +mapping::SparsePoseGraph::SubmapData SparsePoseGraph::GetSubmapDataUnderLock( + const mapping::SubmapId& submap_id) { + auto submap = submap_data_.at(submap_id).submap; + // We already have an optimized pose. + if (submap_id.trajectory_id < + static_cast(optimized_submap_transforms_.size()) && + submap_id.submap_index < static_cast(optimized_submap_transforms_ + .at(submap_id.trajectory_id) + .size())) { + return {submap, transform::Embed3D( + optimized_submap_transforms_.at(submap_id.trajectory_id) + .at(submap_id.submap_index) + .pose)}; + } + // We have to extrapolate. + return {submap, ComputeLocalToGlobalTransform(optimized_submap_transforms_, + submap_id.trajectory_id) * + submap->local_pose()}; +} + SparsePoseGraph::TrimmingHandle::TrimmingHandle(SparsePoseGraph* const parent) : parent_(parent) {} diff --git a/cartographer/mapping_2d/sparse_pose_graph.h b/cartographer/mapping_2d/sparse_pose_graph.h index ddb4094..00cd00a 100644 --- a/cartographer/mapping_2d/sparse_pose_graph.h +++ b/cartographer/mapping_2d/sparse_pose_graph.h @@ -84,14 +84,14 @@ class SparsePoseGraph : public mapping::SparsePoseGraph { void RunFinalOptimization() override; std::vector> GetConnectedTrajectories() override; int num_submaps(int trajectory_id) EXCLUDES(mutex_) override; - transform::Rigid3d GetSubmapTransform(const mapping::SubmapId& submap_id) - EXCLUDES(mutex_) override; + mapping::SparsePoseGraph::SubmapData GetSubmapData( + const mapping::SubmapId& submap_id) EXCLUDES(mutex_) override; + std::vector> + GetAllSubmapData() EXCLUDES(mutex_) override; transform::Rigid3d GetLocalToGlobalTransform(int trajectory_id) EXCLUDES(mutex_) override; std::vector> GetTrajectoryNodes() override EXCLUDES(mutex_); - std::shared_ptr GetSubmap(const mapping::SubmapId& submap_id) - EXCLUDES(mutex_); std::vector constraints() override EXCLUDES(mutex_); private: @@ -154,11 +154,14 @@ class SparsePoseGraph : public mapping::SparsePoseGraph { submap_transforms, int trajectory_id) const REQUIRES(mutex_); + mapping::SparsePoseGraph::SubmapData GetSubmapDataUnderLock( + const mapping::SubmapId& submap_id) REQUIRES(mutex_); + const mapping::proto::SparsePoseGraphOptions options_; common::Mutex mutex_; // If it exists, further scans must be added to this queue, and will be - // considered later. + // considered later std::unique_ptr>> scan_queue_ GUARDED_BY(mutex_); diff --git a/cartographer/mapping_3d/global_trajectory_builder.cc b/cartographer/mapping_3d/global_trajectory_builder.cc index 095d171..21141b0 100644 --- a/cartographer/mapping_3d/global_trajectory_builder.cc +++ b/cartographer/mapping_3d/global_trajectory_builder.cc @@ -30,19 +30,6 @@ GlobalTrajectoryBuilder::GlobalTrajectoryBuilder( GlobalTrajectoryBuilder::~GlobalTrajectoryBuilder() {} -int GlobalTrajectoryBuilder::num_submaps() { - return sparse_pose_graph_->num_submaps(trajectory_id_); -} - -GlobalTrajectoryBuilder::SubmapData GlobalTrajectoryBuilder::GetSubmapData( - const int submap_index) { - // TODO(hrapp): Get rid of this function and query the sparse pose graph - // directly. - const mapping::SubmapId submap_id{trajectory_id_, submap_index}; - return {sparse_pose_graph_->GetSubmap(submap_id), - sparse_pose_graph_->GetSubmapTransform(submap_id)}; -} - void GlobalTrajectoryBuilder::AddImuData( const common::Time time, const Eigen::Vector3d& linear_acceleration, const Eigen::Vector3d& angular_velocity) { diff --git a/cartographer/mapping_3d/global_trajectory_builder.h b/cartographer/mapping_3d/global_trajectory_builder.h index b9d3f9b..5668131 100644 --- a/cartographer/mapping_3d/global_trajectory_builder.h +++ b/cartographer/mapping_3d/global_trajectory_builder.h @@ -38,8 +38,6 @@ class GlobalTrajectoryBuilder GlobalTrajectoryBuilder(const GlobalTrajectoryBuilder&) = delete; GlobalTrajectoryBuilder& operator=(const GlobalTrajectoryBuilder&) = delete; - int num_submaps() override; - SubmapData GetSubmapData(int submap_index) override; void AddImuData(common::Time time, const Eigen::Vector3d& linear_acceleration, const Eigen::Vector3d& angular_velocity) override; void AddRangefinderData(common::Time time, const Eigen::Vector3f& origin, diff --git a/cartographer/mapping_3d/sparse_pose_graph.cc b/cartographer/mapping_3d/sparse_pose_graph.cc index c215d19..223024a 100644 --- a/cartographer/mapping_3d/sparse_pose_graph.cc +++ b/cartographer/mapping_3d/sparse_pose_graph.cc @@ -424,12 +424,6 @@ SparsePoseGraph::GetTrajectoryNodes() { return trajectory_nodes_.data(); } -std::shared_ptr SparsePoseGraph::GetSubmap( - const mapping::SubmapId& submap_id) { - common::MutexLocker locker(&mutex_); - return submap_data_.at(submap_id).submap; -} - std::vector SparsePoseGraph::constraints() { common::MutexLocker locker(&mutex_); return constraints_; @@ -455,23 +449,29 @@ int SparsePoseGraph::num_submaps(const int trajectory_id) { return submap_data_.num_indices(trajectory_id); } -transform::Rigid3d SparsePoseGraph::GetSubmapTransform( +mapping::SparsePoseGraph::SubmapData SparsePoseGraph::GetSubmapData( const mapping::SubmapId& submap_id) { common::MutexLocker locker(&mutex_); - // We already have an optimized pose. - if (submap_id.trajectory_id < - static_cast(optimized_submap_transforms_.size()) && - submap_id.submap_index < static_cast(optimized_submap_transforms_ - .at(submap_id.trajectory_id) - .size())) { - return optimized_submap_transforms_.at(submap_id.trajectory_id) - .at(submap_id.submap_index) - .pose; + return GetSubmapDataUnderLock(submap_id); +} + +std::vector> +SparsePoseGraph::GetAllSubmapData() { + common::MutexLocker locker(&mutex_); + std::vector> + all_submap_data(submap_data_.num_trajectories()); + for (int trajectory_id = 0; trajectory_id < submap_data_.num_trajectories(); + ++trajectory_id) { + all_submap_data[trajectory_id].reserve( + submap_data_.num_indices(trajectory_id)); + for (int submap_index = 0; + submap_index < submap_data_.num_indices(trajectory_id); + ++submap_index) { + all_submap_data[trajectory_id].emplace_back(GetSubmapDataUnderLock( + mapping::SubmapId{trajectory_id, submap_index})); + } } - // We have to extrapolate. - return ComputeLocalToGlobalTransform(optimized_submap_transforms_, - submap_id.trajectory_id) * - submap_data_.at(submap_id).submap->local_pose(); + return all_submap_data; } transform::Rigid3d SparsePoseGraph::ComputeLocalToGlobalTransform( @@ -492,5 +492,24 @@ transform::Rigid3d SparsePoseGraph::ComputeLocalToGlobalTransform( .inverse(); } +mapping::SparsePoseGraph::SubmapData SparsePoseGraph::GetSubmapDataUnderLock( + const mapping::SubmapId& submap_id) { + auto submap = submap_data_.at(submap_id).submap; + // We already have an optimized pose. + if (submap_id.trajectory_id < + static_cast(optimized_submap_transforms_.size()) && + submap_id.submap_index < static_cast(optimized_submap_transforms_ + .at(submap_id.trajectory_id) + .size())) { + return {submap, optimized_submap_transforms_.at(submap_id.trajectory_id) + .at(submap_id.submap_index) + .pose}; + } + // We have to extrapolate. + return {submap, ComputeLocalToGlobalTransform(optimized_submap_transforms_, + submap_id.trajectory_id) * + submap->local_pose()}; +} + } // namespace mapping_3d } // namespace cartographer diff --git a/cartographer/mapping_3d/sparse_pose_graph.h b/cartographer/mapping_3d/sparse_pose_graph.h index ad03cf8..b515efb 100644 --- a/cartographer/mapping_3d/sparse_pose_graph.h +++ b/cartographer/mapping_3d/sparse_pose_graph.h @@ -83,14 +83,14 @@ class SparsePoseGraph : public mapping::SparsePoseGraph { void RunFinalOptimization() override; std::vector> GetConnectedTrajectories() override; int num_submaps(int trajectory_id) EXCLUDES(mutex_) override; - transform::Rigid3d GetSubmapTransform(const mapping::SubmapId& submap_id) - EXCLUDES(mutex_) override; + mapping::SparsePoseGraph::SubmapData GetSubmapData( + const mapping::SubmapId& submap_id) EXCLUDES(mutex_) override; + std::vector> + GetAllSubmapData() EXCLUDES(mutex_) override; transform::Rigid3d GetLocalToGlobalTransform(int trajectory_id) EXCLUDES(mutex_) override; std::vector> GetTrajectoryNodes() override EXCLUDES(mutex_); - std::shared_ptr GetSubmap(const mapping::SubmapId& submap_id) - EXCLUDES(mutex_); std::vector constraints() override EXCLUDES(mutex_); private: @@ -153,6 +153,9 @@ class SparsePoseGraph : public mapping::SparsePoseGraph { submap_transforms, int trajectory_id) const REQUIRES(mutex_); + mapping::SparsePoseGraph::SubmapData GetSubmapDataUnderLock( + const mapping::SubmapId& submap_id) REQUIRES(mutex_); + const mapping::proto::SparsePoseGraphOptions options_; common::Mutex mutex_;