# 프로젝트 개요 및 요구 사항 분석

### 프로젝트 개요

이 프로젝트의 목표는 Preempt RT(Real-Time) 패치를 적용한 리눅스 커널을 기반으로 한 실시간 제어 시스템을 개발하는 것이다. 실시간 제어 시스템은 다양한 산업 및 연구 분야에서 사용되며, 시스템의 응답 시간과 처리 지연을 최소화하는 것이 중요하다. Preempt RT 패치는 이러한 요구를 충족하기 위해 리눅스 커널의 선점성을 강화하여 실시간 성능을 제공하는 기능을 추가한다.

이 프로젝트는 다음과 같은 주요 목표를 가지고 있다:

* **실시간 제어 시스템의 개발:** Preempt RT 패치를 적용한 리눅스 환경에서 동작하는 실시간 제어 시스템을 설계하고 구현한다.
* **실시간 성능 최적화:** 시스템의 시간 지연을 최소화하고 안정적인 실시간 응답을 보장하기 위해 다양한 최적화 기법을 적용한다.
* **모듈화된 시스템 설계:** 각 기능을 모듈화하여 독립적으로 개발하고, 이를 통합하여 전체 시스템을 구축한다.
* **성능 테스트 및 검증:** 개발된 시스템의 성능을 측정하고, 실시간 요구 사항을 충족하는지 검증한다.

### 요구 사항 분석

실시간 제어 시스템을 성공적으로 개발하기 위해서는 시스템이 충족해야 하는 주요 요구 사항을 분석하는 것이 중요하다. 이 절에서는 기능적 요구 사항과 비기능적 요구 사항으로 나누어 분석한다.

#### 기능적 요구 사항

1. **입력 신호 처리:**

   * 시스템은 다양한 센서로부터 입력 신호를 받아야 하며, 이를 실시간으로 처리할 수 있어야 한다.
   * 입력 신호는 주기적으로 발생할 수 있으며, 각각의 신호는 지정된 시간 내에 처리되어야 한다.
   * 각 신호는 고유의 처리 로직에 따라 분석되고, 그 결과는 제어 명령으로 변환되어야 한다.

   이를 수학적으로 표현하면, 입력 신호 $\mathbf{x}(t)$가 주어졌을 때, 실시간 제어 시스템의 목표는 다음과 같이 정의할 수 있다:

$$
\mathbf{y}(t) = f(\mathbf{x}(t), \theta)
$$

여기서 $\mathbf{y}(t)$는 제어 신호, $f$는 처리 함수, $\theta$는 시스템 파라미터를 나타낸다.

2. **제어 신호 생성:**

   * 입력 신호를 기반으로 적절한 제어 신호를 생성해야 한다.
   * 제어 신호는 특정 시간 제약 내에 출력되어야 하며, 출력되는 제어 신호는 정밀하고 정확해야 한다.

   제어 신호는 다음과 같은 피드백 제어 시스템의 형태로 나타낼 수 있다:

$$
\mathbf{u}(t) = K\_p \cdot e(t) + K\_i \cdot \int e(t) , dt + K\_d \cdot \frac{de(t)}{dt}
$$

여기서 $\mathbf{u}(t)$는 제어 신호, $e(t)$는 오류 신호, $K\_p$, $K\_i$, $K\_d$는 각각 비례, 적분, 미분 제어 이득을 나타낸다.

3. **실시간 데이터 로깅:**
   * 실시간으로 처리된 데이터 및 제어 신호를 기록하여 시스템의 상태를 모니터링하고, 추후 분석할 수 있도록 해야 한다.
   * 데이터는 고정된 시간 간격으로 기록되며, 로깅 시스템은 실시간 처리에 영향을 미치지 않도록 설계되어야 한다.

#### 비기능적 요구 사항

1. **실시간 응답성:**
   * 시스템은 모든 입력 신호에 대해 일정 시간 내에 응답해야 하며, 응답 시간은 최악의 경우에도 미리 정의된 한계를 초과해서는 안 된다.
   * 예를 들어, 제어 루프의 주기가 $T\_c$라면, 처리 시간 $t\_{process}$는 항상 $t\_{process} \leq T\_c$를 만족해야 한다.
2. **신뢰성 및 가용성:**
   * 시스템은 오작동 없이 지속적으로 운영될 수 있어야 하며, 특정 수준의 가용성을 유지해야 한다.
   * 이를 위해 장애 발생 시 자동 복구 메커니즘이 필요하며, 시스템 다운타임을 최소화해야 한다.
3. **확장성:**
   * 시스템은 필요에 따라 기능이 추가되거나 변경될 수 있어야 한다.
   * 확장 시 기존 시스템의 성능에 미치는 영향을 최소화해야 하며, 모듈화된 설계를 통해 유지보수 및 기능 추가를 용이하게 해야 한다.
4. **보안성:**
   * 실시간 제어 시스템은 외부 공격으로부터 보호되어야 하며, 민감한 데이터는 안전하게 처리 및 저장되어야 한다.
   * 보안 메커니즘은 실시간 성능에 영향을 미치지 않도록 효율적으로 설계되어야 한다.

