13.3.2.3. 컴패니언 컴퓨터(Raspberry Pi, Jetson) 환경: str2str (RTKLIB) 패키지 기반 온보드 NTRIP 클라이언트 구현 및 UART 직렬(Serial) 포워딩 쉘 스크립트 작성
지상 관제국(GCS, QGroundControl)을 NTRIP 클라이언트로 이용하는 통상적인 구조는, QGC 데스크톱이 LTE 인터넷에서 RTCM 데이터를 받아 900\text{ MHz} 텔레메트리로 드론에 쏘아주는 형태이다. 그러나 이 방식은 텔레메트리의 통달 거리 한계(1 \sim 2\text{ km})를 넘어서는 장거리 BVLOS(비가시권) 비행에서는 무용지물이 된다.
진정한 자율 상업용 드론은 기체 내부에 탑재된 컴패니언 컴퓨터(Companion Computer, 예: Raspberry Pi, NVIDIA Jetson) 와 LTE/5G 모뎀을 이용하여, QGC의 개입 없이 스스로 캐스터 서버에 접속해 보정 데이터를 확보하는 ’독립형 온보드(On-board) NTRIP 시스템’을 갖추어야 한다.
본 절에서는 오픈소스 GNSS 포지셔닝 라이브러리의 표준인 RTKLIB에 포함된 강력한 스트림 중계 유틸리티 str2str을 활용하여, 컴패니언 컴퓨터 환경에서 NTRIP 클라이언트를 구축하고 얻어진 RTCM 데이터를 Pixhawk(FC)의 GPS UART 포트로 포워딩(Forwarding)하는 쉘 스크립트 구현 기법을 개발자 수준에서 해부한다.
1. RTKLIB 생태계와 str2str 의 역할
RTKLIB은 일본의 Takasu Tomoji 교수가 개발한 C 언어 기반의 오픈소스 GNSS 항법 처리 엔진이다. 이 패키지에 포함된 핵심 CLI(Command Line Interface) 툴인 str2str (Stream to Stream)은 그 이름이 암시하듯, 서로 다른 통신 매체(소켓, 파일, 직렬 포트) 간에 측위 데이터를 퍼나르는 ‘데이터 스위칭 라우터’ 역할을 수행한다.
str2str 은 매우 가볍고 안정적이어서(Linux daemon 형태로 운용) 리소스 자원이 제한된 컴패니언 컴퓨터 위에 온보드 NTRIP 클라이언트를 올리기에 가장 완벽한 해상도(Resolution)를 제공한다.
2. 온보드 NTRIP 클라이언트 네트워크 아키텍처
온보드 환경에서는 데이터의 흐름이 완전히 뒤바뀐다.
- 다운 스트리밍(Down-streaming): 컴패니언 컴퓨터의 LTE 동글(Dongle)이 공용 인터넷망을 통해 NTRIP 캐스터(예: ngii.go.kr)의 특정 포트에 TCP/IP 접속을 시작한다.
- 시그널 라우팅(Signal Routing): 캐스터로부터 수신된 RTCM 바이너리 포맷의 데이터는
str2str프로세스가 인터셉트한다. - 직렬 포워딩(Serial Forwarding):
str2str은 입에 머금은 바이트 배열을 컴패니언 컴퓨터에 연결된 USB-to-TTL 컨버터(혹은 GPIO UART 핀)를 통해 Pixhawk의GPS 2혹은TELEM 2포트로 와이어링(Hard-wiring)하여 강제 주입한다.
이 구조에서는 QGC가 중간에 MAVLink 인캡슐레이션을 해줄 필요가 없다. 순도 100\% 의 RTCM 3.3 바이너리가 비행 제어기(FC) 내부의 GPS 모듈(u-blox F9P 칩 자체)의 RX 핀으로 직격 꽂히게 된다.
3. str2str 기반 자동화 쉘 스크립트 작성 기법
시스템 부팅 시 자동으로 NTRIP 망에 접속하고, 통신 단절 시 무한 재시도(Watchdog)하는 극한의 생존성을 부여하기 위한 .sh 쉘 스크립트 작성 로직을 살펴보자.
3.1 기본 str2str 실행 구문 분석
가장 기초적인 NTRIP 클라이언트 명령 포맷은 다음과 같다.
str2str -in ntrip://[ID]:[PASSWORD]@[IP_ADDR]:[PORT]/[MOUNTPOINT] \
-out serial://[TTY_DEVICE]:[BAUDRATE] \
-c [NMEA_FILE_PATH] \
-b 1
-in: 입력 스트림 양식.ntrip://프로토콜을 명시하여 URI 체계로 캐스터 계정 정보와 IP를 한 줄에 넘긴다.-out: 출력 스트림 양식.serial://을 사용하여 리눅스 장치 파일(예:/dev/ttyTHS1또는/dev/ttyUSB0)을 지정하고, F9P 칩셋이 대기하고 있는 보드레이트(예:115200)를 강제한다.-c: VRS 통신을 위한 영혼의 파라미터. 캐스터가 역전송 NMEA를 요구할 경우, 특정 위치의 GPGGA 문장이 한 줄 적혀있는 임의의 텍스트 파일을 지정하면 이 유틸리티가 알아서 역-캐스팅 주기를 맞춰준다.-b 1: 쌍방향(Bidirectional) 데이터 소통을 허용한다.
3.2 런타임 수호(Watchdog) 쉘 스크립트 구현
실제 드론은 비행 도중 3\text{G} / 4\text{G} 기지국 핸드오버(Handover)를 겪으며 IP 연결이 수시로 찢어진다. str2str 이 한 번 죽고 나서 재실행되지 않으면 기체는 RTK Fix를 영영 상실한다.
이를 막기 위한 run_ntrip.sh 무한 루프 감시 스크립트의 골격이다.
#!/bin/bash
TTY_DEV="/dev/ttyUSB_RTK"
BAUD="115200"
CASTER_URI="ntrip://admin:1234@14.63.xxx.xxx:2101/RTCM31_VRS"
while true; do
echo "[$(date)] Starting str2str NTRIP Client..."
# -r: 연결 실패 시 10000ms 마다 무한 재시도
# -n: NMEA GGA 간격 설정(ms)
str2str -in ${CASTER_URI} \
-out serial://${TTY_DEV}:${BAUD}:8:n:1:off \
-r 10000 \
-b 1
echo "[$(date)] str2str Process Terminated! Restarting in 3 seconds..."
sleep 3
done
- 포트 옵션 해부:
serial://${TTY_DEV}:${BAUD}:8:n:1:off구문은 리눅스의stty명령어를 대체한다. 8 데이터 비트, 스톱 비트 1, 패리티 없음(None), 하드웨어 흐름 제어(Flow Control) Off 상태로 커널 드라이버를 로우레벨 튜닝한다.
3.3 시스템 데몬(Systemd) 등록
쉘 스크립트 작성이 끝나면, Ubuntu(Jetson/RPi)의 systemd 로 데몬화(ntrip-client.service) 하여, 드론 배터리를 꽂고 OS 부팅이 완료되면 네트워크 매니저가 유효해지는 순간 백그라운드 프로세스로 자동 기동 되도록 권한을 묶어두어야 한다.
결론적으로, 통신 반경의 사슬을 끊고 수백 킬로미터의 BVLOS 비행을 수행하려는 드론 엔지니어라면, QGC의 편안한 ‘자동 연결’ 버튼에 의존해선 안 된다. 리눅스의 척박한 터미널 환경에서 str2str 바이너리를 통제하고, 커널의 tty 장치 맵을 다듬으며 프로세스 생존을 스스로 책임지는 온보드 통신 아키텍처를 세팅함으로써 비로소 드론은 진정한 의미의 자율 이동체로 거듭난다.