# 데이터 흐름과 통신 프로토콜

### 데이터 흐름

드론의 비행 제어 시스템에서는 다양한 센서와 액추에이터들이 데이터를 주고받으며 시스템의 상태를 지속적으로 업데이트한다. 이러한 데이터 흐름은 시스템의 효율성과 정확성에 직접적인 영향을 미친다. 주된 데이터 흐름은 다음과 같이 구성된다.

#### 센서 데이터 수집

각종 센서 (예: IMU, GPS, 바로미터 등)들은 지속적으로 데이터를 수집하여 FC에 전달한다. 이 과정은 일반적으로 다음 단계로 구분된다:

1. **데이터 샘플링**: 센서들은 정해진 주기에 따라 데이터를 샘플링한다.
2. **데이터 필터링**: 샘플링된 데이터는 노이즈 제거와 보정 과정을 거친다.
3. **데이터 전송**: 필터링된 데이터는 FC로 전송된다.

#### 데이터 처리

FC는 수신된 센서 데이터를 실시간으로 처리하여 드론의 현재 상태를 파악하고 필요한 제어 명령을 생성한다.

1. **상태 추정**: 센서 데이터를 이용하여 드론의 위치, 속도, 가속도 등을 추정한다.
2. **제어 명령 계산**: 추정된 상태를 바탕으로 PID 제어기와 같은 알고리즘을 이용하여 필요한 제어 명령을 계산한다.
3. **명령 전송**: 계산된 제어 명령은 ESC(Electronic Speed Controller)와 같은 액추에이터로 전달된다.

#### 액추에이터 동작

전송된 제어 명령에 따라 액추에이터들은 드론의 모터를 제어하여 실제 물리적인 변화를 일으킨다.

1. **모터 제어**: 제어 명령에 따라 모터의 속도와 방향을 조절한다.
2. **상태 피드백**: 모터의 상태를 다시 센서로 측정하여 FC로 피드백을 제공한다.

### 통신 프로토콜

드론 시스템 내의 데이터 흐름을 원활하게 하기 위해서는 다양한 통신 프로토콜이 사용된다. 각 프로토콜은 특정 목적과 요구사항에 맞게 설계되었다.

#### I2C (Inter-Integrated Circuit)

I2C는 저속, 단거리 데이터 전송을 위한 프로토콜로, 주로 센서 데이터 전송에 사용된다.

* **주파수**: 100 kHz 또는 400 kHz
* **특징**: 다중 마스터-슬레이브 구조, 클럭 라인(SCL)과 데이터 라인(SDA) 사용

#### SPI (Serial Peripheral Interface)

SPI는 고속 데이터 전송이 필요한 경우에 사용되는 프로토콜로, 주로 IMU 같은 고속 센서에 사용된다.

* **주파수**: 최대 수 MHz
* **특징**: 풀-듀플렉스, 마스터-슬레이브 구조, 클럭 라인(SCK), 데이터 입력(MISO), 데이터 출력(MOSI), 선택 라인(SS) 사용

#### UART (Universal Asynchronous Receiver-Transmitter)

UART는 비동기식 통신 프로토콜로, 주로 GPS 모듈과 같은 외부 장치와의 통신에 사용된다.

* **속도**: 보통 9600 bps에서 115200 bps
* **특징**: 간단한 하드웨어 구성, 풀-듀플렉스, 스타트 비트와 스톱 비트 사용

#### CAN (Controller Area Network)

CAN은 노이즈가 많은 환경에서 신뢰성 있는 데이터 전송을 위해 사용되는 프로토콜로, 주로 자동차와 드론의 제어 시스템에서 사용된다.

* **속도**: 125 kbps에서 1 Mbps
* **특징**: 다중 마스터-슬레이브 구조, 오류 검출 및 수정 기능 제공, 메세지 우선순위 제어

#### MAVLink (Micro Air Vehicle Link)

MAVLink는 드론과 지상 통제 스테이션 간의 통신을 위해 설계된 프로토콜로, 드론의 상태 모니터링과 제어 명령을 전송하는 데 사용된다.

