## 0.1 uORB 메시지 구조 분석 및 데이터 퍼블리싱 매커니즘

## 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) 등 기체 기준 부착 각도
  1. 동적 신뢰성 평가 지표 (signal_qualityvariance):
    단순 길이(current_distance) 값 자체보다 이 두 개의 지표가 추정기에게 압도적으로 더 중요하다. 드라이버는 광학 신호량이 부족하거나 위상 지연 수치(Count)가 흔들릴 때 자체적으로 렌즈 노이즈를 계산하여 반비례하는 signal_quality를 퍼블리싱해야 한다.
    EKF2 필터는 이 variance(분산)와 signal_quality가 떨어지는 것으로 감지하면, 즉각 해당 거리 정보의 신뢰도 가중치 행렬 원소 값을 깎아내려(Degrade) GPS 등 타 센서의 영향력을 높임으로써 필터 동요를 맒아챈다.

  2. 공간적 매핑 로직 (orientation):
    드론의 하단에만 센서를 달지 않는다. 천장 충돌 비행을 막기 위해 상단(Upward), 장애물 회피를 위해 전후좌우(Forward/Right) 사방에 라이다 5~6개를 도배할 수도 있다. 드라이버 실행 시 시작 파라미터(예: -R 25)로 방향 속성을 강제 주입하면, 퍼블리싱될 때 orientation 멤버 변수에 코드가 각인된다.
    이를 읽어들이는 옵스택클 필터(Obstacle Avoidance) 로직 모듈은 uORB에서 구동 중인 수많은 거리 토픽 중 orientation 코드를 파싱하여 공간(3D Space)의 어느 벡터 거리가 막혀있는지 구(Sphere) 형태의 로컬 복셀 맵(Voxel Map)을 직조(Weaving)해 나간다.