해당 카테고리의 첫 글에서 우리는 두개의 기차 시스템을 모델링했고 아래 사진처럼 완성했다. 우리가 모델링한 것은 feedback system의 plant 부분이고 controller부분을 설계해서 원하는대로 동작하도록 만들어야 한다.

먼저 간단하게 보기 위해서 train model을 하나의 subsystem block으로 만들어야 한다. 이를 위해서 3개의 scope block을 sinks library의 out1으로 바꾸고 한개의 signal generator를 sources library의 in1으로 바꿔야 한다. 그러면 아래와 같은 화면이 만들어진다.

모델을 모두 선택 후(Ctrl+A) 우클릭 후에 선택항목을 서브시스템으로 만들기 선택(Ctrl+G)를 통해서 하나의 subsystem block으로 만든다. 결과는 아래와 같다.

여기에 PID controller block을 추가하고 train system의 F에 연결한다. 쉽게 생각하가 위해서 엔진이 도크를 만들어서 바퀴에 전달하는 과정을 생략했다. PID의 각 계수를 설정하고 속도를 제어할 것이기 때문에 속도인 x1_dot을 feedback loop를 만들어서 연결한다.

r그리고 source library에 signal builder를 추가해서 원하는 신호를 가도록 만든다. 우리는 300초동안 처음 10초부터 150초까지는 1의 속도를 갖고 150초부터 300초까지는 0의 신호를 갖도록 만들고 싶다. 블록을 더블클릭 후 위쪽 탭에서 축 메뉴에서 시간의 범위를 설정하고 마우스로 신호에서 각 축의 위치를 변경할 수 있다. 그리고 x1의 속도를 확인할 수 있도록 scope를 추가한다.


시뮬레이션의 실행시간을 300초로 설정하고 실행 후 x1_dot의 scope을 보면 아래와 같다.

우리가 원하는 결과가 나오지 않았다. 속도가 1에 도달하지 못하는 steady-state error가 나타난것이 확인된다. 이는 pid 제어기의 계수들을 적절하게 조절하면 해결 가능하다.
#linear Analysis Points 관련
https://ctms.engin.umich.edu/CTMS/index.php?example=Introduction§ion=SimulinkControl
위의 사이트에서 extracting a model into MATLAB부분을 따라가고 있던중에 linear analysis points부분이 계속 따라해봐도 보이지 않았다... 여기서 세시간 정도 멈쳤던거 같다ㅠㅠ
결론은 추가로 toolbox를 설치해줘야 한다. simullink 위의 메뉴에서 앱 선택후 애드온 받기를 클릭 후 아래 사진의 simulink control design을 설치한다.


signal을 우클릭 후에 train system으로 들어가는 신호를 open-loop input으로 설정하고 나가는 신호를 open-loop output으로 설정한다. 우리는 control이 없는 train 모델 그 자체를 원하기 때문에 feedback signal을 삭제해야 한다. 그 결과 아래와 같은 화면을 볼 수 있다.

ㄴsimulink화면 위쪽의 앱 메뉴를 클릭하면 제어시스템- Model Linearizer을 클릭한다.
(이것도 원래없었는데 추가로 설치하면서 생겼다ㅠㅠ)
d자 이제 여기에서 train 모델을 matlab으로 가져올 수 있다. 처음 실행하면 아래 왼쪽 사진과 같은 화면이 나온다. 여기서 위의 step 버튼을 누르면 linearized model이 만들어진다. 우리가 만든 기차 모델은 이미 linear이기 때문에 큰 변화가 없다.
화면 내에서 linear analysis workspace에서 linsys1을 위쪽의 MATLAB Workspace로 그래그 하면 기존 매트랩에서도 해당 시스템은 전달함수로 변수명을 linsys1으로 사용할 수 있다.



simulink를 이용한 Controller design
simulink에서 pid controller를 설계하는 방법은 두가지 방법이 있다.
첫번째 방법은 pid block을 더블클릭하면 나오는 화면에서 조정버튼을 누른다. 그러면 아래와 같은 화면이 나오고 여기서 각 계수의 값을 찾을 수 있다.

