18.1.2.1 하드 리얼타임(Hard Real-time) 제어 환경에서의 지연(Latency) 결정론성 확보

18.1.2.1 하드 리얼타임(Hard Real-time) 제어 환경에서의 지연(Latency) 결정론성 확보

항공 우주 및 로보틱스 분야에서 소프트웨어가 제어하는 대상은 가상의 데이터가 아니라 물리 법칙의 지배를 받는 질량체이다. 특히 드론(멀티로터)과 같이 본질적으로 공기역학적 불안정성(Aerodynamic Instability)을 지닌 플랫폼은, 모터 출력을 끊임없이 보정해주지 않으면 중력에 의해 즉각적으로 추락하게 된다. 이러한 특수성을 가진 제어 환경 시스템을 우리는 하드 리얼타임(Hard Real-time) 시스템이라고 부른다.

1. 하드 리얼타임과 지연(Latency) 결정론성의 개념

일반적인 IT 시스템(Soft Real-time 또는 Non Real-time)에서는 데이터를 송수신할 때 평균적인 전송 속도(Throughput)가 중요하지만, 가끔씩 발생하는 수십 밀리초(ms)의 지연은 사용자의 체감 편의를 다소 떨어뜨릴 뿐 치명적인 사고로 이어지지는 않는다.

그러나 PX4-Autopilot의 자세 제어 루프(Attitude Control Loop)에서는 지연 결정론성(Latency Determinism) 이 생명이다. 지연 결정론성이란, 아무리 최악의 시스템 부하(Worst-case Execution Time, WCET) 상황에서도 “데이터가 발행(Publish)된 후 구독(Subscribe)되어 처리되기까지 걸리는 시간이 수학적으로 예측 가능한 절대적인 상한선(Maximum Bound) 내에 무조건 들어오는가?“에 대한 확증을 의미한다.

만약 미들웨어가 99번을 1마이크로초 만에 전송하더라도, 단 한 번 OS 커널 스케줄러의 변덕이나 병목으로 인해 50밀리초 늦게 제어 데이터를 전달한다면, 기체는 이미 자세가 뒤집혀 돌이킬 수 없는 물리적 파국(Crash)을 맞이하게 된다.

2. 기존 범용 미들웨어의 비결정론적 한계

ROS 1/2나 리눅스 기반 IPC(Inter-Process Communication) 체계를 그대로 비행 제어 루프 한가운데에 가져다 쓸 수 없는 이유가 바로 이 비결정론성에 있다. 범용 미들웨어들은 다음과 같은 요소들로 인해 지연이 발생할 수 있다.

  1. 동적 메모리 할당 병목: 메시지를 퍼블리시할 때마다 시스템 힙(Heap)에서 메모리를 할당(malloc)하고 해제(free)하는 과정은 메모리의 단편화 상태에 따라 실행 시간(Execution Time)이 불규칙하게 튀어 오르는 주범이다.
  2. OS 계층 및 네트워크 스택의 개입: 로컬 호스트 내부 통신이라 하더라도, 소켓(Socket) 기반 통신은 커널 영역(Kernel Space)과 사용자 영역(User Space) 간의 컨텍스트 스위칭(Context Switching) 및 버퍼 복사를 여러 번 유발한다.

3. uORB의 지연 탈피 및 결정론성 확보 메커니즘

uORB는 이러한 지연 요소를 설계 단계에서부터 철저하게 배제(Elimination)하였다. 다음은 uORB가 결정론적인 응답성(Deterministic Responsiveness)을 확보하는 핵심 메커니즘이다.

3.1 메모리 정적 할당(Static Allocation) 및 사전 포장(Pre-allocation)

uORB에서 신규 토픽이 최초로 발행(Advertise)될 때, OS(NuttX)는 해당 구조체 크기만큼의 메모리를 링 버퍼(Ring Buffer) 형태로 한 번만 할당한다. 이후 실제 비행 중 빈번하게 orb_publish()가 호출될 때는 이미 존재하는 고정된 메모리 주소 오프셋에 바이트 단위 덮어쓰기(memcpy)만을 수행한다. 런타임 중 동적 메모리 할당 과정이 완전히 소거됨에 따라, 메모리를 찾느라 발생하는 레이턴시 스파이크(Latency Spike)가 근본적으로 차단된다.

3.2 폴(Poll) 디스크립터 기반 하드웨어 수준 즉각 기상(Wake-up)

자세 제어(Attitude Controller) 데몬 스레드는 CPU를 잡고 while 루프를 무한히 돌며 센서 데이터를 기다리지 않는다. 이들은 데이터를 감시하는 파일 디스크립터(File Descriptor) 배열을 넘기고 poll() 시스템 콜을 호출해 완전히 잠수(Sleep) 상태로 들어간다.

자이로 센서 드라이버가 uORB 노드에 데이터를 복사해 넣는 순간, uORB 내부 로직은 즉각적으로 대기 중인 파일 디스크립터의 세마포어(Semaphore)를 해제(Post)한다. 이는 복잡한 커널 큐 감시를 거치지 않고, OS의 가장 깊숙한 스케줄러를 직접 깨우는(Trigger) 패스트 패스(Fast-path)이다. 데이터 수신에서 제어 루프의 기상까지 걸리는 시간은 오직 CPU의 컨텍스트 스위칭 타임(통상 대역폭에서 몇 마이크로초 수준)에만 의존하는 완벽한 결정론(Determinism)을 확보하게 된다.

3.3 생산자 비블로킹(Non-blocking Publisher) 원칙

“수신자가 바쁘거나, 로깅 프로그램의 플래시 메모리 저장이 밀리더라도, 발행자는 단 1사이클도 기다리지 않는다.” uORB의 발행자는 토픽 파일 디스크립터에 락(Lock)이 걸렸는지와 무관하게 새 데이터를 최신 세대 버퍼에 박아넣고 리턴한다. 이를 통해 가장 중요한 고속 제어기 모듈들의 타이밍 데드라인(Timing Deadline) 연쇄 파괴 현상을 구조적으로 차단하였다.