hydra code - python/bindings/src/hydra_python_pipeline.cpp

About_work·2024년 10월 15일
0

lifelong scene graph

목록 보기
13/56

1. python/bindings/include/hydra/bindings/hydra_python_pipeline.h

  • 이 코드는 C++ 에서 정의된 HydraPythonPipeline 클래스의 헤더 파일.
  • 이 클래스는 HydraPipeline이라는 기본 클래스를 상속받고 있으며,
    • Python 바인딩을 추가해 Python 코드에서 이 파이프라인을 사용할 수 있게 해.
  • 또한 이 클래스는
    • 파이프라인 초기화, 실행, 저장과 관련된 다양한 기능을 제공하며,
    • Frontend, Backend, Reconstruction 모듈을 포함한 시스템의 다양한 모듈들과 상호작용해.

1.1. 클래스 정의 개요

class HydraPythonPipeline : public HydraPipeline {
 public:
  using PositionMatrix = FrontendModule::PositionMatrix;
  • PositionMatrix 타입 정의:
    • 이 줄에서 PositionMatrix라는 타입을 정의하고 있는데, 이는 FrontendModule::PositionMatrix에서 가져온 타입으로,
    • 파이프라인에서 위치 정보 처리와 관련된 데이터 타입

2. 생성자와 소멸자

  HydraPythonPipeline(const PipelineConfig& config,
                      int robot_id = 0,
                      int config_verbosity = 0,
                      bool step_mode_only = true);

  virtual ~HydraPythonPipeline();
  • 생성자:
    • HydraPythonPipeline의 생성자는 여러 매개변수를 받는데,
      • 주요 인자는 PipelineConfig, robot_id, config_verbosity, 그리고 step_mode_only야.
    • PipelineConfig:
      • 파이프라인을 설정하는 구성 파일로, 파이프라인 동작에 필요한 설정 값들을 포함하고 있어.
    • config_verbosity:
      • 구성 파일의 출력 또는 동작 로그 수준을 조절하는 인자.
      • 값이 클수록 더 많은 디버깅 또는 로깅 정보가 출력될 수 있어.
    • step_mode_only:
      • 파이프라인이 한 번에 하나의 단계만 실행될 것인지 여부를 나타내는 플래그
      • true이면 단계별로 처리, false이면 연속 실행일 가능성이 있어.
  • 소멸자:
    • virtual ~HydraPythonPipeline()은 이 클래스가 삭제될 때 호출되는 가상 소멸자야. 메모리 관리와 관련된 작업이 있을 수 있어.

3. 주요 함수들

3.1 initPython

  void initPython(const PythonConfig& config, const PythonCamera& camera);
  • 역할:
    • 이 함수는 Python 환경에서 파이프라인을 초기화하는 역할을 해.
    • PythonConfig:
      • Python 측에서 설정된 구성 파일로, 파이프라인의 동작을 제어하는 데 사용
    • PythonCamera:
      • Python 카메라 설정을 받아 파이프라인에 적용
      • 카메라 정보는 시각적 데이터 처리나 재구성에 사용될 수 있어.

3.2 start, stop, save

  void start() override;
  void stop() override;
  void save() override;

4. 클래스의 내부 구성 요소들

 protected:
  bool step_mode_only_;
  std::shared_ptr<ReconstructionModule> reconstruction_;
  std::shared_ptr<FrontendModule> frontend_;
  std::shared_ptr<BackendModule> backend_;
  std::shared_ptr<LoopClosureModule> loop_closure_;

  DynamicSceneGraph::Ptr graph_;
  • step_mode_only_:
    • 파이프라인이 단계별로만 실행되는지 여부를 나타내는 내부 플래그. 앞서 생성자에서 설정된 값이 이 멤버 변수에 저장됨.
  • reconstruction_:
    • 재구성 모듈에 대한 포인터.
      • 파이프라인에서 3D 장면이나 공간을 재구성하는 역할을 할 것으로 보임.
  • frontend_:
    • 프론트엔드 모듈에 대한 포인터.
      • 주로 데이터 수집 및 초기 처리를 담당하는 모듈일 가능성이 큼.
  • backend_:
    • 백엔드 모듈에 대한 포인터.
      • 보통 더 높은 수준의 데이터 처리나 결과를 최종적으로 출력하는 모듈일 수 있음.
  • loop_closure_:
    • 루프 클로저 모듈에 대한 포인터.
      • 이 모듈은 로봇이나 시스템이 이미 방문한 장소를 다시 방문할 때, 이를 인식하고 그래프 구조를 최적화하는 역할을 할 수 있어.

ㅌㅈ

2. python/bindings/src/hydra_python_pipeline.cpp

