# 서울 강남 3D 자율주행 학습 코스

기존 ASLA 실험실의 주행·학습·검증·복구 기능에 실제 공개 지도를 연결한 실험 코스다. 외형에만 지도를 얹은 것이 아니라 경로 계산, 센서 거리, 도로 이탈 판정, 차량 이동, 훈련 전이와 평가에 같은 좌표를 사용한다. 물리 모델은 기존 평면 운동학 bicycle이고, 실차·공공도로 주행 및 영상 인식 성능은 검증하지 않았다.

## 지역과 데이터

- 범위: 위도37.493~37.511, 경도127.024~127.056, 약2.83km×2.00km. 강남역·역삼역·선릉역 인근의 테헤란로 일대이며 강남구 전체가 아니다. 일부 서초 지역도 포함한다.
- 실제 OSM 도로 구간978개, 건물 외곽선5,845개, traffic_signals 노드15개, crossing 노드222개.
- 강남대로·테헤란로·논현로·언주로·선릉로 이름과 노드 식별자를 보존한다.
- 원본: `public/maps/gangnam-source.osm.json.gz`, 변환: `gangnam.json`/`gangnam-data.mjs`, 소스 hash/타임스탬프: `map-manifest.json`.
- OpenStreetMap contributors / ODbL1.0 출처와 다운로드를 화면에 표시한다. 반복 사용은 저장된 스냅샷을 읽으며 외부 API를 매 프레임 호출하지 않는다.

건물805개는 height 태그,173개는 층수×3.2m,4,867개는 기본12m를 사용한다. 높이는3~350m 범위로 제한했다. 외곽선은 실제 지도에서 가져오지만 사진·외벽·층고·출입구의 실측 복원은 아니다. 단순 closed building way만 포함하며 multipolygon/holes와 지형 고도는 후속 범위다. 도로 폭은 width 태그2개, lanes 기반 추정58개, 도로 등급 추정918개다. 차선·횡단보도 표시는 시뮬레이션 표현이고 HD map 검수 자료가 아니다.

## 코스

| 코스 | 거리 | 경로 |
|---|---:|---|
| gangnam-yeoksam | 820.40m | 강남역 인근 → 역삼역 인근 |
| yeoksam-seolleung | 1,142.67m | 역삼역 인근 → 선릉역 인근 |
| gangnam-seolleung | 1,963.06m | 강남역 인근 → 선릉역 인근 |

출발·도착은 지하철 승강장 위치가 아니라 해당 역 인근의 **OSM 도로 노드**다. 동일 노드 ID를 공유하는 도로로 연결 그래프를 만들고, OSM 일방통행 방향을 적용한 Dijkstra 경로를 사용한다. 알려진 private/no/customers 도로는 경로 그래프에서 제외한다. 회전 제한 관계·차로별 통행·버스전용·신호 우선권·실시간 통제와 공사는 검증되지 않았다. 그래프 방향성 준수가 도로교통법상 적법한 실차 경로를 보장하지 않는다.

## 화면과 학습

기기 모드 또는 서버 연결 후 `주행 코스` 선택 → `이 코스 불러오기` → `실시간 훈련 시작`으로 사용한다. 기존 합성 시험장과 각 강남 경로는 별도 모델·replay·정책 슬롯으로 보존·복원한다. 선택한 노면의 로컬 후보가 실제 시뮬레이터 전이로 역전파하며 운영 모델은 별도 검증 전까지 유지한다. 지도 WGS84 위치, 도로 길이, 실제/추정 데이터 구분을 표시한다. 코스 변경 시 다른 코스의 학습 수치·고스트 경로·평가를 섞지 않는다.

3D는 실제 건물 polygon을 높이 방향으로 extrusion하고 같은 도로 중심선·폭을 그린다. WebGL에서는 전체 외곽선5,845개를 하나의 vertex-color mesh로 병합하며, GPU 미지원 CPU 경로는 전체 보기 최대380개, 근거리330m 내 최대180개를 LOD로 보여준다. 데이터에는 전체 외곽선이 있으며 2D 지도도 전체를 그린다. 현재 렌더링한 건물 수를 HUD에 표시한다. WebGL 하드웨어 경로의 실제 기기 성능은 별도 검수 대상이다.

