핵심 요약! 이거만 보면 돼
- 최적화 여부 결정:
- 루프 클로저가 감지되고 최적화를 위한 설정이 활성화되어 있으면 최적화를 수행합니다.
- optimize 메서드 실행
- addPlacesToDeformationGraph
- 그래프 최적화
- updateDsgMesh
- callUpdateFunctions
- DSG에 mesh를 제외한 모든 나머지 계층 업데이트
- 그렇지 않으면
updateDsgMesh
와 callUpdateFunctions
만 실행합니다.
- DSG 전송: ZeroMQ를 통해 다른 시스템이나 모듈로 DSG를 전송합니다.
- 추가 처리 호출:
- 등록된 모든 sink 함수를 호출하여 추가적인 데이터 처리나 저장 등의 작업을 수행합니다.
optimize 핵심요약!
optimize
메서드는 루프 클로저가 감지되었을 때 메쉬 변형과 그래프 최적화를 수행합니다.
- 먼저, 장소(place) 노드들을 변형 그래프에 추가하여 메쉬 변형 시 공간적 일관성을 유지합니다.
- 변형 그래프를 최적화하여 메쉬 변형에 필요한 제어점의 위치를 업데이트합니다.
- 최적화된 결과를 기반으로 DSG의 메쉬를 업데이트하여 환경 지도의 왜곡을 보정합니다.
- 업데이트된 정보를 바탕으로 에이전트와 각 레이어의 업데이트 함수를 호출하여 DSG의 노드와 엣지를 갱신합니다.
- 객체, 장소, 방, 건물 등의 레이어를 각각 업데이트하고, 필요한 경우 노드 병합을 수행합니다.
- 병합 처리와 콜백 실행을 통해 DSG의 일관성과 정확성을 유지합니다.
- 이를 통해 로봇의 위치 추정과 환경 모델이 최신 상태로 유지되도록 지원합니다.
if (config.optimize_on_lc && have_loopclosures_) {
optimize(input.timestamp_ns);
} else {
updateDsgMesh(input.timestamp_ns);
callUpdateFunctions(input.timestamp_ns);
}
if (logs_) {
logStatus();
}
if (zmq_sender_) {
zmq_sender_->send(*private_dsg_->graph, config.zmq_send_mesh);
}
ScopedTimer sink_timer("backend/sinks", input.timestamp_ns);
Sink::callAll(sinks_, input.timestamp_ns, *private_dsg_->graph, *deformation_graph_);
}
개요
처리 흐름은 다음의 핵심 단계들을 포함합니다:
- 최적화와 직접 업데이트 사이의 결정
- ZeroMQ (ZMQ)를 통한 DSG 업데이트 전송
- 추가 처리를 위한 Sink 함수 호출
1. 최적화와 직접 업데이트 사이의 결정
- 시스템은 루프 클로저 감지 및 구성 설정에 따라 최적화 단계를 수행할지 직접 업데이트를 진행할지 결정합니다.
결정 로직
- 조건 확인:
- 최적화 플래그:
optimize_on_lc
는 루프 클로저가 감지되었을 때 최적화를 활성화하는 구성 파라미터입니다.
- 루프 클로저 감지:
have_loopclosures_
는 루프 클로저가 발생했는지를 나타내는 불리언 플래그입니다.
- 결정:
- 만약 루프 클로저에서의 최적화가 활성화되어 있고 그리고 루프 클로저가 감지되었다면:
- 최적화 수행: 현재 타임스탬프와 함께
optimize
함수를 호출합니다.
- 그렇지 않으면:
- DSG 메쉬 업데이트:
updateDsgMesh
함수를 호출하여 DSG의 메쉬 표현을 업데이트합니다.
- 업데이트 함수 호출:
callUpdateFunctions
메서드를 호출하여 DSG의 노드와 엣지를 조정하기 위한 다양한 업데이트 함수를 실행합니다.
목적
-
최적화:
- 최적화 시점: 루프 클로저는 로봇이 이전에 방문한 위치를 재인식할 때 발생하며, 지도에서 누적된 드리프트를 수정해야 할 수 있습니다.
- 최적화의 효과: DSG의 노드들의 위치와 방향을 조정하여 전역적인 일관성을 유지합니다.
-
직접 업데이트:
- 메쉬 업데이트: 환경의 메쉬 표현이 최신 센서 데이터와 일치하도록 업데이트합니다.
- 업데이트 함수 호출: 객체 속성 업데이트, 노드 병합, 시맨틱 레이블 조정 등 DSG 레이어에 필요한 업데이트를 적용합니다.
optimize
3. ZeroMQ (ZMQ)를 통한 DSG 업데이트 전송
- 시스템은 다른 구성 요소나 시스템과의 통신을 위해 ZMQ를 사용하여 업데이트를 전송하도록 구성될 수 있습니다.
작업
- DSG 그래프 전송:
- 함수 호출:
zmq_sender_
의 send
메서드를 호출하여 DSG 그래프를 전송합니다.
- 구성 파라미터:
config.zmq_send_mesh
플래그는 전송 시 메쉬 데이터를 포함할지 여부를 결정합니다.
목적
- 모듈 간 통신:
- 실시간 업데이트: 다른 모듈(다른 프로세스나 머신에서 실행될 수 있음)이 DSG에 대한 최신 정보를 받을 수 있도록 합니다.
- 협업: 환경의 현재 상태를 공유하여 분산 처리와 시각화를 용이하게 합니다.
4. 추가 처리를 위한 Sink 함수 호출
- 마지막으로, 시스템은 추가적인 처리를 수행할 수 있는 sink 함수들을 호출
- 이는 데이터 로깅, 분석 또는 외부 시스템과의 인터페이스 같은 작업을 수행할 수 있습니다.
작업
- 모든 Sink 함수 호출:
- 함수 호출:
Sink::callAll
메서드를 호출하여 sink 함수 리스트(sinks_
), 현재 타임스탬프, DSG 그래프, 변형 그래프를 전달합니다.
목적
- 확장성:
- 사용자 정의 처리:
- Sink를 통해 핵심 백엔드 로직을 변경하지 않고도 사용자 정의 작업을 수행할 수 있습니다.
- 데이터 내보내기:
- Sink는 파일, 데이터베이스 또는 네트워크 스트림으로 데이터를 내보내는 작업을 처리할 수 있습니다.