수조 수위 제어 시스템의 PID 설계
PID 제어기(Proportional-Integral-Derivative Controller)는 제어 대상의 출력값과 설정값(Set-point) 사이의 오차를 바탕으로 제어 입력을 생성하는 가장 보편적인 알고리즘입니다. 수조 수위 제어에서 각 요소는 다음과 같은 역할을 수행합니다.
- 비례(P): 현재 오차 크기에 비례하여 즉각적인 응답을 만들어냅니다.
- 적분(I): 누적된 오차를 제거하여 정상상태 오차(Steady-state error)를 최소화합니다.
- 미분(D): 오차의 변화율을 감지하여 오버슈트를 억제하고 시스템의 감쇠 특성을 개선합니다.
Simulink 모델 구성
수조 시스템 시뮬레이션을 위해 Simulink에서 수조의 동특성을 구현하는 Plant 블록과 PID Controller 블록을 배치합니다. 수조 모델은 유입 유량과 유출 유량의 차이를 적분하여 수위로 변환하는 구조를 가집니다. 피드백 루프를 형성하여 실제 수위와 목표 수위의 차이를 PID 제어기의 입력으로 전달하도록 설계합니다.
MATLAB 스크립트를 이용한 수위 제어 시뮬레이션
% 제어 파라미터 및 초기화
dt = 0.01;
sim_time = 15;
t_vec = 0:dt:sim_time;
% PID 게인 설정
gain_p = 1.2;
gain_i = 0.05;
gain_d = 0.15;
% 목표 수위 및 상태 변수
target_h = 4.0 * ones(size(t_vec));
level_out = zeros(size(t_vec));
error_prev = 0;
integral_sum = 0;
% 시뮬레이션 루프
for k = 2:length(t_vec)
curr_error = target_h(k) - level_out(k-1);
integral_sum = integral_sum + curr_error * dt;
derivative_val = (curr_error - error_prev) / dt;
% PID 제어 입력 계산
u_control = (gain_p * curr_error) + (gain_i * integral_sum) + (gain_d * derivative_val);
% 수조 모델 (단순 선형 모델 가정: h_dot = u)
level_out(k) = level_out(k-1) + u_control * dt;
error_prev = curr_error;
end
% 결과 시각화
figure;
plot(t_vec, target_h, 'g--', 'LineWidth', 1.2); hold on;
plot(t_vec, level_out, 'm', 'LineWidth', 1.5);
grid on;
xlabel('Time (sec)');
ylabel('Water Level (m)');
title('Water Tank Level PID Control Result');
legend('Target', 'Simulated Level');
倒立擺(Inverted Pendulum) 제어 시스템 설계
倒立擺는 무게 중심이 지지점보다 위에 위치하여 태생적으로 불안정한 비선형 시스템입니다. 제어의 목적은 진자 하단에 토크나 힘을 가해 수직 상태(0도)를 유지하도록 하는 것입니다. 시스템의 비선형성을 고려하여 PID 파라미터를 정교하게 튜닝해야 합니다.
동역학 모델 및 Simulink 구현
진자의 각도를 $\theta$라 할 때, 중력과 외부 토크에 의한 각가속도를 산출하는 동역학 식을 기반으로 모델을 구축합니다. Simulink에서는 Sine 함수와 곱셈기 블록을 사용하여 비선형 동특성을 모사하며, 각도 피드백을 통해 제어기가 수직 상태에서의 이탈을 감지하도록 구성합니다.
MATLAB 스크립트를 이용한 진자 안정화 제어
% 물리 상수 정의
p_mass = 0.15; % 진자 질량 (kg)
p_len = 0.4; % 진자 길이 (m)
gravity = 9.81; % 중력 가속도
% PID 제어기 게인 (불안정 시스템이므로 높은 비례 게인 필요)
kp_ang = 15.0;
ki_ang = 0.2;
kd_ang = 2.5;
% 시간 변수 초기화
t_step = 0.005;
t_end = 5;
time_axis = 0:t_step:t_end;
theta_vec = zeros(size(time_axis));
omega_vec = zeros(size(time_axis));
theta_vec(1) = 0.1; % 초기 기울기 (rad)
err_sum_p = 0;
err_old_p = 0;
for k = 2:length(time_axis)
% 오차 계산 (목표 각도 = 0)
e_p = 0 - theta_vec(k-1);
err_sum_p = err_sum_p + e_p * t_step;
e_diff_p = (e_p - err_old_p) / t_step;
% 제어 토크 결정
u_torque = (kp_ang * e_p) + (ki_ang * err_sum_p) + (kd_ang * e_diff_p);
% 진자 동역학 계산 (Alpha = [T - mgL*sin(theta)] / [mL^2])
inertia = p_mass * (p_len^2);
alpha = (u_torque - p_mass * gravity * p_len * sin(theta_vec(k-1))) / inertia;
% 상태 업데이트 (Euler integration)
omega_vec(k) = omega_vec(k-1) + alpha * t_step;
theta_vec(k) = theta_vec(k-1) + omega_vec(k) * t_step;
err_old_p = e_p;
end
% 결과 그래프 출력
figure;
plot(time_axis, theta_vec * 180/pi, 'b', 'LineWidth', 1.5);
grid on;
xlabel('Time (s)');
ylabel('Angle (deg)');
title('Inverted Pendulum Stability via PID');
시뮬레이션 분석 및 보고서 작성 가이드
제어기 성능을 평가하기 위해 다음 요소들을 중점적으로 분석합니다.
- 오버슈트(Overshoot): 목표값에 도달하는 과정에서 발생하는 최대 초과량.
- 정착 시간(Settling Time): 시스템이 허용 오차 범위 내로 안정화되는 데 걸리는 시간.
- 강인성(Robustness): 외부 노이즈나 파라미터 변화(수조의 유출 계수 변경, 진자의 질량 변경 등)에 대한 제어 성능 유지 능력.
보고서 작성 시에는 각 파라미터(P, I, D)를 변화시킴에 따라 응답 곡선이 어떻게 변화하는지 비교 데이터를 포함하고, 비선형 시스템인 倒立擺에서 PID 제어가 갖는 한계점과 이를 극복하기 위한 LQR 또는 퍼지 제어와 같은 대안적 접근법을 고찰하는 것이 바람직합니다.