[Frontend] hydra code - src/frontend/frontend_module.cpp (updatePlaces)

About_work·2024년 10월 17일
0

lifelong scene graph

목록 보기
30/56
void FrontendModule::updatePlaces(const ReconstructionOutput& input) {
  if (!freespace_places_) {
    return;
  }

  NodeIdSet active_nodes;
  freespace_places_->detect(input);
  {  // start graph critical section
    std::unique_lock<std::mutex> graph_lock(dsg_->mutex);
    freespace_places_->updateGraph(input.timestamp_ns, *dsg_->graph);

    // TODO(nathan) fold this into updateGraph and return archived instead
    // find node ids that are valid, but outside active place window
    active_nodes = freespace_places_->getActiveNodes();
    for (const auto& prev : previous_active_places_) {
      if (active_nodes.count(prev)) {
        continue;
      }

      const auto has_prev_node = dsg_->graph->findNode(prev);
      if (!has_prev_node) {
        continue;
      }

      const auto& prev_node = *has_prev_node;
      prev_node.attributes().is_active = false;
      if (lcd_input_) {
        lcd_input_->archived_places.insert(prev);
      }

      if (frontier_places_) {
        frontier_places_->archived_places_.push_back(prev);
      }
    }
    previous_active_places_ = active_nodes;

    const auto& places = dsg_->graph->getLayer(DsgLayers::PLACES);
    places_nn_finder_.reset(new NearestNodeFinder(places, active_nodes));
    addPlaceAgentEdges(input.timestamp_ns);
    addPlaceObjectEdges(input.timestamp_ns);
    state_->latest_places = active_nodes;
  }  // end graph update critical section
}

0. 이것만 보면돼!

  • reconstruction 모듈이 전달한 TSDF를 기반으로 GVD 알고리즘을 돌려 place nodes를 도출(graph 형태로 도출)
  • 도출한 graph(place nodes)를 원래 그래프에 반영
  • Place(3) - Agent(2) 엣지를 새로 조정하고, Place(3)-object(2) 엣지를 새로 조정합니다.

1. updatePlaces 개요

  • 2D 및 3D 공간 내에서 유효한 장소(places)를 업데이트하고 관리

1. 목적

  • 활성 장소(active places)를 감지하고, 현재 활성 상태가 아닌 이전 장소들을 아카이빙(비활성화)
  • 이 작업은 DSG에 기반한 그래프의 갱신과 관련
    • 장소 간의 관계를 유지하며 에이전트(agent)와 물체(object)와의 연결(edge)을 업데이트
  • 이를 통해 에이전트와 물체가 실제 공간에서 어떻게 상호작용하는지를 추적하며, 루프 클로저 감지와 같은 고급 기능의 토대를 제공

2. 주요 알고리즘과 로직 분석

1) 장소 감지 및 갱신 시작 (freespace_places_)

2) 장소의 활성 상태와 아카이빙 처리

  • 현재 활성화된 장소를 추적하기 위해 active_nodes라는 집합에 현재 감지된 장소를 저장
  • 이전 활성 장소(previous_active_places_)와 비교해 현재 활성화된 장소에 포함되지 않는 노드를 비활성화합니다:
    • 비활성화된 장소의 is_active 플래그를 false로 설정합니다.
    • LCD(Loop Closure Detection)가 활성화된 경우, 비활성화된 장소를 archived_places에 추가합니다.
    • Frontier 탐색이 활성화된 경우, 비활성화된 장소를 frontierplaces에 보관합니다.

4) 에이전트-장소 및 물체-장소 간의 엣지 연결

  • addPlaceAgentEdges()addPlaceObjectEdges() 함수를 호출하여 감지된 장소와 에이전트 및 물체 간의 관계를 업데이트
    • 에이전트-장소: 에이전트와 가까운 장소를 연결합니다.
    • 물체-장소: 물체와 관련된 장소를 연결합니다.

5) 상태 갱신

  • 마지막으로, 현재 활성화된 장소의 상태를 state_->latest_places에 저장합니다.


4. addPlaceAgentEdges()addPlaceObjectEdges()

  • 이 두 함수의 목적은 장소 노드와 객체/에이전트 노드 간의 연결을 그래프에 추가하는 것
  • 가장 가까운 place를 찾아 연결함.
profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글