SLAM-Dunk-Prometheus

iPhone LiDAR-IMU SLAM & Semantic Segmentation

Prometheus Team

개요

SLAM-Dunk-Prometheus는 iPhone의 LiDAR·IMU·RGB 카메라만을 사용해 실내 공간을 3D로 재구성하고, 그 위에 의미론적 이해(semantic understanding)를 결합해 '공간이 무엇인지'까지 추론하는 end-to-end 파이프라인입니다.

Depth+IMU 기반 Geometry SLAM으로 카메라 궤적을 안정적으로 복원한 뒤 TSDF fusion으로 정제된 3D 맵(mesh/point cloud)을 생성하고, Mosaic3D(geometry-only)와 OpenScene(open-vocabulary)를 결합해 구조물과 물체를 함께 인식하는 semantic map을 구축합니다.

최종 결과는 웹 기반 인터랙티브 데모(viser)로 시각화되며, 사용자는 “wall”, “bed”, “Where can I walk?” 같은 텍스트 질의로 3D 공간에서 관련 영역을 즉시 탐색할 수 있습니다.

데모 패널

SLAM-Dunk 데모 패널

실시간 SLAM 결과 및 세그멘테이션 시각화

시스템 모듈

SLAM 파이프라인

StrayScanner 데이터셋에 최적화된 실시간 LiDAR-IMU SLAM 시스템입니다. 주요 기능은 다음과 같습니다.

  • 센서 융합: 고주파 LiDAR와 IMU 센서 데이터를 융합하여 정확한 위치 추정
  • 포즈 추정: 포즈 추정 및 궤적 최적화를 통한 정밀한 로봇 위치 추적
  • 포인트 클라우드 처리: 효율적인 포인트 클라우드 처리 및 3D 맵 구축
  • 데이터 전처리: 포괄적인 데이터 전처리 및 후처리 도구 제공

기술적 특징: depth 맵과 confidence 맵을 활용하여 높은 정확도의 3D 맵을 생성합니다. post_processor.py를 통해 데이터 통합 및 후처리를 수행할 수 있습니다.

Python LiDAR IMU 포인트 클라우드

3D 세그멘테이션

딥러닝 모델을 융합한 3D Semantic Segmentation 시스템입니다. 주요 기능은 다음과 같습니다.

  • Mosaic3D 통합: Mosaic3D 모델을 활용한 고정밀 3D 세그멘테이션
  • OpenScene 지원: OpenScene 모델을 통한 다양한 장면 이해
  • 대화형 시각화: 세그멘테이션된 장면을 위한 대화형 시각화 도구

기술적 특징: 본 모듈은 convert_stray.py를 통해 StrayScanner 데이터를 세그멘테이션 모델에 적합한 형식으로 변환합니다. Mosaic3D와 OpenScene 모델을 모두 지원하여 다양한 환경에서 높은 정확도의 세그멘테이션을 제공합니다.

Python 딥러닝 3D 비전 의미론적 세그멘테이션 Mosaic3D OpenScene

데모 영상

SLAM과 세그멘테이션이 작동하는 전체 파이프라인 시연

핵심 개념

SLAM이란?

SLAM(Simultaneous Localization And Mapping)은 로봇이나 자율주행 차량이 미지의 환경에서 동시에 자신의 위치를 파악하고 주변 환경의 지도를 작성하는 기술입니다. 본 프로젝트에서는 LiDAR(Light Detection And Ranging) 센서와 IMU(Inertial Measurement Unit)를 융합하여 3차원 공간에서의 정밀한 위치 추정과 맵 구축을 수행합니다.

LiDAR-IMU 센서 융합

LiDAR는 레이저를 사용하여 주변 환경까지의 거리를 측정하는 센서로, 정밀한 3D 포인트 클라우드 데이터를 제공합니다. IMU는 가속도계와 자이로스코프를 포함하여 로봇의 움직임과 방향을 측정합니다. 이 두 센서를 융합함으로써 각 센서의 장점을 살리고 단점을 보완하여 더 정확하고 안정적인 위치 추정이 가능합니다.