두번째 방법은 앱에서 제어시스템을 누르면 아래와 같은 화면이 나온다.


설계하려는 블록을 추가하고 ok버튼을 누르고 확인을 누른다. 이전에 시스템을 추출했을 때처럼 시스템의 input과 output을 설정한다. signal builder block의 output인 velocity command signal을 우클릭 후에 Linear Analysis Point -> Input Perturbation으로 closed-loop system의 input으로 설정한다. 그리고 train system의 output중에 속도인 train engine velocity signal을 우클릭 후에 Linear Analysis Points -> Output Measurement로 closed loop system의 output으로 설정한다. 그러면 아래와 같이 signal에 표시가 생긴다. 그러면 어떤 신호를 input 또는 output으로 하는지 알 수 있다.

다음은 이전에 앱에서 시작한 제어 시스템 디자이너에서 조정방법 -> 근궤적 편집기를 선택한다. 아래의 왼쪽 사진처럼 찾으면 된다. 그다음 나오는 화면에서 Plot(플롯)을 선택하면 오른쪽 사진처럼 근궤적이 화면에 보여진다.


우리가 여기서 gain k의 값을 변경하고 싶으면 근궤적에서 핑크색 상자를 드래그하면 된다. 이제 step response를 확인해 보자. 아래의 왼쪽 사진처럼 새 플롯 -> 새 계단을 선택한다. 그리고 새 입력-출력 전달 응답을 선택해서 입력신호는 Signal Builder에서 나오는 신호를 출력신호는 Subsystem에서 나오는 기차의 속도를 선택한다. 마지막으로 플롯을 누르면 가장 아래의 오른쪽과 같은 step input 신호에 대한 response가 시간에 따라서 그려진다.




step response의 x축과 y축의 범위를 그래프 화면 우클릭 후에 제한의 각 값을 변경하면 아래 사진처럼 나타난다. 우리는 여기서 overshoot을 줄이고 steady-state error를 줄일 수 있도록 제어기를 설계해보자.

아래 사진처럼 근궤적 그래프 화면을 우클릭 후에 보상기 편집을 선택한다. 오른쪽 사진과 같은 화면이 나오고 우클릭 후 극점 또는 영점 추가를 통해서 다음과 같이 설계할 수 있다. 여기서는 일단 loop gain은 0.05, real zero를 -0.15에 추가하고 integrator를 추가하자.
왜 integrator와 -0.15에 zero를 추가하는지는 좌측의 포스팅에 정리(https://fbc0314.tistory.com/10)





마지막으로 위의 사진에서 블록 업데이트를 누르면 현재 pid의 계수값이 처음의 feedback system의 pid의 계수에 적용된다. pid의 계수를 조절하는 것은 compensator를 추가하고 그때의 정리된 계수가 각각의 pid값이 되는 것이다.
결과를 처음과 비교해보자. 왼쪽 사진은 pid의 각 값을 1,0,0으로 했을 때고 오른쪽 사진은 pid의 각 값을 0.33, 0.05,0으로 했을 때이다. steady-state error가 없어지고 overshoot이 존재하지 않으면서 목표한 값까지 부드럽게 도달해서 기차의 속도를 제어하는데 적합하다.


이처럼 matlab의 simulink를 이용해서 pid에 적합한 값을 구하는 방법에 대해서 직접 따라해보면서 결과를 확인했다. 이를 잘 이용하면 compensator에 대한 결과를 쉽게 확인할 수 있을 것이다.
'control tutorials > introduction' 카테고리의 다른 글
| 추가적으로 정리한 것 (0) | 2025.01.20 |
|---|---|
| Simscape (0) | 2025.01.19 |
| Frequency Domain (0) | 2025.01.14 |
| Root Locus(근궤적) (0) | 2025.01.14 |
| PID Controller Design (0) | 2025.01.13 |