processIncrementalMeshGraph(*input.deformation_graph, timestamps_, unconnected_nodes_)
hasLoopClosure(*msg)
inline bool hasLoopClosure(const PoseGraph& graph) {
for (const auto& edge : graph.edges) {
if (edge.type == pose_graph_tools::PoseGraphEdge::Type::LOOPCLOSE) {
return true;
}
}
return false;
}
input의 pose graph
의 각 그래프의 엣지를 순회하며, 엣지 유형이 ‘LOOPCLOSE’인 경우를 찾는다.true
를 반환해 루프 클로저가 존재한다고 판단한다.processIncrementalPoseGraph(*msg, trajectory_, timestamps_, unconnected_nodes_)
processIncrementalPoseGraph(*msg, trajectory_, timestamps_, unconnected_nodes_);
logIncrementalLoopClosures(*msg);
msg
)에서 루프 클로저 엣지를 찾아서 loop_closures_
리스트에 저장LOOPCLOSE
인지 확인합니다.gtsam::Symbol
을 사용하여 소스 노드(src_key
)와 목적지 노드(dest_key
)의 키를 생성pose
)을 가져옵니다.loop_closures_
리스트에 추가loop_closures_
리스트: 루프 클로저 이벤트를 저장하여 나중에 경로 최적화에 사용updateAgentNodeMeasurements(*input.agent_updates.external_priors)
updateAgentNodeMeasurements
):if (input.agent_updates.external_priors) {
updateAgentNodeMeasurements(*input.agent_updates.external_priors);
// Think of it as "implicit" loop closures
have_loopclosures_ = true;
have_new_loopclosures_ = true;
}
have_loopclosures_
및 have_new_loopclosures_
를 true
로 설정하여 루프 클로저 처리가 필요함을 나타냅니다.updateAgentNodeMeasurements
함수void BackendModule::updateAgentNodeMeasurements(
const pose_graph_tools::PoseGraph& meas) {
deformation_graph_->removePriorsWithPrefix(
GlobalInfo::instance().getRobotPrefix().key);
std::vector<std::pair<gtsam::Key, gtsam::Pose3>> agent_measurements;
for (const auto& node : meas.nodes) {
agent_measurements.push_back(
{gtsam::Symbol(GlobalInfo::instance().getRobotPrefix().key, node.key),
gtsam::Pose3(node.pose.matrix())});
}
deformation_graph_->addNodeMeasurements(agent_measurements);
}
목적: 외부에서 받은 노드 측정값을 변형 그래프에 업데이트합니다.
동작:
기존 프라이어 제거:
노드 측정값 생성:
meas
)의 모든 노드를 순회하며, 각 노드의 키와 포즈를 가져옵니다.agent_measurements
벡터에 키와 포즈의 쌍을 추가합니다.변형 그래프 업데이트:
참고 사항: