2. hydra python binding 분석
2.1. Hydra/python/src/hydra_python/commands/habitat.py
- 이 코드는 Hydra라는 라이브러리를 사용하여 Habitat 시뮬레이터와 상호작용하는 CLI(Command Line Interface) 명령어들을 정의한 것
- 코드의 주요 역할은
Habitat의 3D 씬(scene)을 처리
하고, 경로를 생성하거나 데이터를 기록
하며, 필요한 시각화를 수행하는 것
- 이 코드는 주로 Habitat 시뮬레이터에서 Hydra 파이프라인을 실행하는 다양한 명령어를 제공
2.2. 전체적인 흐름
- 경로 생성 및 시뮬레이션 실행:
- 주요 기능은
경로를 생성
하고, 해당 경로에 따라 시뮬레이션을 실행
하며, TSDF와 메시에 대한 공간 정보를 복원
하는 것
- 이를 통해 에이전트가 3D 공간에서 작업을 수행할 수 있도록 환경을 제공
- 카메라 정보:
- 시뮬레이션에서
카메라의 설정 정보도 출력할 수 있으며,
- 이를 통해 에이전트의 시각적 인식 기능을 설정할 수 있습니다.
2.3. 주요 함수 및 로직 설명
1. _get_trajectory(data, prev_dsg, seed, use_full_scene=False)
- 이 함수는 시뮬레이션 내에서 에이전트가 따라갈 경로(trajectory)를 생성
- 이전의 DSG(Scene Graph)가 주어지면 그 정보로부터 경로를 복원하고, 그렇지 않다면 주어진 설정에 따라 경로를 랜덤으로 생성
use_full_scene
플래그가 설정된 경우 전체 씬을 대상으로 경로를 생성하고, 그렇지 않다면 랜덤 경로를 생성합니다.
- 반환된 경로는
hydra.Trajectory
객체로, 경로의 길이는 메트릭 단위로 출력됩니다.
세부 사항:
prev_dsg
:
- 이전의 DSG 파일에서 경로를 복원할 때 사용
use_full_scene
:
- 만약 이 플래그가 참이라면 전체 씬의 경로를 생성합니다.
- 그렇지 않으면 임의의 경로를 선택합니다.
- 경로 출력:
2. @cli.command(name="run")
hydra habitat run /path/to/habitat/mp3d/17DRP5sb8fy/17DRP5sb8fy.glb -v
- 이 명령어는 주어진 scene_path에서 Hydra를 실행하는 명령어
- 주요 작업:
- 시뮬레이션 씬을 불러오고,
- 경로를 생성하며,
- 필요한 설정을 로드한 뒤 Hydra 파이프라인을 초기화하고 실행
- 시각화 옵션을 사용하면 시뮬레이터와 그래프의 동작을 볼 수 있음
2.1. 주요 옵션들:
scene_path
: 시뮬레이션에 사용할 씬 파일의 경로
output_path
: 시뮬레이션 결과를 저장할 경로
label_space
: 세멘틱 레이블을 정의하는 공간
- 예를 들어, 'ade20k_mp3d'는 유명한 세멘틱 레이블 데이터셋 중 하나입니다.
prev_dsg
:
- 이전의 DSG 파일을 입력으로 받아들여 경로를 복원할 때 사용합니다.
seed
: 랜덤 경로를 생성할 때 사용할 시드 값입니다.
visualize
: 시각화를 활성화할지 여부를 설정합니다.
glog_level
및 verbosity
: 로깅과 출력의 수준을 조절하는 옵션입니다.
use_full_scene
:
- 전체 씬을 사용할지, 일부만 사용할지를 설정하는 플래그입니다.
- 이 함수의 흐름은
scene_path
로부터 데이터를 읽어오고, 경로를 생성하며, 해당 경로에 따라 시뮬레이션을 실행하는 구조로 되어 있습니다.
3. @cli.command(name="reconstruction")
- 이 명령어는 Habitat 씬(scene)에서 메시와 TSDF를 복원하는 역할을 합니다.
- 이때 복원된 3D 공간을 기반으로 에이전트가 작업을 수행할 수 있게 됩니다.
주요 옵션들:
scene_path
: 사용할 씬의 경로입니다.
voxel_size
: TSDF에서 사용할 볼셀 크기를 지정합니다. 볼셀은 3D 공간을 나누는 작은 단위입니다.
- 이 명령어는 주어진 씬에서 3D 메시와 TSDF 데이터를 복원하여, 해당 공간의 정보를 제공합니다.
4. @cli.command(name="record")
- 이 명령어는 시뮬레이션을 실행하여
MP3D 데이터셋에서 데이터를 기록하는 역할
- 데이터를 기록하는 동안, 시뮬레이터에서 생성된 경로와 관련된 정보를 함께 기록
주요 옵션들:
scene_path
: 사용할 씬 파일 경로입니다.
output_path
: 기록된 데이터를 저장할 경로입니다.
5. @cli.command(name="camera-info")
- 이 명령어는 카메라 정보를 출력하는 역할을 합니다.
- 주어진 scene_path에 대응하는 카메라의 정보(예: 해상도, 시야각 등)를 출력합니다.
2.2. python/src/hydra_python/run.py
- 이 코드는 Hydra 프로젝트에서
이미지를 시각화
하고, 시뮬레이션을 실행
하며, 데이터를 처리
하는 로직을 담고 있어.
2.2.0. 전체적인 흐름 요약
- 이미지 시각화 준비:
ImageVisualizer
클래스를 통해 이미지 시각화 환경을 준비
하고, 시각화를 진행할 수 있도록 함.
- 단계별 처리:
_take_step
함수가 각 단계별로 포즈, 이미지, 세그먼트 데이터
를 처리하고, 파이프라인에 넘겨서 실행함.
- 파이프라인 실행:
run
함수는 pose_source
에서 포즈 데이터를 순차적으로 가져오며
,
- 각 포즈마다
_take_step
을 호출하여 데이터를 처리하고 시뮬레이션을 진행함.
- 진행 상태 및 콜백:
- 각 단계가 완료될 때마다
step_callback
을 호출하여 결과를 시각화하거나 파이프라인을 업데이트함.
2.2.1. ImageVisualizer 클래스
class ImageVisualizer:
"""GUI for showing images."""
def __init__(self):
"""Initialize pyqtgraph."""
import pyqtgraph.multiprocess as mp
proc = mp.QtProcess(processRequests=False)
self._pg = proc._import("pyqtgraph")
self._pg.setConfigOptions(imageAxisOrder="row-major")
self._view = None
- 목적: 이 클래스는 이미지를 시각적으로 표시하는 GUI를 담당해.
- pyqtgraph: Python용 고성능 시각화 도구인
pyqtgraph
를 사용해 GUI를 구성하고, 이미지를 보여주기 위한 초기화 과정을 진행해.
self._view
: self._view
는 이미지가 처음 표시될 때 초기화되며, 이후에는 업데이트될 때마다 이 뷰에 이미지를 갱신하게 됨.
def show(self, image, is_depth=False):
"""Show an image."""
kwargs = {"autoLevels": False, "levels": (0, 255)} if not is_depth else {}
if self._view is None:
self._view = self._pg.image(image, **kwargs)
if is_depth:
self._view.setPredefinedGradient("viridis")
else:
self._view.setImage(image, **kwargs)
- 이미지 표시:
show()
메서드는 주어진 이미지를 화면에 표시해.
- 깊이 이미지 (
is_depth
):
- 깊이 이미지를 표시할 경우에는
viridis
라는 색상 그라디언트를 설정하여 깊이 값을 시각적으로 표현해.
- 업데이트:
- 이미 뷰가 존재하는 경우(
self._view
가 None
이 아님), 새로운 이미지를 갱신하는 방식으로 동작해.
2.2.2. hydra_output_callback 함수
def hydra_output_callback(pipeline, visualizer):
"""Show graph."""
if visualizer:
visualizer.update_graph(pipeline.graph)
- 목적:
- 이 함수는
Hydra의 파이프라인
과 시각화 도구(visualizer)
를 업데이트하는 콜백 함수야.
- 주어진 파이프라인의 그래프 구조를 시각화 도구에 업데이트해서 표시
2.2.3. _take_step 함수
def _take_step(pipeline, data, pose, segmenter, image_viz):
timestamp, world_t_body, q_wxyz = pose
q_xyzw = np.roll(q_wxyz, -1)
world_T_body = np.eye(4)
world_T_body[:3, 3] = world_t_body
world_T_body[:3, :3] = R.from_quat(q_xyzw).as_matrix()
data.set_pose(timestamp, world_T_body)
labels = segmenter(data.rgb) if segmenter else data.labels
if image_viz:
image_viz.show(data.colormap(labels))
pipeline.step(timestamp, world_t_body, q_wxyz, data.depth, labels, data.rgb)
- 목적:
_take_step
함수는 시뮬레이션이나 데이터 처리에서 한 단계를 실행하는 역할
- 파이프라인에 입력 데이터와 포즈 정보를 제공하고, 각 데이터를 처리한 후 결과를 시각화
- 데이터 처리:
- RGB 이미지에서 세그먼트 라벨을 생성하거나 이미 저장된 라벨을 사용해 처리함.
- 이미지 시각화:
image_viz
가 활성화된 경우(show_images=True
), 세그먼트 라벨을 기반으로 이미지를 시각화함.
- 파이프라인 실행:
reconstruction
frontend
backend