2026년 4월 15일 shosae · Jetson AGX Orin 연구 진행 중

MoNa-π: Flow Matching 기반
모바일 내비게이션 VLA

SigLIP SO400M 비전 인코더, Gemma-2B 언어 모델, 그리고 Flow Matching 액션 헤드를 결합한 End-to-End 모바일 로봇 내비게이션 시스템. 기존 이산 분류 방식의 한계를 극복하고 연속 액션 공간에서의 고품질 궤적 생성을 실현합니다.

~3.5B 총 파라미터 수
10-step 액션 청크 (Receding Horizon)
150 학습 에피소드
10Hz 제어 주파수

왜 Flow Matching인가?

기존 MoNaVLA(Kosmos-2 + 9-class 이산 분류)는 오프라인 지표 100% 수렴을 달성했지만, 실제로는 타이밍 암기(timing memorization)에 의한 결과였습니다. 시각적 인과 관계를 진정으로 이해하지 못하면 실환경 일반화는 불가능합니다.

❌ 기존 MoNaVLA의 한계
이산 9-class 출력
전진/좌회전/우회전 등 불연속 범주 — 부드러운 궤적 불가
❌ 기존 MoNaVLA의 한계
타이밍 암기 문제
오프라인 100% 정확도가 시각 이해가 아닌 시간 패턴 암기
✅ MoNa-π 개선
연속 액션 공간 + Flow Matching
Gaussian 노이즈 → 액션 청크로의 확률적 매핑 학습
✅ MoNa-π 개선
Action Chunking + Receding Horizon
10-step 청크 예측, 50% 소진 시 재계획 — 부드러운 고빈도 제어
핵심 아이디어: Flow Matching은 단순 회귀나 분류보다 훨씬 풍부한 액션 분포를 모델링합니다. 노이즈에서 실제 액션으로 가는 확률적 흐름을 학습함으로써, 동일한 시각 입력에 대해 다양하고 자연스러운 궤적을 생성할 수 있습니다.

SigLIP + Gemma-2B + Flow Matching

Physical Intelligence의 π0 설계를 참고하여, 대규모 비전-언어 모델을 연속 액션 생성 헤드와 결합합니다.

입력 인코더 조건부 출력 이미지 시퀀스 (B, 8, 3, 384, 384) CLIP 정규화 + HFlip 증강 자연어 명령 [INTENT] instruction 9-class 의도 Prefix 주입 가우시안 노이즈 x₀ ~ N(0, I) (B, 10, 3) 학습 시: ODE SigLIP SO400M 비전 인코더 (FP16) 패치 토큰 추출 Gemma-2B 언어 모델 (FP16) hidden: 2048 Perceiver Resampler 64개 잠재 토큰 크로스 어텐션 압축 노이즈 x_t x_t = (1-t)x₀ + t·x₁ 학습 시 선형 보간 Flow Matching Head Self/Cross-Attn (4 layers) v_θ(x_t, t, c) 속도장 예측 액션 청크 (B, 10, 3) vx, vy, angular_z
구성 요소 모델 출력 크기 역할
비전 인코더 SigLIP SO400M patch14-384 (B·W, N_patch, 1152) 8프레임 이미지를 패치 토큰으로 변환
언어 모델 Gemma-2B (FP16) (B, L, 2048) 자연어 명령 인코딩 + 비전 토큰 융합
리샘플러 Perceiver Resampler (B, 64, 2048) 가변 길이 비전-언어 특징 → 64 고정 토큰
액션 헤드 Flow Matching Head (B, 10, 3) 조건부 속도장 v_θ 예측 → ODE 적분

Conditional Flow Matching

Flow Matching은 단순한 Gaussian 분포에서 목표 액션 분포로의 결정론적 흐름을 학습합니다. 확산 모델(Diffusion)보다 빠르고 안정적이며, 단 3~10 스텝의 ODE 적분으로 샘플링이 가능합니다.

