# VERIFIED_LOCK.md — 검증값 잠금 문서
> 목적: 블럭화(구조 재편성) 전 확정값 보존. 이 파일은 참조용 기준이며 재편성 후 대조에 사용한다.
> 작성: 2026-06-24 | 출처는 코드/json 직독 또는 RoboDK·펜던트 실측 명시
> 수정 규칙: 값 변경 시 반드시 출처+날짜 갱신. 추측값 기재 금지.

---

## 1. 펄스→각도 변환 계수

**오일러 순서**: ZYX = Rz(rz)·Ry(ry)·Rx(rx)  
**출처**: `torch_dirs.json._note` — "ZYX(Rz·Ry·Rx) 공구Z축 방향벡터. RoboDK 검증 0.0001° 이내. 2026-06-24"  
**4시임 방향 잔차**: ≤ 0.0001° (RoboDK 대조 검증)

**변환 공식**: `각도 = (펄스 − 영점) ÷ (펄스/도) + 오프셋`  
**부호**: 6축 전부 +1 (역전 없음)  
**출처**: `v4_pathcreate.dc.html:680` 주석 — "AR2010 (로봇2/A-03) 검증 완료 변환계수 — 기술보고서 표 2-2. 부호 전부 +1."

| 축 | 영점(zero) | 펄스/도(ppd) | 오프셋(off) |
|----|-----------|------------|------------|
| S  | 211       | 1341.4     | 0.16       |
| L  | -86494    | 1907.8     | -45.34     |
| U  | 71055     | 1592.8     | 44.61      |
| R  | 2663      | 1022.9     | 2.60       |
| B  | -486      | 980.2      | -0.50      |
| T  | 2791      | 454.7      | 6.14       |

**출처**: `v4_pathcreate.dc.html:682-689` 코드 직독  
**L-U 보정(LU offset coupling)**: 불필요 — 변환계수 자체에 흡수됨  
**검증일**: 이전 세션 (기술보고서 표 2-2 대조)

---

## 2. TOOL0 평행이동 (tcpOffset)

**✅ 확정값**: X = -136.826 mm, Y = +8.192 mm, Z = +506.982 mm  
**크기**: 약 525 mm  
**회전**: 없음 (평행이동만)  
**출처**: RoboDK SolveFK 4점 교차검증 2026-06-24  
**검증 결과**:

| 점 | 후보A 오차 (-133.246/-10.813/504.281) | 후보B 오차 (-136.826/+8.192/506.982) |
|---|---|---|
| SEAM-01 cnum6   | 19.528 mm | **0.001 mm** |
| SEAM-02 cnum35  | 19.526 mm | **0.002 mm** |
| SEAM-03 cnum64  | 19.527 mm | **0.001 mm** |
| SEAM-04 cnum100 | 19.527 mm | **0.001 mm** |

**판정**: B(-136.826/+8.192/506.982) = 진짜 TOOL0. 4점 모두 0.002mm 이내.  
**검증일**: 2026-06-24

> ⚠️ 뷰어 코드(v4_pathcreate.dc.html:701) tcpOffset = [-133.246, -10.813, 504.281] 는 틀린 값.  
> Y 부호까지 다름 (-10.813 vs +8.192). 블럭화 시 일괄 교체 필요.  
> A와 B의 차이 19.5mm는 일정 — 특정 좌표축 오타 또는 이전 보정 잔재로 추정.

---

## 3. 토치 방향벡터 (torch_dirs.json)

**데이터**: `torch_dirs.json` — 4시임 103점 ZYX 방향벡터  
**분포**: SEAM-1: 21점, SEAM-2: 22점, SEAM-3: 27점, SEAM-4: 33점  
**계산방법**: csv rx/ry/rz → ZYX 오일러 → 공구Z축 방향벡터 (dx, dy, dz)  
**RoboDK 잔차**: ≤ 0.0001° (4시임 전체)  
**출처**: `torch_dirs.json._note` 직독  
**dz 방향**: 전 103점 dz < 0 (토치 하향) — 정상  
**dz 범위**: min = -0.9999, max = -0.9549  
**검증일**: 2026-06-24

---

## 4. AR2010 6축 관절 리밋 ✅ 2026-06-24 확정

**출처**: RoboDK API `robot.JointLimits()` 직독 2026-06-24  
**T축**: 펜던트 실측 -405° + 여유 5° = -410° (이전 세션 수정값) → RoboDK도 -410 반환 일치 확인.

| 축 | RoboDK 하한(deg) | RoboDK 상한(deg) | 실물 확인 |
|----|-----------------|-----------------|---------|
| S  | -180 | +180 | RoboDK값 채택, 실물 사양서 미확인 |
| L  | -105 | +155 | RoboDK값 채택, 실물 사양서 미확인 |
| U  |  -86 | +160 | RoboDK값 채택, 실물 사양서 미확인 |
| R  | -200 | +200 | RoboDK값 채택, 실물 사양서 미확인 |
| B  | -135 | +135 | RoboDK값 채택, 실물 사양서 미확인 |
| **T**  | **-410** | **+210** | **✅ 펜던트 실측 -405°+여유 5° = -410° 확정** |

