19.1.2.1. Ubuntu 환경의 PX4-Autopilot 소스 트리 최신화 및 의존성 점검
어떠한 종류의 임베디드 코어 개발이든 그 무결한 실습의 첫 단추는 본사 벤더(Vendor)가 제공하는 가장 안정적이고 최적화된 소스 코드 트리(Source Tree)를 로컬 머신에 완벽하게 복제(Clone)하고, 그에 맞는 컴파일 의존성 툴체인을 단 1비트의 어긋남 없이 100% 매핑하는 것이다.
PX4 생태계는 전 세계 수천 명의 톱클래스 오픈소스 컨트리뷰터(Contributor)들이 치열하게 기여하는 거대하고 역동적인 코드 저장소이므로, 하루에도 수십 개의 커밋(Commit)이 소나기처럼 쏟아진다. 나만의 uORB 커스텀 모듈을 얹어 이 거대한 흐름에 동승하기 위해서는 기존 소스 코드 아키텍처와 충돌이 나지 않도록 최신의 main 브랜치 소스를 단단히 확보해야 한다. 또한, 픽스호크 물리 보드의 심장인 칩셋(ARM Cortex-M 등)을 타게팅하는 크로스 컴파일러(Cross Compiler)와 SITL 시뮬레이터 구동을 위한 종속성 패키지들을 대리석처럼 단단하게 타설해야 한다.
PX4 공식 코어 아키텍처 팀이 가장 광범위하게 테스트하고 결과물의 멱등성을 보증(Guarantee)하는 리눅스 OS 배포판은 다름 아닌 Ubuntu 22.04 LTS (또는 20.04 LTS) 환경이다. 본 실습에서는 이 절대적 기준 환경 위에서 소스 트리를 예리하게 다듬는 실전 커맨드라인(CLI) 프로세스를 수행한다.
1. 단계: 마스터 소스 트리 클론(Clone) 및 서브모듈(Submodule)의 재귀적 동기화
초보자들이 흔히 저지르는 치명적 실수는 단순히 git clone <URL> 명령어 한 줄로 PX4 소스 코드를 가볍게 가져오는 것이다. 이는 다가올 빌드 실패 재앙의 첫 번째 징후이다. PX4-Autopilot 저장소 본체는 내부적으로 마이크로 기기 통신을 담당하는 MAVLink 프로토콜 헤더, 하드웨어 저수준 드라이버 인프라인 NuttX RTOS 소스, SITL 시뮬레이터 구동을 위한 jMAVSim 모듈 등 수십 개의 거대한 서브모듈(Submodules) 덩어리들을 거미줄처럼 링크하고 있다. 이 서브모듈 패키지들이 단 하나라도 누락되면 훗날 “Header not found” 혹은 “Symbol Unresolved“라는 치명적인 붉은 에러로 빌드 파이프라인이 박살나게 된다.
따라서 터미널을 열고 반드시 재귀적 클론(--recursive) 플래그를 달아 소스 코드를 제일 바닥 뿌리째 뽑아 복제해야 한다.
# PX4 메인 저장소와 하위의 모든 서브모듈을 극한으로 재귀적 심층 클론
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
# 클론 성공 후 해당 소스 트리 최상위 디렉토리(Root)로 진입
cd PX4-Autopilot
설령 이미 과거에 클론해 둔 소스 트리가 로컬에 방치되어 존재하더라도, 실습 진입 전 반드시 원격(Remote) 브랜치와 서브모듈의 버전 상태를 최신화하여 스크립트 꼬임과 브랜치 충돌을 미연에 방어하라.
# 원격 저장소의 최신 커밋 내려받아 합치기
git pull origin main
# 서브모듈들의 형상을 현재 메인 브랜치의 헤드 포인터에 맞게 강제 업데이트
git submodule update --init --recursive
2. 단계: 툴체인 및 의존성(Dependencies) 패키지 융합 자동화 셋업
소스 코드 실체가 무결하게 확보되었다면, 이제 이 거대한 텍스트 코드를 0과 1의 기계어로 번역해 줄 ARM GCC 크로스 컴파일러와, 향후 집중으로 다뤄질 uORB 파이썬 빌드 제너레이터(genmsg), 그리고 시뮬레이션을 물리적으로 구현할 가상 툴(Gazebo 등)을 OS 전역에 이식해야 한다.
과거 버전에서는 백여 개에 달하는 잡다한 라이브러리 패키지를 일일이 수동 apt 명령어로 설치하느라 개발자들이 물리적인 환경 구축에만 수일을 헛되이 낭비했다. 그러나 최신의 PX4 빌드 생태계는 매우 천재적인 bash 쉘 자동화 스크립트(ubuntu.sh) 단 하나로 이 모든 험난한 지뢰밭을 원클릭 수준으로 완전히 평정해 통합해 놓았다.
가장 치밀하고 안전하게 시스템 의존성을 타설하기 위해, 소스 트리 최상위에서 권한을 얻어 준비된 셸 스크립트를 강제 실행한다.
# 빌드용 통합 유틸리티 및 의존성 설치 구동 스크립트 실행 (sudo 관리자 권한 요구됨)
bash ./Tools/setup/ubuntu.sh
이 스크립트가 숨 가쁘게 리눅스 머신의 전역을 스캔하며 수행하는 물리적 핵심 백그라운드 매직은 다음과 같다.
- 크로스 컴파일러 타설: 픽스호크(Pixhawk) 보드에 얹힌 마이크로 칩셋을 정확히 타겟으로 조준하는
gcc-arm-none-eabi통합 크로스 컴파일러 바이너리를 알맞은 버전으로 하드코어하게 리눅스 PATH에 꽂아 넣는다. - 코드 제너레이터 인프라 구축: uORB
.msg파싱 생명선에 필요한 Python3 및pip부가 모듈(Jinja2 템플릿 엔진, NumPy 수학 라이브러리 등)을 가상 환경에 결속한다. 이로써 훗날 우리가 타이핑할 메시지 규격 텍스트 파일이 막힘 없이 단단한 C++ 헤더 코드로 번역될 수 있도록 고속도로의 길을 튼다. - SITL 환경 칩셋 구축: Java 기반의 jMAVSim 환경이나 최신 Gazebo 3D 시뮬레이터 바이너리를 리눅스 커널에 융합 설치하여, 위험천만한 물리 기체 연결 없이도 랩탑(Laptop) 로컬에서 즉각적이고 파괴적인 가상 비행 통신 실습이 가능하도록 담보한다.
이 거추장스러운 스크립트가 수 분에서 수십 분의 맹렬한 다운로드 및 융합 설치 끝에 파란색 성공 메시지(Done!)와 함께 터미널에서 우아하게 종료되면, 개발자는 곧바로 코드로 뛰어드는 것이 아니라 반드시 리눅스 머신을 물리적으로 **재부팅(Reboot)**해야 한다. 리눅스의 사용 권한 그룹(User Permissions Groups, 예를 들어 ‘dialout’ 포트 그룹) 세팅 및 컴파일러 환경 변수(Environmental Variables)의 궤적 변경 사항이 터미널 세션의 휘발성에 휩쓸리지 않고 커널 캐시 레벨에서 영구히 시스템에 적용되려면 오직 OS의 재구동만이 절대적 필수 조건이기 때문이다.
이 과정들이 한 치의 누수 없이 완벽하게 통과되었다면, 당신의 리눅스 머신 데스크탑은 이제 어떠한 기괴하고 복잡한 uORB 커스텀 메시지 구조라도 단숨에 씹어 삼키고 뱉어낼 준비가 완료된, 가장 섬뜩하고 강력한 PX4 컴파일 전위 요새로 완전히 탈바꿈한 것이다.