# 제어시스템 설계 과정 개관

#### 시스템 요구사항 정의

제어시스템 설계는 가장 먼저 시스템의 성능, 안정성, 경제성 등을 포함하는 전반적인 요구사항을 구체화하는 작업부터 시작된다. 예컨대 차량의 속도 제어 시스템을 구상한다고 하면, 도로 환경에서 안전하게 주행할 수 있는 속도 범위, 가속·감속 성능, 주변 물리적 제약(도로 마찰계수, 엔진 출력 한계 등)을 체계적으로 정리해야 한다. 이 과정에서 요구되는 한계치, 예컨대 최대 오버슈트, 정상상태 오차, 상승 시간, 특정 구간의 진동 특성 등도 함께 설정된다. 이를 위해 설계 대상의 물리적·기술적 사양이나 안전성 규제 요건 등이 종합적으로 고려된다.

#### 모델링과 수학적 표현

시스템 요구사항이 어느 정도 확립되면, 제어 대상(플랜트)을 수학적으로 표현하는 모델을 구성한다. 이때 선형 혹은 비선형 특성을 고려할 뿐 아니라, 시간영역·주파수영역 관점에서 체계적으로 분석하기 위한 준비가 이루어진다. 다중입출력(MIMO) 계통이라면 벡터·행렬 형태로 모델을 기술한다.

선형 시불변(LTI) 계통으로 가정할 경우, 상태방정식 형태로 표현하면 다음과 같이 쓸 수 있다.

$$
\mathbf{x}\_{k+1} = A \mathbf{x}\_k + B \mathbf{u}\_k
$$

이때 $\mathbf{x}\_k$는 상태벡터, $\mathbf{u}\_k$는 입력벡터다. 연속시간 영역에서 흔히 쓰이는 형태는 다음과 같이 표현할 수 있다.

$$
\dot{\mathbf{x}}(t) = A \mathbf{x}(t) + B \mathbf{u}(t)
$$

출력벡터 $\mathbf{y}(t)$ 또한 다음과 같은 관계식으로 나타낸다.

$$
\mathbf{y}(t) = C \mathbf{x}(t) + D \mathbf{u}(t)
$$

제어 이론에서 모델링은 가장 핵심적인 단계로, 이후 해석과 설계의 적절성에 큰 영향을 미친다. 따라서 물리법칙, 에너지 보존, 동역학적 측정치 등을 종합적으로 검토하여 모델의 근사 정도, 선형화 조건, 파라미터 추정 범위 등을 명확히 설정하는 것이 중요하다.

#### 시스템 해석

모델이 확보된 뒤에는 시간응답 혹은 주파수응답 측면에서 다양한 해석이 이루어진다. 예를 들어 고전적 제어 이론에서는 전이함수(transfer function)를 통해 극(pole)과 영점(zero)의 배치, 안정영역, 전달함수의 감도(sensitivity) 등을 조사한다. 현대 제어 이론에서는 상태방정식을 기반으로 고유치 분포, 상태 가용성, 가제어성(controllability), 가관측성(observability) 등을 분석한다.

시간응답 해석을 위해 초기치 문제를 설정하고 응답을 계산하거나, 주파수응답 해석을 위해 보데 선도나 나이퀴스트 선도 등을 이용해 시스템의 위상여유(phase margin), 이득여유(gain margin), 공진특성 등을 확인한다. 설계 목표(정착 오차, 오버슈트, 도달 시간 등)와 해석 결과를 비교하여, 현재 시스템으로는 어느 정도의 성능을 기대할 수 있는지가 평가된다.

#### 제어기 설계와 구조 결정

기본 해석이 끝나면 실제로 목표 성능을 달성하기 위한 제어기를 설계한다. 고전적 제어 이론을 적용하는 경우에는 보상기(compensator) 또는 PID 제어기 등을 고려하고, 현대 제어 이론을 적용한다면 상태피드백, 관측기(observer) 설계, 최적제어, H∞ 제어, 루프쉐이핑(loop shaping) 기법 등을 검토한다.

구체적으로 고전 제어에서는 루트 궤적(root locus) 기법이나 보데 선도 보상 설계를 통해 극·영점의 재배치를 시도한다. 예를 들어 PID 제어기를 설계한다고 하면, 비례(P), 적분(I), 미분(D) 이득 계수를 조정하여 폐루프 극의 위치를 원하는 곳으로 이동시키고, 그 결과로 응답특성이 요구사항에 부합하도록 만든다. 이는 다음 형태의 제어 입력으로 표현할 수 있다.

$$
u(t) = K\_p e(t) + K\_i \int e(\tau) d\tau + K\_d \frac{d}{dt} e(t)
$$

