본문 바로가기

Robot/Project

[밸런싱 로봇 만들기] 작은 로봇을 하나 완성해서 큰 기쁨을 얻다

이제 기나긴 밸런싱 로봇 만들기 연재를 완결지어야겠습니다.^^. 성질 급하신 분들은 제일 아래 동영상을 먼저 보고 오셔도 됩니다.^^ 제가 만든 방식대로 따라하실려면 이 글에서 제가 링크를 건 모든 문서를 읽어보시길 권장합니다. 왜냐하면, 이번 연재는 실제로 로봇을 만들어가면서 작성된 글이기 때문에 제가 실수하거나 의문이 들었던 부분들도 모두 들어있고, 다시 그 실수나 의문을 해결해가는 과정도 있기 때문입니다. 또한, 단순한 기초지식은 다루지 않았습니다. 특히, DSP 혹은 이 글을 따라하시려고 준비한 마이크로프로세서 무엇이든 어느정도 기초는 알고 있다는 가정입니다. 즉, 엔코더나 ADC 정도, 시리얼 통신, 더 단순하게는 컴파일러의 사용법 정도는 알고 있다는 가정입니다.

그럼 이제 대단원의 최종회를 시작해볼까요???^^


먼저, 연재 중간에 기구부를 변경했었습니다. 위의 메인프레임과 모터 바퀴는 [관련글]에서 언급한대로 디바이스마트에서 구매했습니다.

그리고, 자이로센서와 가속도센서를 장착하고, 처음 세팅을 위해 수평계를 장착했습니다. 자이로센서는 InvenSense사의 IDG300이 장착된 모듈이고, 가속도센서는 Freescale사의 MMA7260QT가 장착된 모델입니다.

메인 프로세서는 DSP 2812를 장착한 Realsys사의 보드를 사용했고, DC모터 드라이버로는 LMD18200을 사용했습니다.

또한, 기본 컨셉은 [관련글]에서 밝혔듯이 레고의 마인드스톰의 동역학을 따라간 후, 차용했습니다.

로봇의 진행방향의 각도는 Psi이고, Theta는 각 모터의 회전각도의 평균입니다.

또한, 두 모터를 사용하기때문에 사실상 Yaw제어가 필요합니다. 그래서 Phi라는 상태를 또한 설정했습니다. 결국 우리의 제어목적은, 로봇이 똑바로 서있고(Psi = 0), 제자리에 가만히 있고(Theta = 0), 한 방향을 똑바로 바라보는(Phi = 0) 것입니다. 그래서, 레고마인드스톰의 동역학을 따라하긴 했지만, 저는 조금더 진행해서, 더블닷에 관한 식으로 변형합니다.[관련글]

그리고, 이를 선형화해서 LQR제어기를 설계하고, 또한 이를 MATLAB/Simulink를 통해 시뮬레이션을 했습니다.[관련글]

이제, DSP 측에 이식(보통 Embedded)해야죠. 먼저 LQR로 도출된 제어기를 사용하기 위해서는 각 상태를 알아야합니다. 저는 Psi, Theta, Phi, dot_Psi, dot_Theta, dot_Phi를 상태를 잡았습니다. 그러므로 이 여섯개의 수치를 측정해야합니다. 그 전에 미분-정확히는 차분-을 수행하기 위해 일정한 샘플링 타임을 유지할 필요가 있습니다. 그래서, 샘플링타임을 10ms로 설정하고, 10ms 마다 타임인터럽트를 걸어줍니다. 결국 메인 제어코드는 타임인터럽트 함수안에 있게 되는 것이지요.

285번행부터 303번행까지는 가속도센서와 자이로센서의 영점을 맞추기 위해 초기 10초를 대기하고, 그 평균을 오프셋으로 지정하는 작업을 합니다.

그리고, 수행되는 코드에서 308번행부터 310번행까지는 ADC를 수행하여 그 오프셋을 빼줍니다. 그리고, 313번부터 328번행은 구간평균(혹은 이동평균)법을 수행해서 5샘플의 평균을 현재의 수치로 사용하도록합니다. 그리고, 자이로센서에서 받은 값은 오프셋과 스케일팩터를 고려해서 바로 로봇이 기울어지는 각속도(dot_psi)로 사용합니다. 아.. 그런데, 기구적으로 장착할때 자이로센서를 반대로 설치하는 바람에 마이너스가 붙었네요.ㅠㅠ

 그리고, [관련글]에서 이야기했던 자이로센서와 가속도센서를 이용해서 각도를 추정하는 보정필를 C로 구현[관련글]했습니다. 이렇게 해서 로봇이 기울어지는 각도(psi)와 그 각속도(dot_psi)는 측정했습니다. 이제

