27.3.1.5. 가속도계 델타 벨로시티 바이어스 할당 (인덱스 13~15)
자이로스코프 바이어스가 기체의 ‘회전(Attitude)’ 추정 오차를 누적시킨다면, 가속도계 바이어스는 기체의 ’속도(Velocity)’와 ‘위치(Position)’ 추정을 맹렬한 속도로 붕괴시키는 주범이다. 가속도계가 출력하는 미세한 중력 오차나 열 팽창 오차는 첫 번째 적분에서 속도 오차로 자라나고, 두 번째 적분에서 위치 오차로 기하급수적(Quadratic)으로 폭발하기 때문이다.
EKF 모델은 이러한 재앙을 막기 위해 13번부터 15번까지의 인덱스를 가속도계의 델타 벨로시티 바이어스(Accel Delta Velocity Bias) 추정에 통째로 할당한다. 본 절에서는 해당 상태 변수들의 C++ 소스 매핑 구조와 물리적 작용 기전을 분석한다.
1. 상태 변수 매핑: idx: 13~15
src/lib/ecl/EKF/common.h 파일의 StateSample 구조체를 이어서 살펴보면, 자이로 바이어스 슬라이스 바로 뒤에 가속도 바이어스 슬라이스가 위치한다.
// src/lib/ecl/EKF/common.h 내부의 가속도 바이어스 슬라이싱
struct StateSample {
matrix::Vector<float, 24> states;
// ... (0~12 인덱스는 quat_nominal, vel, pos, delta_ang_bias)
// 인덱스 13부터 시작하는 길이 3의 슬라이스를 3차원 가속도 델타 속도 바이어스로 선언
const matrix::Vector3f& delta_vel_bias{states.slice<3, 1>(13, 0)};
};
이 delta_vel_bias 참조자가 포인팅하는 세 개의 실수 \Delta v_{bx}, \Delta v_{by}, \Delta v_{bz} 는 다음과 같은 물리적 축을 담당한다.
states[13](\Delta v_{bx}): 기체 X축(Forward) 가속도계의 델타 속도 바이어스 추정치 (m/s)states[14](\Delta v_{by}): 기체 Y축(Right) 가속도계의 델타 속도 바이어스 추정치 (m/s)states[15](\Delta v_{bz}): 기체 Z축(Down) 가속도계의 델타 속도 바이어스 추정치 (m/s)
2. 왜 가속도(m/s^2)가 아닌 델타 속도(m/s)인가?
앞서 27.3.1.4 절에서 다루었던 자이로스코프 바이어스의 단위 채택 논리와 정확히 동일한 이유가 가속도계에도 적용된다.
PX4의 센서 파이프라인(Sensor Pipeline)은 단순히 칩셋에서 노이즈가 섞인 순간 가속도(m/s^2)를 곧바로 EKF로 넘기지 않는다. 대신 하드웨어 인터럽트를 통해 수집된 고주파 가속도 데이터를 일정한 타임스텝 주기(\Delta t, 주로 4ms) 동안 물리적으로 적분하여, 그 짧은 찰나 동안 기체의 ’속도 변화량(Delta Velocity, \Delta v)’이 얼마였는지를 산출해 전달한다.
따라서 상태 벡터 역시 \Delta v 스케일에 맞춘 ‘델타 속도 바이어스(m/s)’ 를 추정하도록 설계되었다. EKF의 예측 연산자는 수신된 원시 델타 속도 측정치에서 이 바이어스 항을 단순 뺄셈 연산(- delta_vel_bias) 처리만 수행하면 되므로, 불필요한 스케일링(Scale)이나 시간(\Delta t) 곱셈 연산을 절약할 수 있다.
3. 동역학 모델 및 관측 업데이트를 통한 바이어스 추론 메커니즘
10~12번의 자이로 바이어스와 마찬가지로, 가속도 바이어스(13~15번) 역시 EKF의 예측(f()) 함수 내에서는 랜덤 워크(Random Walk) 상수로 취급되어 값 자체는 변하지 않는다. 오직 프로세스 노이즈(EKF2_ACC_NOISE) 파라미터에 의해 불확실성(공분산)만 증가할 뿐이다.
이 바이어스가 극적으로 교정(Update)되는 순간은 주로 GPS 위치/속도 관측이나 기압계 고도 관측이 들어올 때다.
3.1 Z축 가속도 바이어스(\Delta v_{bz})의 극적인 보정 예시
멀티로터 기체가 고도를 일정하게 유지(Altitude Hold)하고 있다고 가정해 보자.
만약 Z축 가속도 센서에 미세한 (+) 바이어스가 끼어 있어서, 기체가 실제로는 가만히 있는데도 “기체가 더 위로 솟구치고 있다“고 센서가 거짓 보고를 한다면 어떻게 될까?
- Prediction 오판: EKF는 이 거짓 Z축 데이터를 적분하여 하강 속도(v_D, 상태 인덱스 6)를 음수 방향(상승)으로 키우고, 이를 또 적분하여 위로 솟구치는 D 위치(p_D, 상태 인덱스 9)를 산출한다.
- Observation 충돌: 이때 기압계(Barometer)나 GPS 고도계가 “고도 안 변했어!“라는 확고한 관측치(Measurement)를 EKF에 던진다.
- Innovation 기반 교정: EKF 행렬 연산은 “내가 위치를 +1m 높게 계산했는데 기압계는 0m라고 하네? 이 오차(Innovation)가 어디서부터 누적된 걸까?“를 야코비안 체인 룰을 통해 역추적한다.
- 역산의 종착지: 궁극적으로 EKF는 0~3번 쿼터니언을 미세 보정함과 동시에, **“기초 데이터인 기체 Z축 가속도 센서가 +0.005 m/s 만큼의 속임수 델타 벨로시티 바이어스를 가지고 있다”**고 판단하여 15번 인덱스(
states[15])의 값을 즉각적으로 차감하여 보정한다.
이처럼 관성 센서의 바이어스는 GPS나 기압계 같은 ’절대 참조 센서’와의 끊임없는 오차 대결(Innovation) 속에서 칼만 필터의 수학적 추론을 통해 서서히 진짜 값으로 수렴해 나간다.
이제 관성 측정 장치(IMU)에 얽힌 인덱스 0~15번까지의 코어 상태와 바이어스 상태 할당을 모두 마쳤다. 다음 절부터는 주변 환경의 보이지 않는 에너지를 추정해 내는 외계 상태 파티션, 그 첫 번째인 지구 자기장 모델 변수(인덱스 16~18번)를 파헤친다.