19.7.2. SITL 환경 실행 및 모듈 라이프사이클 제어
19.7.1 단원에서 CMake 타겟 메뉴판에 당신의 커스텀 모듈(px4_uorb_example)의 이름표를 성공적으로 박아 넣었다면, 이제 그 텍스트 쪼가리들을 진짜 기계어 바이너리로 컴파일(Compile)하여 리눅스 PC 위에 가상의 픽스호크 보드 운영체제를 통째로 띄워 올릴 차례이다.
우리는 이를 SITL (Software-In-The-Loop) 시뮬레이션 환경이라고 부른다. SITL은 실제 하드웨어 센서 칩스터 대신 가상의 물리 엔진(Gazebo, jMAVSim 등)이 만들어내는 가짜 센서 데이터를 VFS 링 버퍼에 때려 넣어주며, PX4 펌웨어 메인 커널 코드는 자신이 진짜 공중에 떠 있는 줄 알고 완벽하게 똑같은 멀티스레드 스케줄링과 EKF 연산을 수행하게 된다.
이 가상 통제실 스크린 안에서, 모듈 개발자는 자신이 짠 코드를 찌르고 부수며 가지고 노는 무소불위의 신(God)이 될 수 있다.
1. SITL 통제실: NuttShell (NSH) 터미널의 개방
PX4 펌웨어를 SITL 모드로 빌드하고 띄우면, 리눅스 터미널 창은 어느새 우분투(Ubuntu)의 bash 쉘을 뒤로하고, PX4 실시간 운영체제(NuttX RTOS) 내부의 터미널 쉘인 NuttShell (NSH) 프롬프트(px4>)로 완벽히 탈바꿈하게 된다.
이 px4> 프롬프트야말로 실시간으로 살아 꿈틀거리는 픽스호크 램(RAM) 메모리의 내부로 직행하는 유일무이한 마스터 콘솔 인터페이스이다. 시스템이 부팅된 직후, 우리가 짠 수백 줄의 C++ 데몬 클래스는 아직 힙(Heap) 메모리에 로드되지 않은 채 디스크(가상 플래시메모리)에서 잠들어 있다. 즉, 코딩을 잘해놨다고 해서 부팅 즉시 프로그램이 자동으로 돌아가는 것이 절대 아니다.
이 콘솔 창에서 개발자는 스스로 생명수가 되어, 자신의 모듈을 강제로 기상시키고(Start), 백그라운드로 밀어 넣으며(Daemonize), 구동 상태의 변수들을 덤프(Status) 뜨고, 마지막에 스레드를 살해(Stop)하는 완벽한 라이프사이클(Lifecycle) 제어 권력을 행사해야만 한다.
이어지는 19.7.2.1 단원부터 우리는 다음의 무자비한 SITL 통제 절차 타이핑 콤보를 실전으로 타격해 볼 것이다.
- 빌드 및 부팅 (
make px4_sitl): C++ 소스 코드를 GCC 커널로 구워내고 jMAVSim 가상 물리 엔진 공역 맵 위에 픽스호크를 런칭시키는 컴파일러 타격. (19.7.2.1 단원 타설 예정) - 생명 불어넣기 (
px4_uorb_example start): NSH 쉘 위에서 텍스트 명령어를 타이핑하여, 죽어있는 내 모듈의main()함수를 때려 깨우고 글로벌 시스템 Work Queue에 영구 스케줄링 티켓을 타설하는 런타임 기동 절차. (19.7.2.2 단원 타설 예정) - 메인 덤프 (
px4_uorb_example status): 컴파일 따윈 필요 없이, 실시간으로 날아다니는 기체의 메모리 워크 큐를 열어젖혀 내 인스턴스의 에러율, 타임스탬프 극대값을 텍스트로 탈취해 내는 동적 디버깅 인터페이스 기술. (19.7.2.3 단원 타설 예정)
이 세 단계를 완전히 체화하면, 당신은 수십 번 기체를 갈아엎어야만 알 수 있었던 멀티스레드 레이스 컨디션 버그를, 의자에 앉아 한 잔의 커피를 마시며 콘솔 타이핑 단 세 번만으로 우아하게 색출하고 터뜨릴 수 있는 완벽한 SITL 아키텍트로 거듭날 것이다.