Skip to content

Latest commit

 

History

History
193 lines (133 loc) · 9.57 KB

File metadata and controls

193 lines (133 loc) · 9.57 KB

드론의 FCC 시스템을 6개의 주요 Task로 나눴고, 그 Task를 서브타스크들로 더 세분화하려는 접근은 모듈성, 유지보수성, 실시간성 최적화 면에서 매우 바람직합니다.


기준: 서브타스크 분할의 목적

서브타스크로 나누는 주된 이유는 다음과 같습니다:

  1. 각 Task가 담당하는 기능이 복합적일 경우 기능별 분할
  2. 작업 주기(Hz)가 다른 작업 분리
  3. 실시간성과 비실시간 작업 분리
  4. I/O Blocking이나 연산량 많은 작업의 분리

각 Task의 서브타스크 분해 예


1. SensorTask (Core 1, 실시간)

역할: IMU, Barometer, GPS, Magnetometer 등에서 데이터 수집

서브타스크 분해 예:

서브타스크 이름 역할
IMUTask MPU6050, ICM20948 등에서 자이로/가속도 수집
BarometerTask BMP280, MS5611 등 고도 정보 수집
GPSTask GPS 모듈에서 위치, 속도 수신
MagnetometerTask HMC5883L 등 나침반 수집

SensorManagerTask가 위 Task들을 통합하여 공유 버퍼에 저장하거나 큐로 전파


2. StabilizerTask (Core 1, 실시간)

역할: PID 계산 및 자세 제어

서브타스크 분해 예:

서브타스크 이름 역할
AttitudeEstimator 센서 융합 (Madgwick, Kalman 등)으로 Pitch/Roll/Yaw 추정
PIDRollTask Roll 축 PID 계산
PIDPitchTask Pitch 축 PID 계산
PIDYawTask Yaw 축 PID 계산

PIDControllerTask에서 각 축별 PID를 조합하여 출력 생성


3. MotorCtrlTask (Core 1)

역할: PWM 계산 및 모터 명령

서브타스크 분해 예:

서브타스크 이름 역할
PWMTask 4개의 ESC/모터에 PWM 출력
MotorMixingTask 스로틀+PID 값 → 각 모터에 믹싱 계산
SoftStartTask 이륙 시 부드러운 출력 증가 (optional)

4. CommandTask (Core 0)

역할: 사용자 명령 수신

서브타스크 분해 예:

서브타스크 이름 역할
UARTCommandTask 지상국 또는 PC에서 보내는 Serial 명령 파싱
BLECommandTask BLE 앱 또는 RC 수신기에서 명령 수신
RCInputTask PWM/PPM 신호 기반 RC 입력 해석
CommandParser 수신 명령 분석 및 정규화 → 큐 전파

5. TelemetryTask (Core 0)

역할: 드론 상태 전송

서브타스크 분해 예:

서브타스크 이름 역할
StatusEncoderTask 센서/제어 정보를 패킷으로 인코딩
WiFiTxTask WiFi로 송신 (UDP/TCP)
SerialTxTask UART, USB 등으로 송신
BLETxTask BLE 특성(characteristic)로 송신

6. FailsafeTask (Core 1)

역할: 이상 상황 감지 및 긴급 제어

서브타스크 분해 예:

서브타스크 이름 역할
LinkLossMonitor RC/WiFi 연결 끊김 감지
SensorHealthTask 센서 이상/정지 감지
LandingTask Fail 발생 시 착륙 루틴 수행
WatchdogTask 시스템 Hang 또는 Task Stuck 감지

요약표: 전체 Task 및 서브타스크 구조

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/서브타스크 관리 방식

  • 각 서브타스크를 별도 Task로 만들기 vs. 한 Task 내부의 state-machine으로 돌리기 선택 가능

    • 고속/병렬 처리 필요한 경우 → Task 분리 (ex. IMU vs GPS)
    • 순차적/간단한 경우 → 하나의 Task 내 switch-case 처리
  • 공용 자원 접근 시 Mutex 또는 EventGroup 필요

요약 테이블

ESP32 기반 드론 Flight Control Computer (FCC) 시스템을 구성하는 6개의 주요 Task와 그에 따른 서브타스크들하나의 통합 테이블로 정리한 것입니다.


ESP32 드론 FCC 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)