Rename TrajectoryConnectivity ConnectedComponents. (#510)
* Rename TrajectoryConnectivity ConnectedComponents.master
parent
c65f7a97b6
commit
1a367f0549
|
@ -14,26 +14,26 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include "cartographer/mapping/trajectory_connectivity.h"
|
||||
#include "cartographer/mapping/connected_components.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <unordered_set>
|
||||
|
||||
#include "cartographer/mapping/proto/trajectory_connectivity.pb.h"
|
||||
#include "cartographer/mapping/proto/connected_components.pb.h"
|
||||
#include "glog/logging.h"
|
||||
|
||||
namespace cartographer {
|
||||
namespace mapping {
|
||||
|
||||
TrajectoryConnectivity::TrajectoryConnectivity()
|
||||
ConnectedComponents::ConnectedComponents()
|
||||
: lock_(), forest_(), connection_map_() {}
|
||||
|
||||
void TrajectoryConnectivity::Add(const int trajectory_id) {
|
||||
void ConnectedComponents::Add(const int trajectory_id) {
|
||||
common::MutexLocker locker(&lock_);
|
||||
forest_.emplace(trajectory_id, trajectory_id);
|
||||
}
|
||||
|
||||
void TrajectoryConnectivity::Connect(const int trajectory_id_a,
|
||||
void ConnectedComponents::Connect(const int trajectory_id_a,
|
||||
const int trajectory_id_b) {
|
||||
common::MutexLocker locker(&lock_);
|
||||
Union(trajectory_id_a, trajectory_id_b);
|
||||
|
@ -41,7 +41,7 @@ void TrajectoryConnectivity::Connect(const int trajectory_id_a,
|
|||
++connection_map_[sorted_pair];
|
||||
}
|
||||
|
||||
void TrajectoryConnectivity::Union(const int trajectory_id_a,
|
||||
void ConnectedComponents::Union(const int trajectory_id_a,
|
||||
const int trajectory_id_b) {
|
||||
forest_.emplace(trajectory_id_a, trajectory_id_a);
|
||||
forest_.emplace(trajectory_id_b, trajectory_id_b);
|
||||
|
@ -50,7 +50,7 @@ void TrajectoryConnectivity::Union(const int trajectory_id_a,
|
|||
forest_[representative_a] = representative_b;
|
||||
}
|
||||
|
||||
int TrajectoryConnectivity::FindSet(const int trajectory_id) {
|
||||
int ConnectedComponents::FindSet(const int trajectory_id) {
|
||||
auto it = forest_.find(trajectory_id);
|
||||
CHECK(it != forest_.end());
|
||||
if (it->first != it->second) {
|
||||
|
@ -59,7 +59,7 @@ int TrajectoryConnectivity::FindSet(const int trajectory_id) {
|
|||
return it->second;
|
||||
}
|
||||
|
||||
bool TrajectoryConnectivity::TransitivelyConnected(const int trajectory_id_a,
|
||||
bool ConnectedComponents::TransitivelyConnected(const int trajectory_id_a,
|
||||
const int trajectory_id_b) {
|
||||
if (trajectory_id_a == trajectory_id_b) {
|
||||
return true;
|
||||
|
@ -74,7 +74,7 @@ bool TrajectoryConnectivity::TransitivelyConnected(const int trajectory_id_a,
|
|||
return FindSet(trajectory_id_a) == FindSet(trajectory_id_b);
|
||||
}
|
||||
|
||||
std::vector<std::vector<int>> TrajectoryConnectivity::ConnectedComponents() {
|
||||
std::vector<std::vector<int>> ConnectedComponents::Components() {
|
||||
// Map from cluster exemplar -> growing cluster.
|
||||
std::unordered_map<int, std::vector<int>> map;
|
||||
common::MutexLocker locker(&lock_);
|
||||
|
@ -91,7 +91,7 @@ std::vector<std::vector<int>> TrajectoryConnectivity::ConnectedComponents() {
|
|||
return result;
|
||||
}
|
||||
|
||||
int TrajectoryConnectivity::ConnectionCount(const int trajectory_id_a,
|
||||
int ConnectedComponents::ConnectionCount(const int trajectory_id_a,
|
||||
const int trajectory_id_b) {
|
||||
common::MutexLocker locker(&lock_);
|
||||
const auto it =
|
||||
|
@ -99,9 +99,9 @@ int TrajectoryConnectivity::ConnectionCount(const int trajectory_id_a,
|
|||
return it != connection_map_.end() ? it->second : 0;
|
||||
}
|
||||
|
||||
proto::TrajectoryConnectivity ToProto(
|
||||
proto::ConnectedComponents ToProto(
|
||||
std::vector<std::vector<int>> connected_components) {
|
||||
proto::TrajectoryConnectivity proto;
|
||||
proto::ConnectedComponents proto;
|
||||
for (auto& connected_component : connected_components) {
|
||||
std::sort(connected_component.begin(), connected_component.end());
|
||||
}
|
||||
|
@ -115,11 +115,11 @@ proto::TrajectoryConnectivity ToProto(
|
|||
return proto;
|
||||
}
|
||||
|
||||
proto::TrajectoryConnectivity::ConnectedComponent FindConnectedComponent(
|
||||
const proto::TrajectoryConnectivity& trajectory_connectivity,
|
||||
proto::ConnectedComponents::ConnectedComponent FindConnectedComponent(
|
||||
const proto::ConnectedComponents& connected_components,
|
||||
const int trajectory_id) {
|
||||
for (const auto& connected_component :
|
||||
trajectory_connectivity.connected_component()) {
|
||||
connected_components.connected_component()) {
|
||||
if (std::find(connected_component.trajectory_id().begin(),
|
||||
connected_component.trajectory_id().end(),
|
||||
trajectory_id) != connected_component.trajectory_id().end()) {
|
||||
|
@ -127,7 +127,7 @@ proto::TrajectoryConnectivity::ConnectedComponent FindConnectedComponent(
|
|||
}
|
||||
}
|
||||
|
||||
proto::TrajectoryConnectivity::ConnectedComponent connected_component;
|
||||
proto::ConnectedComponents::ConnectedComponent connected_component;
|
||||
connected_component.add_trajectory_id(trajectory_id);
|
||||
return connected_component;
|
||||
}
|
|
@ -14,14 +14,14 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef CARTOGRAPHER_MAPPING_TRAJECTORY_CONNECTIVITY_H_
|
||||
#define CARTOGRAPHER_MAPPING_TRAJECTORY_CONNECTIVITY_H_
|
||||
#ifndef CARTOGRAPHER_MAPPING_CONNECTED_COMPONENTS_H_
|
||||
#define CARTOGRAPHER_MAPPING_CONNECTED_COMPONENTS_H_
|
||||
|
||||
#include <map>
|
||||
#include <unordered_map>
|
||||
|
||||
#include "cartographer/common/mutex.h"
|
||||
#include "cartographer/mapping/proto/trajectory_connectivity.pb.h"
|
||||
#include "cartographer/mapping/proto/connected_components.pb.h"
|
||||
#include "cartographer/mapping/submaps.h"
|
||||
|
||||
namespace cartographer {
|
||||
|
@ -33,12 +33,12 @@ namespace mapping {
|
|||
// connected trajectories i and j?") and the transitive connectivity.
|
||||
//
|
||||
// This class is thread-safe.
|
||||
class TrajectoryConnectivity {
|
||||
class ConnectedComponents {
|
||||
public:
|
||||
TrajectoryConnectivity();
|
||||
ConnectedComponents();
|
||||
|
||||
TrajectoryConnectivity(const TrajectoryConnectivity&) = delete;
|
||||
TrajectoryConnectivity& operator=(const TrajectoryConnectivity&) = delete;
|
||||
ConnectedComponents(const ConnectedComponents&) = delete;
|
||||
ConnectedComponents& operator=(const ConnectedComponents&) = delete;
|
||||
|
||||
// Add a trajectory which is initially connected to only itself.
|
||||
void Add(int trajectory_id) EXCLUDES(lock_);
|
||||
|
@ -61,7 +61,7 @@ class TrajectoryConnectivity {
|
|||
int ConnectionCount(int trajectory_id_a, int trajectory_id_b) EXCLUDES(lock_);
|
||||
|
||||
// The trajectory IDs, grouped by connectivity.
|
||||
std::vector<std::vector<int>> ConnectedComponents() EXCLUDES(lock_);
|
||||
std::vector<std::vector<int>> Components() EXCLUDES(lock_);
|
||||
|
||||
private:
|
||||
// Find the representative and compresses the path to it.
|
||||
|
@ -77,16 +77,16 @@ class TrajectoryConnectivity {
|
|||
};
|
||||
|
||||
// Returns a proto encoding connected components.
|
||||
proto::TrajectoryConnectivity ToProto(
|
||||
proto::ConnectedComponents ToProto(
|
||||
std::vector<std::vector<int>> connected_components);
|
||||
|
||||
// Returns the connected component containing 'trajectory_id'.
|
||||
proto::TrajectoryConnectivity::ConnectedComponent FindConnectedComponent(
|
||||
const cartographer::mapping::proto::TrajectoryConnectivity&
|
||||
trajectory_connectivity,
|
||||
proto::ConnectedComponents::ConnectedComponent FindConnectedComponent(
|
||||
const cartographer::mapping::proto::ConnectedComponents&
|
||||
connected_components,
|
||||
int trajectory_id);
|
||||
|
||||
} // namespace mapping
|
||||
} // namespace cartographer
|
||||
|
||||
#endif // CARTOGRAPHER_MAPPING_TRAJECTORY_CONNECTIVITY_H_
|
||||
#endif // CARTOGRAPHER_MAPPING_CONNECTED_COMPONENTS_H_
|
|
@ -14,7 +14,7 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include "cartographer/mapping/trajectory_connectivity.h"
|
||||
#include "cartographer/mapping/connected_components.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <memory>
|
||||
|
@ -28,49 +28,49 @@ namespace {
|
|||
|
||||
constexpr int kNumTrajectories = 10;
|
||||
|
||||
TEST(TrajectoryConnectivityTest, TransitivelyConnected) {
|
||||
TrajectoryConnectivity trajectory_connectivity;
|
||||
TEST(ConnectedComponentsTest, TransitivelyConnected) {
|
||||
ConnectedComponents connected_components;
|
||||
|
||||
// Make sure nothing's connected until we connect some things.
|
||||
for (int trajectory_a = 0; trajectory_a < kNumTrajectories; ++trajectory_a) {
|
||||
for (int trajectory_b = 0; trajectory_b < kNumTrajectories;
|
||||
++trajectory_b) {
|
||||
EXPECT_EQ(trajectory_a == trajectory_b,
|
||||
trajectory_connectivity.TransitivelyConnected(trajectory_a,
|
||||
connected_components.TransitivelyConnected(trajectory_a,
|
||||
trajectory_b));
|
||||
}
|
||||
}
|
||||
|
||||
// Connect some stuff up.
|
||||
trajectory_connectivity.Connect(0, 1);
|
||||
EXPECT_TRUE(trajectory_connectivity.TransitivelyConnected(0, 1));
|
||||
trajectory_connectivity.Connect(8, 9);
|
||||
EXPECT_TRUE(trajectory_connectivity.TransitivelyConnected(8, 9));
|
||||
EXPECT_FALSE(trajectory_connectivity.TransitivelyConnected(0, 9));
|
||||
connected_components.Connect(0, 1);
|
||||
EXPECT_TRUE(connected_components.TransitivelyConnected(0, 1));
|
||||
connected_components.Connect(8, 9);
|
||||
EXPECT_TRUE(connected_components.TransitivelyConnected(8, 9));
|
||||
EXPECT_FALSE(connected_components.TransitivelyConnected(0, 9));
|
||||
|
||||
trajectory_connectivity.Connect(1, 8);
|
||||
connected_components.Connect(1, 8);
|
||||
for (int i : {0, 1}) {
|
||||
for (int j : {8, 9}) {
|
||||
EXPECT_TRUE(trajectory_connectivity.TransitivelyConnected(i, j));
|
||||
EXPECT_TRUE(connected_components.TransitivelyConnected(i, j));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST(TrajectoryConnectivityTest, EmptyConnectedComponents) {
|
||||
TrajectoryConnectivity trajectory_connectivity;
|
||||
auto connections = trajectory_connectivity.ConnectedComponents();
|
||||
TEST(ConnectedComponentsTest, EmptyConnectedComponents) {
|
||||
ConnectedComponents connected_components;
|
||||
auto connections = connected_components.Components();
|
||||
EXPECT_EQ(0, connections.size());
|
||||
}
|
||||
|
||||
TEST(TrajectoryConnectivityTest, ConnectedComponents) {
|
||||
TrajectoryConnectivity trajectory_connectivity;
|
||||
TEST(ConnectedComponentsTest, ConnectedComponents) {
|
||||
ConnectedComponents connected_components;
|
||||
for (int i = 0; i <= 4; ++i) {
|
||||
trajectory_connectivity.Connect(0, i);
|
||||
connected_components.Connect(0, i);
|
||||
}
|
||||
for (int i = 5; i <= 9; ++i) {
|
||||
trajectory_connectivity.Connect(5, i);
|
||||
connected_components.Connect(5, i);
|
||||
}
|
||||
auto connections = trajectory_connectivity.ConnectedComponents();
|
||||
auto connections = connected_components.Components();
|
||||
ASSERT_EQ(2, connections.size());
|
||||
// The clustering is arbitrary; we need to figure out which one is which.
|
||||
const std::vector<int>* zero_cluster = nullptr;
|
||||
|
@ -91,25 +91,25 @@ TEST(TrajectoryConnectivityTest, ConnectedComponents) {
|
|||
}
|
||||
}
|
||||
|
||||
TEST(TrajectoryConnectivityTest, ConnectionCount) {
|
||||
TrajectoryConnectivity trajectory_connectivity;
|
||||
TEST(ConnectedComponentsTest, ConnectionCount) {
|
||||
ConnectedComponents connected_components;
|
||||
for (int i = 0; i < kNumTrajectories; ++i) {
|
||||
trajectory_connectivity.Connect(0, 1);
|
||||
connected_components.Connect(0, 1);
|
||||
// Permute the arguments to check invariance.
|
||||
EXPECT_EQ(i + 1, trajectory_connectivity.ConnectionCount(1, 0));
|
||||
EXPECT_EQ(i + 1, connected_components.ConnectionCount(1, 0));
|
||||
}
|
||||
for (int i = 1; i < 9; ++i) {
|
||||
EXPECT_EQ(0, trajectory_connectivity.ConnectionCount(i, i + 1));
|
||||
EXPECT_EQ(0, connected_components.ConnectionCount(i, i + 1));
|
||||
}
|
||||
}
|
||||
|
||||
TEST(TrajectoryConnectivityTest, ReflexiveConnectivity) {
|
||||
TrajectoryConnectivity trajectory_connectivity;
|
||||
EXPECT_TRUE(trajectory_connectivity.TransitivelyConnected(0, 0));
|
||||
EXPECT_EQ(0, trajectory_connectivity.ConnectionCount(0, 0));
|
||||
trajectory_connectivity.Add(0);
|
||||
EXPECT_TRUE(trajectory_connectivity.TransitivelyConnected(0, 0));
|
||||
EXPECT_EQ(0, trajectory_connectivity.ConnectionCount(0, 0));
|
||||
TEST(ConnectedComponentsTest, ReflexiveConnectivity) {
|
||||
ConnectedComponents connected_components;
|
||||
EXPECT_TRUE(connected_components.TransitivelyConnected(0, 0));
|
||||
EXPECT_EQ(0, connected_components.ConnectionCount(0, 0));
|
||||
connected_components.Add(0);
|
||||
EXPECT_TRUE(connected_components.TransitivelyConnected(0, 0));
|
||||
EXPECT_EQ(0, connected_components.ConnectionCount(0, 0));
|
||||
}
|
||||
|
||||
} // namespace
|
|
@ -18,10 +18,10 @@ package cartographer.mapping.proto;
|
|||
|
||||
// This is how proto2 calls the outer class since there is already a message
|
||||
// with the same name in the file.
|
||||
option java_outer_classname = "TrajectoryConnectivityOuterClass";
|
||||
option java_outer_classname = "ConnectedComponentsOuterClass";
|
||||
|
||||
// Connectivity structure between trajectories.
|
||||
message TrajectoryConnectivity {
|
||||
message ConnectedComponents {
|
||||
message ConnectedComponent {
|
||||
repeated int32 trajectory_id = 1;
|
||||
}
|
|
@ -104,7 +104,7 @@ void SparsePoseGraph::AddScan(
|
|||
trajectory_nodes_.Append(
|
||||
trajectory_id, mapping::TrajectoryNode{constant_data, optimized_pose});
|
||||
++num_trajectory_nodes_;
|
||||
trajectory_connectivity_.Add(trajectory_id);
|
||||
connected_components_.Add(trajectory_id);
|
||||
|
||||
// Test if the 'insertion_submap.back()' is one we never saw before.
|
||||
if (trajectory_id >= submap_data_.num_trajectories() ||
|
||||
|
@ -180,7 +180,7 @@ void SparsePoseGraph::ComputeConstraint(const mapping::NodeId& node_id,
|
|||
submap_id, submap_data_.at(submap_id).submap.get(), node_id,
|
||||
trajectory_nodes_.at(node_id).constant_data.get());
|
||||
} else {
|
||||
if (trajectory_connectivity_.TransitivelyConnected(
|
||||
if (connected_components_.TransitivelyConnected(
|
||||
node_id.trajectory_id, submap_id.trajectory_id)) {
|
||||
const transform::Rigid2d initial_relative_pose =
|
||||
optimization_problem_.submap_data()
|
||||
|
@ -314,7 +314,7 @@ void SparsePoseGraph::HandleWorkQueue() {
|
|||
for (const Constraint& constraint : result) {
|
||||
CHECK_EQ(constraint.tag,
|
||||
mapping::SparsePoseGraph::Constraint::INTER_SUBMAP);
|
||||
trajectory_connectivity_.Connect(constraint.node_id.trajectory_id,
|
||||
connected_components_.Connect(constraint.node_id.trajectory_id,
|
||||
constraint.submap_id.trajectory_id);
|
||||
}
|
||||
|
||||
|
@ -503,7 +503,7 @@ transform::Rigid3d SparsePoseGraph::GetLocalToGlobalTransform(
|
|||
}
|
||||
|
||||
std::vector<std::vector<int>> SparsePoseGraph::GetConnectedTrajectories() {
|
||||
return trajectory_connectivity_.ConnectedComponents();
|
||||
return connected_components_.Components();
|
||||
}
|
||||
|
||||
int SparsePoseGraph::num_submaps(const int trajectory_id) {
|
||||
|
|
|
@ -32,9 +32,9 @@
|
|||
#include "cartographer/common/mutex.h"
|
||||
#include "cartographer/common/thread_pool.h"
|
||||
#include "cartographer/common/time.h"
|
||||
#include "cartographer/mapping/connected_components.h"
|
||||
#include "cartographer/mapping/pose_graph_trimmer.h"
|
||||
#include "cartographer/mapping/sparse_pose_graph.h"
|
||||
#include "cartographer/mapping/trajectory_connectivity.h"
|
||||
#include "cartographer/mapping_2d/sparse_pose_graph/constraint_builder.h"
|
||||
#include "cartographer/mapping_2d/sparse_pose_graph/optimization_problem.h"
|
||||
#include "cartographer/mapping_2d/submaps.h"
|
||||
|
@ -172,7 +172,7 @@ class SparsePoseGraph : public mapping::SparsePoseGraph {
|
|||
GUARDED_BY(mutex_);
|
||||
|
||||
// How our various trajectories are related.
|
||||
mapping::TrajectoryConnectivity trajectory_connectivity_;
|
||||
mapping::ConnectedComponents connected_components_;
|
||||
|
||||
// We globally localize a fraction of the scans from each trajectory.
|
||||
std::unordered_map<int, std::unique_ptr<common::FixedRatioSampler>>
|
||||
|
|
|
@ -102,7 +102,7 @@ void SparsePoseGraph::AddScan(
|
|||
trajectory_nodes_.Append(
|
||||
trajectory_id, mapping::TrajectoryNode{constant_data, optimized_pose});
|
||||
++num_trajectory_nodes_;
|
||||
trajectory_connectivity_.Add(trajectory_id);
|
||||
connected_components_.Add(trajectory_id);
|
||||
|
||||
// Test if the 'insertion_submap.back()' is one we never saw before.
|
||||
if (trajectory_id >= submap_data_.num_trajectories() ||
|
||||
|
@ -212,7 +212,7 @@ void SparsePoseGraph::ComputeConstraint(const mapping::NodeId& node_id,
|
|||
trajectory_nodes_.at(node_id).constant_data.get(), submap_nodes,
|
||||
initial_relative_pose.rotation());
|
||||
} else {
|
||||
if (trajectory_connectivity_.TransitivelyConnected(
|
||||
if (connected_components_.TransitivelyConnected(
|
||||
node_id.trajectory_id, submap_id.trajectory_id)) {
|
||||
constraint_builder_.MaybeAddConstraint(
|
||||
submap_id, submap_data_.at(submap_id).submap.get(), node_id,
|
||||
|
@ -330,7 +330,7 @@ void SparsePoseGraph::HandleWorkQueue() {
|
|||
for (const Constraint& constraint : result) {
|
||||
CHECK_EQ(constraint.tag,
|
||||
mapping::SparsePoseGraph::Constraint::INTER_SUBMAP);
|
||||
trajectory_connectivity_.Connect(constraint.node_id.trajectory_id,
|
||||
connected_components_.Connect(constraint.node_id.trajectory_id,
|
||||
constraint.submap_id.trajectory_id);
|
||||
}
|
||||
|
||||
|
@ -534,7 +534,7 @@ transform::Rigid3d SparsePoseGraph::GetLocalToGlobalTransform(
|
|||
}
|
||||
|
||||
std::vector<std::vector<int>> SparsePoseGraph::GetConnectedTrajectories() {
|
||||
return trajectory_connectivity_.ConnectedComponents();
|
||||
return connected_components_.Components();
|
||||
}
|
||||
|
||||
int SparsePoseGraph::num_submaps(const int trajectory_id) {
|
||||
|
|
|
@ -32,9 +32,9 @@
|
|||
#include "cartographer/common/mutex.h"
|
||||
#include "cartographer/common/thread_pool.h"
|
||||
#include "cartographer/common/time.h"
|
||||
#include "cartographer/mapping/connected_components.h"
|
||||
#include "cartographer/mapping/pose_graph_trimmer.h"
|
||||
#include "cartographer/mapping/sparse_pose_graph.h"
|
||||
#include "cartographer/mapping/trajectory_connectivity.h"
|
||||
#include "cartographer/mapping_3d/sparse_pose_graph/constraint_builder.h"
|
||||
#include "cartographer/mapping_3d/sparse_pose_graph/optimization_problem.h"
|
||||
#include "cartographer/mapping_3d/submaps.h"
|
||||
|
@ -177,7 +177,7 @@ class SparsePoseGraph : public mapping::SparsePoseGraph {
|
|||
GUARDED_BY(mutex_);
|
||||
|
||||
// How our various trajectories are related.
|
||||
mapping::TrajectoryConnectivity trajectory_connectivity_;
|
||||
mapping::ConnectedComponents connected_components_;
|
||||
|
||||
// We globally localize a fraction of the scans from each trajectory.
|
||||
std::unordered_map<int, std::unique_ptr<common::FixedRatioSampler>>
|
||||
|
|
Loading…
Reference in New Issue