3D 의미론적 세그멘테이션

3D 의미론적 세그멘테이션은 3차원 포인트 클라우드의 각 점에 의미론적 레이블(예: 벽, 바닥, 가구, 사람 등)을 할당하는 작업입니다. 본 프로젝트는 Mosaic3D와 OpenScene 같은 최신 딥러닝 모델을 활용하여 실시간으로 3D 장면을 이해하고 분류합니다. 이를 통해 로봇은 단순히 장애물의 위치뿐만 아니라 그것이 무엇인지까지 이해할 수 있습니다.

StrayScanner 데이터셋

StrayScanner는 모바일 기기를 사용하여 수집한 실내 환경 데이터셋입니다. RGB 영상, depth 맵, IMU 데이터, odometry 정보를 포함하며, 본 프로젝트는 이 데이터셋을 활용하여 실시간 SLAM 및 세그멘테이션 알고리즘을 개발하고 검증합니다.

파이프라인 설명

Pipeline Overview

Goal

  • iPhone LiDAR + IMU + Camera라는 제한된 센서만으로 실내 공간을 3D로 재구성
  • 공간/물체의 의미를 추론
  • “여긴 뭐야?”, “어디를 걸어갈 수 있어?” 같은 질문에 반응하는 기능 구현

Why this matters

  • 고가의 360° LiDAR 없이 동작하는 최근 가정용 로봇의 방향성과 유사
  • iPhone LiDAR는 시야각/해상도/노이즈 측면에서 어려운 센서 조건
  • 해당 조건에서 SLAM + semantic understanding을 끝까지 연결한 레퍼런스가 매우 제한적

Input sensors

LiDAR depth (low-res, narrow FoV) IMU (gyro/accel) RGB camera (appearance + language query)

Step-by-step Pipeline

Step 0. iPhone Scan Output

What you get after a quick scan

  • Depth frames: 각 픽셀의 거리 정보
  • RGB frames: 일반 컬러 영상 프레임
  • IMU stream: 회전/가속도 변화 기록
  • Camera intrinsics: 카메라 내부 파라미터

Key point

  • 각 프레임이 서로 어떤 위치 관계인지 모르는 상태
  • 프레임을 단순히 쌓으면 3D가 뒤틀리고 누적 오차가 커짐
  • 다음 SLAM 단계에서 '카메라가 어떻게 움직였는지'를 복원해야 함

Step 2. 3D Reconstruction

Purpose

  • SLAM으로 얻은 경로를 기준으로 depth를 하나의 좌표계로 통합
  • 실내 공간을 3D mesh / point cloud로 생성

What happens

  • Depth filtering: 신뢰도 낮은 픽셀 제거, outlier 제거
  • TSDF fusion: 여러 프레임 depth를 안정적으로 통합, 표면을 매끄럽게 복원
  • Post-processing: 작은 조각/이상치 제거, 표면 정리 및 smoothing

Output

  • Refined mesh (3D surface)
  • Refined point cloud (3D points)
refined_mesh
refined_mesh
refined_pointcloud
refined_pointcloud

Step 3. Geometry-only Segmentation (Mosaic3D)

Purpose

  • RGB 없이 형상 정보만으로 semantic segmentation 시도
  • 바닥/벽/천장처럼 구조적으로 확실한 요소를 안정적으로 확보

Strength

  • 큰 구조물(바닥/벽/천장)은 비교적 안정적으로 분리 가능
  • 조명/텍스처 변화에 영향을 덜 받음

Limitation

  • 작은 공간에 물체가 밀집된 환경에서는 성능 저하
  • 작은 물체들은 형상만으로 구분이 어려움

Output

  • Geometry-derived labels (per-point / per-voxel prediction)
  • Floor/Wall 같은 구조 클래스의 anchor 정보
