다음의 문서를 참고하였으며 이를 분석하였습니다.
참고문헌
1. "Learning the code/Learning ArduPilot - Introduction," ardupilot.org/dev/docs/learning-ardupilot-introduction.html
2. "Learning the code/ArduPilot Libraries," ardupilot.org/dev/docs/apmcopter-programming-libraries.html
기본 구조[1]
ArduPilot의 기본 구조는 5가지의 주요 항목으로 나뉜다.
- Vehicle code
- Shared libraries
- Hardware Abstruction Layer(AP_HAL, 하드웨어 추상화 계층)
- Tool directories
- External support code (i.e. mavlink, dronekit)
기체 코드
기체 코드는 최상위 디렉토리로써, 각 기체 타입에 대한 펌웨어를 정의한다. 현재 5가지의 기체 종류가 존재하며, Plane, Copter, Rover, Sub, AntennaTracker가 있다. 각각의 공통 요소가 있지만 다른점이 존재한다.
*.cpp 파일과 함께, 각 기체 디렉토리는 make.inc를 가지는데, 이는 라이브러리 의존성을 열거한다. Makefile은 빌드를 위해 -l 또는 -L 플레그를 만들기 위해 이를 읽는다.
라이브러리들
라이브러리는 네 가지 기체 종류 Copter, Plane, Rover, AntennaTracker 사이에서 공유된다. 이 라이브러리들은 센서 드라이버, 자세 및 위치 추정기(a.k.a EKF), 제어 코드(i.e. PID 제어기)를 포함한다.
하드웨어 추상화 계층, AP_HAL
AP_HAL 계층은 어떻게 ArduPilot을 다양한 플랫폼에 이식할 수 있을지에 대한 것이다. libraries/AP_HAL의 최상위 AP_HAL은 인터페이스를 정의하고 있다. 또한 각 보드 종류에 대해 AP_HAL_XXX의 이름으로 하위 디렉토리를 가진다. 예를 들면 AP_HAL_AVR은 AVR 기반 보드이고 AP_HAL_PX4는 Pixhawk 보드이고, AP_HAL_Linux는 Linux 기반 보드를 위한 라이브러리이다.
툴 디렉토리
툴 디렉토리는 기타 지원 디렉토리이다. 예를 들면 tool/autotest는 autotest 인프라를 제공하며, tools/Replay는 로그 재생 기능을 제공한다.
외부 지원 코드
어떤 플랫폼에서는, 보드 지원이나 추가적인 기능을 제공하기 위한 외부 지원 코드가 필요하다. 현재 외부 트리는 PX4NuttX, PX4Firmware, uavcan, mavlink가 있다.
ArduPilot 라이브러리들[2]
이 라이브러리는 Copter, Plane, Rover가 공유한다. 아래는 고수준의 라이브러리와 함수이다.
핵심 라이브러리
AP_AHRS | DCM 또는 EKF를 이용한 자세 추정 |
AP_Common | 모든 스케치와 라이브러리에서 요구되는 핵심 |
AP_Math | 벡터 연산에 특히 유용한 다양한 수학 함수 |
AC_PID | PID 제어기 라이브러리 |
AC_InertialNav | 가속도계 입력에 GPS와 기압계 데이터를 섞는 관성항법 라이브러리 |
AC_AttitudeControl | PID 제어기 기반 위치, 자세 제어 함수를 포함한 ArduCopter의 제어 라이브러리 |
AC_WPNav | 경로점 항법 라이브러리 |
AP_Motors | 멀티로터와 전형적인 헬리콥터 모터 믹싱 |
RC_Channel | APM_RC에서 각도 같은 내부 단위로 PWM 입출력을 변환하는 라이브러리 |
AP_HAL AP_HAL_ChibiOS AP_HAL_Linux |
"하드웨어 추상화 계층, HAL"을 수행하는 라이브러리로, HAL은 고유한 인터페이스를 고수준의 코드로 나타내어, 다른 보드로 더욱 쉽게 포팅하기 좋게 해준다. 쉬운 말로 정리하면 보드 별로 다른 특징을 추상화시켜서 상위 계층에서 사용할 때 같은 기능으로 쓰기 좋게 해주는 계층을 하드웨어 추상화 계층이다. 해당 계층이 있으면 보드 별로 디바이스 드라이버를 따로 개발할 필요가 없다. |
센서 라이브러리
AP_InertialSensor | 각속도, 가속도 값을 읽어오고, 보정을 수행하며, 표준 단위로 주 코드와 다른 라이브러리에 데이터를 제공한다. |
AP_RangeFinder | 소나와 IR 거리 센서 인터페이스 라이브러리 |
AP_Baro | 기압계 인터페이스 라이브러리 |
AP_GPS | GPS 인터페이스 라이브러리 |
AP_Compass | 3축 지자계 인터페이스 라이브러리 |
AP_OpticalFlow | 광류 센서 인터페이스 라이브러리 |
기타 라이브러리
AP_Mount AP_Camera AP_Relay |
카메라 장착 제어 라이브러리, 카메라 셔터 제어 라이브러리 |
AP_Mission | EEPROM으로부터 임무 명령을 저장/불러오기 |
AP_Buffer | 관성 항법에 사용하기 위한 간단한 FIFO 버퍼 |
'SW > Aircraft' 카테고리의 다른 글
Ardupilot git repo의 특정 tag 가져오기 with submodule (0) | 2023.05.07 |
---|---|
Gazebo를 이용한 Ardupilot SITL 해보기 on Windows 10 WSL (0) | 2023.04.05 |
Ardupilot 시뮬레이션 해보기 (0) | 2020.10.10 |
Ardupilot 빌드 과정 정리 (0) | 2020.10.10 |