27.3.1.4. 자이로스코프 델타 앵글 바이어스 할당 (인덱스 10~12)
앞서 0~9번 인덱스에 할당된 자세, 속도, 위치 상태 변수들은 물리적인 시뮬레이션(관성 항법)의 결과물이다.
그러나 MEMS(Micro-Electro-Mechanical Systems) 기반의 소형 관성 센서 모듈(IMU)이 출력하는 측정값은 결코 완벽하지 않다. 온도 변화, 조립 스트레스, 전자파 간섭 등으로 인해 기체가 완벽히 정지해 있어도 센서는 0이 아닌 미세한 값을 끊임없이 출력하는데, 이를 바이어스(Bias) 라고 부른다.
EKF 모델이 진정으로 확장(Extended)되었다는 증거는 바로 이 보이지 않는 센서의 오차마저도 시스템의 ’상태(State)’로 포함시켜 실시간으로 추정해 낸다는 점에 있다. 본 절에서는 StateSample 구조체의 인덱스 10~12번에 매핑되는 자이로스코프 바이어스의 물리적 구조를 분석한다.
1. 상태 변수 매핑: idx: 10~12
src/lib/ecl/EKF/common.h 파일 내에서 앞선 9번 인덱스의 위치 변수 다음으로, 길이 3의 메모리 슬라이스가 delta_ang_bias 라는 참조자로 선언된다.
// src/lib/ecl/EKF/common.h 내부의 자이로 바이어스 슬라이싱
struct StateSample {
matrix::Vector<float, 24> states;
// ... (0~9 인덱스는 quat_nominal, vel, pos)
// 인덱스 10부터 시작하는 길이 3의 슬라이스를 3차원 자이로 델타 앵글 바이어스로 선언
const matrix::Vector3f& delta_ang_bias{states.slice<3, 1>(10, 0)};
};
이 delta_ang_bias 참조자가 포인팅하는 세 개의 실수 \Delta\theta_{bx}, \Delta\theta_{by}, \Delta\theta_{bz} 는 논리적으로 다음과 같이 대응된다.
states[10](\Delta\theta_{bx}): 기체 X축(Forward) 자이로스코프의 델타 각 바이어스 추정치 (rad)states[11](\Delta\theta_{by}): 기체 Y축(Right) 자이로스코프의 델타 각 바이어스 추정치 (rad)states[12](\Delta\theta_{bz}): 기체 Z축(Down) 자이로스코프의 델타 각 바이어스 추정치 (rad)
2. 왜 초당 각속도(rad/s)가 아닌 델타 앵글(rad)인가?
일반적으로 자이로스코프 바이어스를 표기할 때는 초당 회전 오차인 각속도 바이어스(Angular Rate Bias, rad/s)를 떠올리기 쉽다.
하지만 PX4 ECL 설계진은 과감하게 상태 변수를 ‘델타 각(Delta Angle, rad)’ 단위로 모델링했다. 그 이유는 IMU 데이터를 처리하는 하위 드라이버의 코닝(Coning) 적분 방식과 깊이 연관되어 있다.
최신 드론 펌웨어의 IMU 드라이버는 CPU의 병목을 줄이기 위해 원시 각속도를 수천 Hz로 읽어 들인 뒤 센서 칩 내부 혹은 하위 드라이버 레벨에서 물리적으로 적분하여, 일정 시간(\Delta t) 동안 ’얼마나 회전했는가(\Delta \theta)’에 대한 누적 각도값(Delta Angle)을 EKF에 통째로 넘겨준다.
따라서 EKF의 상태 예측(predictState) 로직은 입력된 이 \Delta \theta 에서 \Delta\theta_{bias} 를 빼는 것만으로도 보상을 완료할 수 있어, 곱셈이나 나눗셈 연산 단계를 생략하고 수치 오차를 줄이는 극적인 최적화를 이뤄냈다.
3. 동역학 모델 내에서의 바이어스 작용 원리
이 10~12번 인덱스의 자이로 바이어스 상태 변수들은 물리적 동역학, 즉 f() 함수 내에서 독특한 지위를 갖는다.
속도(vel)가 위치(pos)로 변화하는 것과 달리, 수 밀리초(ms) 단위의 짧은 시간 동안 센서의 물리적 오차 특성(바이어스)은 변하지 않는다고 가정할 수 있다.
이를 확률 시스템 제어 이론에서는 랜덤 워크(Random Walk) 모델로 정의한다.
3.1 예측(Prediction) 단계: 상수의 유지
// 자이로 바이어스의 상태 예측 동역학 (예측 단계에서는 값이 변하지 않음)
delta_ang_bias(t) = delta_ang_bias(t-1);
예측 단계에서 바이어스 상태 변수 자체의 값은 그대로 유지된다. 단지 이 상태 변수를 품고 있는 공분산 행렬(Covariance Matrix)의 대각 성분만이 사용자 파라미터(EKF2_GYR_NOISE)로 설정된 프로세스 노이즈(Process Noise)만큼 서서히 증가하여 불확실성이 커짐을 표현할 뿐이다.
3.2 보정(Update) 단계: 혁신(Innovation) 기반의 미세 조정
실제로 이 10~12번 인덱스의 값이 뒤바뀌는 순간은 관측 업데이트 시점이다.
예를 들어 자이로 바이어스 때문에 q_3 가 서서히 틀어져 기체가 가만히 있는데도 Yaw가 돌아간다고 EKF가 ’잘못 예측(Prediction)’을 수행했다고 치자. 이때 GPS나 지자기 센서가 “너 사실 Yaw 안 돌았는데?“라는 관측값(Observation)을 주면, EKF는 엄청난 혁신 오차(Innovation Error) 에 직면하게 된다.
이 오차는 24차원의 칼만 게인(Kalman Gain) 행렬 \mathbf{K} 을 역주행하며 곱해져, 0~3번의 쿼터니언을 교정함과 동시에, “이 모든 비극의 원인은 기체 Z축 자이로 센서가 +0.001 rad 만큼의 속임수 바이어스를 가지고 있기 때문” 이라고 스스로 범인을 추론해 낸다. 바로 이 순간 states[12] 값에서 오차만큼이 미세하게 차감(Subtraction)되며 실시간 바이어스 보정이 완료된다.
이처럼 상태 벡터에 센서의 자기 반성(Self-reflection) 속성을 포함시킨 것이 바로 확장 칼만 필터의 백미다.
다음 절에서는 이와 완벽하게 대칭되는 원리로 작동하는 인덱스 13~15번의 가속도계 델타 벨로시티 바이어스(Accel Delta Velocity Bias) 변수를 분석하겠다.