13.4.3.2. Moving Baseline 알고리즘을 통한 두 안테나 간 3차원 상대 벡터(\Delta X, \Delta Y, \Delta Z) 계산 및 요 각도 유도: \psi = \arctan(\Delta Y / \Delta X)
Dual Antenna GPS 시스템이 제공하는 요(Yaw) 각도는 단순한 마법이 아니라, 정밀한 운동학(Kinematics)과 반송파 위상(Carrier-phase) 연산의 결정체이다. 이 과정의 핵에는 ‘Moving Baseline(동적 베이스라인)’ 알고리즘이 자리 잡고 있다.
본 절에서는 u-blox F9P와 같은 하이엔드 수신기가 자체 칩셋(펌웨어 레벨) 혹은 PX4의 gps 드라이버를 거치면서, 드론 프레임에 부착된 두 안테나(Base와 Rover) 간의 밀리미터(\text{mm}) 단위 3차원 상대 벡터(\Delta X, \Delta Y, \Delta Z)를 어떻게 도출해 내는지 수학적 모델을 분석하고, 이 벡터 공간 모델이 어떻게 평면 방위각 방정식인 \psi = \arctan(\Delta Y / \Delta X) 로 귀결되어 최종적으로 PX4 EKF2 코어에 진입하는지 상세히 기술한다.
1. Moving Baseline의 수학적/물리적 개념
종래의 RTK(Real-Time Kinematic)는 고정된, 즉 지구 상의 절대 좌표를 이미 알고 있는 지상 기지국(Static Base)을 기준으로 기체(Rover)의 오차를 교정했다. 하지만 Moving Baseline은 완전히 다른 철학을 가진다.
- Base의 이동: Base 안테나 또한 드론의 등에 업혀 공중을 고속으로 날아다니고 있다 (Moving Base).
- 상대 벡터(Relative Vector) 추정: 이 알고리즘의 유일한 목적은 Base 안테나의 ‘절대’ 위치를 아는 것이 아니라, Base 안테나의 위상 중심을 3\text{D} 좌표계의 원점 (0, 0, 0) 으로 간주했을 때, 똑같이 드론에 업혀 있는 **Rover 안테나의 ‘상대적인’ 3차원 변위 벡터를 추적(Tracking)**하는 것이다.
이를 물리량으로 환산하면 두 안테나 사이의 물리적 막대기(Baseline)가 3차원 공간상에서 어떻게 기울어지고 회전해 있는지를 추론해 내는 과정과 같다.
2. 반송파 위상차(Carrier-phase Difference)를 통한 \Delta X, \Delta Y, \Delta Z 산출
u-blox 등 GNSS 칩셋은 L1/L2 반송파 신호의 위상(Phase)을 측정한다. 만약 인공위성이 드론의 정면(Nose) 쪽에 머물러 있고 두 안테나가 드론의 꼬리와 머리 쪽에 일직선으로 배치되어 있다면, 위성에서 날아온 전파는 앞쪽 안테나(Rover)에 먼저 도달하고 수십 피코초(\text{ps}) 뒤에 뒤쪽 안테나(Base)에 도달한다.
칩셋 내부 마이크로프로세서는 두 안테나가 수신한 **전파 위상의 부분 관측치(Fractional Phase)**를 지속적으로 비교하는 이중 차분(Double Difference) 방정식을 통해 미지의 정수 모호성(Integer Ambiguity)을 해결하고, 국소 NED(North-East-Down) 평면을 기준으로 한 세 개의 성분 벡터를 토해낸다.
- \Delta X (\text{North}): Base 대비 Rover 안테나의 북쪽 방향 변위
- \Delta Y (\text{East}): Base 대비 Rover 안테나의 동쪽 방향 변위
- \Delta Z (\text{Down}): Base 대비 Rover 안테나의 수직 델타 변위
(만약 두 안테나가 완벽하게 수평인 기체 프레임에 장착되었다면 \Delta Z \approx 0 에 수렴하게 된다.)
이 밀리미터 단위 벡터 값들은 UBX-NAV-RELPOSNED (Relative Positioning Information in NED frame)라는 메시지 포맷에 담겨, 직렬 포트(UART)를 타고 PX4 비행 제어기(FC)의 gps 드라이버 데몬으로 쏟아지게 된다.
3. 요(Yaw) 각도 \psi 의 유도 방정식: \psi = \arctan(\Delta Y / \Delta X)
PX4의 gps 드라이버 모듈은 쏟아져 들어온 상대 벡터(\Delta X, \Delta Y, \Delta Z)를 가공하여 MAVLink 및 uORB 생태계가 알아들을 수 있는 라디안(Radian) 단위의 회전 각도(\psi)로 변환해야 한다.
두 안테나가 일직선상( longitudinal axis )에 배치되어 있다고 가정할 때, 3차원 공간 중 드론의 ‘수평 방향 회전(Heading)’ 을 결정짓는 요소는 북쪽(X)과 동쪽(Y) 성분의 투영 비율이다. 즉, 직각삼각형의 삼각비(Trigonometry)에 따라 밑변(\Delta X)과 높이(\Delta Y)의 비율 역탄젠트 함수를 취하게 된다.
\psi = \arctan2(\Delta Y, \Delta X)
3.1 atan2 함수의 사용과 사분면 판별 (Quadrant Identification)
컴퓨터 공학적으로 볼 때, 단순한 \arctan 함수(atan)는 치역이 -\frac{\pi}{2} 에서 \frac{\pi}{2} (-\text{90}^\circ \sim \text{90}^\circ)로 제한되므로 앞방향과 뒷방향을 구별하지 못하는 치명적인 결함이 있다(예: X, Y 부호가 모두 반전된 3사분면).
이를 극복하기 위해 PX4 C++ 펌웨어는 두 성분의 부호를 독립적으로 판별하여 0 \sim 360^\circ (또는 -\pi \sim \pi) 전체 영역을 정확하게 커버하는 atan2f() 라이브러리 함수를 사용한다.
// src/drivers/gps/devices/src/ubx.cpp (상대 위치 파싱 유사 로직)
if (relposned.flags & UBX_RX_RELPOSNED_FLAGS_GNSS_FIX_OK) {
// 1. 센티미터 스케일 단위에서 미터 단위로 변환 및 Float 처리
float delta_x = relposned.relPosN * 0.01f;
float delta_y = relposned.relPosE * 0.01f;
float delta_z = relposned.relPosD * 0.01f;
// 2. 역탄젠트 연산을 통한 라디안 Yaw 각도 유도
float heading_rad = atan2f(delta_y, delta_x);
// 3. 음수 라디안 값을 [0, 2pi] 영역으로 Wrap (선택적)
if (heading_rad < 0.0f) {
heading_rad += 2.0f * M_PI;
}
// 구조체에 저장하여 EKF2로 Publish 대기
_gps_position->heading = heading_rad;
}
4. \Delta Z(수직 변위) 성분의 물리적 의의와 피치(Pitch) 유도 가능성
흥미로운 점은 UBX-NAV-RELPOSNED 메시지 안에 \Delta X, \Delta Y 뿐만 아니라 \Delta Z 성분도 포함되어 있다는 것이다.
비록 드론이 EKF2 레벨에서 메인으로 채택하는 것은 ‘Yaw(방위각)’ 뿐이지만, 이론적으로는 \Delta Z 를 이용하여 피치(Pitch, 기수 들림) 또는 롤(Roll) 각도마저도 추정해 낼 수 있다.
\theta_{pitch} = \arctan \left( \frac{-\Delta Z}{\sqrt{\Delta X^2 + \Delta Y^2}} \right)
현재 PX4 시스템은 신뢰도가 극도로 높은 IMU 자이로스코프(Gyroscope)의 적분과 가속도계 보합으로 Roll/Pitch를 완벽에 가깝게 통제하고 있기 때문에 굳이 GPS의 \Delta Z 를 이용한 융합까지 시도하지는 않는다. 하지만 이 유휴 수직 변위 벡터는, 향후 기체의 변형(Deflection)이나 장주기 피치 편향(Long-term Pitch Bias)을 검사하는 우수한 서브 레퍼런스로 기능할 잠재적 무기이다.
결론적으로 Moving Baseline 기반의 요(Yaw) 각도 추정 역학은 두 안테나가 허공에서 그려내는 투명한 3차원 막대기(Vector Baseline) 그림자를 직교 좌표 축(NED)에 투영한 뒤, 피타고라스와 삼각함수의 렌즈(\arctan)로 집광하여 뽑아낸 ’극좌표계 각도 에너지’의 정수라 할 수 있다.