# 선형 보간: 노이즈에서 실제 액션으로의 직선 경로 x_t = (1 - t) · x₀ + t · x₁ t ∈ [0, 1] # x₀: 가우시안 노이즈, x₁: ground-truth 액션 청크 x₀ ~ N(0, I) x₁ ∈ ℝ^(10 × 3) # 학습 목표: 속도장 v_θ가 (x₁ - x₀)를 예측하도록 L_CFM(θ) = 𝔼t, x₀, x₁ [ ‖ v_θ(x_t, t, c) − (x₁ − x₀) ‖² ] # 추론: ODE 적분으로 노이즈 → 액션 샘플링 (Heun's method, 5 steps) x̂₁ = ODESolve(v_θ, x₀, t_span=[0,1]) → (10, 3) 액션 청크

지원 ODE 솔버

Euler Solver
1–3 steps
가장 빠름 · 실시간 추론용
🎯
Heun Solver
5–10 steps
기본값 · 속도-품질 균형
DPM Solver
3–5 steps
Adams-Bashforth 3차 · 고품질

프로젝트 디렉토리

각 폴더는 파이프라인의 한 단계를 담당하며, 독립적으로 실행 가능합니다.

모델
models/
  backbones/ pi0_backbone.py
  components/ resampler.py
  heads/ flow_head.py
  pi0_core.py ← 메인 래퍼
데이터
data/
  preprocessing.py ← Smoother·Prefix
  dataset.py ← HDF5 v5/v6
collect/
  keyboard_collector.py
  ros2_recorder.py
학습 & 평가
training/
  train.py ← Cosine+Warmup LR
  evaluate.py ← Normalized MSE
configs/
  train.yaml ← 전체 하이퍼파라미터
추론 & 로봇
inference/
  engine.py ← 캐시 TTL 0.5s
  server.py ← FastAPI REST
  ode_solver.py ← Euler·Heun·DPM
robot/
  action_buffer.py
  ros2_controller.py

모델 파라미터 구성

SigLIP SO400M
~400M params
Gemma-2B
~2,000M params
PerceiverResampler + FlowHead
~130M params

데이터 수집부터 로봇 제어까지

MoNa-π는 데이터 수집, 전처리, 학습, 추론 서버, 로봇 서버로 이어지는 완전한 End-to-End 파이프라인을 갖추고 있습니다.

1 📷
데이터 수집
keyboard_collector.py
RampController
HDF5 v6 저장
2 ⚙️
전처리
ActionSmoother
IntentPrefixInjector
Counterfactual
3 🧠
학습
Flow Matching Loss
Cosine+Warmup LR
HF Accelerate
4 🚀
추론 서버
FastAPI REST
POST /predict
캐싱 TTL 0.5s
5 🤖
로봇 서버
ROS2 Node
10Hz cmd_vel
Receding Horizon

데이터 전처리 파이프라인 상세

모듈기능출처 / 방식
ActionSmoother Savitzky-Golay 필터 (window=11, poly=3) — 키보드 Bang-bang 스파이크 제거 신규 구현
ActionNormalizer [-1.15, 1.15] → [-1.0, 1.0] 선형 스케일링 MoNaVLA 이관
IntentPrefixInjector 액션 궤적에서 9-class 의도 분류 후 한/영 다변형 instruction 생성 (20% 노이즈) MobileVLA-R1 방식
CounterfactualInjector stop_prob/steer_prob 확률로 액션+instruction 오버라이드 → 인과 혼란 완화 MoNaVLA 이관
HFlip 증강 이미지 좌우 반전 + angular_z 부호 반전 + instruction left↔right 교체 MoNaVLA 계승

키보드 가감속 제어 (RampController)

Bang-bang 문제: 일반 키보드 수집은 키를 누르는 순간 최대 속도, 떼는 순간 0이 되는 불연속 신호를 만듭니다. Flow Matching은 부드러운 궤적을 선호하므로 이런 스파이크는 학습 품질을 크게 저하시킵니다. RampController는 이차 가속도를 적용해 0.5초에 최대 속도 1.15 도달, 0.15초 감속을 구현합니다.
1.15 0 t=0 0.5s 키 뗌 0.65s 기존 Bang-bang RampController (이차 가속도) 이차 가속 0.15s 감속

빠른 시작 (Shell Alias)

# vla-* alias에 --pi 플래그 추가 — 기존 MoNaVLA 동작 유지