  • 이 코드는 C++ 코드에서 Python 바인딩을 추가하기 위해 작성된 것으로,
    • HydraPythonPipeline 클래스를 Python에서 사용할 수 있도록 만들어주는 역할을 해.

3.1 initPython

  modules_["reconstruction"] = reconstruction_;
  modules_["frontend"] = frontend_;
  modules_["backend"] = backend_;
  if (GlobalInfo::instance().getConfig().enable_lcd) {
    auto lcd_config = config::fromYaml<LoopClosureConfig>(node);
    lcd_config.detector.num_semantic_classes = GlobalInfo::instance().getTotalLabels();
    config::checkValid(lcd_config);

    shared_state_->lcd_queue.reset(new InputQueue<LcdInput::Ptr>());
    loop_closure_ = std::make_shared<LoopClosureModule>(lcd_config, shared_state_);
    modules_["lcd"] = loop_closure_;
  }
  • loopclosure 모듈을 생성하는데, enable_lcd = True 일 때만 생성한다.
    • TODO: enable_lcd = False 인 것 같은데 확인해보자.
  • TODO: loopclosure 작동 방법
    • HydraPipeline::start() 를 써야하는듯

3.3 step 메서드 (Overloading)

.def("step",
     [](HydraPythonPipeline& pipeline,
        size_t timestamp_ns,
        const Eigen::Vector3d& world_t_body,
        const Eigen::Vector4d& world_R_body,
        const py::buffer& depth,
        const py::buffer& labels,
        const py::buffer& rgb) {
       auto input = std::make_shared<InputPacket>();
       input->timestamp_ns = timestamp_ns;
       input->world_t_body = world_t_body;
       input->world_R_body = Eigen::Quaterniond(
           world_R_body[0], world_R_body[1], world_R_body[2], world_R_body[3]);
       input->sensor_input =
           std::make_unique<PythonSensorInput>(timestamp_ns, depth, labels, rgb);
       return pipeline.spinOnce(*input);
     })
  • step:
    • 파이프라인에서 하나의 프레임 또는 단계를 처리하는 함수.
    • 이 함수는 두 가지 방식으로 오버로딩되어 있음.
    • 첫 번째 오버로드
      • depth, labels, rgb 데이터를 받아 처리
    • 이 함수는 입력 데이터(InputPacket)을 구성한 후, spinOnce 메서드를 통해 한 단계를 처리함.
  • Python에서 이 함수는 다음과 같이 호출될 수 있어:
pipeline.step(timestamp_ns, world_t_body, world_R_body, depth, labels, rgb)

메인 함수

bool HydraPythonPipeline::spinOnce(const InputPacket& input) {
  if (!reconstruction_->spinOnce(input)) {
    return false;
  }

  if (!frontend_->spinOnce()) {
    LOG(ERROR) << "[Hydra] Frontend failed to return output";
    return false;
  }

  backend_->spinOnce(true);
  return true;
}

4. 바인딩된 함수들의 역할 요약

  1. 생성자 (__init__):
  • HydraPythonPipeline 객체를 초기화하며, 설정 파일, 로봇 ID 등을 전달받아 초기 상태를 설정.
  1. init:
  • Python 설정과 카메라 정보를 사용하여 파이프라인을 초기화.
  1. save:
  • 파이프라인 상태를 저장.
  1. step (오버로드):
  • 입력 데이터를 받아 파이프라인에서 한 단계(프레임)를 처리.
  1. graph (속성):
  • 파이프라인에서 현재 사용 중인 장면 그래프를 Python에서 조회할 수 있는 속성.

profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글