27.2.3. 데이터 전달 브릿지 메커니즘
어떤 시스템이든 이종(Heterogeneous) 도메인 간의 물리적 장벽을 넘기 위해서는 정교한 통신 브릿지(Bridge) 메커니즘이 필요하다.
PX4의 상태 추정 시스템에서 이 장벽은 ‘uORB 메시징 버스’ 와 ‘순수 C++ 단위로 격리된 EKF 코어’ 사이에 존재한다. 양측은 사용하는 데이터 타입(Data Type)도, 타임스탬프의 기준(Reference) 단위도 다르다. 본 절에서는 ekf2 모듈 래퍼가 이 두 거대한 세계를 어떻게 이어주는지, 그 입력과 출력의 브릿지 메커니즘을 총체적으로 개괄한다.
1. 이종 데이터의 통역사: ekf2 브릿지 패턴
ekf2 모듈( src/modules/ekf2/ )의 가장 중요한 존재 이유는 데이터 형 변환(Type Casting) 과 시맨틱(Semantic) 래핑이다. 수학 방정식으로만 구성된 Ekf 클래스는 ’MAVLink’나 ’uORB’라는 단어 자체를 이해하지 못한다. 반면 센서 드라이버 계층은 칼만 필터의 ’사전 상태(A priori)’나 ’혁신 공분산(Innovation Covariance)’의 개념을 전혀 모른다.
따라서 중간에 위치한 ekf2 브릿지 모듈은 다음과 같은 두 가지 명확한 단방향 데이터 파이프라인(Data Pipeline)을 형성한다.
- 입력 파이프라인 (Inbound):
uORB(운영체제) \rightarrow 직렬화(Serialization) \rightarrowECL 구조체(수학 엔진) - 출력 파이프라인 (Outbound):
ECL 구조체(수학 엔진) \rightarrow 역직렬화(Deserialization) \rightarrowuORB(비행 제어기)
2. Inbound: 센서 데이터 수집 및 주입(Injection) 로직
PX4의 센서 드라이버들은 각기 독립적인 스레드와 타이밍으로 동작하며 sensor_combined (IMU), vehicle_gps_position, sensor_baro 등의 uORB 토픽을 흩뿌린다.
브릿지 모듈은 앞선 절에서 설명한 SubscriptionCallback과 폴링 메커니즘을 통해 이 데이터들의 최신 조각(Snapshot)을 긁어모은다. 이후 데이터를 ECL 코어가 받아들일 수 있는 imuSample, gpsSample, magSample 등의 고정된 C++ 구조체 템플릿으로 변환(직렬화)한다.
이 변환 과정에는 단순히 멤버 변수를 복사하는 것 이상의 중요한 과정이 포함된다.
- 단위 계 변환 (Unit Coercion): 기압계가 밀리바(mbar)로 출력했다면 파스칼(Pa)로 변환하고, GPS 속도가 cm/s 단위라면 m/s 단위로 소수점을 이동시킨다.
- 타임스탬프 동기화: 센서가 측정한 절대 시간(
timestamp)을 EKF 내부에서 유지하는 상대적인 스텝 타임(time_us) 체계로 맵핑(Mapping)한다. - 좌표계 회전 (Frame Rotation): 기체 프레임(FRD)이나 센서 장착 방향(Board Rotation) 보정을 거쳐, 필터가 기대하는 NED(North-East-Down) 정렬 좌표계로 행렬을 회전시켜 주입한다.
3. Outbound: 추정 결과 추출 및 시스템 배포 로직
ECL 내부 코어(Ekf::update())가 수십 번의 행렬 곱셈을 마친 뒤 쿼터니언과 위치 벡터 산출을 완료하고 나면, 브릿지는 이제 반대 방향으로 바빠진다.
ECL은 산출물을 uORB에 직접 발행할 능력이 없으므로, 대신 브릿지가 제공하는 접근자(Getter) API를 통해 결과값을 빼내 가도록 허용한다.
// 결과 추출 및 발행의 논리적 흐름 (의사코드)
void EKF2::PublishLocalPosition() {
vehicle_local_position_s lpos{}; // uORB 전송을 위한 빈 껍데기 구조체
// 1. ECL 코어로부터 C++ 벡터(Eigen 호환) 추출
Vector3f pos;
_ekf.get_position(pos);
// 2. uORB 구조체 포맷으로 매핑 (역직렬화)
lpos.x = pos(0);
lpos.y = pos(1);
lpos.z = pos(2);
lpos.timestamp = hrt_absolute_time(); // 다시 OS 타임스탬프 부여
// 3. 비행 제어 루프를 향해 토픽 발행!
_vehicle_local_position_pub.publish(lpos);
}
이러한 Outbound 브릿지 메커니즘을 통해, EKF 연산의 결과물은 vehicle_local_position, vehicle_global_position, vehicle_attitude, estimator_status 등 10여 가지가 넘는 잘게 쪼개진 제어용 uORB 토픽들로 파생되어 PX4의 하위 제어기(Position Controller, Attitude Controller)들에게 뿌려지게 된다.
4. 요약: 고립 체계의 혈관망
요약하자면 ekf2 브릿지 메커니즘은 무기질적인 수학 연산 덩어리인 ECL 코어에 생명력을 불어넣는 탯줄이자 혈관망이다.
이 브릿지가 이종 도메인 간의 단위(Unit)를 맞추고, 타임스탬프를 동기화하며, 멀티 스레드 접근을 잠그고 푸는 흙먼지 묻는 작업(Dirty Work)을 전담해 주기 때문에, ECL 수학 코어 개발자들은 오직 ’어떻게 하면 칼만 필터의 수렴 속도를 높일 것인가’라는 순수 상태 추정 학문 자체에만 집중할 수 있게 된다.
다음 절부터 다루어 볼 내용들은 바로 이 브릿지가 입/출력 양단에서 실제로 데이터를 직렬화하고 토픽을 방출하는 구체적인 소스 코드 레벨의 변환(Serialization) 메커니즘들이다.