vla-collect --pi --output /data/ep001.h5 --task "장애물 회피"
vla-train   --pi configs/train.yaml
vla-server  --pi --ckpt checkpoints/best
vla-inference --pi --instruction "장애물 피해 직진"
vla-eval    --pi checkpoints/best

구현 현황 및 검증

2026년 4월 15일 기준 파이프라인 각 단계의 검증 결과입니다. 실제 모델 체크포인트 없이 구조 및 동작 검증에 집중했습니다.

📦
데이터셋 로딩
✓ 통과
150 에피소드 · 266 샘플 · (2,8,3,384,384)
FlowMatchingHead
✓ 통과
loss=1.57 · backward · FP16
🔄
ODE 솔버
✓ 통과
Euler / Heun / DPM 모두 검증
🎓
학습 루프 1회
✓ 통과
DataLoader→loss→backward→step · loss=2.08
🎮
ActionChunkBuffer
✓ 통과
push/pop/replan/emergency 논리 검증
📡
모듈 임포트
✓ 통과
evaluate / server / ros2_controller 구문 검증
🌐
추론 서버 end-to-end
⏳ 진행 중
학습된 체크포인트 필요
🤖
ROS2 통합
⏳ 대기
ROS2 환경 및 실제 하드웨어 필요

SOTA 논문 대응

논문핵심 아이디어MoNa-π 대응상태
TIC-VLA (2026) Slow VLM + Fast Action Expert 분리 Gemma-2B backbone + FlowMatchingHead 분리 구조 ✓ 구현
OmniVLA (ICRA 2026) 저주파 카메라 → 연속 속도 제어 ActionSmoother + 2Hz 이미지 + 10-step chunking ✓ 구현
MobileVLA-R1 (2025) 이산 의도 CoT + 연속 제어 분리 IntentPrefixInjector (9-class) + Flow Matching ✓ 구현
π0 (Physical Intelligence) SigLIP + PaliGemma + Flow Matching SigLIP SO400M + Gemma-2B + 동일 Flow Matching 참조

MoNaVLA → MoNa-π 이관 항목

기존 MoNaVLA 연구에서 검증된 기술들을 MoNa-π에 이식했습니다. 무엇을 버리고 무엇을 지켰는지 명확히 합니다.

MoNaVLA · nav_h5_dataset_impl.py:258
CLIP 정규화 상수
mean=[0.481, 0.458, 0.408] std=[0.269, 0.261, 0.276] — SigLIP도 동일 상수 사용
MoNaVLA · nav_h5_dataset_impl.py:338
HFlip 증강 전략
이미지 반전 + angular_z 부호 반전 + instruction left↔right 교체
MoNaVLA · nav_h5_dataset_impl.py:291
Counterfactual Injector
stop/steer 5% 확률 오버라이드로 인과 혼란 완화
MoNaVLA · nav_h5_dataset_impl.py:123
다국어 Action-aware Instruction
한/영 20개+ 변형, 20% 확률 노이즈 텍스트
MoNaVLA · vla_control_utils.py
VLAControlManager
robust_stop() 5회 반복, move_and_stop_timed() 0.4s 이동 후 자동 정지
MoNaVLA · gradio_data_collector.py
HDF5 v5 포맷 키 구조
observations/images, actions, language_instruction (dataset, not attrs)

다음 단계

파이프라인 골격은 완성되었습니다. 이제 실제 학습과 실환경 검증으로 나아갑니다.

✓ 전체 파이프라인 골격 구현
collect → preprocess → train → inference → robot server 전 모듈 코드 완성
✓ 데이터 파이프라인 검증
150 에피소드 로딩, CLIP 정규화, HFlip, 의도 Prefix 동작 확인
✓ Flow Matching 손실 + 역전파 검증
FlowMatchingHead FP16 손실 계산, backward pass, ODE 솔버 3종 검증
→ 1 Epoch 학습 smoke test
train.yaml 설정으로 전체 학습 루프 실행, val_loss 수렴 확인
추론 서버 end-to-end 검증
학습된 체크포인트로 POST /predict → 200ms 이내 응답 확인
Jetson AGX ROS2 통합
카메라 → 추론 서버 → cmd_vel 10Hz 루프, 실환경 장애물 회피 테스트
신규 데이터 수집 (RampController)
가감속 Ramp 키보드로 Bang-bang 없는 부드러운 궤적 수집, v6 포맷
정량 평가 및 논문 작성
Normalized MSE, 실환경 성공률, MoNaVLA 대비 비교 실험