> ⚠️ S/L/U/R/B 5축은 RoboDK값 채택. 야스카와 AR2010 사양서와 교차확인 미실시.  
> 사양서 확인 시 이 표 업데이트 필요.

---

## 5. 경로 진실 데이터 (weld_path.json)

**파일**: `weld_path.json`  
**출처**: `weld_path.json._note` 직독 — "rebuilt from tcp_from_fk.csv (RoboDK FK truth) 2026-06-23"  
**총 점수**: 103점 (4시임 합계)  
**세그먼트별**:

| 세임 | weld_path.json (arc=1 경로점) | weld_path_typed.json (move_type 포함) |
|------|------------------------------|--------------------------------------|
| SEAM-01 | 21점 | 21점 (MOVL, MOVC) |
| SEAM-02 | 20점 | 22점 (MOVL, MOVC) |
| SEAM-03 | 29점 | 27점 (MOVL, MOVC) |
| SEAM-04 | 33점 | 33점 (MOVL, MOVC, MOVS) |

> ⚠️ SEAM-02, SEAM-03 점수 불일치: weld_path.json vs weld_path_typed.json 필터링 방식 차이 추정.  
> 경로 좌표 자체는 weld_path.json (RoboDK FK 기준)이 진실. weld_path_typed.json은 move_type 부가 파일.

**검증일**: 2026-06-23 (weld_path.json 재빌드일)

---

## 6. 정반면 Z 좌표

**코드에서 읽은 값**:
- `v4_pathcreate.dc.html:1228` 주석: `정반Z(-557.51)+지그(50)+외판(5)=-502.51mm`
- `v4_pathcreate.dc.html:1144`: `FLOOR = -0.95` (world단위 = -950mm, 뷰어 그리드)

**인계문서 기재값**: -577.4mm  
**보고서 4점평균**: -557.4mm  
**코드 주석값(구버전)**: -557.51mm

> ✅ **해결완료 (CEO 구술 확정 2026-07-18)**: 20mm 차이는 오류가 아니라 **측정 기준점 변경**.  
> 구버전(-557.51)은 **노즐 끝** 기준, 현재(-577.4)는 **와이어 끝** 기준 — 기준점이 와이어 끝으로
> 내려간 만큼 정반까지 거리가 약 20mm 늘어난 것. 두 값 모두 각자 기준으로는 맞는 값.  
> 물리검증: 터치 4점 암시 높이 -579.0±2.0이 -577.4와 1.6mm 일치 (CEO 최종확정 2026-07-04, v5 코드 1037행).  
> **현재 유효값 = -577.4 (와이어 끝 기준). v5 전체가 이 값 사용. -557.51은 폐기된 구버전 파일에만 잔존.**

---

## 7. 뷰어 FK URDF 확정 ✅ 해결완료

**현재 상태**: **해결 완료 2026-06-24**  
**방법**: RoboDK JointPoses() 7개 프레임 역추적 → xyz/rpy/sign 확정 + base offset 보정  
**합격 기준**: 4점 모두 1mm 이내 → 실제 달성: 4점 최대 0.002mm  
**검증일**: 2026-06-24

**핵심 발견**:  
- U, R, B, T 4개 축: 회전 방향이 반대 → `sign:-1` 처리  
- S, L 2개 축: 정상 방향 `sign:1`  
- FK 시작점을 `mTr(0,0,-505)` (로봇 베이스 = RoboDK 월드 기준)으로 변경 필수

---

## 부록 — URDF 기구학 체인 (✅ 검증 확정 2026-06-24)

**출처**: RoboDK JointPoses() 역추적 + 뷰어 4점 0.002mm 검증  
**코드 위치**: `v4_pathcreate.dc.html:693-700` (URDF), `:774,776` (FK 함수)

| 축 | xyz (mm) | rpy (rad) | sign | 비고 |
|----|---------|-----------|------|------|
| S  | [0, 0, 505]      | [0, 0, 0]        | +1 | |
| L  | [150, 0, 0]      | [-π/2, 0, -π/2]  | +1 | |
| U  | [760, 0, 0]      | [0, 0, 0]        | **-1** | 이전: rpy=[π,0,0] 틀림 |
| R  | [200, **+**1082, 0] | [-π/2, 0, 0]  | **-1** | 이전: Y=-1082 틀림 |
| B  | [0, 0, 0]        | [π/2, 0, 0]      | **-1** | |
| T  | [0, **+**100, 0] | [**-**π/2, 0, 0] | **-1** | 이전: Y=-100, rpy=+π/2 틀림 |

