Chapter 19. uORB 토픽(Topic) 발행 및 구독 구현 실습
- 19.1. 실습 환경 준비 및 애플리케이션 구조 설계
- 19.1.1. 실습 개요 및 목표
- 19.1.1.1. 사용자 정의 uORB 메시지 전체 라이프사이클(Lifecycle) 이해
- 19.1.1.2. Publisher-Subscriber(Pub-Sub) 패턴의 PX4 내 적용 사례 리뷰
- 19.1.2. 개발 환경 및 Toolchain 상태 검증
- 19.1.2.1. Ubuntu 환경의 PX4-Autopilot 소스 트리 최신화 및 의존성 점검
- 19.1.2.2. VSCode 및 C/C++ IntelliSense 환경 설정 (uORB 헤더 경로 인식)
- 19.1.3. 커스텀 모듈(Custom Module) 워크스페이스 구축
- 19.1.3.1.
src/examples디렉토리 하위에 실습용 폴더(px4_uorb_example) 생성 - 19.1.3.2. 모듈의 진입점(Main function) 및 데몬(Daemon) 실행 구조 설계
- 19.1.3.3. CMake 기반의 모듈 빌드 스크립트(
CMakeLists.txt) 초안 작성 - 19.2. 사용자 정의 uORB 메시지(Topic) 설계 및 빌드 시스템 연동
- 19.2.1. uORB
.msg파일 문법 및 데이터 타입 - 19.2.1.1. PX4 메시지 정의 규칙: 필수 필드인
uint64 timestamp의 의미와 중요성 - 19.2.1.2. 스칼라(Scalar) 타입(
uint8,float32등)과 배열(Array) 선언 규칙 - 19.2.1.3. 메시지 내 상수(Constants/Enums) 정의 및 비트마스크(Bitmask) 활용 방안
- 19.2.2. 신규 메시지 파일 생성 실습
- 19.2.2.1.
msg/SensorTestData.msg파일 작성 및 테스트용 필드 구성 - 19.2.2.2. 주석 처리를 통한 메시지 메타데이터(Metadata) 명세화
- 19.2.3. 빌드 시스템(CMake)에 메시지 등록 및 컴파일
- 19.2.3.1.
msg/CMakeLists.txt의set(msg_files ...)리스트에 신규 메시지 추가 - 19.2.3.2. 파이썬 스크립트(
genmsg)를 통한 C/C++ 소스 코드 자동 생성 원리 - 19.2.3.3.
make px4_sitl_default실행을 통한 빌드 파이프라인 작동 검증 - 19.2.4. 자동 생성된 C/C++ 헤더 파일 분석
- 19.2.4.1.
build/.../uORB/topics/sensor_test_data.h파일 구조 및 경로 확인 - 19.2.4.2.
ORB_DECLARE매크로 및 데이터 구조체(sensor_test_data_s) 분석 - 19.2.4.3. Topic 메타데이터(
__orb_sensor_test_data) 및 ID(ORB_ID)의 역할 - 19.3. 발행자(Publisher) 애플리케이션 구현
- 19.3.1. 발행자 모듈 기본 구조 작성
- 19.3.1.1. 필요한 시스템 및 uORB 헤더 파일 인클루드(
#include <uORB/uORB.h>등) - 19.3.1.2. 메인 루프(Main Loop) 구성 및 모듈 상태 관리(State Management) 변수 선언
- 19.3.2. 데이터 구조체 초기화 및 값 할당
- 19.3.2.1. 메모리 쓰레기값 방지를 위한
memset또는 Zero-initialization 기법 - 19.3.2.2.
hrt_absolute_time()을 활용한 고해상도 타임스탬프 획득 및 기록 - 19.3.2.3. 센서 모사(Mock-up) 데이터 생성 및 구조체 내부 필드 갱신 로직 구현
- 19.3.3. uORB Topic 광고(Advertisement) 및 발행(Publication)
- 19.3.3.1.
orb_advertise()를 통한 Topic 등록 및 발행 핸들(orb_advert_t) 획득 - 19.3.3.2. 메시지 큐 사이즈(Queue size) 설정 메커니즘 (
orb_advertise_queue()) - 19.3.3.3.
orb_publish()함수를 호출하여 실제 데이터 전파(Broadcast) - 19.3.4. 자원 해제 및 발행 종료 처리
- 19.3.4.1.
orb_unadvertise()를 통한 메모리 릭(Memory Leak) 방지 - 19.3.4.2. 모듈 종료 시그널(SIGTERM/SIGINT) 수신 시 안전한 종료 로직(Graceful Shutdown)
- 19.4. 구독자(Subscriber) 구현: 폴링(Polling) 및 직접 읽기 방식
- 19.4.1. 단순 읽기(Simple Read) 방식의 구현
- 19.4.1.1.
orb_subscribe()를 통한 파일 디스크립터(File Descriptor) 핸들 확보 - 19.4.1.2.
orb_copy()를 이용한 최신 데이터 스냅샷(Snapshot) 획득 구조 - 19.4.1.3. 데이터 구조체 값의 유효성(Validity) 및 타임스탬프 최신화 검증
- 19.4.2. 업데이트 확인(Update Check) 기반의 폴링 메커니즘
- 19.4.2.1. 주기적인 태스크 슬립(
usleep/px4_usleep) 설정 - 19.4.2.2.
orb_check()함수로 새로운 데이터 수신 여부(Updated Flag) 확인 - 19.4.2.3. 신규 데이터가 있을 때만
orb_copy()를 수행하여 CPU 점유율 최적화 - 19.5. 구독자(Subscriber) 구현: 이벤트 대기(Wait/Poll) 및 콜백 방식
- 19.5.1.
px4_poll()기반의 효율적인 이벤트 대기 로직 - 19.5.1.1. POSIX
poll()개념과 PX4 RTOS(NuttX) 환경에서의 추상화(px4_poll) - 19.5.1.2.
px4_pollfd_struct_t구조체 배열 설정 및 감시 이벤트(POLLIN) 지정 - 19.5.1.3. 타임아웃(Timeout) 파라미터 튜닝 및 지연(Latency) 허용 범위 설정
- 19.5.2. 다중 Topic 동시 구독 처리 로직
- 19.5.2.1. 여러 개의 Topic을 하나의 Poll Set으로 묶는 방법
- 19.5.2.2.
poll()반환값 분석 및 이벤트 발생 Topic 식별 분기문(Switch-case) 작성 - 19.5.3. Work Queue (Work Item) 기반의 최적화된 콜백 구조
- 19.5.3.1. 타이머 및 인터럽트 기반의 비동기 Work Queue 스케줄링 개념
- 19.5.3.2.
px4::WorkItem클래스 상속을 통한 이벤트 드리븐(Event-driven) 구독자 설계 - 19.5.3.3.
Run()메서드 오버라이딩을 통한 uORB 업데이트 처리 로직 통합 - 19.6. 다중 인스턴스(Multi-instance) 발행 및 구독 심화
- 19.6.1. 다중 인스턴스의 개념 및 아키텍처
- 19.6.1.1. 단일 Topic 내 인스턴스 식별자(Instance ID)의 역할
- 19.6.1.2. 다중 센서 중복(Redundancy) 구성 시(예: 듀얼 GPS) uORB 토폴로지 설계
- 19.6.2. 다중 인스턴스 발행(Publisher) 구현
- 19.6.2.1.
orb_advertise_multi()함수 호출 및 인스턴스 포인터 전달 - 19.6.2.2.
ORB_MULTI_MAX_INSTANCES제한 및 초과 시 예외 처리 로직 - 19.6.3. 다중 인스턴스 구독(Subscriber) 구현
- 19.6.3.1.
orb_subscribe_multi()를 활용한 특정 인스턴스 지정 구독 - 19.6.3.2. 전체 활성 인스턴스 순회(Iterating) 및 데이터 병합(Aggregation) 로직
- 19.6.3.3. 센서 투표(Voting) 및 장애 조치(Failover) 알고리즘 기초 연동
- 19.7. 커스텀 모듈 빌드 설정 및 SITL(Software-In-The-Loop) 테스트
- 19.7.1. 펌웨어 타겟(Target) 구성 파일 연동
- 19.7.1.1.
boards/px4/sitl/default.cmake에 커스텀 모듈(examples/px4_uorb_example) 추가 - 19.7.2. SITL 환경 실행 및 모듈 라이프사이클 제어
- 19.7.2.1.
make px4_sitl jmavsim빌드 및 시뮬레이터 구동 - 19.7.2.2. NuttShell(NSH) 콘솔에서 커스텀 애플리케이션 수동 실행 (
px4_uorb_example start) - 19.7.2.3. 백그라운드 태스크(&) 실행 및 상태 확인 (
px4_uorb_example status) - 19.7.3. 로깅(Logging) 및 출력 결과 검증
- 19.7.3.1.
PX4_INFO,PX4_WARN,PX4_ERR매크로를 이용한 콘솔 메시지 출력 - 19.7.3.2. 발행자가 전송한 모사 데이터와 구독자가 수신한 데이터의 일치성 검증
- 19.8. uORB 시스템 모니터링 및 실무 디버깅 기법
- 19.8.1.
listener명령어를 이용한 실시간 데이터 검사 - 19.8.1.1. CLI 기반
listener <topic_name>활용 및 터미널 출력 포맷 해석 - 19.8.1.2. 특정 인스턴스 지정 및 메시지 발행 속도(Hz) 파악
- 19.8.2.
uorb top명령어를 이용한 시스템 프로파일링 - 19.8.2.1. 시스템 전체 Topic 별 발행/수신 빈도(Hz) 및 데이터 크기 모니터링
- 19.8.2.2. 메시지 큐 오버플로우(Message Drop) 현상 식별 및 병목 구간 분석
- 19.8.3. 실무 개발 시 흔히 발생하는 오류 및 해결 방안(Troubleshooting)
- 19.8.3.1. 타임스탬프(Timestamp) 누락으로 인한 로거(Logger) 기록 실패 원인 분석
- 19.8.3.2. 잘못된 폴링 타임아웃(0 또는 무한대) 설정으로 인한 CPU 점유율 100% 버그 수정
- 19.8.3.3. 스레드 컨텍스트(Thread Context) 간의 데이터 경쟁(Data Race) 방지
- 19.9. 소스 코드 통합 및 최적화(Best Practices)
- 19.9.1. 코딩 컨벤션(PX4 Coding Standards) 준수 확인 (
make format) - 19.9.2. uORB 모듈의 불필요한 헤더 의존성(Dependencies) 제거 및 최적화
- 19.9.3. 시스템 부하(Overhead)를 최소화하기 위한 Zero-copy 방식 고찰