가상 차량은 최고8m/s로 제한한다. 움직이는 차량·보행자·정차 차량과 신호 주기는 **합성 조건**이며 서울 실시간 교통 데이터가 아니다. 신호의 위치는 지도 노드지만 위상은 합성이다. 경사·고가/지하의 입체 차로 분리는 평면화된다. 독립 안전 감속은 별도 개입으로 집계하며 자율 학습 모델의 순수 성공으로 계산하지 않는다.

## 재현 및 감사

```sh
python scripts/maps/compile-gangnam.py public/maps/gangnam-source.osm.json.gz
node experiments/road/gangnam.mjs
node --test tests/*.test.mjs
```

원본 hash를 검증하고 실제 원본 노드의 위경도를 역투영한 오차를 검사한다. 세 코스의 모든 그래프 edge 방향과 도로 판정 일치, 실제 강남 좌표에서의 이동·센서·gradient, 동결 시험의 무학습, 체크포인트의 지도 버전/hash 검증, 서버 인증·코스별 저장/복원도 시험한다. 전체 자동 시험43개 통과.

학습30회(노면별10회), 선택 검증 seed21001/21007/21011, 최종 고정 시험 seed61001/61007/61013을 사용했다. 운영 신경망과 후보를 분리하고 후보 미통과 시 미학습 운영 신경망을 유지한다. 목적지 도달·충돌·이탈·적신호 위반·안전 개입·보상·거리·스텝의 원시 수치를 `experiment-results.json`에 보존했다. 코스별 체크포인트도 보존한다.

| 코스 | 기준 모델 도달 | 30회 학습 후 운영 모델 도달 | 후보 적용 |
|---|---:|---:|---|
| 강남→역삼 | 2/3 | 2/3 | 거절·기존 유지 |
| 역삼→선릉 | 2/3 | 2/3 | 거절·기존 유지 |
| 강남→선릉 | 0/3 | 0/3 | 효용 부족·기억·기존 유지 |

이 도달 결과는 **학습 개선 결과가 아니다.** 세 실험 모두 개선을 입증하지 못했다. 고정 seed 세 건은 회귀 진단에 불과하며 독립된 실도로 일반화·통계적 우월성·ASLA 정본 전체 재현을 입증하지 않는다. 특히 긴 코스의 timeout/실패와 학습 후보의 음의 전이가 남아 있다. 지도 적용과 실제 학습 동작은 구현했지만 실도로 자율주행 완성 판정은 HOLD다.

감사 이벤트와 서버 모델 증적에는 course_id, route_id, map_id, 원본 SHA256을 연결한다. 기존 role·idempotency·expected_version·CAS 검사를 유지한다. 코스 전환은 `/v1/road/course`, 실제 모델 학습은 `/training-step` 또는 `/train`, 선택·검증·복구는 기존 도로 API를 사용한다. 외부 체크포인트에서 map hash가 다르면 가져오기를 거절한다.

## 2026-11-01 지상 표현 보정

원본에 포함된 강남역 지하쇼핑센터(way 305923846)의 `location=underground`, `layer=-1`, `tunnel=yes` 태그를 건물 메타데이터에 보존합니다. 전체 원본 건물 5,845개는 유지하고 지하 시설 2개는 지상 건물 메시·창호 생성에서 제외합니다. 지하쇼핑센터가 도로 위를 막는 큰 건물로 나타나던 오류를 수정했습니다. 보행로·계단은 자동차 도로와 구분해 표시하고 지하 도로는 지상 렌더링에서 제외합니다.

창호·층간 띠·옥상 설비·가로등·차선은 시각화를 위한 추정 형상입니다. 실제 외관·차로 수 측량값이 아닙니다. 횡단 보행자의 모의 시험 위치에 추가한 줄무늬는 시나리오용 횡단보도이며 원본 OSM 횡단보도와 구분합니다. 차량·보행자의 물리 상태와 학습 입력은 기존 엔진을 사용합니다.
