27.3.1.6. 지구 자기장(Earth Magnetic Field) 모델 변수 할당 (인덱스 16~18)
항법 코어 파티션(0~9번 인덱스)과 센서 바이어스 추정 파티션(10~15번 인덱스)을 지나면, EKF 상태 벡터는 본격적으로 기체 외부의 보이지 않는 물리 현상, 즉 ‘환경(Environment)’ 을 추측하는 영역으로 진입한다.
그 첫 번째 대상은 드론의 절대적인 ‘요(Yaw, 헤딩)’ 각도를 결정짓는 유일한 기준인 지구 정자기장(Earth Magnetic Field) 이다. 본 절에서는 StateSample 구조체의 인덱스 16~18번에 할당된 지구 자기장 벡터가 왜 EKF의 상태로 편입되어야 하는지, 그리고 3차원 C++ 코드로 어떻게 매핑되는지 분석한다.
1. 상태 변수 매핑: idx: 16~18
src/lib/ecl/EKF/common.h 파일 내 StateSample 구조체에서, 인덱스 16번부터 3개의 실수가 mag_I (Magnetic Field In Earth Frame) 라는 참조 변수로 바인딩되어 있다.
// src/lib/ecl/EKF/common.h 내부의 지구 자기장 슬라이싱
struct StateSample {
matrix::Vector<float, 24> states;
// ... (0~15 인덱스는 quat, vel, pos, gyro_bias, accel_bias)
// 인덱스 16부터 시작하는 길이 3의 슬라이스를 NED 기준 지구 자기장 벡터로 선언
const matrix::Vector3f& mag_I{states.slice<3, 1>(16, 0)};
};
이 mag_I 참조자를 구성하는 벡터 성분 m_{e,N}, m_{e,E}, m_{e,D} 의 물리적 의미는 관성 좌표계(NED, 지구 고정 프레임) 를 기준으로 한 주변 지구 자기장의 절대 크기와 방향(단위: 가우스(Gauss) 또는 밀리가우스(mG))을 뜻한다.
states[16](m_{e,N}): 북쪽(North)을 향하는 지구 자기장 벡터 성분states[17](m_{e,E}): 동쪽(East)을 향하는 지구 자기장 벡터 성분states[18](m_{e,D}): 아래쪽(Down)을 향하는 지구 자기장 벡터 성분
2. 지구 자기장 벡터를 ’추정’해야 하는 이유
지구 자기장(Earth Magnetic Field)은 말 그대로 지구 코어에서 뿜어져 나오는 자연현상이다. 많은 초급 개발자들은 “지구 자기장은 어디서든 북쪽을 가리키는 고정된 상수(Constant)가 아닌가? 왜 덧셈/뺄셈을 통해 실시간으로 추정(Estimate)해야 하는 상태 변수로 모델링했을까?” 라는 의문을 품는다. 그 이유는 공간적 특수성에 있다.
2.1 자북(Magnetic North)과 진북(True North)의 불일치
지구 자기장이 가리키는 북쪽(자북, Magnetic North)은 지리상의 북극(진북, True North)과 일치하지 않는다. GPS는 진북 기준의 속도/위도를 주지만, 나침반 센서(Magnetometer)는 자북을 기준으로 측정값을 던져준다. 이 편차(Declination)는 전 세계 위치마다 다르며, 심지어 매년 조금씩 변한다.
2.2 국소적 자기장 왜곡(Local Anomalies)
다리 밑의 철골 구조물, 매립된 고전압 케이블, 혹은 화산암 지대 위를 날아갈 때, 지구 자기장은 반듯한 한 방향을 가리키지 않고 국소적으로 왜곡된다.
따라서 PX4 EKF는 지구 자기장을 단순히 믿지 않는다. 초기(Initialization) 단계에서는 GPS 위치 기반의 룩업 테이블(WMM, World Magnetic Model)을 참고하여 대략적인 16~18번 인덱스 값을 채워 넣지만, 비행이 시작되어 기체가 기동하고 여러 센서 데이터가 퓨전(Fusion)되기 시작하면 EKF는 교차 검증을 통해 “현재 내가 떠 있는 위치의 실제 진짜 자기장(mag_I)” 을 실시간으로 업데이트하며 헤딩(Heading)에 대한 기준점을 보정해 나간다.
3. 동역학 예측 및 관측 메커니즘
3.1 예측(Prediction) 단계: 상수의 유지
지자기장은 수 킬로미터(km)를 이동하지 않는 한 몇 밀리초(ms) 만에 드라마틱하게 변하지 않는다. 따라서 EKF의 상태 전이 함수(f()) 내에서 mag_I 벡터는 랜덤 워크(Random Walk)로 취급되어, 측정치 업데이트가 들어오지 않는 동안에는 다음과 같이 단순히 이전 상태의 값을 복사하여 유지한다.
// 지구 자기장 예측 동역학 (예외적인 경우가 아니면 값 변화 없음)
mag_I(t) = mag_I(t-1);
3.2 관측(Observation) 및 업데이트 단계
기체에 탑재된 자력계(지자기 센서)는 3차원 센서 축을 기준으로 측정치(mag_body)를 내놓는다. EKF는 다음과 같은 논리적 흐름으로 이 데이터를 융합한다.
- 관측치 예측: EKF는 현재 자기가 추정 중인 자세(
quat, 인덱스 0~3)와 지구 자기장(mag_I, 인덱스 16~18)을 바탕으로, “지구가 이 정도 자기장을 뿜고 있고 내 기체가 이렇게 기울어져 있으니, 현재 내 지자기 센서에는 (x, y, z) 만큼의 값이 찍혀야 해“라는 예상 관측치(Predicted Measurement) 를 계산해 낸다 (h(\mathbf{x}_k)). - 잔차(Innovation) 산출: 이 예상값과 실제 지자기 센서가 뱉어낸 원시 데이터를 비교한다.
- 상태 보정: 차이(Innovation)가 발생했다면, 이 차이가 기체의 ’자세(Yaw)’를 잘못 산출해서 벌어진 일인지, 아니면 동네의 ‘지구 자기장’ 자체가 특이해서 벌어진 일인지 공분산(Covariance) 가중치를 기반으로 분배하여 두 변수(인덱스 0~3, 인덱스 16~18) 모두를 미세하게 교정한다.
이처럼 지구 자기장 객입은 결국 ‘정확한 Yaw 각도를 알아내기 위한 밑거름’ 역할을 한다. 그러나 드론의 지자기 센서를 괴롭히는 요소는 거대한 지구만이 아니다. 드론 몸뚱어리 자체가 거대한 자석이 되어 센서를 속이기도 한다.
다음 절에서는 이 내부의 적을 추정해 내는 인덱스 19~21번의 기체 고정축 자기장(Body Magnetic Field) 왜곡 변수에 대해 파헤쳐 본다.