output_pointcloud
output_pointcloud
output_mesh
output_mesh

Step 4. Open-vocabulary Features (OpenScene)

Purpose

  • RGB 기반 appearance 단서로 작은 물체 구분 강화
  • 텍스트 질의(bed, chair, bag)에 반응하는 feature 생성
  • 질의 기반 의미 탐색(query-driven semantic search)까지 확장

What happens (conceptually)

  • RGB 프레임에서 언어 정렬된 feature 추출
  • 3D 공간으로 투영해 point-wise feature로 누적
  • 3D 문맥(geometry)을 고려해 feature를 더 일관되게 정제

What it enables

  • 작은 물체(침대, 의자, 책 등) 인식 개선
  • 텍스트 질의에 따라 관련 3D 영역을 유연하게 강조

Output

  • Open-vocabulary 3D features (per-point embedding)
output_pointcloud
output_pointcloud
output_mesh
output_mesh

Step 5. Fusion: Structure (Geometry) + Objects (Open-vocab)

Why fusion

  • Geometry-only는 구조물에 강함, 작은 물체에 약함
  • Open-vocab는 물체에 강함, 구조적 안정성이 흔들릴 수 있음
  • 둘을 결합해 전체적으로 안정성 높은 Semantic map을 목표로 함

Fusion strategy (high-level)

  • 구조적 영역(바닥/벽 등): Mosaic3D anchor를 더 신뢰
  • 물체 영역(침대/의자 등): OpenScene feature를 더 신뢰
  • 결과적으로 구조는 흔들리지 않고, 물체는 더 잘 분리되며, 질의 기반 탐색도 가능

Output

  • 최종 semantic map (per-point scores / labels)
  • interactive query에 바로 사용할 수 있는 representation

Step 6. Interactive Demo (viser): Ask the Map

Purpose

  • 연구 결과를 직관적으로 이해할 수 있게 시각화
  • 로봇처럼 공간이 답하는 느낌

Interaction

  • 텍스트 질의 입력
  • 3D 공간에서 관련 영역이 즉시 강조

Example queries

Where can I walk? bed chair desk wall floor

Data Transformation Summary

From raw sensor data → to robot-readable map

  • Raw depth/RGB/IMU (연속 프레임)
  • Geometry SLAM (이동 경로 복원)
  • 3D reconstruction (지도 생성)
  • Geometry segmentation (구조적인 feature 확보)
  • Open-vocabulary features (물체 + 언어 feature 확보)
  • Fusion (구조 안정성 + 물체 인식 + 질의 대응)
  • Interactive demo

시작하기

SLAM 파이프라인

git clone https://github.com/SLAM-Dunk-Prometheus/SLAM-Pipeline.git
cd SLAM-Pipeline
# 저장소 README의 설치 지침을 따르세요

# 환경 설정
conda create -n slam-pipeline python=3.9
conda activate slam-pipeline
pip install -r requirements.txt

# SLAM 실행
python LiDAR_IMU_SLAM.py data/

# 데이터 전처리
python post_processor.py data/ --integrate

3D 세그멘테이션

git clone https://github.com/SLAM-Dunk-Prometheus/Segmentation.git
cd Segmentation
# 저장소 README의 설치 지침을 따르세요

# StrayScanner 데이터 변환
python convert_stray.py

# 세그멘테이션 데모 실행
cd mosaic3d
# 데모 코드 실행

데이터 구조

StrayScanner 데이터는 다음과 같은 구조로 구성됩니다.

data/
├── rgb.mp4              # RGB 영상
├── camera_matrix.csv    # 카메라 행렬
├── odometry.csv         # 오도메트리 데이터
├── imu.csv              # IMU 데이터
├── depth/               # Depth 맵
│   ├── 000000.npy
│   ├── 000001.npy
│   └── ...
└── confidence/          # Depth confidence 맵
    ├── 000000.png
    └── ...