#### 프로젝트 주요 구성 요소

프로젝트의 주요 구성 요소는 다음과 같다. 각 구성 요소는 시스템의 전반적인 성능과 안정성에 중요한 역할을 한다.

**1. 실시간 커널 및 시스템 설정**

* **Preempt RT 패치 적용:** 리눅스 커널에 Preempt RT 패치를 적용하여 시스템의 선점성을 강화하고, 실시간 처리를 가능하게 한다.
* **커널 설정 최적화:** 실시간 응답성을 최적화하기 위해 커널의 설정을 조정한다. 예를 들어, HZ 값(커널 타이머 주기)을 높여 짧은 시간 단위로 스케줄링을 처리할 수 있도록 설정할 수 있다.
* **고정 우선순위 스케줄링:** 실시간 스레드 및 프로세스에 고정된 우선순위를 할당하여 중요한 작업이 선점되지 않도록 한다.

**2. 입력 신호 수집 및 처리 모듈**

* **센서 인터페이스:** 다양한 유형의 센서(예: 온도, 압력, 위치 센서 등)로부터 신호를 수집하는 인터페이스를 구현한다.
* **신호 필터링 및 전처리:** 센서 신호에 포함된 노이즈를 제거하고, 필터링된 데이터를 실시간 제어 루프에 전달한다. 예를 들어, 저역통과 필터를 사용하여 고주파 노이즈를 제거할 수 있다.
* **입력 신호 큐잉:** 실시간 처리에 필요한 입력 신호를 큐(queue)에 저장하고, 이를 효율적으로 관리한다.

**3. 제어 알고리즘 모듈**

* **피드백 제어 알고리즘:** 실시간으로 제어 대상의 상태를 모니터링하고, 적절한 제어 신호를 생성하는 피드백 제어 알고리즘을 구현한다.
* **적응형 제어:** 시스템의 동작 환경 변화에 따라 제어 파라미터를 조정하는 적응형 제어 기법을 적용할 수 있다. 예를 들어, PID 제어기에서 $K\_p$, $K\_i$, $K\_d$ 값을 실시간으로 조정한다.
* **모델 예측 제어(MPC):** 예측 모델을 사용하여 미래의 시스템 상태를 추정하고, 최적의 제어 신호를 미리 계산하여 시스템에 적용하는 방법이다.

**4. 실시간 데이터 로깅 및 모니터링 모듈**

* **로그 데이터 저장:** 실시간으로 발생하는 데이터(예: 입력 신호, 제어 신호, 시스템 상태 등)를 기록하고 저장하는 기능을 구현한다. 이 데이터는 이후 시스템 성능 분석 및 디버깅에 사용된다.
* **실시간 모니터링:** 시스템의 현재 상태를 실시간으로 모니터링하고, 이상 징후가 발생할 경우 이를 즉시 알릴 수 있는 경고 시스템을 포함한다.
* **데이터 스트리밍:** 필요에 따라 외부 모니터링 시스템으로 데이터를 실시간 전송할 수 있는 기능을 제공하여, 원격에서 시스템 상태를 확인할 수 있도록 한다.

#### 요구 사항 검토

시스템의 요구 사항을 검토하는 과정은 프로젝트 성공의 핵심이다. 요구 사항이 명확하지 않거나 실현 가능성이 낮은 경우, 프로젝트의 전체 일정과 품질에 악영향을 미칠 수 있다.

1. **요구 사항의 명확성:**
   * 모든 기능적 및 비기능적 요구 사항이 명확하게 정의되고 이해되었는지 확인한다.
   * 요구 사항이 불명확할 경우, 이해 관계자와 추가 논의를 통해 구체화한다.
2. **기술적 타당성:**
   * 요구 사항이 현재의 기술 수준에서 구현 가능한지 평가한다. 필요한 경우, 기술적 한계에 맞추어 요구 사항을 조정하거나 추가적인 연구 개발을 계획한다.
   * 예를 들어, 실시간 데이터 로깅의 경우, 시스템의 IO 성능과 메모리 사용량을 고려하여 로깅 주기와 데이터 양을 조정해야 할 수 있다.
3. **우선순위 설정:**
   * 각 요구 사항의 우선순위를 정하여, 개발 과정에서 중요한 기능이 먼저 구현되고 테스트될 수 있도록 한다.
   * 우선순위는 시스템의 필수 기능, 성능 요구 사항, 사용자 요구 사항 등을 기준으로 설정한다.
4. **리스크 분석:**
   * 프로젝트 수행 중 발생할 수 있는 리스크를 사전에 식별하고, 이를 관리하기 위한 계획을 수립한다.
   * 예를 들어, 하드웨어 오류나 소프트웨어 버그로 인한 시스템 중단을 방지하기 위해 이중화 설계나 백업 시스템을 고려할 수 있다.
5. **요구 사항 문서화:**
   * 모든 요구 사항을 체계적으로 문서화하여, 개발 팀 내에서 일관된 이해를 공유할 수 있도록 한다.
   * 문서화된 요구 사항은 프로젝트 진행 중에도 참조할 수 있도록 유지 관리한다.