여기서 $e(t)$는 기준 신호와 실제 출력 사이의 오차이다. 현대 제어 이론 관점에서는 상태벡터 $\mathbf{x}(t)$를 이용해 $\mathbf{u}(t) = -K \mathbf{x}(t)$와 같은 방식으로 피드백을 구성한다. 이때 이득행렬 $K$를 어떻게 결정하느냐에 따라 극 배치(pole placement)나 최적제어 성능이 달라진다.

#### 구조적 흐름 예시

아래 다이어그램은 제어시스템 설계 과정의 대표적 흐름을 단순화하여 보여준다.

{% @mermaid/diagram content="flowchart LR
A\[시스템 요구사항 정의] --> B\[모델링]
B --> C\[시스템 해석]
C --> D\[제어기 설계]
D --> E\[시뮬레이션 및 검증]
E --> F\[구현 및 실험]" %}

이 과정은 상호 피드백 구조를 가지므로, 구현 도중에 모델이나 제어기를 다시 수정할 수도 있다. 특히 실제 하드웨어에서 측정된 응답과 기대했던 이론적 응답이 상이한 경우, 앞선 모델링 단계로 다시 돌아가 파라미터를 재추정하거나 설계 목표치를 재조정한다.

#### 시뮬레이션 및 검증

구상된 제어 알고리즘이나 보상 기법이 실제 시스템에서 의도대로 동작하는지를 미리 가상 환경에서 검증하기 위해, 시뮬레이션 과정을 거친다. 이때 모델링 단계에서 수립한 동적방정식(상태방정식 등)을 기반으로, 다양한 입력·외란 조건을 시나리오로 설정하여 시뮬레이션을 수행한다. 이를 통해 제어 파라미터가 적절한지, 목표 성능(전달함수 특성, 상태궤적 제한, 출력 오버슈트 등)에 부합하는지를 사전에 점검하게 된다.

예를 들어 주파수영역에서의 설계라면 보데 선도 상에서 요구되는 이득여유, 위상여유 등과 같은 주요 수치를 제어기가 만족하는지 확인하고, 시뮬레이션 도중 알려지지 않은 외란이나 모델링 오차를 추가하여 시스템의 견고성(robustness)을 평가한다. 만약 시스템이 마진을 확보하지 못하거나, 성능 한계를 초과하는 응답을 보일 경우, 이전 단계로 돌아가 제어기 매개변수를 수정하거나 보상 구조를 재검토해야 한다.

비선형 제어, 적응(adaptive) 제어, 퍼지(fuzzy) 제어, 신경망(neural network) 제어 등 다양한 기법을 적용하는 경우에는 더욱 세밀한 시뮬레이션이 요구된다. 이때 모델은 단순화 수준이 낮아지고, 연산 시간 및 자원이 크게 증가할 수 있어 효율적인 시뮬레이션 환경을 갖추는 것 또한 중요하다.

#### 구현 및 실험

시뮬레이션을 통해 어느 정도 설계가 확정되면, 실제 제어 대상에 제어기를 적용하기 위한 하드웨어·소프트웨어 구현 단계로 넘어간다. 여기에는 다음과 같은 세부 작업들이 포함된다.

센서·액추에이터 선택과 설치. 측정 노이즈나 환경적 제약이 있을 수 있으므로, 센서의 범위·해상도·응답 시간을 정확히 설정해준다. 액추에이터는 제어기 설계에서 가정한 입력 범위와 동역학 특성(지연 시간, 부하 토크 등)을 충분히 만족해야 한다. 센서가 계측한 데이터를 수집해 제어기로 전달하고, 제어기가 산출한 명령신호를 액추에이터로 전송하기 위한 A/D, D/A 변환 장치와 통신 프로토콜 설정이 이루어진다.

실시간 운용을 위해 RTOS(Real-Time Operating System) 또는 고성능 프로세서를 사용하는 사례가 흔하다. 특정 산업용 필드버스나 FPGA, DSP를 사용하는 경우도 있다. 이러한 구조에서 루프 주기(loop period)나 연산 지연(latency), 파형 발생 시의 트리거 조건 등이 설계에서 의도한 대로 맞춰지는지 꼼꼼히 점검한다.

구현 이후에는 다양한 실험 시나리오를 통해 의도한 설계 사양이 제대로 충족되는지 실제 응답 데이터를 수집한다. 가령 폐루프 상태에서 안정성이 보장되는지, 과도 응답 시 일부 구간에서 포화(saturation)가 발생하지 않는지, 외란에 대한 거동이 시뮬레이션과 유사한지를 면밀히 검토한다. 예측과 달리 큰 오차가 발견되면, 다시 모델링 단계를 재평가해야 하거나, 제어 알고리즘 보상 기법을 수정해야 할 수도 있다.

#### 추적 제어와 강인 설계

설계 대상 시스템이 특정 궤적(trajectory)을 따라가야 하는 추적 제어 문제라면, 레퍼런스 신호(reference input)가 변화할 때마다 최소 오차와 신속응답을 달성하도록 제어기를 구성한다. 이에 대한 전형적 예시로는 로봇 매니퓰레이터의 궤적 제어, 항공기 자세 제어, 자율주행 차량의 차선 유지가 있다. 이 경우 시스템의 외란, 파라미터 변동, 비선형성이 전반적인 응답에 큰 영향을 주기 때문에, 설계 단계부터 강인 제어(robust control) 기법이나 적응 제어 기법을 적용하여 시스템이 예상치 못한 상황에서도 성능을 유지할 수 있도록 준비한다.

강인 제어 설계의 예로, H∞ 제어나 μ-합성(μ-synthesis) 기법 등을 들 수 있다. H∞ 제어에서는 주파수영역에서 시스템이 가져야 하는 민감도(Sensitivity)나 보완감도(Complementary Sensitivity)에 대한 성능 지표를 최소화하는 형태의 최적화 문제를 풀어 설계를 진행한다. 이때 시스템 모델뿐만 아니라 모델 불확실성의 범위를 명시적으로 설정하고, 해당 불확실성 내에서 안정성과 성능을 동시에 만족하는 피드백 게인을 도출한다.

현대 제어 이론에서 가장 간단한 강인 설계 예시는 극 배치(pole placement) 방식으로, 시스템 행렬 $A$, 입력행렬 $B$가 불확실성을 가진다고 가정했을 때, 특정 폐루프 극을 원하는 위치에 배치하도록 $K$를 설계하는 방법을 모색하는 것이다. 다만 실제 엔지니어링 관점에서는, 불확실성이 매우 크거나 비선형 항이 복잡할 때 고전적 극 배치만으로는 적절한 성능을 달성하기가 어렵다. 그럴 경우에는 이론적으로 보다 정교한 접근이 필요하고, 실험적 튜닝을 병행하여 성능을 보완한다.

#### 적응 제어와 지능형 제어

설계 대상이 시간에 따라 동적으로 변하거나, 파라미터가 외부 환경에 의해 크게 변동되는 상황에서는 적응 제어(adaptive control) 기법을 적용하여 제어기의 파라미터를 실시간으로 조정할 수 있다. 예를 들어 플랜트가 다음과 같은 상태방정식을 가진다고 하자.

$$
\dot{\mathbf{x}}(t) = A(\theta) \mathbf{x}(t) + B(\theta) \mathbf{u}(t)
$$

여기서 $\theta$는 플랜트 파라미터(예: 질량, 관성 모멘트, 마찰 계수 등)를 나타낸다고 할 때, 시간에 따라 $\theta(t)$가 변화할 수 있다. 이를 고전적 제어로 설계하면, 특정 $\theta$값을 기준으로만 최적화되기 때문에 실제 운전 조건이 바뀌면 설계 성능을 제대로 달성하지 못할 수 있다. 적응 제어기에서는 $\theta(t)$ 추정값을 갱신하거나, 제어 이득 행렬을 실시간으로 튜닝하여 동적으로 변화하는 플랜트에 대응한다.

대표적인 방법으로는 MIT 규칙, 모델 추종 제어(Model Reference Adaptive Control), 자기 튜닝 조절기(Self-Tuning Regulator) 등이 있다. 이들 기법은 설계자가 설정한 적응 규칙(adaptation rule)을 통해 $\theta$나 제어 이득을 갱신한다. 예를 들어 모델 추종 제어에서는 기준모델(reference model) $\dot{\mathbf{x}}\_m(t) = A\_m \mathbf{x}\_m(t) + B\_m r(t)$을 설정해두고, 실제 시스템의 $\mathbf{x}(t)$가 $\mathbf{x}\_m(t)$에 근접하도록 제어기를 실시간으로 조정한다.

지능형 제어는 이러한 적응 메커니즘을 보다 확장하여, 퍼지(Fuzzy) 규칙 기반 제어나 인공신경망(ANN), 딥러닝을 활용하는 사례를 가리킨다. 퍼지 제어의 경우 시스템의 비선형성이나 불확실성을 언어적 규칙(if-then)을 통해 정리한다. 예컨대 "속도가 느리면 가속 페달을 더 밟아라"와 같은 소박한 규칙을 퍼지 집합으로 표현하고, 각 규칙별로 퍼지 추론(fuzzy inference)을 거쳐 제어입력을 결정한다. 인공신경망 기법에서는 복잡한 비선형 관계를 뉴럴 네트워크로 근사화하여 입력 $\mathbf{x}(t)$와 출력 $\mathbf{u}(t)$ 사이의 함수적 매핑을 학습한다. 이는 시스템 모델이 명확하지 않거나, 차원이 매우 높아 해석적으로 제어법칙을 도출하기 어려울 때 유리하다.

#### 디지털 제어와 샘플링 이론

실제 공정 또는 임베디드 시스템에서의 제어는 마이크로프로세서, DSP, FPGA 등의 디지털 장치로 구현된다. 따라서 이산시간 제어(discrete-time control) 또는 샘플드데이터(sampled-data) 관점이 필요하다. 일반적인 디지털 제어 구조에서, 센서 측정값은 일정한 샘플링 주기 $T\_s$로 획득되어 A/D 변환을 거친다. 디지털 제어기는 이 값을 기반으로 제어 알고리즘을 계산하여, 명령신호를 D/A 변환 후 액추에이터로 전달한다.

샘플링된 신호는 연속시간 도메인에서 주파수 성분이 $f\_s/2$를 초과하지 않도록(나이퀴스트 샘플링 정리) 충분히 빠른 샘플링을 해야 한다. 그러나 공학적으로는 샘플링 주기를 지나치게 짧게 잡으면 프로세싱 부담이 커지므로, 시스템 동특성과 처리 비용 사이에서 균형점을 찾는다. 디지털 제어 이론에서는 Z-변환을 활용하여 다음과 같은 전이함수를 정의한다.

$$
G(z) = \mathcal{Z}{ g(kT\_s) }
$$

샘플링 오차, 지연 시간, 영 디스플레이스먼트(zero-order hold) 등의 요소를 모델에 반영하여, 폐루프 극(pole)을 $z$-영역 상에서 원하는 위치에 재배치하거나, PID 제어를 디지털 형태로 구현할 때의 차분 방정식을 분석한다. 또한 실제 구현에서는 한정된 정밀도(고정소수점 연산, 양자화 오차 등)와 입력 포화(saturation) 문제도 고려해야 한다. 이러한 세부 사항이 무시되면 설계치와 달리 오차가 누적되거나, 불필요한 진동(채터링)이 발생하여 제어 성능이 저하될 수 있다.

#### 제약 조건과 안티 윈드업(anti-windup)

현실적인 제어 문제에서는 입력이 제한(saturation)되거나, 상태값이 물리적으로 특정 범위를 벗어나면 안전 위험이 발생하는 등의 제약(constraints)이 존재한다. 특히 액추에이터가 가진 최대 토크나 구동 전압, 시스템 운전 조건 등이 대표적 예다. 이를 설계에 반영하지 않으면, 실제 운전 시 제어기에서 계산한 입력이 물리적으로 구현 불가능해 제어 성능이 크게 훼손될 수 있다.

입력 포화로 인한 대표적 문제 중 하나는 적분기의 누적오차가 계속 커지는 현상, 곧 ‘윈드업(windup)’이다. 이를 방지하기 위해 적분 제어부를 제약 범위 안으로 강제로 제한하거나, 포화 상태에 진입하는 순간 적분 성분을 다시 초기화(reset)하는 ‘안티 윈드업’ 기법을 쓴다. 예시로 PID 제어 구조에 안티 윈드업을 적용하면, 다음과 같은 수정된 형태를 쓸 수 있다.

$$
u(t) = \mathrm{sat}\Big(K\_p e(t) + K\_i \xi(t) + K\_d \frac{d}{dt} e(t)\Big)
$$

여기서 $\mathrm{sat}(\cdot)$ 함수는 포화 구간 내로 출력을 제한한다. 적분 항 $\xi(t)$ 또한 출력이 포화 상태이면 적분을 중지하거나, 별도의 보상기를 통해 보정한다. 이 방법은 실제 산업 계통이나 로봇 제어기 설계에서 필수적이며, 포화 구간에서의 과도 응답을 안정적으로 처리한다.

#### 모델 예측 제어(MPC)

최근 제어 이론에서 중요하게 활용되는 기법 중 하나가 모델 예측 제어(Model Predictive Control, MPC)다. 이는 시스템 모델을 이용해 미래 시간 구간까지의 동작을 예측하고, 그 예측 정보를 바탕으로 현재 입력을 최적화한다. 예컨대 시점 $k$에서 미래 예측 구간 $N$을 설정한 뒤, 비용함수

$$
J = \sum\_{i=0}^{N-1} \Big| \mathbf{y}*{k+i} - \mathbf{r}*{k+i} \Big|^2 + \alpha \Big| \mathbf{u}\_{k+i} \Big|^2
$$

를 최소화하도록 $\mathbf{u}*{k}, \mathbf{u}*{k+1}, \ldots, \mathbf{u}*{k+N-1}$를 결정한다. 여기서 $\mathbf{y}*{k+i}$는 예측된 출력, $\mathbf{r}\_{k+i}$는 목표값(레퍼런스), $\alpha$는 제어 입력을 억제하는 가중치다. 실제 구현에서는 가용한 입력 범위를 제한하는 등의 선형·비선형 제약식도 함께 고려하게 된다.

이 최적화 문제를 시점 $k$마다 반복적으로 풀어서, 예측 구간 전체 입력 시퀀스 중 첫 번째 입력값(또는 소수 개의 입력값)만을 실제 시스템에 적용한 뒤, 다음 시점에서 다시 문제를 재구성·해결한다. 이를 ‘이동획득구간(Moving Horizon) 기법’이라고 부르며, 시스템이 외란을 받거나 모델이 다소 부정확하더라도 실시간으로 재계산하여 대응할 수 있다는 이점이 있다. 그러나 최적화 연산이 복잡하고, 빠른 연산을 보장해줄 하드웨어와 알고리즘이 필요하므로 상대적으로 비용이 높다. 산업 공정(정제, 화학 플랜트 등)이나 자율주행 차량, 로보틱스 등에서 다양하게 활용되고 있다.

#### 관측기 설계와 상태 추정

실제 제어기 구현 과정에서는 모든 상태를 직접 계측할 수 없는 경우가 많다. 예컨대 로봇 조인트 제어에서 조인트각도는 센서를 통해 측정 가능하더라도, 조인트각속도나 토크 등의 모든 상태변수를 센서로 읽어내기는 어려울 수 있다. 이럴 때 상태방정식을 이용해 관측기를(observer) 설계하여, 미측정 상태값을 추정하고 이를 제어루프에 활용한다.

선형 시불변 시스템에서 흔히 사용하는 관측기로는 루엔버거(Luenberger) 관측기가 있다. 이는 다음과 같이 표현된다.

$$
\dot{\hat{\mathbf{x}}}(t) = A \hat{\mathbf{x}}(t) + B \mathbf{u}(t) + L\Big(\mathbf{y}(t) - C \hat{\mathbf{x}}(t)\Big)
$$

여기서 $\hat{\mathbf{x}}(t)$는 추정 상태벡터, $L$은 관측 이득(observer gain) 행렬이다. 폐루프 극 배치(pole placement)를 통해 관측오차 방정식 $\dot{\tilde{\mathbf{x}}} = (A - LC)\tilde{\mathbf{x}}$가 원하는 감쇠 특성을 갖도록 설계한다. 이를 통해 실제 상태값 $\mathbf{x}(t)$를 측정하지 않고도, 관측기 출력 $\hat{\mathbf{x}}(t)$를 상태피드백 제어에 활용할 수 있다.

상태방정식에서 잡음이나 불확실성이 있을 경우, 상태추정의 정확도에 한계가 생긴다. 센서 측정 노이즈와 시스템 노이즈이 공존하는 환경이라면 확률적 관측 이론을 적용할 수 있다. 대표적으로 칼만 필터(Kalman Filter)가 널리 쓰인다. 이는 잡음이 가우시안 분포를 따른다고 가정했을 때, 상태추정에 대해 최소 분산을 보장하는 필터를 구하는 방법이다.

연속시간 칼만 필터는 시스템이 다음과 같이 잡음 항을 포함한다고 할 때

$$
\dot{\mathbf{x}}(t) = A \mathbf{x}(t) + B \mathbf{u}(t) + \mathbf{w}(t), \quad \mathbf{y}(t) = C \mathbf{x}(t) + \mathbf{v}(t),
$$

$\mathbf{w}(t)$, $\mathbf{v}(t)$가 각각 공분산 행렬 $Q$, $R$를 갖는 백색잡음(white noise)라고 가정한다. 이때 칼만 필터의 추정식은 다음 꼴로 주어진다.

$$
\dot{\hat{\mathbf{x}}}(t) = A \hat{\mathbf{x}}(t) + B \mathbf{u}(t) + K(t)\Big(\mathbf{y}(t) - C \hat{\mathbf{x}}(t)\Big)
$$

여기서 필터 이득 $K(t)$는 리커시브하게 결정되며, 필터 오차 공분산 행렬 $P(t)$에 대한 미분방정식을 다음과 같이 푼다.

$$
\dot{P}(t) = A P(t) + P(t) A^\top + Q - P(t) C^\top R^{-1} C P(t)
$$

그 결과, $K(t) = P(t) C^\top R^{-1}$로 얻어진다. 이는 시스템 모델과 측정 불확실성(잡음 공분산) 정보가 주어졌을 때, 매 시점에서 추정 상태값이 통계적으로 가장 그럴듯한 방향으로 보정됨을 의미한다. 상태 추정 과정에서 칼만 필터를 이용하면 잡음 환경에서도 안정적이고 정확한 상태 정보를 확보할 수 있어, 이후 제어기 설계를 더욱 견고하게 해준다.

#### 최적 제어

최적 제어는 특정 성능지표(비용함수)를 최소화하는 제어입력을 찾아내는 방법론을 다룬다. 여러 기법이 있으나, 선형 2차 비용함수 형태를 다루는 경우가 가장 대표적이고, 이를 선형 2차 조절 문제(LQ, Linear-Quadratic)라 한다. 예컨대 연속시간 LQ 제어에서 목표는 다음 비용함수를 최소화하는 것이다.

$$
J = \int\_{0}^{\infty} \Big(\mathbf{x}(t)^\top Q \mathbf{x}(t) + \mathbf{u}(t)^\top R \mathbf{u}(t)\Big) , dt
$$

여기서 $Q$와 $R$은 양의 준정(definite) 행렬이며, $R$은 입력 비용을 억제하는 역할을 한다. 이 문제는 해밀턴-자코비-벨만 방정식(HJB 방정식) 관점이나, 리카티 미분방정식(Ricatti equation)을 통해 풀 수 있다. 연속시간 선형 시스템

$$
\dot{\mathbf{x}}(t) = A \mathbf{x}(t) + B \mathbf{u}(t)
$$

에서 위 비용함수를 최소화하는 제어입력은

$$
\mathbf{u}^\*(t) = -R^{-1} B^\top P \mathbf{x}(t)
$$

로 주어지며, $P$는 해가 존재한다면 리카티 방정식

$$
A^\top P + P A - P B R^{-1} B^\top P + Q = 0
$$

를 만족한다. 이를 LQR(Linear-Quadratic Regulator)이라고 부른다. 상태의 전부를 관측할 수 없을 때는 관측기를 통해 추정된 상태를 기반으로 LQ 제어를 적용한다. 이것을 LQG(Linear-Quadratic Gaussian) 제어라고 하며, 한쪽은 최적 상태추정(칼만 필터), 다른 한쪽은 LQ 제어가 결합된 형태다.

비선형 계통에 대해서는 LQ 기법으로 단순화가 어려울 수 있으나, 특정 작동점 근방에서 선형화함으로써 근사적으로 적용하거나, 미분 게임이나 PMP(Pontryagin's Minimum Principle) 등을 이용해 확장된 최적 제어 전략을 세운다.

#### 슬라이딩 모드 제어와 비선형 제어

비선형 계통 또는 불확실성이 큰 계통에서, 빠르고 강인한 응답을 얻기 위해 슬라이딩 모드 제어(Sliding Mode Control)를 적용하기도 한다. 여기서는 슬라이딩 곡면(sliding surface)을 정의해, 시스템 상태가 그 곡면 위로 강제로 움직이도록 입력을 구성한다. 예컨대 1차원 오차 변수 $s(t)$를 정의하고, $s(t) = 0$인 곡면을 유지하는 제어 입력을 준다.

슬라이딩 모드 제어의 핵심은 “스위칭” 동작을 통해 상태가 슬라이딩 곡면에 붙어 있게 만드는 것이다. 가장 단순한 형태의 스위칭 제어는 부호함수를 이용하는데, 예를 들어

$$
u(t) = -K ,\mathrm{sgn}\big(s(t)\big)
$$

와 같이 구현한다. $\mathrm{sgn}(\cdot)$은 부호함수(signum function)다. 이 방식은 설계가 간단하고 강인 특성이 우수하지만, 실제 구현에서는 높은 스위칭 주파수로 인해 채터링(chattering)이 발생하고, 물리적 액추에이터가 이를 처리하기 어려운 문제가 있다. 이를 완화하기 위해 여러 변형기법(경사함수, 스무딩, 적응 게인 등)을 적용한다.

보다 일반적인 비선형 제어 이론에서는 리야푸노프 안정도(Lyapunov stability) 이론, 피드백 선형화(Feedback linearization), 백스테핑(Backstepping), 게인 스케줄링(Gain scheduling) 등을 활용한다. 피드백 선형화 기법은 시스템의 비선형성 일부를 제어 입력으로 상쇄하여, 결과적으로 선형 동역학으로 만드는 시도를 한다. 이때 시스템이 삼각 구조나 조건부 가역성을 가져야만 적용이 가능하므로, 플랜트의 비선형 구조를 면밀히 분석해야 한다.

게인 스케줄링은 작동점(operating point)에 따라 서로 다른 선형 제어기(또는 파라미터)를 구성해 두고, 실시간으로 작동점에 맞게 제어 파라미터를 전환하는 기법이다. 예컨대 항공기의 고도, 속도, 받음각(angle of attack) 등의 조합에 따라 선형화된 모델이 달라질 경우, 각 모델별로 LQR 게인이나 PID 계수를 미리 구해놓고, 실제 운용 시 이에 맞춰 스케줄링하는 식이다.

#### 실시간 구현과 하드웨어 인 더 루프(HIL) 시뮬레이션

시뮬레이션 검증을 마친 뒤 제어 알고리즘을 실제 시스템에 적용하기 위해서는, 마이크로컨트롤러나 DSP, FPGA, 산업용 컴퓨터 등과 같은 실시간 플랫폼 상에 코드를 작성·배포하고, 센서·액추에이터 등 물리적 입출력부를 연결해야 한다. 이때 스펙에 맞는 컴퓨팅 자원(RAM 용량, CPU 클럭, I/O 인터페이스)을 확보하는 것이 중요하다. 실제로 동작해야 하는 제어주기(제어 사이클, cycle time)는 시스템 동특성과 안전성 요구사항을 충족할 수 있을 만큼 짧아야 하며, 프로세서가 제어 오버헤드를 감당할 수 있도록 최적화된 알고리즘 구현이 필요하다.

물리적 하드웨어와 연결하기 전, 혹은 초기 프로토타이핑 단계에서 하드웨어 인 더 루프(Hardware-In-the-Loop, HIL) 시뮬레이션을 많이 활용한다. 이는 제어 대상(플랜트) 부분은 가상 모델로 돌리되, 제어기 하드웨어(또는 센서·액추에이터를 포함한 일부 주변장치)는 실제 장치를 사용하여 구성하는 방식이다. 예를 들어 엔진 제어 유닛(ECU)을 설계할 때, 엔진 자체는 시뮬레이터(동역학 모델)로 대체하고 ECU 하드웨어는 실제 제품을 사용한다. 이로써 실물 엔진 없이도 소프트웨어 논리와 하드웨어 입출력 과정을 검증할 수 있으므로, 위험도와 개발 비용을 줄이고 개발 속도를 높일 수 있다.

하드웨어 인 더 루프 환경에서 중요한 점은 시뮬레이터가 매우 빠르게 동작해야 한다는 것이다. 실제 엔진이나 모터가 초당 1,000번 이상의 제어 사이클로 반응하는 상황이라면, 시뮬레이션 역시 그 정도 주기로 실제와 같은 동특성을 모사해야 한다. 이를 위해 전용 HIL 장비나 고성능 FPGA, RTOS 기반의 빠른 연산 환경이 준비된다. 하드웨어에서의 타이밍 지연, 양자화 노이즈, 센서/액추에이터 비선형성 등 실제적인 요소를 최대한 시뮬레이터에 반영하여, 결과 신뢰도를 높이려는 노력이 함께 이뤄진다.

#### 소프트웨어 인 더 루프(SIL)와 모델 기반 설계

하드웨어 인 더 루프 이전 단계로, 소프트웨어 인 더 루프(Software-In-the-Loop, SIL) 시뮬레이션을 수행하기도 한다. 이는 제어 알고리즘을 실제 마이크로컨트롤러에서 동작하는 형태의 C/C++ 코드로 변환한 뒤, 이 코드를 호스트 PC나 가상 환경에서 동작시키며 플랜트 모델과 연계하는 방식이다. 즉, 제어 대상은 가상 모델이고, 제어기 역시 이론적인 블록 다이어그램이 아니라 실제로 컴파일된 C/C++ 실행 파일 형태로 돌아간다. 이를 통해 실제 임베디드 코드의 로직 오류, 변수 범위, 실행 속도 등을 사전 점검할 수 있다.

모델 기반 설계(Model-Based Design) 접근에서는 먼저 물리계를 수학적 모델로 정확히 표현하고, 블록 다이어그램이나 상태기반 시뮬레이션 툴(Simulink, LabVIEW, MapleSim 등)을 활용해 제어 로직을 그래픽적으로 구성한 뒤 자동 코드 생성(Auto Code Generation) 기능을 통해 C/C++ 코드로 변환하는 흐름이 일반적이다. 이 코드는 곧바로 SIL 시뮬레이션에서 테스트되며, 이후 HIL 시뮬레이션, 궁극적으로는 실제 하드웨어 적용으로 이어진다. 이를 통해 설계 변경이 발생할 때마다 모델을 수정하고, 다시 자동 코드 생성을 수행하여, 휴먼 에러를 줄이고 개발 효율을 높일 수 있다.

#### 예제: 이산시간 상태공간 시뮬레이션 (C++ 구현)

다음은 이산시간 상태공간 모형을 간단히 시뮬레이션하는 C++ 코드 예시다. 상태공간 형태는

$$
\begin{aligned}
\mathbf{x}*{k+1} = A \mathbf{x}*{k} + B \mathbf{u}*{k}
\ \mathbf{y}*{k} = C \mathbf{x}*{k} + D \mathbf{u}*{k}
\end{aligned}
$$

라고 하고, 이를 일정 스텝 동안 시뮬레이션하여 출력을 확인하는 코드 사례다. 실제 산업 응용에서는 더 복잡한 로직과 잡음, 포화 등을 고려해야 하지만, 본 예시는 구조를 보이기 위한 간단한 형태다.

```cpp
#include <iostream>
#include <vector>

int main() {
    // 시스템 차원 정의
    const int n = 2; // 상태벡터 크기
    const int m = 1; // 입력벡터 크기
    const int p = 1; // 출력벡터 크기

    // 상태공간 행렬 A, B, C, D를 2x2, 2x1, 1x2, 1x1 예제로 가정
    std::vector<double> A = {1.0, 0.01,
                             0.0, 1.0};
    std::vector<double> B = {0.0, 0.01};
    std::vector<double> C = {1.0, 0.0};
    std::vector<double> D = {0.0};

    // 초기 상태, 입력 설정
    std::vector<double> x(n, 0.0);
    x[0] = 0.5; // 예: 초기 위치 0.5
    x[1] = 0.0; // 예: 초기 속도 0
    std::vector<double> u(m, 0.0);

    // 시뮬레이션 파라미터
    const int simSteps = 100;
    for(int k = 0; k < simSteps; ++k) {
        // 출력 계산 y_k = C * x_k + D * u_k
        double y = C[0]*x[0] + C[1]*x[1] + D[0]*u[0];

        // 여기서는 간단히 일정입력으로 설정. 예: u(t)=1.0
        u[0] = 1.0;

        // 차기 상태 x_{k+1} = A * x_k + B * u_k
        std::vector<double> x_next(n, 0.0);
        x_next[0] = A[0]*x[0] + A[1]*x[1] + B[0]*u[0];
        x_next[1] = A[2]*x[0] + A[3]*x[1] + B[1]*u[0];
        
        // 현재 상태를 갱신
        x = x_next;

        // 결과 출력
        std::cout << "k=" << k 
                  << ", x=[" << x[0] << "," << x[1] << "]"
                  << ", y=" << y
                  << ", u=" << u[0] << std::endl;
    }

    return 0;
}
```

예제를 확장하여 PID 제어 로직이나 관측기, 내부모델제어(IMC) 등을 추가할 수 있으며, 실제 하드웨어 통신부와 연동하기 위해서는 직렬포트, CAN, EtherCAT 등의 인터페이스 코드를 작성해야 한다. 산업 현장에서는 실시간 커널을 갖춘 운영체제(RTOS) 환경에서 위와 같은 코드를 태스크(task) 단위로 배치해, 주기적으로 상태 업데이트와 제어 출력 계산을 수행하게 한다.

#### 프로토타이핑과 튜닝 전략

실무에서 제어시스템 프로토타이핑을 할 때, 먼저 설계자가 사전에 설정한 이론적 파라미터(PID 이득, LQR 게인 등)를 기반으로 초기 시동을 건다. 그리고 실제 운전 상황에서 회귀 분석, 주파수응답 식별, 실험적 오차 기반 조정 등을 통해 튜닝을 거듭한다. 예컨대 PID 제어의 경우, 출발점으로 지연 추정법(Ziegler-Nichols)이나 크루스-비엘(Kruse-Butler) 기법 등을 적용하고, 안정적으로 구동한 뒤 세부 오버슈트나 진동 특성에 따라 오프라인 또는 온라인 튜닝을 반복한다.

적응 제어나 강인 제어를 구현하는 경우, 많은 파라미터(적응 이득, 모델 불확실성 범위 등)를 설정해야 하므로, 실험적 검증과 튜닝이 더욱 중요해진다. HIL 시뮬레이션에서 어느 정도 가능성을 확인하더라도, 실제 물리 현장에서는 온도·진동·습기·마모·센서 드리프트 등이 모델 오차를 야기하기 때문에, 반복적인 실험과 데이터 분석이 필연적으로 뒤따른다. 이 과정에서 상태·출력 로그(logging)를 체계적으로 수집하고, 데이터 마이닝 혹은 머신러닝 기법으로 오차 패턴이나 노이즈 특성을 파악하여 설계 모델을 재보정하기도 한다.

#### 재설계와 유지보수

최종적으로 시스템이 상용 운전 상태에 들어갔더라도, 제어기가 가진 성능을 꾸준히 모니터링하고 필요 시 재설계·업데이트를 진행한다. 생산 공정이나 기계 장치의 운전 조건이 달라질 때마다(부하가 변하거나 프로세스 장비가 교체되는 등) 기존 제어기의 파라미터가 유효하지 않을 수 있다. 따라서 유지보수 단계에서 시스템 식별 혹은 파라미터 재추정, 보상기 재설계가 주기적으로 이뤄진다. 이는 최근에 보편화된 IoT(사물인터넷) 기반 진단 시스템, 클라우드 기반 로그 분석 플랫폼과 결합되어, 예지정비(predictive maintenance)나 온라인 튜닝을 가능하게 한다.

이처럼 제어시스템 설계는 요구사항 정의부터 모델링, 해석, 제어기 설계, 시뮬레이션, HIL/SIL, 실제 구현과 튜닝, 유지보수에 이르기까지 하나의 순환 고리를 이루며 진행된다. 그리고 각 단계는 상호 의존적이어서, 현장 데이터나 운영 조건 변화에 따라 다시 앞선 단계를 재평가·수정하는 작업이 일상적으로 일어난다. 이 전체 과정의 완성도가 높아질수록, 제어시스템이 목표 성능과 안정성을 충족하면서도 비용·에너지를 절감하는 방향으로 발전하게 된다.