바퀴를 구동하는 모터에 내장된 엔코더를 이용해서 로봇이 이동한 거리를 의미하는 theta를 측정해야합니다. 그러나 같은 모터가 반대방향으로 달려있어서 하나는 부호를 바꿔줘야(345번행-346번행)합니다. 거기서 기어비(50)와 한 바퀴의 펄스수(13)와 DSP 내부의 체배수(4)를 곱한 2600으로 나눠주고, 라디안으로 생각하면 각도로 환산됩니다. 그리고, theta와 phi를 구하게 됩니다.

이제, theta와 phi의 속도성분을 구해야하는데, 이것 역시 문제가 있는게 엔코더 신호를 그냥 단순히 차분하면, 예상외로 이상하다는 것을 확인할 수 있습니다. 이는 엔코더의 분해능이 높지 않을때, 차분하면 순간적으로 높은 값이 나타나서 제어성능을 떨어트릴 수 있습니다. 보통 정교한 제어를 해야하는 경우 펄스와 펄스사이의 시간을 직접 측정해서 속도성분을 찾는데, 사실 펜들럼류의 로봇들은 그렇게까지 정교하지 않아도 제어 성능을 보장받을 수 있습니다. 그래서 위에 보이다시피 역시 구간평균법을 적용해서 theta와 phi의 속도 성분인 dot_theta, dot_phi를 구하게 됩니다. 이제 상태를 모두 측정할 수 있게 되었습니다.  그럼, 제어기는 어떻게 구현할 까요.??

[관련글]에서 단지 이론적으로 구했던 제어 게인 K1, K2를 그대로 프로세서에 인가하겠습니다.

그래도 되냐구요?? 

튜닝하지 않아도 되냐구요?? 

어떻게 이론이 실제와 같냐구요??

시사, 정치, 사상, 경제 등의 인문사회 분야가 아니라 공학이라면, 저는 이론과 실제는 상당히 근접한다고 말하고 싶습니다. 인터넷을 서치하다가 동역학과 시뮬레이션까지는 정말 잘 해놓고, 실제로 적용할 때는 정작 튜닝을 너무 과도하게 하는 경우를 자주 보게 되는데, 그럴거면 왜 그 복잡한 이론적 접근을 수행했는지 묻고 싶습니다. 설계된 제어기가 제대로 동작하지 않는다면, 제어기 디자이너의 실력부족으로 현실을 충분히 반영하지 못했기 때문입니다. 훌륭한 제어기 디자이너는 요구되는 제어목적을 수행하기 위해 버리고 간략화할 것이 무엇인지 판단하고, 제어 목적에서 중요한 요소는 놓치지 않고 반영할 수 있어야합니다.
- 아직은 초보 제어기 디자이너 PinkWink 생각 -

응?? 쓸데없는 이야기를 갑자기 해버렸네요. 그래서, 위와 같이 각 모터에 인가할 전압을 생성합니다. 그렇게 동역학을 유도하고, 선형화해서, LQR제어기를 꾸몄는데, 겨우 370번행과 371번행, 딱 두줄에 제어기는 구현되었네요.^^ 이제, 마무리네요. 동영상입니다.

대략 10초대에서 화면이 위로 올라가는데, 저 로봇이 아직 배터리를 장착하지 않아서 전원선입니다. 줄로 매달아서 사기치는게 아니냐는 의문을 가지실까바 화면을 위쪽까지 올려봤습니다. 중반부터는 자로 툭툭 때리는 장면도 역시 확인하실수 있습니다. 휴~~ 길고 긴 연재를 마쳤네요. MATLAB 기초 연재할때는 진도가 잘 나가길래 아무생각없이 이번연재를 수행했다가 생각보다 진도가 나가지 않아 죄송스럽습니다. 다음 부터는 연재할때 좀 생각하면서 해야겠어요...^^ 

아 그리고, 동영상을 하나더 추가합니다. 클. 유투브에 올린건데요. 뭔가 다른 모습도 있어요^^

반응형