이번엔 오픈소스기반의 소프트웨어들을 이용해 FLCC (Flight Control Computer) 하드웨어를 적용한 HILS (Hardware In the Loop Simulation) 환경을 구축해 간단한 항공기 제어를 해봤다.
용어가 생소한 분을 위해 간략히 소개를 하자면 FLCC는 조종사의 스틱 명령을 전달 받아 Actuator를 이용해 항공기의 조종면을 움직이는 명령을 생성하고 때에 따라서는 Autopilot 기능을 수행하거나 항공기의 안정적인 자세제어를 위한 역할을 수행하기도 한다. 컴퓨터로 제어하는 요즘 항공기에는 대부분 들어가게 되며 Fly-By-Wire 시스템을 위한 중요한 요소이다.
HILS는 시뮬레이션 환경을 말한다. 시뮬레이션이라면 소프트웨어 기반으로만 생각 할 수 있으나 실제 장착되는 장비를 시뮬레이션 루프안에 포함시켜 실제 하드웨어 장비의 동작을 검증하기 위한 목적으로 수행하기도 하는데 이를 HILS라 부른다.
우선 사용한 오픈소스 및 적용 하드웨어는 다음과 같다.
- FDM : JSBSim
- Visualizer : FlightGear
- Application : QT
- FLCC RTOS : Embedded Linux-Xenomai
- FLCC H/W : PXA270 (ARMv5, 520MHz)
- Comm. : Realtime Ethernet (UDP/IP)
각 부분별 소프트웨어 소개를 잠깐 하자면 JSBSim은 항공기 공력 시뮬레이션을 위한 물리엔진이다. 흔히 FDM (Flight Dynamic Model)이라고 하는데 항공기의 공력 파라미터인 무게, 관성, 양력계수, 항력계수 등을 xml형태로 전달 하고 항공기 제어 파라미터인 엔진 추력, 조종면 위치 각등을 입력하면 항공기의 속도, 위치, 고도, 자세등을 알려주는 오픈소스 기반 소프트웨어 이다.
FlightGear는 3D 가시화 툴로 JSBSim에서 출력된 비행체 정보를 바탕으로 지리정보 (GIS - Geographic Information System)와 함께 지형지물과 항공기, HUD등을 그려주는 역할을 한다. JSBSim 자체는 이런 가시화 툴을 제공하지 않기에 항공기 제어 결과를 3D 그래픽으로 확인 하고자 한다면 필요한 툴이다. 역시 오픈소스이며 전세계 공항 정보와 많은 항공기 모델을 가지고 있다.
FlightGear를 설치하면 JSBSim도 같이 설치되며 별도 지정을 하지 않으면 JSBSim을 기본 FDM으로 사용하게 된다. FlightGear와 연동하여 사용 가능한 FDM은 JSBSim 말고도 YASim이 있는데 둘의 차이라면 JSBSim은 항공기의 양력계수, 항력계수등 공력 파라미터를 입력 받는 반면 YASim은 항공기의 기하학 (Geometric) 정보인 날개 면적, 코드 길이, 조종면 면적, 동체 길이등을 직접 입력 받아 공력 물리엔진 연산을 수행한다.
QT는 그래픽 어플리케이션 개발용 라이브러리이며 역시 오픈소스이다. IDE 기능까지 포함하고 있어 MS의 비주얼 스튜디오와 같다고 보면 된다. 그러나 윈도우즈 뿐만 아니라 리눅스나 맥 OS에서도 사용 가능하며 심지어 리눅스기반의 임베디드 시스템에도 포팅하여 사용 가능하다. 꼭 그랙픽 관련 어플리케이션 뿐만 아니라 콘솔 기반 응용 프로그램도 작성 가능하다. 그래픽관련 라이브러리 뿐만 아니라 Multi-thread, Network등 많은, 그리고 유용한 라이브러리도 제공한다.
QT를 소개하는 이유는 FLCC측 비행 제어 어플리케이션 개발시 처음부터 FLCC하드웨어를 사용하지 않고 FlightGear가 동작하는 호스트 PC에서 Native 개발 환경으로 빠르게 동작 확인을 해볼 수 있다는 점 때문이다.
Native 개발 환경에서 동작이 확인 되면 별다른 소스 수정없이 바로 FLCC 타겟에 사용 가능 하다. 물론 Native OS가 비실시간 운영체제라면 실시간 태스크 관련 코드는 수정이 좀 필요할 것이다.
마지막으로 FLCC 하드웨어에서 사용할 RTOS인 Xenomai이다.
리눅스 기반의 실시간 커널 패치로 이전 글에서 많이 소개 되었다.
항공기 실시간 제어를 위해 FLCC 하드웨어에는 Embedded Linux-Xenomai를 사용했다.
항공기를 제어 시뮬레이션을 수행 하려면 FDM으로 부터 계산된(시뮬레이션된) 항공기 자세정보가 필요하며 제어 루프에 의해 계산된 출력물인 엔진 추력, 조종면 각도값은 다시 FDM으로 주입하여 일련의 되먹임 (Feedback) 제어루프가 형성 되어야 한다.
다행히 FlightGear에는 UDP/IP 및 RS-232통신라인을 이용해 이런 일련의 데이터 흐름을 만들 수 있는 기능이 있다.
해외 자료들 뒤져 보니 실 기체 개발시 HILS용으로 FlightGear를 많이 사용하는가 보다.
제어 루프는 RTOS기반의 FLCC 하드웨어에서 수행 하도록 구성하면 된다.
전체 시스템 구성을 보자면 아래 그림과 같다.
[그림 1] Native 시뮬레이션 환경
[그림 2] FLCC-HILS 환경
사용한 FLCC 하드웨어는 일전에 EtherCONN 개발시 사용한 PXA270기반 보드를 사용했다 (링크참조).
Linux-Xenomai가 이미 포팅되어 있고 UDP/IP 통신을 위한 Ethernet용 실시간 디바이스 드라이버 (RTDM)가 만들어져 있으니 바로 활용 가능 하였다.
개발시에는 [그림 1]과 같이 Native 환경에서 개발을 진행 하고 얼추 결과가 나오면 [그림 2]와 같이 실제 FLCC 하드웨어에 제어 코드를 이식해 사용 하면 된다.
HILS 환경을 구축하고 간단하게 항공기의 롤 및 피치 제어용 Auto-pilot을 구현해 돌려 봤다. 아래 동영상 결과는 실제 FLCC 하드웨어로 제어하는 모습이다.
[영상 1] Roll/Pitch Auto-pilot Off
[영상 2] Roll/Pitch Auto-pilot On
[영상 3] Roll/Pitch Auto-pilot Off/On
[영상 1]은 롤/피치 제어용 Auto-pilot기능이 없는 순수 비행 화면이다.
비행 조종은 게임 패드의 조이스틱을 사용했으며 트림을 사용하지 않고 조종하는 모습이다.
조종사가 아니다 보니 항공기 조종하는게 생각 보다 어렵다.
[영상 2]는 롤/피치 제어용 Auto-pilot의 도움을 받아 비행하는 모습니다. 아케이드 게임하는 것처럼 조종하기가 참 수월해진다.
[영상 3]은 롤/피치 제어용 Auto-pilot 기능을 on/off를 반복하면서 동작 상태를 관찰하는 모습이다.