다른 로봇·태스크로 이식하려면?

MoNa-π 아키텍처는 내비게이션을 위해 설계됐지만, 핵심 컴포넌트는 도메인에 무관합니다. 어떤 부분이 재사용 가능하고 어디를 교체해야 하는지 컴포넌트별로 분석합니다.

컴포넌트파일이전 난이도무엇을 바꾸나
SigLIP SO400M models/backbones/pi0_backbone.py 🟢 재사용 변경 없음. 사전학습 시각 표현은 완전히 도메인 독립적
Gemma-2B models/backbones/pi0_backbone.py 🟢 재사용 변경 없음. 언어 이해 능력은 어떤 언어 명령에도 적용
PerceiverResampler models/components/resampler.py 🟢 재사용 변경 없음. 64토큰 압축 구조는 도메인에 무관
FlowMatchingHead models/heads/flow_head.py 🟢 config 1줄 action_dim: 3 → 7만 변경. Transformer 구조 전체 재사용
ODE Solvers inference/ode_solver.py 🟢 재사용 변경 없음. 수치 적분은 액션 차원에 무관
ActionSmoother data/preprocessing.py 🟢 재사용 Savitzky-Golay는 임의 차원 시계열에 적용 가능
ActionNormalizer data/preprocessing.py 🔵 범위 수정 min_val / max_valaction_dim 을 새 도메인에 맞게 조정
IntentPrefixInjector data/preprocessing.py 🟡 어휘 교체 9-class 내비게이션 레이블(FORWARD/TURN…)을 새 도메인 어휘(GRASP/PLACE…)로 교체
CounterfactualInjector data/preprocessing.py 🟡 로직 수정 stop/steer 오버라이드 로직을 새 도메인 실패 모드로 교체
ActionChunkBuffer robot/action_buffer.py 🟢 재사용 변경 없음. Receding Horizon 버퍼 구조는 도메인 독립
ros2_controller.py robot/ros2_controller.py 🟡 인터페이스 교체 geometry_msgs/Twist → 새 메시지 타입 (JointState, PoseStamped 등)
keyboard_collector.py collect/keyboard_collector.py 🔴 재작성 모바일 특화 키맵. 조작 로봇은 SpaceMouse/joystick 텔레오퍼레이션으로 대체 필요
학습 데이터 configs/train.yaml → data.train_path 🔴 재수집 새 도메인 시연 데이터 필요. 백본은 재사용하고 FlowHead만 fine-tune 가능

구체적 이전 시나리오

난이도 낮음
2-휠 차동구동 로봇
Turtlebot, Clearpath Husky
현재 3D 액션에서 linear_y 제거
action_dim: 2 # lx, az
IntentPrefix에서 STRAFE 클래스 제거
✓ 거의 모든 코드 재사용 가능
난이도 중간
드론 내비게이션
PX4, ArduPilot, MAVLink
6D 액션 (pos + yaw 속도)
action_dim: 4 # vx,vy,vz,yaw
ROS2 토픽 → /mavros/setpoint_velocity
고도 정보 위한 depth cam 추가 권장
⚠ 안전 제약 추가 필요
난이도 높음 · 고가치
7DoF 로봇 팔 조작
Franka, UR5, Kinova
EE 델타 포즈 또는 관절 각도
action_dim: 7 # Δx,y,z,rx,ry,rz,grip
IntentPrefix → GRASP / PLACE / WIPE …
SpaceMouse 텔레오퍼레이션으로 수집
★ π0 원본 설계 의도와 일치
환경 이전 (동일 로봇)
새 환경 Fine-tuning
실내 → 실외 / 다른 건물
코드 변경 0줄
백본 동결 (frozen) + FlowHead만 fine-tune
pretrain:
  ckpt_path: "checkpoints/best"