* **속도**: 일반적으로 57600 bps에서 115200 bps
* **특징**: 경량, 양방향, 패킷 기반 통신, 다양한 메시지 타입 지원 (예: 위치, 상태, 제어 명령)

#### PWM (Pulse Width Modulation)

PWM은 드론의 모터 속도 제어에 주로 사용되는 프로토콜로, 주파수와 듀티 사이클을 통해 모터의 동작을 제어한다.

* **주파수**: 일반적으로 50 Hz에서 400 Hz
* **특징**: 간단한 구현, 높은 호환성, 아날로그 신호 기반

### 실시간 리눅스 환경 설정

드론의 FC 소프트웨어는 실시간 처리가 중요하다. 이를 위해 실시간 리눅스 환경이 필요하다. 실시간 리눅스 환경 설정에는 몇 가지 중요한 단계가 포함된다.

#### 커널 패치

리눅스 커널을 실시간으로 동작하게 하기 위해 RT-Preempt 패치를 적용한다.

1. **커널 소스 코드 다운로드**: 원하는 버전의 리눅스 커널 소스 코드를 다운로드한다.
2. **RT-Preempt 패치 적용**: 다운로드한 커널 소스 코드에 RT-Preempt 패치를 적용한다.
3. **커널 컴파일**: 패치된 커널을 컴파일하여 시스템에 설치한다.

#### 실시간 스케줄러 설정

실시간 태스크를 위한 스케줄러를 설정한다. 일반적으로 FIFO나 RR (Round Robin) 스케줄링 정책을 사용한다.

1. **실시간 태스크 생성**: `pthread` 라이브러리를 이용하여 실시간 태스크를 생성한다.
2. **스케줄링 정책 설정**: `pthread_setschedparam` 함수를 이용하여 스케줄링 정책과 우선순위를 설정한다.

#### 고해상도 타이머 설정

실시간 시스템에서는 고해상도 타이머를 사용하여 정확한 타이밍을 보장한다.

1. **타이머 생성**: `timer_create` 함수를 이용하여 타이머를 생성한다.
2. **타이머 설정**: `timer_settime` 함수를 이용하여 타이머의 주기와 동작을 설정한다.

### FC(Fly Controller) 소프트웨어 개발

FC 소프트웨어 개발은 드론의 비행 제어를 실시간으로 수행할 수 있도록 설계되어야 한다.

#### 주요 모듈

FC 소프트웨어는 일반적으로 다음과 같은 주요 모듈로 구성된다.

1. **센서 인터페이스 모듈**: 각종 센서와의 통신을 담당한다.
2. **상태 추정 모듈**: 센서 데이터를 기반으로 드론의 현재 상태를 추정한다.
3. **제어 알고리즘 모듈**: 비행 제어 알고리즘을 구현하여 필요한 제어 명령을 생성한다.
4. **액추에이터 인터페이스 모듈**: 제어 명령을 액추에이터로 전달한다.

#### 제어 알고리즘

드론의 안정적인 비행을 위해 다양한 제어 알고리즘이 사용된다. 대표적인 알고리즘으로는 PID 제어가 있다.

* **비례 제어 (P)**: 현재 오류에 비례하여 제어 입력을 생성한다.
* **적분 제어 (I)**: 과거 오류의 누적을 고려하여 제어 입력을 생성한다.
* **미분 제어 (D)**: 오류의 변화율을 고려하여 제어 입력을 생성한다.

#### 코드 최적화

실시간 시스템에서는 코드의 효율성과 최적화가 매우 중요하다.

1. **루프 최적화**: 불필요한 연산을 최소화하고, 루프를 효율적으로 구성한다.
2. **메모리 관리**: 실시간으로 메모리 할당과 해제를 최소화하여 메모리 누수를 방지한다.
3. **타이밍 분석**: 각 코드 블록의 실행 시간을 분석하여 실시간 요구사항을 충족하는지 확인한다.
