mindstorms_with_matlab_logo.png



반갑습니다. 교주 LGS입니다. o(^o^)o

이번 시간에는 지난 시간에 이어 Mindstorms에서 제공하고 있는 Motor를 본격적으로 Control 해보겠습니다.

이번 강좌에서는 Control Theory 내용의 상당부분이 활용되므로 강의 중간 이해가 가지 않는 내용은 Control Theory 강좌를 참고하시기 바랍니다.

자~ 강의 시작하겠습니다.


어떤 System을 Control 하기 위해서는 System에대한 수학적 Model이 있어야하고 수학적 모델을 얻기 위해서는 실험 데이터가 필요합니다.


lego_motor_control01.png


입력과 출력의 관계를 얻기 위해 Unity Feedback  System을 구성하였습니다.

2초에 Step Input으로는 180도를 주었구요... 결과값은 MATLAB Workspace에 저장되도록 하였습니다.

Motor_test_data.mat

결과를 그래프로 그려보면 아래처럼 나오내요~ ^^


lego_motor_control02.png  


%Overshoot도 보이구요 결정적으로 Steady-state Error가 존재합니다. ;; 

Feedback Control을 하기 위해서는 우선 획득한 실험 데이터를 이용해 Motor를 System Identification 해야겠죠? ^^

System Identification Toolbox을 사용하여 Motor의 모델을 찾아보겠습니다.

Command Window에서 >>ident이라고 입력하셔서 System Identification Tool을 띄우신 후에

System Identification Tool 왼쪽의 Import data -> Time Domain Data...를 클릭합니다.

Import Data 창에서 아래와 같이 각 항목을 채워주세요~

lego_motor_control03.png  

Import 버튼을 누르셔서 데이터를 불러들이시구요~

Estimate --> 를 클릭해서 Transfer Function Models... 를 선택후 pole과 zero의 숫자를 정해주세요~

(Estimation이 부정확하게 나오면 pole zero의 숫자를 바꿔가면서 여러번 시도해보세요)


lego_motor_control04.png  


Estimation 버튼을 누르면 아래와 같이 진행상황을 볼 수 있는 Estimation Progress Viewer가 뜹니다.

lego_motor_control05.png  


다시 System Identification Tool 메인화면으로 돌아와서 중앙 하단에 있는 Model Output 항목을 체크하시면

실제 측정한 데이터와 System Identification을 통해 얻은 Model의 Simulation 결과를 비교할 수 있습니다.

Simulation 결과와 실제 측정값이 아주 잘 맞네요 o(^o^)o


lego_motor_control06.png  


마지막으로 Model Views에 있는 방금 생성한 tf1 Model을 드래그 앤 드롭해서 To Workspace에 떨궈주면 tf1 Model이

MATLAB Workspace로 exporting 되구요 command window에서 >>tf1 이라고 입력하시면 Identify된 Model을 확인하실 수 있습니다.


lego_motor_control07.png  


step 함수로 Transient Response 한번 확인해보시구요~ ^^


lego_motor_control08.png  


자~ 이제 획득한 Model을 가지고 Controller를 만들어 봅시다.

Controller에도 정말 여러가지 종류가 있지만 저는 간단하게 MATLAB에서 정말 사용하기 쉬운 (클릭 한방이면 끝나는)

PID(proportional–integral–derivative) controller를 사용하겠습니다.

Simulink를 열어서 아래와 같이 모델 하나 만들어 주세요~


 lego_motor_control09.png  


Transfer Function 블럭 더블클릭해서 창을 여신 다음

Numerator와 Denominator의 coefficient의 값으로 System Identification을 통해 얻은 tf1의 num과 den의 값을 참조하겠습니다.


lego_motor_control10.png  


다시 PID Block을 더블 클릭해서 PID Tunning을 위한 다이얼로그를 뜨웁니다.

(Response Optimization에 관한 내용은 여기를 참조하세요)

Proportional, Integral, Derivative의 각 Gain을 P,I,D,F 변수로 설정하시고 MATLAB command window에서 

>>P=1; I=1; D=0; F=100 으로 초기값을 잡아주시고 각 변수를 workspace에 만들어 둡니다.

그리고 Tune... 버튼을 눌러서 PID Tuner를 여세요.


lego_motor_control14.png


Response Time 슬라이드바를 조정하여 여러분이 원하는 결과가 나오도록 합시다.


lego_motor_control11.png


오른쪽의 Performance를 보시면 Rise time, Settling time이 적절하게 개선된 것을 보실 수 있습니다. o(^o^)o 

OK, OK 누르셔서 창을 다 닫으시구요.

PID 블럭을 복사해서 처음에 데이터를 획득하기 위해 만들었던 LEGO 모델에 붙여 넣습니다.

그리고 마우스 오른쪽 클릭 -> Make Subsystem을 선택하여 아래와 같이 Subsystem을 만들어 줍니다.

Subsystem은 System Identification으로 찾아낸 Unity Feedback을 나타냅니다.


lego_motor_control12.png


마지막으로 Tool -> Run on Target Hardware -> Run을 눌러서 모터를 Control 해보세요 o(^o^)o

Constant 블럭을 열어서 값을 바꾸시면 실시간으로 모터 각도를 컨트롤 할 수 있습니다.


lego_motor_control13.png


제가 몇가지 각도로 움직여 보았습니다.

Steady-state Error 없이 잘 control 되고 있네요 =(=^ㅅ^=)= Overshoot도 없군요 헤헤

오늘 강좌 끝~



profile