## 0.1 uORB 메시지 구조 분석 및 데이터 퍼블리싱 매커니즘
하드웨어 인터페이스(I2C, UART, CAN)의 파도를 뚫고 살아남은 로컬 센서의 이식값은 최종적으로 PX4 OS가 이해할 수 있는 단 하나의 표준화된 언어, 즉 uORB 메시지 구조체(uORB/topics/distance_sensor.msg) 로 변환되어야만 Estimator(EKF2)나 Commander의 컨볼루션(Convolution) 연산대에 오를 수 있다. 이 메시지 구조체의 문법을 뜯어보면 운영체제가 거리 센서를 융합할 때 요구하는 파라미터가 무엇인지 명확히 알 수 있다.
distance_sensor.msg 핵심 멤버 변수 분석
// 주요 구조체 변수 예시
uint64 timestamp // [us] 센서 데이터가 수집된 시스템 시간 (EKF 타임 싱크용)
float32 min_distance // [m] 센서가 태생적으로 측정할 수 있는 최소 신뢰 거리
float32 max_distance // [m] 센서가 태생적으로 측정할 수 있는 최대 신뢰 거리
float32 current_distance // [m] 방금 측정한 실제 값 (필터링 됨)
float32 variance // [m^2] 측정값의 노이즈 분산치 (EKF 가중치 연산용)
int8 signal_quality // [0~100] % 단위의 원시 측정 신뢰도 (Voter 패스 여부)
uint8 type // MAV_DISTANCE_SENSOR_LASER, _ULTRASOUND 등 센서의 스펙트럼 속성
uint8 orientation // ROTATION_DOWNWARD_FACING(25), FORWARD(0) 등 기체 기준 부착 각도
-
동적 신뢰성 평가 지표 (
signal_quality와variance):
단순 길이(current_distance) 값 자체보다 이 두 개의 지표가 추정기에게 압도적으로 더 중요하다. 드라이버는 광학 신호량이 부족하거나 위상 지연 수치(Count)가 흔들릴 때 자체적으로 렌즈 노이즈를 계산하여 반비례하는signal_quality를 퍼블리싱해야 한다.
EKF2 필터는 이variance(분산)와signal_quality가 떨어지는 것으로 감지하면, 즉각 해당 거리 정보의 신뢰도 가중치 행렬 원소 값을 깎아내려(Degrade) GPS 등 타 센서의 영향력을 높임으로써 필터 동요를 맒아챈다. -
공간적 매핑 로직 (
orientation):
드론의 하단에만 센서를 달지 않는다. 천장 충돌 비행을 막기 위해 상단(Upward), 장애물 회피를 위해 전후좌우(Forward/Right) 사방에 라이다 5~6개를 도배할 수도 있다. 드라이버 실행 시 시작 파라미터(예:-R 25)로 방향 속성을 강제 주입하면, 퍼블리싱될 때orientation멤버 변수에 코드가 각인된다.
이를 읽어들이는 옵스택클 필터(Obstacle Avoidance) 로직 모듈은 uORB에서 구동 중인 수많은 거리 토픽 중orientation코드를 파싱하여 공간(3D Space)의 어느 벡터 거리가 막혀있는지 구(Sphere) 형태의 로컬 복셀 맵(Voxel Map)을 직조(Weaving)해 나간다.