수조 수위 제어를 위한 PID 시뮬레이션
1. 제어 이론 및 모델링
PID 제어기는 오차 신호를 기반으로 비례(Proportional), 적분(Integral), 미분(Derivative) 연산을 수행하여 제어 입력을 생성하는 폐루프 제어 방식입니다. 비례 항은 현재 오차에 즉각적으로 반응하여 시스템의 응답 속도를 높이고, 적분 항은 시간에 따른 오차를 누적하여 정상 상태 오차(Steady-state error)를 제거합니다. 미분 항은 오차의 변화율을 예측하여 과도한 오버슈트(Overshoot)를 억제하고 시스템의 안정성을 향상시킵니다.
Simulink 환경에서는 수조를 단순한 유량 적분 모델로 가정할 수 있습니다. 유입수 흐름을 입력으로, 수위를 출력으로 설정한 후, PID Controller 블록을 사용하여 목표 수위와 실제 수위의 편차를 최소화하는 피드백 루프를 구성합니다.
2. MATLAB 스크립트 구현
다음은 Simulink의 연속 시간 모델을 이산화하여 MATLAB 스크립트로 구현한 수조 수위 PID 제어 코드입니다.
% PID 제어기 이득 설정
propGain = 1.2;
intGain = 0.15;
derGain = 0.02;
% 시뮬레이션 파라미터
dt = 0.01;
simTime = 0:dt:10;
targetLevel = 5.0 * ones(size(simTime));
currentLevel = zeros(size(simTime));
% 제어기 상태 변수 초기화
errSignal = zeros(size(simTime));
intTerm = 0;
prevErr = 0;
for k = 2:length(simTime)
% 현재 스텝의 오차 계산
errSignal(k) = targetLevel(k) - currentLevel(k-1);
% 적분 및 미분 항 업데이트
intTerm = intTerm + errSignal(k) * dt;
derTerm = (errSignal(k) - prevErr) / dt;
% 제어 입력(유입수 조절 신호) 생성
controlInput = propGain * errSignal(k) + intGain * intTerm + derGain * derTerm;
% 수조 동역학 모델 (단순 1차 적분 시스템 가정)
currentLevel(k) = currentLevel(k-1) + controlInput * dt;
% 이전 오차 저장
prevErr = errSignal(k);
end
% 결과 시각화
figure;
plot(simTime, targetLevel, 'r--', 'LineWidth', 2); hold on;
plot(simTime, currentLevel, 'b-', 'LineWidth', 2);
legend('목표 수위', '실제 수위');
xlabel('시간 (초)');
ylabel('수위 (m)');
title('수조 수위 PID 제어 시뮬레이션 결과');
3. 결과 분석 및 보고서 핵심 요소
시뮬레이션 결과를 분석할 때는 다음 요소들을 중점적으로 다루어야 합니다. 첫째, 수조 모델의 물리적 가정(예: 단면적 일정, 유출량 무시 등)이 실제 시스템과 얼마나 부합하는지 설명해야 합니다. 둘째, 비례, 적분, 미분 이득 값을 변경했을 때 상승 시간(Rise time), 오버슈트, 정상 상태 도달 시간 등 과도 응답 특성이 어떻게 변하는지 정량적으로 비교해야 합니다. 이를 통해 특정 이득 조합이 수위 제어에 미치는 영향을 명확히 도출할 수 있습니다.
도립진자 시스템의 균형 제어
1. 동역학 특성 및 제어 목표
도립진자(Inverted Pendulum)는 열린 루프 상태에서 본질적으로 불안정(Open-loop unstable)한 비선형 시스템입니다. 제어의 핵심 목표는 진자 하단에 적절한 토크나 힘을 가하여 막대가 중력 방향으로 넘어지지 않고 수직 상태(각도 0)를 유지하도록 만드는 것입니다. LQR이나 상태 피드백 제어 등 다양한 고급 기법이 적용될 수 있으나, 시스템의 기본 특성을 파악하기 위해 PID 제어를 적용하는 것이 직관적입니다.
Simulink에서는 강체 동역학(Rigid Body Dynamics) 블록을 활용하여 진자의 질량, 길이, 관성 모멘트를 정의하고, 각도 센서 피드백을 통해 PID 제어기로 토크 명령을 생성하는 구조로 모델링합니다.
2. MATLAB 스크립트 구현
비선형 동역학 방정식을 오일러 적분법(Euler Integration)으로 근사화하여 도립진자의 균형 제어를 시뮬레이션하는 코드입니다.
% 도립진자 물리 파라미터
pendulumMass = 0.15;
rodLength = 0.6;
gravity = 9.81;
% PID 이득 튜닝
K_prop = 12.0;
K_int = 0.05;
K_der = 1.5;
% 시뮬레이션 환경 설정
stepSize = 0.01;
tSpan = 0:stepSize:10;
refAngle = zeros(size(tSpan)); % 수직 상태(0 라디안) 유지
angPos = zeros(size(tSpan));
angVel = zeros(size(tSpan));
% 상태 변수 초기화
errVal = zeros(size(tSpan));
accumErr = 0;
lastErr = 0;
for idx = 2:length(tSpan)
% 현재 오차 산출
errVal(idx) = refAngle(idx) - angPos(idx-1);
% PID 항 계산
accumErr = accumErr + errVal(idx) * stepSize;
diffErr = (errVal(idx) - lastErr) / stepSize;
% 제어 토크 도출
actuatorTorque = K_prop * errVal(idx) + K_int * accumErr + K_der * diffErr;
% 비선형 동역학 방정식 (오일러 적분법 적용)
momentOfInertia = pendulumMass * (rodLength^2);
angAccel = (actuatorTorque - pendulumMass * gravity * rodLength * sin(angPos(idx-1))) / momentOfInertia;
% 각속도 및 각도 업데이트
angVel(idx) = angVel(idx-1) + angAccel * stepSize;
angPos(idx) = angPos(idx-1) + angVel(idx) * stepSize;
lastErr = errVal(idx);
end
% 각도 라디안에서 도(degree)로 변환 후 플롯
figure;
plot(tSpan, refAngle * 180/pi, 'r--', 'LineWidth', 2); hold on;
plot(tSpan, angPos * 180/pi, 'b-', 'LineWidth', 2);
legend('목표 각도', '실제 각도 (°)');
xlabel('시간 (초)');
ylabel('진자 각도 (°)');
title('도립진자 균형 유지를 위한 PID 제어 시뮬레이션');
3. 결과 분석 및 보고서 핵심 요소
도립진자 시뮬레이션 보고서는 시스템의 불안정성과 비선형성에 초점을 맞추어야 합니다. 중력 항인 sin(theta)로 인해 발생하는 비선형성이 제어 성능에 미치는 영향을 분석하고, 초기 각도擾動(Perturbation)이 주어졌을 때 시스템이 수직 상태로 회복되는 과정을 평가해야 합니다. 또한, 오일러 적분법 사용으로 인한 수치적 오차 누적 문제를 지적하고, 이를 해결하기 위해 룽게-쿠타(Runge-Kutta) 방법론 적용이나 샘플링 타임 조정과 같은 개선 방안을 제시하는 것이 중요합니다.