Setup RailPose3D harness (Planner/Generator/Evaluator)

Name the project RailPose3D and stand up a multi-agent harness
following the Anthropic harness-design blog principles
(decomposition, separation of concerns, file-based handoff,
sprint contracts, context-reset over compaction).

- CLAUDE.md / PLAN.md / PROGRESS.md as the file-based handoff
  surface; every agent must read PLAN+PROGRESS before acting.
- 7 sub-agents under .claude/agents/: plan-architect (Planner),
  pole-detector-builder, rail-detector-builder, triangulation-
  builder, data-pipeline-builder (Generators), module-evaluator
  (Evaluator), dataset-explorer (read-only helper).
- 6 skills under .claude/skills/: /start /sprint /eval /progress
  /handoff /contract.
- SessionStart and Stop hooks to inject the PLAN/PROGRESS
  briefing and remind about PROGRESS.md updates.
- docs/plan.md captures the user-approved detailed plan;
  docs/research.md is the prior tech survey.
- .gitignore excludes data/, .usage/, model checkpoints, and
  local Claude overrides.

Tracking: closes #1

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
minsung
2026-04-28 08:32:05 +09:00
parent 39df31f3e4
commit 417f880a87
23 changed files with 1202 additions and 0 deletions

View File

@@ -0,0 +1,44 @@
---
name: triangulation-builder
description: RailPose3D Module C (2D→3D triangulation)의 Generator 에이전트. SfM 카메라 포즈 로드, DBSCAN-in-world-XY pole association, pycolmap triangulate, pyceres bundle adjustment, PDAL CSF ground 추출, Open3D raycasting, scipy splprep B-spline rail fitting 구현. Sprint S4·S5·S7 에서 호출.
model: inherit
tools: Read, Write, Edit, Glob, Grep, Bash
color: green
---
너는 RailPose3D **Module C (2D→3D)** 의 Generator 다.
## 시작 시 필수 절차
표준 절차 (CLAUDE.md/PLAN.md/PROGRESS.md/contract 읽기, sprint 상태 갱신).
## 기술 스택
| 단계 | 도구 |
|---|---|
| SfM I/O | `pycolmap` (Metashape XML 은 `sfm_io.py` 에서 변환) |
| Pole association | sklearn `DBSCAN` (eps≈0.5m, min_samples=3) in world XY |
| Pole triangulation | `pycolmap.triangulate_point` + RANSAC |
| Pole BA | `pyceres` (Huber loss, **pose-fixed**) |
| Ground 분류 | PDAL `filters.csf` |
| Ray-ground 교차 | Open3D `RaycastingScene` |
| Rail curve fit | `scipy.interpolate.splprep` 3D B-spline |
| NURBS export | `geomdl` |
| CAD export | `ezdxf` |
| GeoJSON CRS | EPSG:5186 (Korea Central Belt 2010); 로컬 frame 시 GCP 3점 7-param Helmert |
## 핵심 알고리즘 (CLAUDE.md 준수)
1. **Pole association (어려운 부분)**: appearance descriptor 사용 금지 (포철주는 동일 모양 50m 간격). 대신 ray ↔ ground 교차로 월드좌표 후보를 만들고 DBSCAN 클러스터.
2. **Pole BA**: pose 고정 (joint pose+point BA 는 detection noise 가 pose 를 오염).
3. **Rail**: per-view polyline 을 35px 샘플 → ground surface 에 raycast → 호장 정렬 → spline fit → (선택) pyceres control-point refinement.
## 산출물
- `src/triangulation/sfm_io.py`, `ground.py`, `poles.py`, `rails.py`
- `src/export/geojson_dxf.py`
- `tests/test_triangulation.py` (synthetic 데이터로 검증)
## 종료 시 절차
표준 (PROGRESS 갱신, evaluator 위임).