새 환경 ~50 에피소드만 수집해도 적응 가능 (예상)
✓ 가장 현실적인 단기 계획

7DoF 조작 이전 — 최소 변경 diff

핵심 인사이트: FlowMatchingHeadaction_dim 파라미터 하나로 임의의 차원에 즉시 적용됩니다. 백본(SigLIP + Gemma-2B)은 변경 없이 완전히 재사용됩니다. 가장 큰 장벽은 코드가 아니라 새 도메인의 시연 데이터 수집입니다.
# configs/train.yaml — 변경 3줄로 7DoF 조작 도메인 이전

model:
+  action_dim: 7     # Δx, Δy, Δz, Δrx, Δry, Δrz, gripper
-  action_dim: 3     # vx, vy, angular_z (내비게이션)
+  horizon: 20       # 조작은 더 긴 horizon 권장
-  horizon: 10

data:
+  train_path: /data/franka_episodes/
-  train_path: /data/mobile_vla_dataset_v5/

# data/preprocessing.py — IntentPrefixInjector 어휘만 교체
INTENT_LABELS = [
+    "REACH", "GRASP", "PLACE", "PUSH", "PULL", "WIPE", "OPEN", "CLOSE", "STOP",
-    "FORWARD", "BACKWARD", "TURN_LEFT", "TURN_RIGHT", ... (내비게이션 9-class)
]

# robot/ros2_controller.py — 퍼블리시 메시지 타입만 교체
+ from franka_msgs.msg import JointCommand
+   msg.position = action_chunk[0]   # 관절 각도 목표값
- from geometry_msgs.msg import Twist
-   msg.linear.x = action[0]         # 내비게이션 속도

이전 전략 요약

🔵
고정 (변경 불필요)
SigLIP · Gemma-2B · Resampler · ODE Solvers · ActionBuffer
전체 파라미터의 ~95% 재사용
🔵
Config 1줄 (파라미터 변경)
action_dim · horizon · train_path · normalizer bounds
FlowMatchingHead 구조 자동 적응
🟡
소규모 코드 수정
IntentPrefix 어휘 · ROS2 메시지 타입
~100줄 이내 수정으로 완료 가능
🔴
재작성 / 재수집 필요
데이터 수집 스크립트 · 시연 데이터셋
새 도메인 50~500 에피소드가 진짜 장벽

모바일 VLA에 효과적인 프롬프트란?

SigLIP · Gemma-2B · PerceiverResampler · FlowMatchingHead 각각의 특성이 어떤 언어 표현을 "좋아하는지" 분석합니다. 잘못된 instruction은 액션 분포를 흩뜨리고 주행을 불안정하게 만듭니다.

각 컴포넌트가 언어를 다루는 방식

👁 SigLIP SO400M
Contrastive 학습으로 텍스트와 패치가 정렬됨.
"빨간 장애물"이라는 단어가 있으면 해당 색상 패치에 attention이 집중.
→ 시각적 앵커(색·형태·위치)를 명시하면 그라운딩 품질 ↑
💬 Gemma-2B
2B 파라미터 — 복잡한 추론보다 직관적 명령이 유리.
영어 성능 > 한국어지만 fine-tune 데이터로 보완 가능.
부정문·조건문 이해가 약함.
→ 단문·목표 지향적 표현이 복문보다 효과적
🔗 PerceiverResampler
64토큰으로 압축 시 언어 conditioning에 따라 어떤 시각 패치를 보존할지 결정.
"바구니"라는 단어 → 바구니 영역 패치 우선 보존.
→ 목표 객체를 명시하면 resampler가 관련 영역 집중
⚡ FlowMatchingHead
conditioning이 약하면 액션 분포가 퍼져 불안정한 행동 생성.
명확한 intent prefix → 분포의 mode가 좁아짐.
모호한 instruction → 분산 큰 Gaussian → 뭐든 할 수 있음.
→ [INTENT] prefix가 분포를 안정화하는 핵심 장치

의도 자동 분류 — 어떻게 레이블이 붙는가

학습 데이터의 [INTENT] 레이블은 액션 청크의 평균값으로 자동 분류됩니다 (classify_intent()). 임계값 근처의 모호한 움직임이 가장 취약한 지점입니다.

lx (전진/후진) az (회전) lx=-0.15 lx=+0.15 az=+0.15 az=-0.15 STOP |lx|<0.15 & |az|<0.15 FORWARD BACKWARD TURN_LEFT TURN_RIGHT FWD_LEFT FWD_RIGHT STRAFE_LEFT STRAFE_RIGHT ⚠ 임계값 근처 모호 구간

임계값 0.15 근처에서 생성된 데이터는 의도 레이블과 실제 액션이 불일치할 수 있습니다. 학습 시 이런 샘플이 많으면 동일한 instruction이 다른 행동을 유발하는 혼동이 생깁니다.

좋은 표현 vs 피해야 할 표현

유형나쁜 표현 ❌좋은 표현 ✅이유
거리 기술 "1.5m 앞으로 이동해" "저 바구니 앞까지 가" VLM은 미터법을 물리적으로 이해 못함. 시각 앵커 기반 목표가 필요
부정 명령 "장애물 쪽으로 가지 마" "[FORWARD_LEFT] 장애물 왼쪽으로 우회해" Gemma-2B는 부정문 처리가 약함. 목표 행동을 직접 기술하는 것이 강함
조건 분기 "왼쪽이 막히면 오른쪽으로" "[TURN_RIGHT] 오른쪽 경로로 이동해" 2B 모델에 if-else 추론 기대 금물. VLM이 이미 시각 장면을 보고 있음
방위 기반 "북쪽으로 이동" / "동쪽 방향" "저 파란 벽 방향으로 직진" 절대 방위는 학습 데이터에 없음. 시각적으로 인식 가능한 기술 필요
추상적 목표 "올바른 경로를 따라가" "[FORWARD] 정면에 보이는 출구로 직진해" "올바른"은 시각 그라운딩 없음. 구체적인 시각 대상이 필요
과도하게 긴 문장 "주변을 살피며 효율적으로 회피하며 이동해" "[TURN_LEFT] 왼쪽으로 돌아서 장애물을 피해" Gemma-2B 2B 모델, 단문 선호. 핵심 동작 하나에 집중
임계값 근처 "살짝 왼쪽으로" / "아주 조금만 틀어" "[TURN_LEFT] 왼쪽으로 회전해" + 작은 az 값 데이터 0.15 임계 근처 모호성. prefix로 의도를 고정하고 액션 크기로 세기 표현
시각 앵커 없음 "앞으로 가" "[FORWARD] 정면 회색 바구니를 향해 직진해" SigLIP grounding은 텍스트 앵커에 반응. 객체 기술 → PerceiverResampler 집중도 ↑

의도 클래스별 권장 표현 패턴

VLM 특성 + 학습 데이터 분포를 고려한 권장 표현입니다. 학습 시 변형 7개 이상을 확보하는 것이 목표입니다.

[FORWARD] lx > 0.15, |az| < 0.15
"저 회색 바구니로 직진해"
"[FORWARD] Straight ahead to the target"
"정면 목표물을 향해 쭉 가"
★ 시각 앵커 포함 시 grounding ↑
[TURN_LEFT] az < -0.15, |lx| < 0.15
"왼쪽으로 회전해서 목표를 찾아"
"Rotate left toward the basket"
"좌측으로 각도를 틀어"
"약간 왼쪽으로" (임계값 근처 위험)
[TURN_RIGHT] az > 0.15, |lx| < 0.15
"오른쪽으로 조향을 바꿔"
"Steer toward the right side"
"우측 방향으로 보정해"
회전 후 목표 언급 시 안정성 ↑
[FORWARD_LEFT] lx > 0.15 & az < -0.15
"왼쪽 대각선으로 비스듬히 접근해"
"장애물 왼쪽으로 돌아가"
"Bear left of the obstacle"
★ 장애물 회피에 가장 많이 쓰이는 클래스
[FORWARD_RIGHT] lx > 0.15 & az > 0.15
"오른쪽 대각선으로 비스듬히 가"
"Shift right while moving forward"
"전진하면서 오른쪽으로 살짝 틀어"
"while" / "하면서" 동시동작 표현이 자연스러움
[STOP] |lx|,|az| < 0.15
"멈춰" / "정지" / "스톱"
"Halt" / "Freeze" / "Stand by"
"바구니 앞에서 멈춰"
★ Counterfactual 5% 오버라이드로 정지 학습 강제
[STRAFE_LEFT/RIGHT] |ly| > 0.15
"왼쪽으로 옆으로 이동해"
"Slide left while facing forward"
"왼쪽으로" (TURN_LEFT와 혼동 위험)
★ "옆으로" / "lateral" 명시로 회전과 구분 필수

논문 기반 학습 데이터 언어 전략

MobileVLA-R1 · CoT 기반
Intent prefix가 분포를 안정화
[INTENT] 태그 없이 "왼쪽으로 가"만 있으면 Flow Head가 TURN_LEFT와 STRAFE_LEFT 사이에서 분산이 커짐. prefix로 모드를 고정해야 함
OmniVLA · ICRA 2026
10% 텍스트 dropout으로 시각 강인성 학습
학습 데이터의 10%를 빈 instruction으로 만들면 모델이 언어에 과의존하지 않고 시각 정보 자체로도 판단 가능. 특히 명령이 모호할 때 시각 fallback이 작동
TIC-VLA · 2026
시간 지연을 instruction에 반영
현재 프레임 t에서 instruction을 생성하지만 실제 액션은 t+δ에 실행됨. "now"보다 "toward" / "approach" 같은 방향성 표현이 지연에 더 강건함
MoNaVLA · 다국어 20% 노이즈
한/영 혼용 + 20% 범용 변형
특정 언어 표현에 과적합 방지. "바구니로 가"와 "go to the basket" 모두 학습 → 추론 시 어떤 언어로 명령해도 작동. 범용 변형 20%가 언어 독립성을 강화
SigLIP Contrastive 특성
색상 + 형태 기술로 grounding 강화
SigLIP은 시각-텍스트 contrastive 학습 특성 상 "빨간", "둥근", "큰" 같은 시각적 속성 기술어에 강함. 공간적 앵커("왼쪽 구석", "가까운") 추가 시 PerceiverResampler attention 집중도 ↑
Gemma-2B 언어 특성
영어 > 한국어 강도, 그러나 혼합 유효
Gemma-2B pretraining은 영어 비중이 높아 영어 instruction이 더 강한 latent를 생성함. 단, fine-tuning 데이터에 한국어를 포함하면 한국어도 동등하게 작동. 코드스위칭(혼합)도 유효

데이터 수집 시 instruction 체크리스트

✅ 반드시 포함 각 의도 클래스마다 최소 7개 이상 변형 (한3 + 영4 기준) 시각 앵커 포함 버전: "저 [색상] [물체]를 향해" 형태 20% 확률로 범용 generic 표현 (Navigate to the goal 류) STOP 명령 어휘 최소 6종 (정지 학습이 안전에 가장 중요) STRAFE에 "옆으로" / "laterally" 명시 (TURN과 구분) ⚠ 주의 부정문 최소화 → 목표 행동 직접 기술로 대체 절대 거리 금지 → 시각 앵커 기반 목표로 대체 임계값 0.15 근처 애매한 데이터에 prefix 명시 강제 한 에피소드에 여러 의도가 섞이면 구간별 annotation 필요 💡 개선 아이디어 (미구현) 10% 빈 instruction dropout (OmniVLA 방식, 시각 fallback 강화) CoT 스타일: "[TURN_LEFT] 왼쪽에 장애물이 있으므로 회전" (이유 포함) GRPO 보상 기반 instruction 품질 필터링 (MobileVLA-R1 방식)

실제 π0 vs MoNa-π: 무엇이 같고 무엇이 다른가

Physical Intelligence의 π0 논문(Black et al., 2024)은 PaliGemma + Flow Matching Expert를 결합한 크로스-엠보디먼트 VLA를 제안한다. MoNa-π는 이 아키텍처를 모바일 내비게이션에 맞게 재해석한다.

실제 π0 아키텍처

