드론의 FCC 시스템을 6개의 주요 Task로 나눴고, 그 Task를 서브타스크들로 더 세분화하려는 접근은 모듈성, 유지보수성, 실시간성 최적화 면에서 매우 바람직합니다.
서브타스크로 나누는 주된 이유는 다음과 같습니다:
- 각 Task가 담당하는 기능이 복합적일 경우 기능별 분할
- 작업 주기(Hz)가 다른 작업 분리
- 실시간성과 비실시간 작업 분리
- I/O Blocking이나 연산량 많은 작업의 분리
역할: IMU, Barometer, GPS, Magnetometer 등에서 데이터 수집
서브타스크 분해 예:
| 서브타스크 이름 | 역할 |
|---|---|
IMUTask |
MPU6050, ICM20948 등에서 자이로/가속도 수집 |
BarometerTask |
BMP280, MS5611 등 고도 정보 수집 |
GPSTask |
GPS 모듈에서 위치, 속도 수신 |
MagnetometerTask |
HMC5883L 등 나침반 수집 |
SensorManagerTask가 위 Task들을 통합하여 공유 버퍼에 저장하거나 큐로 전파
역할: PID 계산 및 자세 제어
서브타스크 분해 예:
| 서브타스크 이름 | 역할 |
|---|---|
AttitudeEstimator |
센서 융합 (Madgwick, Kalman 등)으로 Pitch/Roll/Yaw 추정 |
PIDRollTask |
Roll 축 PID 계산 |
PIDPitchTask |
Pitch 축 PID 계산 |
PIDYawTask |
Yaw 축 PID 계산 |
PIDControllerTask에서 각 축별 PID를 조합하여 출력 생성
역할: PWM 계산 및 모터 명령
서브타스크 분해 예:
| 서브타스크 이름 | 역할 |
|---|---|
PWMTask |
4개의 ESC/모터에 PWM 출력 |
MotorMixingTask |
스로틀+PID 값 → 각 모터에 믹싱 계산 |
SoftStartTask |
이륙 시 부드러운 출력 증가 (optional) |
역할: 사용자 명령 수신
서브타스크 분해 예:
| 서브타스크 이름 | 역할 |
|---|---|
UARTCommandTask |
지상국 또는 PC에서 보내는 Serial 명령 파싱 |
BLECommandTask |
BLE 앱 또는 RC 수신기에서 명령 수신 |
RCInputTask |
PWM/PPM 신호 기반 RC 입력 해석 |
CommandParser |
수신 명령 분석 및 정규화 → 큐 전파 |
역할: 드론 상태 전송
서브타스크 분해 예:
| 서브타스크 이름 | 역할 |
|---|---|
StatusEncoderTask |
센서/제어 정보를 패킷으로 인코딩 |
WiFiTxTask |
WiFi로 송신 (UDP/TCP) |
SerialTxTask |
UART, USB 등으로 송신 |
BLETxTask |
BLE 특성(characteristic)로 송신 |
역할: 이상 상황 감지 및 긴급 제어
서브타스크 분해 예:
| 서브타스크 이름 | 역할 |
|---|---|
LinkLossMonitor |
RC/WiFi 연결 끊김 감지 |
SensorHealthTask |
센서 이상/정지 감지 |
LandingTask |
Fail 발생 시 착륙 루틴 수행 |
WatchdogTask |
시스템 Hang 또는 Task Stuck 감지 |
| Main Task | 서브타스크 예 |
|---|---|
| SensorTask | IMU, GPS, Baro, Mag |
| StabilizerTask | Estimator, PID(Pitch/Roll/Yaw) |
| MotorCtrlTask | PWM, Mixer, SoftStart |
| CommandTask | UART, BLE, RCInput, Parser |
| TelemetryTask | Encoder, WiFiTx, SerialTx, BLETx |
| FailsafeTask | LinkMonitor, SensorCheck, Landing, Watchdog |
-
각 서브타스크를 별도 Task로 만들기 vs. 한 Task 내부의 state-machine으로 돌리기 선택 가능
- 고속/병렬 처리 필요한 경우 → Task 분리 (ex. IMU vs GPS)
- 순차적/간단한 경우 → 하나의 Task 내 switch-case 처리
-
공용 자원 접근 시 Mutex 또는 EventGroup 필요
ESP32 기반 드론 Flight Control Computer (FCC) 시스템을 구성하는 6개의 주요 Task와 그에 따른 서브타스크들을 하나의 통합 테이블로 정리한 것입니다.
| 메인 Task | 서브타스크 | 설명 |
|---|---|---|
| 1. SensorTask (Core 1) | IMUTask |
자이로/가속도 센서 (MPU6050, ICM20948 등) 데이터 수집 |
BarometerTask |
고도계 센서 (BMP280, MS5611 등)에서 고도 정보 획득 | |
GPSTask |
GPS 모듈에서 위치, 속도, 고도 등 획득 | |
MagnetometerTask |
나침반 방향 (HMC5883L 등) 데이터 수집 | |
SensorManagerTask |
개별 센서 데이터를 통합하여 공유 버퍼에 저장 | |
| 2. StabilizerTask (Core 1) | AttitudeEstimator |
센서 융합(Madgwick, Complementary 등)으로 Roll/Pitch/Yaw 계산 |
PIDRollTask |
Roll 축 PID 계산 | |
PIDPitchTask |
Pitch 축 PID 계산 | |
PIDYawTask |
Yaw 축 PID 계산 | |
PIDControllerTask |
각 PID 출력 조합 → 최종 제어 벡터 구성 | |
| 3. MotorCtrlTask (Core 1) | MotorMixingTask |
PID + Throttle 값을 각 모터에 믹싱 |
PWMTask |
ESC로 PWM 출력 수행 | |
SoftStartTask |
부드러운 출력 상승 (arming/이륙 시 사용) | |
| 4. CommandTask (Core 0) | UARTCommandTask |
지상국 등에서 UART 명령 수신/파싱 |
BLECommandTask |
BLE 기반 RC 앱 또는 설정 앱에서 명령 수신 | |
RCInputTask |
RC 수신기 (PWM, PPM, SBUS 등) 입력 해석 | |
CommandParser |
명령 공통 파싱 후 내부 큐 또는 Event 전송 | |
| 5. TelemetryTask (Core 0) | StatusEncoderTask |
센서/상태값을 전송 패킷으로 인코딩 |
WiFiTxTask |
상태 정보를 WiFi (UDP/TCP)로 전송 | |
SerialTxTask |
UART로 지상국에 전송 | |
BLETxTask |
BLE로 스마트폰 앱에 전송 | |
| 6. FailsafeTask (Core 1) | LinkLossMonitor |
RC 또는 WiFi 연결 끊김 감지 |
SensorHealthTask |
센서 값 이상 감지 (NaN, timeout 등) | |
LandingTask |
긴급 착륙 시퀀스 실행 (slow descent 등) | |
WatchdogTask |
시스템 hang, 특정 Task 미응답 감지 후 리셋 수행 |
- Core 1: 실시간 제어 중심 Task (센서/제어/모터)
- Core 0: 통신 및 명령 수신 중심 Task
- 서브타스크들은 실제로는 별도 FreeRTOS Task 또는 하나의 Task 내 로직 분기(Switch/State Machine)로 구현될 수 있습니다.
- 각 Task 간 통신은
Queue,Shared Struct + Mutex,EventGroup등을 활용
- 모든 서브타스크를 클래스 기반 구조(OOP) 로 구현하면 매우 모듈화된 FCC 시스템이 됩니다.
- 예:
class SensorManager,class PIDController,class MotorMixer등
이 구조 기반으로 설계 가능
- 전체 프로젝트 구조 설계 (
/tasks,/drivers,/libs디렉토리 구성) - 각 서브타스크 샘플 코드 or 클래스 템플릿
- Task 간 통신 예제 (
xQueue,EventGroup,Mutex)