Rename ScanId to NodeId in the serialization. (#394)
This is consistent with the naming in the C++ structs.master
parent
00e3d33e43
commit
94a848cd46
|
@ -61,31 +61,31 @@ std::vector<double> ComputeCoveredDistance(
|
||||||
return covered_distance;
|
return covered_distance;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We pick the representative scan in the middle of the submap.
|
// We pick the representative node in the middle of the submap.
|
||||||
//
|
//
|
||||||
// TODO(whess): Should we consider all scans inserted into the submap and
|
// TODO(whess): Should we consider all nodes inserted into the submap and
|
||||||
// exclude, e.g. based on large relative linear or angular distance?
|
// exclude, e.g. based on large relative linear or angular distance?
|
||||||
std::vector<int> ComputeSubmapRepresentativeScan(
|
std::vector<int> ComputeSubmapRepresentativeNode(
|
||||||
const mapping::proto::SparsePoseGraph& pose_graph) {
|
const mapping::proto::SparsePoseGraph& pose_graph) {
|
||||||
std::vector<int> submap_to_scan_index;
|
std::vector<int> submap_to_node_index;
|
||||||
for (const auto& constraint : pose_graph.constraint()) {
|
for (const auto& constraint : pose_graph.constraint()) {
|
||||||
if (constraint.tag() !=
|
if (constraint.tag() !=
|
||||||
mapping::proto::SparsePoseGraph::Constraint::INTRA_SUBMAP) {
|
mapping::proto::SparsePoseGraph::Constraint::INTRA_SUBMAP) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
CHECK_EQ(constraint.submap_id().trajectory_id(), 0);
|
CHECK_EQ(constraint.submap_id().trajectory_id(), 0);
|
||||||
CHECK_EQ(constraint.scan_id().trajectory_id(), 0);
|
CHECK_EQ(constraint.node_id().trajectory_id(), 0);
|
||||||
|
|
||||||
const int next_submap_index = static_cast<int>(submap_to_scan_index.size());
|
const int next_submap_index = static_cast<int>(submap_to_node_index.size());
|
||||||
const int submap_index = constraint.submap_id().submap_index();
|
const int submap_index = constraint.submap_id().submap_index();
|
||||||
if (submap_index <= next_submap_index) {
|
if (submap_index <= next_submap_index) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
CHECK_EQ(submap_index, next_submap_index + 1);
|
CHECK_EQ(submap_index, next_submap_index + 1);
|
||||||
submap_to_scan_index.push_back(constraint.scan_id().scan_index());
|
submap_to_node_index.push_back(constraint.node_id().node_index());
|
||||||
}
|
}
|
||||||
return submap_to_scan_index;
|
return submap_to_node_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
proto::GroundTruth GenerateGroundTruth(
|
proto::GroundTruth GenerateGroundTruth(
|
||||||
|
@ -96,8 +96,8 @@ proto::GroundTruth GenerateGroundTruth(
|
||||||
const std::vector<double> covered_distance =
|
const std::vector<double> covered_distance =
|
||||||
ComputeCoveredDistance(trajectory);
|
ComputeCoveredDistance(trajectory);
|
||||||
|
|
||||||
const std::vector<int> submap_to_scan_index =
|
const std::vector<int> submap_to_node_index =
|
||||||
ComputeSubmapRepresentativeScan(pose_graph);
|
ComputeSubmapRepresentativeNode(pose_graph);
|
||||||
|
|
||||||
int num_outliers = 0;
|
int num_outliers = 0;
|
||||||
proto::GroundTruth ground_truth;
|
proto::GroundTruth ground_truth;
|
||||||
|
@ -109,41 +109,41 @@ proto::GroundTruth GenerateGroundTruth(
|
||||||
}
|
}
|
||||||
|
|
||||||
// For some submaps at the very end, we have not chosen a representative
|
// For some submaps at the very end, we have not chosen a representative
|
||||||
// scan, but those should not be part of loop closure anyway.
|
// node, but those should not be part of loop closure anyway.
|
||||||
CHECK_EQ(constraint.submap_id().trajectory_id(), 0);
|
CHECK_EQ(constraint.submap_id().trajectory_id(), 0);
|
||||||
CHECK_EQ(constraint.scan_id().trajectory_id(), 0);
|
CHECK_EQ(constraint.node_id().trajectory_id(), 0);
|
||||||
if (constraint.submap_id().submap_index() >=
|
if (constraint.submap_id().submap_index() >=
|
||||||
static_cast<int>(submap_to_scan_index.size())) {
|
static_cast<int>(submap_to_node_index.size())) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const int matched_scan = constraint.scan_id().scan_index();
|
const int matched_node = constraint.node_id().node_index();
|
||||||
const int representative_scan =
|
const int representative_node =
|
||||||
submap_to_scan_index.at(constraint.submap_id().submap_index());
|
submap_to_node_index.at(constraint.submap_id().submap_index());
|
||||||
|
|
||||||
// Covered distance between the two should not be too small.
|
// Covered distance between the two should not be too small.
|
||||||
if (std::abs(covered_distance.at(matched_scan) -
|
if (std::abs(covered_distance.at(matched_node) -
|
||||||
covered_distance.at(representative_scan)) <
|
covered_distance.at(representative_node)) <
|
||||||
min_covered_distance) {
|
min_covered_distance) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compute the transform between the scans according to the solution and
|
// Compute the transform between the nodes according to the solution and
|
||||||
// the constraint.
|
// the constraint.
|
||||||
const transform::Rigid3d solution_pose1 =
|
const transform::Rigid3d solution_pose1 =
|
||||||
transform::ToRigid3(trajectory.node(representative_scan).pose());
|
transform::ToRigid3(trajectory.node(representative_node).pose());
|
||||||
const transform::Rigid3d solution_pose2 =
|
const transform::Rigid3d solution_pose2 =
|
||||||
transform::ToRigid3(trajectory.node(matched_scan).pose());
|
transform::ToRigid3(trajectory.node(matched_node).pose());
|
||||||
const transform::Rigid3d solution =
|
const transform::Rigid3d solution =
|
||||||
solution_pose1.inverse() * solution_pose2;
|
solution_pose1.inverse() * solution_pose2;
|
||||||
|
|
||||||
const transform::Rigid3d submap_solution = transform::ToRigid3(
|
const transform::Rigid3d submap_solution = transform::ToRigid3(
|
||||||
trajectory.submap(constraint.submap_id().submap_index()).pose());
|
trajectory.submap(constraint.submap_id().submap_index()).pose());
|
||||||
const transform::Rigid3d submap_solution_to_scan_solution =
|
const transform::Rigid3d submap_solution_to_node_solution =
|
||||||
solution_pose1.inverse() * submap_solution;
|
solution_pose1.inverse() * submap_solution;
|
||||||
const transform::Rigid3d scan_to_submap_constraint =
|
const transform::Rigid3d node_to_submap_constraint =
|
||||||
transform::ToRigid3(constraint.relative_pose());
|
transform::ToRigid3(constraint.relative_pose());
|
||||||
const transform::Rigid3d expected =
|
const transform::Rigid3d expected =
|
||||||
submap_solution_to_scan_solution * scan_to_submap_constraint;
|
submap_solution_to_node_solution * node_to_submap_constraint;
|
||||||
|
|
||||||
const transform::Rigid3d error = solution * expected.inverse();
|
const transform::Rigid3d error = solution * expected.inverse();
|
||||||
|
|
||||||
|
@ -154,8 +154,8 @@ proto::GroundTruth GenerateGroundTruth(
|
||||||
}
|
}
|
||||||
auto* const new_relation = ground_truth.add_relation();
|
auto* const new_relation = ground_truth.add_relation();
|
||||||
new_relation->set_timestamp1(
|
new_relation->set_timestamp1(
|
||||||
trajectory.node(representative_scan).timestamp());
|
trajectory.node(representative_node).timestamp());
|
||||||
new_relation->set_timestamp2(trajectory.node(matched_scan).timestamp());
|
new_relation->set_timestamp2(trajectory.node(matched_node).timestamp());
|
||||||
*new_relation->mutable_expected() = transform::ToProto(expected);
|
*new_relation->mutable_expected() = transform::ToProto(expected);
|
||||||
}
|
}
|
||||||
LOG(INFO) << "Generated " << ground_truth.relation_size()
|
LOG(INFO) << "Generated " << ground_truth.relation_size()
|
||||||
|
|
|
@ -24,9 +24,9 @@ message SubmapId {
|
||||||
optional int32 submap_index = 2; // Submap index in the given trajectory.
|
optional int32 submap_index = 2; // Submap index in the given trajectory.
|
||||||
}
|
}
|
||||||
|
|
||||||
message ScanId {
|
message NodeId {
|
||||||
optional int32 trajectory_id = 1;
|
optional int32 trajectory_id = 1;
|
||||||
optional int32 scan_index = 2; // Scan index in the given trajectory.
|
optional int32 node_index = 2; // Node index in the given trajectory.
|
||||||
}
|
}
|
||||||
|
|
||||||
message SparsePoseGraph {
|
message SparsePoseGraph {
|
||||||
|
@ -40,7 +40,7 @@ message SparsePoseGraph {
|
||||||
}
|
}
|
||||||
|
|
||||||
optional SubmapId submap_id = 1; // Submap ID.
|
optional SubmapId submap_id = 1; // Submap ID.
|
||||||
optional ScanId scan_id = 2; // Scan ID.
|
optional NodeId node_id = 2; // Scan ID.
|
||||||
// Pose of the scan relative to submap, i.e. taking data from the scan frame
|
// Pose of the scan relative to submap, i.e. taking data from the scan frame
|
||||||
// into the submap frame.
|
// into the submap frame.
|
||||||
optional transform.proto.Rigid3d relative_pose = 3;
|
optional transform.proto.Rigid3d relative_pose = 3;
|
||||||
|
|
|
@ -120,9 +120,9 @@ proto::SparsePoseGraph SparsePoseGraph::ToProto() {
|
||||||
submap_id.submap_index);
|
submap_id.submap_index);
|
||||||
|
|
||||||
const NodeId node_id = node_id_remapping.at(constraint.node_id);
|
const NodeId node_id = node_id_remapping.at(constraint.node_id);
|
||||||
constraint_proto->mutable_scan_id()->set_trajectory_id(
|
constraint_proto->mutable_node_id()->set_trajectory_id(
|
||||||
node_id.trajectory_id);
|
node_id.trajectory_id);
|
||||||
constraint_proto->mutable_scan_id()->set_scan_index(node_id.node_index);
|
constraint_proto->mutable_node_id()->set_node_index(node_id.node_index);
|
||||||
|
|
||||||
constraint_proto->set_tag(mapping::ToProto(constraint.tag));
|
constraint_proto->set_tag(mapping::ToProto(constraint.tag));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue