control tutorials/cruise control

2. Control

fbc0314 2025. 1. 22. 17:21

1. system model과 원하는 조건

cruise control 문제의 전달함수는 아래와 같다. 

$$T(s)=\frac{V(s)}{U(s)}=\frac{1}{ms+b}$$ $$vehicle\ mass(m)\ :\ 1000kg$$ $$damping\ coefficient\ :\ 50Ns/m$$ $$reference\ speed\ :\ 10m/s$$

우리는 자동차가 10m/s을 유지하도록 제어기를 설계해야 한다. 또한 rise time < 5s, Overshoot<10%, Steady-state error<2%의 조건도 만족시켜야 한다.

 

open-loop system에서 500N의 힘을 가하면 10m/s의 steady-state 값을 갖는다. open-loop에서는 시스템에 그대로 적용되기 때문에 input이 힘이지만 closed-loop system에서는 제어기를 한번 거치고  feed back도 존재하는 시스템에 적용되기 때문에 input은 목표속도이다. 정리하면

  • open-loop 시스템 : 입력은 힘, 출력은 속도이고 시스템에 직접적인 힘을 가해서 속도를 생성한다.
  • closed-loop 시스템 : 입력은 목표 속도, 출력은 실제 속도이고 제어기는 목표속도와 실제속도의 차이를 기반으로 힘을 생성하여 시스템에 입력한다.

 

2.PID 제어기

pid제어기의 전달함수는 이전과 같이 tf()함수를 사용하거나 pid(Kp, Ki, Kd)의 함수를 사용하면 된다. pid제어기를 사용한 feedback 시스템을 매트랩으로 만들고 P제어기와 PI제어기의 영향을 확인해보자!!

 

1)Proportioinal Control

비례제어만을 사용한다면 pid제어기의 전달함수는 C=Kp이다. 이를 적용해서 closed-loop system의 전달함수를 구하면 아래와 같다.

$$T(s)=\frac{Y(s)}{R(s)}=\frac{G(s)C(s)}{1+G(s)C(s)}=\frac{Kp}{ms+b+Kp}$$

 

비례제어는 steady-state error를 줄여주고 시스템을 빠르게 만들지만 steady-state error를 완전히 없애지는 못한다. 매트랩 코드를 통해서 결과를 확인해보자. tf_cruise는 시스템의 전달함수, C는 pid제어기의 전달함수, T는 전체 feedback system의 전달함수이고 step(r*T)는 T의 시스템에 크기가 r(10)인 step input이 작용할 때 결과를 보여준다.

m=1000;
b=50;
r=10;

tf_cruise=tf([1],[m,b]);

Kp=100;
C=pid(Kp);

T=feedback(C*tf_cruise,1);

step(r*T);
axis([0 50 0 10]);

 

Kp=100인 경우

 

steady-state error와 rise time을 줄여야 한다. Kp의 값을 5000으로 늘리고 그 결과를 확인해 보자!

Kp=5000의 경우

steady-state error는 거의 없어지고 rise time은 0.5로 매우 짧다. 하지만 자동차의 속도를 0에서 10m/s까지 0.5초 이내에 줄이는 것은 물리적 한계로 불가능하다. 이를 Actuator limitation이라고 하고 제어공학에서 자주 나타나는 문제이다. 따라서 제어기를 설계할 때는 이러한 부분 또한 고려해야 한다. 위 문제를 해결하기 위해서는 적당한 proportional gain Kp를 설정하고 integral controler를 추가해서 steady-state error를 제거해야 한다.

 

2)Proportional-Integral Control

비례제어와 적분제어를 사용하면 pid 제어기의 전달함수는 C=Kp+Ki/s이다.  이를 적용해서 closed-loop system의 전달함수를 구하면 아래와 같다.

$$T(s)=\frac{Y(s)}{R(s)}=\frac{G(s)C(s)}{1+G(s)C(s)}=\frac{KpS+Ki}{ms^{2}+(b+Kp)s+Ki}$$

적분제어를 추가하면 steady-state error를 줄일 수 있다. Kp는 600, Ki는 1로 설정하고 아래의 코드를 통해서 결과를 확인하자.

 

 

m=1000;
b=50;
r=10;

tf_cruise=tf([1],[m,b]);

Kp=600;
Ki=1;
C=pid(Kp);

T=feedback(C*tf_cruise,1);

step(r*T);
axis([0 50 0 12]);​

Kp=600, Ki=1의 결과

integral gain의 경우 너무 크면 unstable한 결과가 나올 수 있으므로 작은값부터 천천히 늘리는 것이 좋다. 아래는 Kp는 800, Ki는 40의 결과이다. steady-state error는 없어졌고 rise time도 5초 이내이다.

Kp=800, Ki=40의 결과

 

3. Root Locus

root locus는 gain이 0부터 무한대로 변화할 때 가능한 closed-loop pole의 위치를 나타낸 그래프이다. open-loop pole을 이용하는데 gain이 0일 때 closed-loop pole은 open-loop pole의 pole이고 gain이 무한대일 때 closed-loop pole은 open-loop의 zero이다.

pid에서 Kp만 고려한다고 생각해도 된다. closed-loop 전달함수는 아래와 같이 표현된다.

$$\frac{Y(s)}{R(s)}=\frac{K_{p}}{ms+(b+K_{p})}$$

1)transient response

우리가 성능 목표는 Rise time < 5s, Overshoot < 10%, Steady-state error < 2%이다. 이를 통해서 고유진동수와 dampin ratio의 범위를 구할 수 있다.

$$Rise\ time\ :\ T_{r}=\frac{1.8}{w_{n}}$$ $$w_{n} \geq \frac{1.8}{T_{r}}$$ $$w_{n} \geq \frac{1.8}{5}=0.36$$ $$OverShoot\ :\ e^{-\zeta \frac{\pi}{\sqrt{1-\zeta ^{2}}}} *100$$ $$\zeta \geq \sqrt{ \frac{ln^{2}(M_{p})}{\pi^2+ln^2(M_p)}}$$ $$\zeta \geq \sqrt{ \frac{ln^{2}(0.1)}{\pi^2+ln^2(0.1)}}=0.59$$

 

성능을 만족하기 위해서는 고유진동수는 0.36이상, damping ration는 0.6이상이여야 한다. 매트랩의 sgrid()함수를 사용해서 만족하는 범위의 근궤적을 나타낼 수 있다.

m=1000;
b=50;
r=10;

tf_cruise=tf([1],[m,b]);

rlocus(tf_cruise);
axis([-0.6 0 -0.6 0.6]);
sgrid(0.6,0.36);

근궤적과 만족하는 경계 표현

고유진동수가 0.36이상이라는 것은 0.36이 표시된 호의 바깥쪽에 pole이 있어야 함을 의미하고 damping ratio가 0.6이상이라는 것은 0.6으로 표시된 두 직선 사이에 pole이 있어야 한다는 것을 의미한다. rlocfind()함수를 추가하면 원하는 위치를 클릭해서 해당 위치에서 가장 가까운 근궤적 위의 pole을 선택하고 이를 통해서 gain값과 pole의 값을 얻을 수 있다.

( [Kp,poles]=rlocfind(tf_cruise)을 마지막에 추가한다 )

 

나온 값인 Kp=350으로 feedback system의 step response를 확인해보면 아래와 같다.

m=1000;
b=50;
r=10;

tf_cruise=tf([1],[m,b]);

Kp=350;
tf=feedback(Kp*tf_cruise,1)
step(r*tf);

Kp=350일 때 step response

rise time은 대략 5초이고 overshoot은 거의 없는 것으로 보인다. transient response의 조건은 만족하지만 steady-state error는 좀더 줄여야 한다.

 

2)steady-state response

transient resonse의 조건을 만족시켰으니 steady-state error를 줄여서 steady-state response의 조건을 만족시켜보자. 여기서는 Lag controller를 사용한다. Lag controller는 원점 근처에 pole과 zero를 추가해서 근궤적에 변화를 주지는 않지만 그 두 값의 비율만큼 steady-state error가 줄어들도록 하는 역할을 한다. 원점 근처에 존재하면 pole과 zero의 위치는 가깝지만 그 둘의 비율을 크게 만들어서 steady-state error를 줄일 수 있다. 아래는 lag controller의 전달함수이다.

$$C(s)=\frac{s+z_0}{s+p_0}$$

Kp와 lag controller를 포함해서 closed-loop 전달함수를 구하면 아래와 같다.

$$T(s)=\frac{Y(s)}{U(s)}=\frac{K_pC(s)G(s)}{1+K_pC(s)G(s)}=\frac{K_p \frac{s+z_0}{s+p_0} \frac{1}{ms+b}}{1+K_p \frac{s+z_0}{s+p_0} \frac{1}{ms+b}}$$ $$T(s)=\frac{K_p s+K_p z_0}{m s^2+(b+m p_0 +K_p)s+(bp_0+K_p z_0)}$$