**FK 함수 변경**: `let m = this.mTr(0,0,-505)` (이전: identity matrix)

---

## 백업 데이터 파일 목록

`backup_verified/` 폴더에 보존 (2026-06-24):
- `weld_path.json` — RoboDK FK 진실 경로 (103점, 4시임)
- `weld_path_typed.json` — move_type 부가 경로 파일
- `torch_dirs.json` — 토치 방향벡터 (ZYX, 103점)

---

---

## 8. 블럭화 진행 현황 (2026-06-24)

**블럭B 데이터 분리 완료**: `dozikworks_data.js` — coeff/urdf/tcpOffset/anchors/blocksDef/buildIO/dims/jointLimits
- v4 클래스 필드가 `window.DZW_DATA.xxx` 참조로 교체됨
- 값(숫자) 변경 없음. FK 4점 0.0016mm 유지 확인.

**블럭A 엔진 분리 완료**: `dozikworks_engine.js` — window.DZW_ENGINE 18개 함수 (2026-06-24)
- 순수계산 14개 + DZW_DATA 의존 4개(fk/angleToPulse/pulseToAngle/fkFromPulse) + checkJointLimits
- 런타임 의존 4개(poseAt/curStep/curBlock/buildPoints)는 클래스에 유지.
- 클래스 메서드는 window.DZW_ENGINE 위임으로 대체.
- FK 4점 0.0013/0.0015/0.0011/0.0016mm 분리 후 동일 유지 확인 ✅
- checkJointLimits 동작 확인: 103점 전체 한계 이내 (SEAM 경로는 실제 한계 안에 있음) ✅
- 기즈모(_tc) 동작 ✅, 404 없음 ✅

**다음 단계**: 경로 점 한계 초과 시 빨강 표시 연결 (Block C).

*이 문서의 "확인 필요" 항목은 재편성 완료 후 반드시 점검할 것.*

---

## 9. 로봇 시각(poseRobot) 동결 ✅ 2026-06-25

**git 태그**: robot-locked-v5method-2026-06-25  
**검증 결과**: 4방향 팔 연결 확인 + FK 0.0016mm 유지  
**헤드리스 검증 일시**: 2026-06-25

### 동결 내용

**poseRobot (DOZIKWORKS_OS_v4_pathcreate.dc.html line 1383)**
```javascript
poseRobot(j){ const g=this.gj; if(!g)return; const d=Math.PI/180;
  for(const a of ['S','L','U','R','B','T']){ if(g[a]) g[a].rotation.z=j[a]*d; } }
```
- ★ SGN 절대 금지 — `j[a]*d` 직접 적용. SGN 추가 시 팔 903mm 이상 이탈.
- ★ 수정 시: 4방향 스크린샷 + FK csv 4점(1mm 이내) 필수 검증 후에만 허용.

**urdf/fk/tcpOffset**: 부록(§부록) 값 그대로 유지. sign:-1 포함 구조 동결.

### 브라우저 확인 주의
- 서버 파일 변경 후 브라우저에 캐시가 남을 수 있음.
- **Ctrl+Shift+R** (하드 리프레시) 필수. 변경 확인 전 "완료" 금지.

---

## 10. 메인 뷰어 확정 + 영구 동결 ✅ 2026-06-25

**git 태그**: main-v1-LOCKED-2026-06-25  
**CEO 확인**: 직접 팔 연결 확인 (Edge/Chrome 실화면)

### 메인 뷰어
- **파일**: `DOZIKWORKS OS.dc.html` (v1, 버전번호 없는 최초 파일)
- v4/v5는 보존만. 메인 아님.

### 로봇 기구학 동결 (v1 방식 — 절대 수정 금지)

**urdf** (sign 없음, rpy/xyz로 방향 흡수):
```
S:  xyz=[0,0,505],     rpy=[0,0,0]
L:  xyz=[150,0,0],     rpy=[-PI/2,0,-PI/2]
U:  xyz=[760,0,0],     rpy=[PI,0,0]
R:  xyz=[200,-1082,0], rpy=[-PI/2,0,0]
B:  xyz=[0,0,0],       rpy=[PI/2,0,0]
T:  xyz=[0,-100,0],    rpy=[PI/2,0,0]
```
**tcpOffset**: [-133.246, -10.813, 504.281]  
**fk**: identity matrix 시작, sign 없음 (`j[u.a]*d` 직접)  
**poseRobot**: `g[a].rotation.z = j[a]*d` (SGN 절대 금지)

### 수정 금지 이유
v4의 sign:-1 방식 + mTr(0,0,-505) 조합이 팔을 903mm 이탈시킴.  
2026-06-25 대규모 디버깅으로 확인. v1 방식만 멀쩡함.
