# um982_driver

UM982(Unicore) → `gnss_comm/msg/GnssPVTSolnMsg` 드라이버 노드. FAST-LIVO2-RTK 백엔드가
구독하는 토픽(`gps.gps_topic`, 기본 `/ublox_driver/receiver_pvt`)으로 발행한다.

기존 ublox 드라이버를 대체한다. 자세한 배경/검토는
[`docs/UM982-명령어검토-및-바이너리포팅.md`](../../docs/UM982-명령어검토-및-바이너리포팅.md),
[`docs/UM982-녹화-및-연동-구현.md`](../../docs/UM982-녹화-및-연동-구현.md) 참고.

## 한 노드에 다 들어있는 이유
시리얼 포트는 한 프로세스만 점유할 수 있다. 따라서 **RTCM 주입(NTRIP)** 과 **BESTNAV 파싱/발행**이
같은 노드 안에 있다:

```
NTRIP(VRS) ──RTCM3──▶ UM982 ──BESTNAV(binary)+GGA(ascii)──▶ um982_driver ──GnssPVTSolnMsg──▶ 백엔드
     ▲                                                          │
     └────────────────────── GGA(VRS 유지) ───────────────────┘
```

## 수신기 사전 설정
드라이버 실행 전에 UM982 가 아래를 출력하도록 저장돼 있어야 한다(리포 루트 `rtk/config_all.py`):
```
BESTNAVB COM3 0.1     # 10Hz 바이너리 (파싱 소스)
GPGGA    COM3 1       # NTRIP VRS 업링크용
```

## 빌드
```bash
colcon build --packages-select gnss_comm um982_driver
source install/setup.bash
```

## 실행
```bash
# config/um982.yaml 에서 serial_port / NTRIP 자격증명 확인 후
ros2 launch um982_driver um982_driver.launch.py
# 또는 자격증명을 CLI 로:
ros2 run um982_driver um982_driver_node --ros-args \
    --params-file src/um982_driver/config/um982.yaml \
    -p ntrip_user:=<id> -p ntrip_pass:=<pw>
```
`ros2 topic echo /ublox_driver/receiver_pvt` 로 발행 확인. 콘솔에 `RTK FIXED` 전환 로그가 뜬다.

## BESTNAV → GnssPVTSolnMsg 매핑
| GnssPVTSolnMsg | BESTNAV(§7.3.26) | 비고 |
|---|---|---|
| `time.week` / `time.tow` | 헤더 Wn / Ms÷1000 | UNIX 복원 → 센서 시간동기 |
| `latitude` / `longitude` | lat / lon | |
| `altitude` | hgt(MSL) + undulation | **타원체고** (백엔드 ENU 입력) |
| `height_msl` | hgt | |
| `h_acc` / `v_acc` | √(latσ²+lonσ²) / hgtσ | GTSAM 공분산 |
| `vel_n/e/d` | hor·cos(trk) / hor·sin(trk) / −vert | 속력·침로 → NED |
| `carr_soln` | pos_type: 48/49/50→2, 32/33/34→1 | RTK Fixed/Float |
| `fix_type`/`valid_fix`/`diff_soln`/`num_sv` | pos_type / #solnSVs | |

## 파라미터 (config/um982.yaml)
- `serial_port`, `serial_baud`(460800), `gps_topic`
- `use_ntrip`, `ntrip_host/port/mountpoint/user/pass`, `gga_send_period`
- `publish_fixed_only`(기본 false), `inflate_cov_when_not_fixed`(기본 true)

> 백엔드는 fix 품질을 거르지 않으므로, RTK Fixed 가 아닌 해는 `inflate_cov_when_not_fixed`
> 로 공분산을 키워 영향력을 줄이거나 `publish_fixed_only` 로 아예 배제한다.

## 검증
CRC(Appendix 1) 통과 프레임만 발행한다. 파서 로직은 `rtk/rtk_test.py`(파이썬 프로토타입)와 동일.
```bash
python3 rtk/rtk_test.py   # 하드웨어 붙이기 전 파서/파이프라인 사전 검증
```
