Ardupilot 컴파일 환경 구축 시 발생하는 주요 이슈와 해결 전략

아두파일럿(Ardupilot)은 강력한 오픈소스 프로젝트이지만, 처음 개발 환경을 구축하는 과정에서 예기치 못한 컴파일 오류를 마주하는 경우가 많습니다. 특히 임베디드 개발 환경은 운영체제의 라이브러리 상태나 빌드 도구의 버전에 매우 민감합니다. 여기서는 아두파일럿 빌드 과정에서 가장 흔히 발생하는 문제들과 이를 해결하기 위한 기술적인 접근 방법을 정리합니다.

1. Ubuntu 환경의 파이썬 의존성 충돌

아두파일럿은 빌드 시스템인 Waf와 코드 생성기 작업을 위해 파이썬(Python) 환경에 크게 의존합니다. 공식적으로 제공되는 install-prereqs-ubuntu.sh 스크립트를 사용하더라도, 기존에 설치된 패키지와의 버전 불일치로 인해 빌드가 중단될 수 있습니다. 특히 empy, future, lxml과 같은 패키지는 버전이 너무 높거나 낮으면 빌드 스크립트가 파싱 오류를 일으킵니다. 다음은 현재 환경에 설치된 핵심 패키지의 버전을 확인하고 강제로 재설치하는 과정입니다.
# 필수 패키지 버전 일괄 확인
for pkg in empy future lxml; do
    echo -n "$pkg: "
    python3 -c "import $pkg; print($pkg.__version__)" 2>/dev/null || echo "Not installed"
done

# 특정 버전으로 재설치 (예시: empy 3.3.4 필요 시)
python3 -m pip install --user --upgrade empy==3.3.4 future lxml
빌드 도구인 Waf는 특정 파이썬 인터프리터 경로를 참조하므로, venvconda 환경을 사용하는 경우 PATH 환경 변수가 꼬이지 않도록 주의해야 합니다.

2. Windows WSL2 환경에서의 빌드 최적화

Windows 사용자들은 보통 WSL2(Windows Subsystem for Linux)를 사용하여 빌드 환경을 구성합니다. 하지만 WSL2의 구조적 특성으로 인해 발생하는 고유한 이슈들이 있습니다.

디스크 입출력(I/O) 성능 저하

WSL2에서 /mnt/c/와 같이 Windows 파일 시스템 내에 프로젝트를 두고 빌드하면 컴파일 속도가 수배 이상 느려집니다. 이는 가상화된 파일 시스템 간의 통신 오버헤드 때문입니다. 아두파일럿 소스 코드는 반드시 WSL 내의 네이티브 경로(/home/username/ 등)에 배치해야 합니다.

리소스 제한 설정

WSL2가 가용 메모리를 과도하게 점유하거나 반대로 컴파일 중 메모리 부족으로 프로세스가 킬(Kill)되는 경우가 있습니다. 사용자 홈 디렉토리에 .wslconfig 파일을 생성하여 자원 할당을 최적화할 수 있습니다.
# %UserProfile%\.wslconfig 파일 설정
[wsl2]
memory=8GB      # 시스템 사양에 맞게 조절
processors=8    # 컴파일 속도를 위해 충분한 코어 할당
swap=4GB
guiApplications=false

USB 장치 연결 (Passthrough)

빌드된 바이너리를 하드웨어에 업로드하려면 USB 포트에 직접 접근해야 합니다. WSL2는 기본적으로 USB 장치 접근을 차단하므로 usbipd를 사용해야 합니다.
# Windows 파워셸에서 장치 공유
usbipd list
usbipd bind --busid 2-1
usbipd attach --wsl --busid 2-1

# WSL 내부에서 확인
lsusb

3. Git 서브모듈(Submodule) 동기화 이슈

아두파일럿은 ChibiOS, MAVLink, 각종 센서 드라이버를 서브모듈 형태로 포함하고 있습니다. 전체 용량이 크기 때문에 네트워크 상태에 따라 클론이 실패하거나 특정 모듈이 누락되는 경우가 잦습니다.

안정적인 서브모듈 업데이트

단순히 git clone만 수행하면 내부 라이브러리 폴더가 비어 있게 됩니다. 다음 명령어를 통해 깊이(Depth)를 제한하여 빠르게 데이터를 가져오고, 누락된 모듈을 재귀적으로 복구할 수 있습니다.
# 얕은 복사(Shallow Clone)를 이용한 서브모듈 초기화
git submodule update --init --recursive --recommend-shallow --jobs 8

# 만약 서브모듈 정보가 꼬였다면 강제 동기화
git submodule sync --recursive
git submodule update --init --force --recursive
브랜치를 전환(예: master에서 Copter-4.x로 이동)한 직후에는 반드시 서브모듈 상태를 업데이트해야 합니다. 그렇지 않으면 이전 버전의 라이브러리와 새 버전의 아두파일럿 코드가 충돌하여 정의되지 않은 참조(Undefined Reference) 오류가 발생합니다.

4. 빌드 대상 지정 및 정리

아두파일럿의 빌드 도구인 Waf는 빌드 캐시를 활용합니다. 보드 타겟을 변경하거나 큰 규모의 코드 수정이 있은 후에는 distclean을 통해 환경을 초기화하는 것이 안전합니다.
# 빌드 캐시 삭제 및 초기화
./waf distclean

# 특정 보드(예: Pixhawk 4) 설정 및 빌드
./waf configure --board Pixhawk4
./waf copter --jobs 4
성공적인 빌드를 위해서는 로그 메시지 상단의 Checking for... 항목들이 모두 ok인지 확인하는 습관이 중요합니다. 특히 크로스 컴파일러인 arm-none-eabi-gcc의 경로가 정확히 잡혔는지 점검해야 합니다.

태그: Ardupilot Firmware WSL2 Git Embedded

7월 5일 21:24에 게시됨