z0은 0.3, p0은 0.03으로 하면 둘은 가까이 있으므로 근궤적은 변화가 없고  z0/p0은 1/10이므로 steady-state error는 1/10으로 줄어든다. 다음을 실행시켜서 적절한 Kp의 값을 구한다.

m=1000;
b=50;
r=10;

tf_cruise=tf([1],[m,b])

z0=0.3;
p0=0.03;
C_lag=tf([1,z0],[1,p0]);

rlocus(C_lag*tf_cruise);
axis([-0.6 0 -0.6 0.6]);
sgrid(0.6,0.36);
[Kp,poles]=rlocfind(C_lag*tf_cruise)

 

Kp를 1286.2라고 하고 step response를 구해보자.

m=1000;
b=50;
r=10;

tf_cruise=tf([1],[m,b])

z0=0.3;
p0=0.03;
C_lag=tf([1,z0],[1,p0]);

kp=1286.2;
tf=feedback(kp*C_lag*tf_cruise,1);
step(r*tf);

lag compensator를 추가하고 Kp=1286.2일 때의 step response

결과를 보면 steady-state error는 거의 0으로 줄어들었다. zero가 추가되면서 overshoot이 생겼지만 transient response에서 요구하는 rise time<5s와 overshoot<10%는 그대로 만족한다.

 

4. Frequency

frequency response의 크기와 위상차를 각각 나타낸 것이 bode plot이다. 이러한 bode plot은 open-loop system이 stable한 경우 사용할 수 있다. 위의 시스템의 경우 open-loop pole이 모두 LHP에 있으므로 stable하다.

아래의 코드를 이용해서 bode diagram을 그리면 아래와 같다.

m=1000;
b=50;
r=10;

tf_cruise=tf([1],[m,b]);
bode(tf_cruise);

bode diagram

1)Gain k

위의 시스템은 type0이고 steady-state error는 아래처럼 표현된다.

$$e_{step}(\infty ) = \frac{1}{1+\displaystyle \lim_{s \to 0}GH}=\frac{1}{1+K_p}$$

여기서 Kp의 값은 bode diagram에서 주파수가 0일때의 크기와 같다. 위의 그래프에서 Kp의 값은 대략 -34dB=10^(-34/20)=0.02가 되고 steady-state error는 1/(1+0.02)*100=98%가 된다. step response를 확인해보면 아래와 같다.

m=1000;
b=50;
r=10;

kp=1;
tf_cruise=tf([kp],[m,b]);
tf=feedback(tf_cruise,1);
step(r*tf);

step response 결과

결과에서 steady-state error를 확인해보면 (10-0.2)/10*100=98%로 동일하게 나온다. 정리하면 steady state error를 줄이기 위해서는 주파수가 0일때의 bode diagram의 크기를 변경해야 하는데 이는 gain인 Kp의 값을 조절하면 된다. gain의 값이 변하면 bode diagram은 위아래로 이동한다.

 

그러면 주파수가 0일 때의 bode diagram의 크기는 어떤 값이 되어야 하는가??

$$steady-state\ error\ <\ 2%$$ $$\frac{1}{1+k_p}<0.02$$ $$k_p>49=33.8dB$$

33.8dB가 되어야 한다. 현재 주파수가 0일 때 크기는 -34dB이므로 Kp>(34dB+33.8dB)=67.8dB=2455여야 한다. Kp의 값을 2455로 해서 bode diagram과 step response를 확인하면 아래와 같다.

왼쪽은 bode diagram, 오른쪽은 step response

steady-state error는 0이 되었지만 2초만에 자동차가 10m/s의 속도에 도달했다. 이는 Actuator limitation으로 불가능하다.

 

2)steady-state response(lag compensator)

위에서 설명했던 것처럼 lag compensator를 이용해서 원점 근처에 pole과 zero를 추가하면 근궤적에는 영향을 주지 않으면서 steady-state error는 줄일 수 있다.

-0.02에 pole, 0.1에 zero을 추가하고 gain kp는 1000으로 했을 때의 bode diagram과 step response를 확인해보자.

 

왼쪽은 bode diagram, 오른쪽은 step response

아주 작은 overshoot이 있지만 steady-state error는 0에 가깝고 rise time은 5이하이므로 조건을 만족한다.

'control tutorials > cruise control' 카테고리의 다른 글

3. Simulink modeling  (0) 2025.01.29
1. System Modeling  (0) 2025.01.21