본문으로 바로가기

비가 오는듯 마는듯합니다. 분명 장마라고 하던데... 방금 예전에 제가 알바로 일했던 입시학원의 예전 선생님들을 만나 소주한잔 하고 왔습니다. 당시 저는 고등부 수학을 수업했었는데, 그때 이야기들을 한참하며 떠들고 웃었네요. 그 때, 한때는 학원강사로 평생을 일할까하는 생각도 했었는데, 지금은 이렇게 백수로 살고 있네요. 그래도 그 분들과의 오랜만의 자리가 너무 즐겁고 재미있었습니다. 한잔을 더 하고 싶지만, 어지러워서...ㅠㅠ 그래서 술이나 깰겸... 연재를 다시 올리네요..^^

레고의 마인드 스톰의 문서를 확인한 이후, 밸런싱로봇의 동역학을 따라가보았었습니다. [관련글] 그 후, 허접한 마트에서 기구부를 구입하고, 모터의 파라미터를 도출했었습니다.[관련글] 이제, 나머지 파라미터를 구성하고, 모델을 선형화해서, 선형제어기를 구할려고 합니다. 그 후 MATLAB/Simulink를 이용해 제어기의 타당성을 확인한 다음 실제 적용을 해봐야겠지요. 

레고 마이드 스톰의 문서가 저에게 많은 도움을 주는군요.. 저런 그림도 제공해주고 말이죠^^

디바이스마트에서 구입한( -추신- 2016년 현재 지금은 단종되었습니다.) 기구부의 제원에 맞도록 수치를 구했습니다. 물론 오차가 발생할것입니다만, 레고 마인드스톰의 기구부도 딱 저렇게 생기진 않았지요. 어차피 제가 생각한 LQR제어기를 구성하고 실제 시스템에 테스트를 해봐야알겠지만, 통상 펜들럼류의 로봇들은 저정도는 간략히해도 큰 문제가 없습니다. 지난번[관련글]에 모터의 마찰계수에 집착한것은 원체 그 모터의 마찰계수가 클것이기 때문이었으니까요.

상태방정식 구하기 !

이전에 문단 [관련글]에서 상태방정식을 구했었습니다. 그때 결과를 보면

이었습니다. 그러나 동역학과 실제 시스템을 유심히 관찰하면, 기구가 넘어지는 psi와 기구가 이동한 거리를 의미하는 theta는 같은 제어기로 두고, 기구의 yaw 움직임을 관장하는 phi는 따로 제어기를 구성해도 괜찮아보입니다. 단지 블로그에 올리는 거니 따로 제어기를 구성해도 되는지, 안정화증명은 생략하도록하죠... (절대 귀찮아서 그런게 아닙니다...ㅠㅠ)

그래서 상태방정식을 위와 같이 분리합니다. 앗... 밑의 수식은 psi가 아니라 phi입니다. 큭... 음주 블로깅의 폐해....ㅠㅠ

위의 파라미터를 대입해서

이렇게 상태방정식을 구했습니다.

LQR 제어기 설계 !

MATLAB을 사용하면서 큰 장점중 하나는 역시 막강한 툴박스에 있겠죠^^ 그중 LQR 툴박스도 있습니다. LQR 툴박스의 사용방법은 예전에 언급했습니다.[관련글

툴박스를 사용하기 위한 가중치행렬을 정의하고, 제어기를 구해보면

라고 하는군요^^. LQR 툴박스는 제어입력 u=-Kx로 봅니다.^^

MATLAB / Simulink 시뮬레이션 환경 구축하기 !

미분방정식으로 나타난 동역학 방정식을 MATLAB/Simulink로 구현하는 방법은 [관련글]에서 설명을 했었습니다. 우리가 구현해야할 동역학은 당연히 밸런싱로봇의 비선형방정식입니다. 다시 이전에 구했던 결과식을 가져오면

입니다. MATLAB/Simulink에서는 위 동역학을 바로 밸런싱로봇이라고 볼 겁니다. 그러니 실제상황처럼 테스트를 하기 위해 위 동역학을 Simulink에서 구현해야지요

위 그림처럼 구성하고 빨강박스에는 theta에 관한 식이 들어갑니다.

음.. 사실 전 저 수식을 손으로 입력한게 아닙니다. 예전에도 한번 언급했지만, 위치벡터와 운동에너지와 위치에너지, 변수와 상태만 설정하면, 결과 동역학을 유도하도록 만들어 둔 프로그램이 있습니다. 제가 만든 그 프로그램의 마지만 단계가 시뮬레이션을 위해 저 function 블럭에 넣을 수식을 simulink에 사용할 수 있도록 변환시켜주는 것입니다. (언제한번 그것도 연재해야할 텐데 말이죠....ㅠㅠ)

저 빨간 박스에는 phi쪽 수식이 들어가야합니다.

마지막으로

저 박스에는

psi쪽 수식이 들어가게 됩니다. 그렇게 해서 저 전체 블럭을 Subsystem으로 변환합니다.[관련글]

그리고, 제어기 부분을 만들어 줘야겠네요^^

위에 빨간부분은 아까구한 LQR제어기법의 결과인 K1, K2가 각각 들어가면 됩니다. 저 빨간박스부분이 실제 마이크로 프로세서에 입력되는 부분으로서, 숫제 8개가 전부입니다...^^

이제 저 부분은 제가 이전에 동역학을 편의상 u1, u2로 두었는데요. 그걸 각 모터에 인가하는 전압으로 바꾸는 것입니다.

v_l = (u1+u2)/2

v_r = (u1-u2)/2

입니다.

시뮬레이션 결과 !

이제 시뮬레이션 결과를 봐야겠네요. 뭐 당연히 되는 거라 의미는 없지만, 

위에서 부터 theta, phi, psi입니다. 셋 다 모두 초기치를 2도로 주었습니다. phi를 제외 하면 대략 4초가 지나면서 안정화가 되었다고 볼 수 있습니다.

노란선이 u1이고 빨간선이 u2입니다.

실제 각 모터에 인가된 전압입니다. 24V Max 모터인데, 각각 8V정도를 극 초반에 사용하고, 오버슈트가 발생할때가 고작 0.8V정도네요. 일단 괜찮다는 것을 확인할 수 있습니다. 이제, 몇가지 작업을 더 하고, 실제 하드웨어 프로그램을 어떻게 구성하는지를 시작으로 각 상태의 측정과 제어기를 이식하는 것을 실제 다루게 되겠네요. 그때 테스트를 하면서, 제어기를 수정하게 될겁니다. 가중치행렬(Q,R)을 변경해가면서, 제어기의 성능을 향상시키게 되겠지요.^^

신고