PaliGemma 3B (고정) SigLIP SO400M Gemma-2B Trunk ↓ joint cross-attention ↓ VLM Tokens (visual+text) 10K 시간 · 7 로봇 · 68 태스크 크로스-엠보디먼트 사전학습 cond Action Expert (파인튜닝) Flow Matching Transformer ↑ noisy action tokens x_t joint attention (VLM ↔ action) 7DoF manipulation default ODE 10→50 step Action Chunk 50Hz · continuous

상세 비교

항목 실제 π0 MoNa-π 격차
시각 인코더 SigLIP SO400M (1152D) SigLIP SO400M (1152D) ✓ 동일
언어 모델 Gemma-2B (PaliGemma) Gemma-2B ✓ (독립 로드) 유사
언어 통합 PaliGemma 통합 joint forward [vis|text] concat → Gemma encoder ✓ 수정 완료
시각↔액션 joint attn Action Expert가 VLM 토큰에 직접 cross-attend FlowHead가 64 latent cond에 cross-attend 간접
사전학습 규모 10,000시간 · 7 로봇 · 68 태스크 단일 플랫폼 · 소규모 수집 최대 격차
액션 공간 7DoF manipulation (manipulation) (vx, vy, ωz) 모바일 내비게이션 의도적
ODE solver 50 step Euler 5 step / Heun 5 step Jetson 최적화
파인튜닝 전략 VLM 고정 + Action Expert만 학습 전체 파라미터 학습 가능 유연
수정된 치명적 결함 — 언어 지시 완전 무시 (fix: ce7134f)

기존 구현에서 text_inputforward()에 전달되었지만 내부에서 완전히 무시되었다. Gemma-2B는 로드되었으나 호출되지 않았으며, 모든 언어 지시는 액션 conditioning에 아무 영향을 미치지 않았다.

이전 (버그)
def forward(self, images, text_input=None):
    # text_input 완전 무시
    visual_latents = self.resampler(vision_feats)
    return visual_latents  # (B, 64, 2048)
이후 (수정)
def forward(self, images, text_input=None):
    visual_latents = self.resampler(vision_feats)
    # text 토크나이즈 후 concat
    combined = cat([visual_latents, text_embeds])
    out = gemma_encoder(combined)
    return out[:, :64]  # 언어 grounded

π0 벤치마크 — 우리의 목표 기준점

0.971
Bussing Easy
성공률 (π0)
>2×
π0 vs π0-small
(470M, VLM 없음)
50Hz
제어 빈도
(Action Chunking)
10K h
사전학습 데이터
(7 로봇 플랫폼)

남은 격차 & 현실적 해소 전략

크로스-엠보디먼트 데이터 부재

π0의 강점은 10K시간 다양한 로봇 데이터 사전학습. Jetson 로컬 수집만으로는 일반화 한계.

해소 전략:
Open-X Embodiment (856 태스크, 22M 스텝) 데이터셋 중 모바일 플랫폼 서브셋 활용. 백본 고정 + FlowHead만 모바일 데이터로 파인튜닝 (π0 논문의 Phase 2 전략과 동일).
간접적인 VLM↔액션 어텐션

π0의 Action Expert는 VLM 토큰에 직접 cross-attend. MoNa-π는 64 latent를 경유하는 간접 구조.

해소 전략:
FlowMatchingHead의 cross_attn key/value를 64 latent 대신 Gemma 전체 시퀀스(64+L)로 확장. cond_dim = 2048, n_tokens = 64+L 로 변경 시 구현 비용 낮고 표현력 대폭 향상.
π0 수렴 로드맵 — 3단계
1
완료 — 언어 통합 수정 (ce7134f)
text_input이 Gemma encoder를 통해 시각 conditioning에 실제로 반영됨. π0 핵심 설계와 동일.
2
다음 — FlowHead cross-attn 확장
64 latent 대신 전체 Gemma 시퀀스를 FlowHead에 전달. 직접 VLM↔액션 어텐션 구현.
3
장기 — Open-X 서브셋 사전학습
모바일 플랫폼(Nav2 + 휠체어 로봇) 데이터로 백본 고정, FlowHead 사전학습 → 모바일 수집 데이터로 파인튜닝.