밸런싱 로봇 (Balancing Robot) 만들기 연재
1. 동역학 구축 (1) [바로가기]
2. 동역학 구축 (2) [바로가기]
3. 동역학 구축 (3) [바로가기]
4. 기구부 구성 및 모터 파라미터 측정 [바로가기]
5. 제어기 설계 및 MATLAB을 이용한 시뮬레이션 [바로가기]
6. 밸런싱 로봇 만들기 [바로가기]



밸런싱로봇 만들기 연재를 시작한지 꽤 되었는데 이제 네번째 글을 올립니다. 지난 두 세주가 너무 바빴네요. 게다가 지난주에는 제가 있는 학교에서 저의 블로그가 둥지를 틀고 있는 티스토리를 차단[관련글]해 버리는 바람에 꽤 애를 먹었습니다. 지금은 완벽히는 아니지만, 잘 해결[관련글]되어서 한 시름 놓았네요.

이번에는 파라미터 찾기에 대해 이야기를 할려고 합니다. 일단 지난번에 기구부[관련글]를 제작하였고, 그 후 동역학 방정식[관련글]을 나름대로(^^) 유도해 보았습니다. 그러나 당시 동역학을 유도할때 관성모멘트나 마찰계수등등을 수치로 제시하지 못했는데요. 이유는 몰라서이지요..ㅠㅠ. 그래서 이번에는 그와 같은 파라미터들을 추정하는 실험과정을 이야기할까 합니다. 






일단, 우리는 현재 정확하다고 믿는 동역학 모델을 가지고 있고, 또 실제 기구부도 완성이 된 상태로 이때 사용하기 참 편한것이 파라미터 추정 (Parameter Estimation)입니다. 이 때 조심해야할 것은 적절한 실험을 어떻게 수행하는가... 이죠. 일단 전체 파라미터를 다 추정하는 것은 약간 어렵습니다. 그래서 기구부를


저렇게 거꾸로 매달아 둡니다. 바뀌는 굴러가지 않도록 고정하구요. 그러면, 마치 진자 (pendulum) 처럼 됩니다. 이 상태에서, 로봇 바디의 관성모멘트(J_m)와 바디와 모터축(기어포함)과의 마찰계수 f_theta를 구할 수 있게 됩니다. 여기서 하나 더, 저 바디 부분을 완전한 음.. 그러니까.. 완전한 균일한 질량 밀도를 가진 막대로 볼 수 없습니다. 무게중심이 바디의 센터에 있다는 보장이 없는거죠.



그래서 제가 이번 실험에서 추정하고 싶은 것은, 로봇바디의 관성모멘트 J_m과 로봇바디와 모터축 사이의 마찰계수 f_theta, 회전중심축과 무게중심사이의 거리 l 입니다. 

이 실험을 위해서 


이런 진자의 동역학


을 이용합니다. 즉, 위 실험처럼 밸런싱로봇을 뒤집어서 일정한 높이에 놓고 자유운동을 시키면 위 동역학대로 움직인다는 거죠. 그럼 그 실험데이터를 가지고 질량 m과 중력가속도 g는 알고 있으니, J_m, f_theta, l을 찾을 수 있다는 겁니다.

실제 실험은 10회를 수행했습니다. 그리고 모터에 내장된 엔코더를 이용해서 회전각도를 시리얼통신으로 PC에 전송시켜 저장합니다. DSP 쪽 코드는 엔코더 해석에 시리얼 전송 기능 뿐이라 생략합니다.^^


그 데이터를 시리얼 통신으로 받았구요. 10개의 데이터를 하나하나 열어서 약간 편집을 해줍니다. 뭐 코드를 잘 짜고 실험환경을 잘 맞추면 원샷에 처리할 수 있지만, 그냥 10번만 할거라서 약간 노가다(^^)를 뜁니다...


저 데이터가 한번 실험한 건데요. 각도를 측정하는 엔코더가 인크리멘탈형이라서 첫 위치를 '0'으로 봅니다. 그래서 일단 0도에서 손으로 일정부분까지 들어올립니다. 그리고 놓는 거죠. (x축은 데이터 갯수를 의미합니다. 시간이 아니라요.) 그래서 저 빨강박스 부분은 실제 자유운동을 한 부분으로 보고 잘라냅니다. 이걸 다른 실험에도 똑같이 적용하는 거죠.

그리고, MATLAB이 제공하는 Parameter Estimation Toolbox를 사용합니다. 그에 관한 설명은

에서 자세히 다루었기 때문에 생략하겠습니다.




10번의 실험 결과를 이용해서 파라미터를 추정한 결과를 평균했을때


이런 결과를 얻었습니다.

무게중심까지의 거리는 0.2241이고, 마찰계수 f_theta는 0.2707, 관성모멘트 J_m은 0.1916이라고 하는 군요. 


위 그래프에서 파란선들은 10번의 실험 데이터들이구요. 그래서 추정한 파라미터를 동역학 모델로 Simulink로 시뮬레이션한 것이 빨간선입니다. 이쯤되면 만족스럽다고 할 수 있을 것 같습니다. 이제 이렇게 추정한 데이터는 확정을 짓고, 

의 결과식에 나와있는 나머지 파라미터들을 찾으로 가야지요^^

http://pinkwink.kr/trackback/319 관련글 쓰기
  • 클라리사 2010/06/01 20:27

    책 어렵겠다고 하시믄서 ㅎㅎ
    이건 뭐임? 완전 외계어~~~

  • 핑구야 날자 2010/06/02 21:33

    무게 중심을 잡은게 어려운 문제군요,, 역시 보기에는 복잡하지만..

    • PinkWink 2010/06/03 00:35

      사실... 저도 할때마다 아직도 많이 혼돈됩니다.
      저한테도 어려운 부분입니다..ㅠㅠ

  • 박진원 2010/06/03 22:27

    대단하세요.. 핑크윙크님.. ^^;
    머리도 좋으신거 같구, 노력도 많이 하시는거 같아요 ^^
    저도 중심 잡는것에 관심이 많아서요.. ^^
    뭐, 아는건 없지만.. ㅠ
    암튼 대단하세요~ 핑크윙크님 ㅋㅋㅋ

    • PinkWink 2010/06/03 23:47

      중심잡는건 참~~~~ 중요한것같습니다. ㅎㅎㅎ^^

  • 돼지돌이 2010/06/30 18:48

    혹시 이번에 강좌하시는건, PDF로 만드실 의향이 없으신지 ㅎㅎㅎ;;; 동역학 공부좀 해야 겠습니다;;; 이런 모델링에 관한것들은 열심히 공부해서 찾아 내시고.... 나름대로의 노하후가 쌓이신 거겠죠?! ㅠ.ㅠ 이 게으름을 이겨내고 동역학의 달이 되고싶다는...

    • PinkWink 2010/06/30 23:34

      얘네들은 제가 공부하는 중간의 과정을 풀어놓고 있는 것이라, PDF로 만들지 않았습니다.ㅠㅠ
      정답이 아닐 수도 있다는 생각에서 말이죠...^^

  • 김현진 2010/07/04 20:13

    대단하십니다..ㅋ 이번에 박사졸업하시는 건가여?

    • PinkWink 2010/07/04 20:26

      하고싶은데 할 수 있을지 잘 모르겠습니다...ㅠㅠ

  • 김현진 2010/07/05 13:00

    따라해보려고 하는데 잘 추정하지 못하네요 ㅠ
    혹시 실험데이터의 샘플링레이트가 문제일까요?
    현재 100Hz로 데이터 저장했습니다.
    10개 데이터로

  • 김현진 2010/07/06 17:30

    새로 추정할때마다 추정치의 초기값을 바꿔줘야하나요?
    단진자 운동에 대해 위 실험을 해보는데 추정값이 너무 터무니없네요ㅠ

    • PinkWink 2010/07/06 17:48

      추정하고자하는 변수의 초기값은 참값에 근사할 수록 좋은 결과를 가집니다. 그리고, 시뮬링크상에서 진자를 들었다가 놓았을때의 각도상의 초기값도 1/s블럭에 넣어두셔야합니다. 그래야 그래프가 일치합니다.

  • 김현진 2010/07/06 18:02

    예 초기값은 그렇게 설정해주었습니다.
    저의 경우에는 회전축과 무게중심과의 거리를 알아서 l 에 대해서는 추정하지 않고 샤프트 마찰계수와 관성모멘트를 측정하려고 하는데여
    진자움직임이 너무 빨라서 그런건지 제가 모델을 잘못구성한건지 ㅠ
    사용자 정의 함수에
    -((m*g*l)/J)sin(u(1))-(f_theta/J)*u(2) 요렇게 작성했거든요
    (u(1) : theta , u(2) : dot_theta)
    너무 답답합니다 ㅠ

    • PinkWink 2010/07/07 11:30

      보통 이런 문제는 조금 어이없는 곳에서 발생하는 경우가 많으니... 꼼꼼이 체크를 해보시는 것 뿐 방법이 없어보이는데요.

  • 다질문 2010/07/19 19:52

    동역학 포스팅을 보니 M과 m이 따로 있던데 그 둘은 어떻게 질량을 측정 하셨나요?? 그리고 여기선 m만 고려해주는 거 같은데 어떻게 측정하셨나요??
    이걸 무시한채 그냥 통째로 다 질량을 측정해서 파라미터를 구해도 무관한지 궁급합니다 핑크윙크님 ㅎㅎ

    • PinkWink 2010/07/19 20:30

      바퀴를 빼고 나머지 무게 전체가 m입니다.
      역시 바퀴만 빼고 나머지 관성이너셔 모두를 J라 두었습니다. 이 글에서 사용한 동역학은 단지 바퀴를 뺀, 모터를 포함한 전체 이너셔와 무게중심을 구하기 위해서입니다. 무게야 저울로^^.

      그러나, 다시한번 말씀드리지만, 만드는 과정을 동시에 보여드리는 것이어서, 약간 옆가지로 빠졌습니다. 글 제일 위에 목차대로만 확인하시면 됩니다.

  • 다질문 2010/07/19 20:53

    아하 그렇군요.. 그렇다면 한가지만 더 질문할께요...
    손으로 들어서 엔코더값을 받아오셨잖아요.. simulink 돌릴때는 입력block을 step input block을 써서 시뮬링크를 돌리셨어요??
    그리고 import data할때 엔코더 그래프에서 빨간색 부분만 짤라서 넣으셨어요??? 그것이 궁금합니다 핑크윙크님 바쁘신데 계속 질문 많이해서 좀 송구스럽지만...ㅎㅎ

    • PinkWink 2010/07/19 20:56

      아니요.. 위의 그래프에서 잘라낸 부분의 첫 값이 초기치이고, 1/s 블럭에서 theta를 의미하는 제일 오른쪽 1/s블럭의 초기치에 그 값을 넣어줍니다. step input 블럭은 넣으시면 안될겁니다.

  • 다질문 2010/07/29 21:39

    텍스트파일의 데이터가 2555X1처럼 되어있는데요.....이럴 때 Data 탭에서 column과 Time/Ts 탭에서 column을 어떻게 적어줘야하는지궁금합니다. parameter estimation포스팅을 봤었는데 이해가 안가서 여기저기 찾아봤는데 잘....여기서 column이 어떤 의미이길래...

    • PinkWink 2010/07/30 05:03

      시간축을 만들어 줘야합니다.
      그렇게 만들어진 행렬을 시간탭에 넣어두고
      입력/출력 데이터를 import시키면 되죠...

  • 다질문 2010/07/31 14:02

    아~~~ 텍스트파일을 만들어줄때 저 위의 그래프는 출력 데이터가 되고, 시간축을 만들어줄때 그냥 1부터 데이터갯수만큼 차례대로 증가시켜서 만들어주면 되고, 입력은 한개만 스텝입력이 되게끔 텍스트파일을 만들어주면 된다는 말씀이신가요?

    • PinkWink 2010/08/01 05:37

      텍스트화일이 아니라하더라도, 그냥 샘플링 타임을 아니까 그 크기를 이용해서 시간축을 만들면됩니다. (어떻게든 말이죠^^)

  • 다질문 2010/08/04 14:18

    파라미터를 구하긴했는데요... 구한 파라미터를 가지고 확인해볼려고 하니까 그래프 모양은 똑같은데....제가 원하는 모양은 초기값에서 진동해서 0으로 수렴해야하는데 초기값에서 위로 진동해서 초기값보다 큰 값으로 수렴하더라고요..... 이게...제가 블럭선도를 잘못그려서인가해서요... 입력은 없는 시스템에 1/s블럭의 초기값만 설정해놓으셨어요???

    • PinkWink 2010/08/04 15:39

      입력을 '0'으로 넣어도 되고, 안넣어도 될겁니다.
      저는 그냥 '0'으로 넣었습니다. 자유운동이니까요^^

  • lunefey 2010/08/06 01:02

    로봇에 관심이 많은 대학생입니다. 동역학에 미쳐서 -_-; 이번학기에 자동제어 들어서 관련자료 찾다가 들어왔는데 ㄷㄷㄷ....경이롭네요. 필요한 요소 뽑고 조합하는데 도가 트신 듯합니다. 박사과정이신가요? 학부면 ㄷㄷㄷ

    • PinkWink 2010/08/06 07:38

      네.. 아직도 졸업하지 못한 박사과정이랍니다..ㅠㅠ
      사실 약간 이상하게 들릴진 몰라도
      공부하면서 재미있는 분야랍니다.
      그리고, 공부한만큼 가시적인 성과도 정확하게 나오는..^^
      하여간.. 좋은 공부하시길 바랍니다.^^

  • 다질문 2010/08/24 15:22

    기구부를 도중에 살짝 바꿔서 다시 이 작업을 해보니, 값이 조금 터무니없고 일관성을 가지지 않아서 그런데요...
    모터의 마찰계수 fm이나, 로봇 바디와 모터축 사이의 마찰계수 f_theta가 매우 작을 경우에는 이럴 수도 있는건가요?? pinkwink님처럼 마찰계수가 크면 파라미터들이 조금 일관성을 가지나요??

    • PinkWink 2010/08/24 18:21

      그렇지 않습니다. 물론 저도 낮은 전압에서는 약간 불안정한 모습을 보이지만, 높은 전압에서는 꽤 신뢰성있는 수치나 나타나고, 그건 마찰계수가 높다든지 낮다든지와는 큰 차이는 없습니다... 그러나... 기구부를 직접 제작하시는 경우는 기구부의 문제일 수도 있습니다. 바퀴와 모터를 잇는 축이 약간(눈으로는 잘 보이지 않을수도) 사선으로 결합되었다든지, 혹은 바퀴를 달고 테스트를 하시는 거라면, 바퀴의 무게분포.. 음.. 그냥 밀도라고 하죠.. 밀도가 고르지 않다든지.. 무게중심이 회전중심축과 일치하지 않는다든지하는 것들???
      그러나 말씀하신것만으로는 어떻다 명확히 답변드리는것은 무리가 있음을 또 알아주시길 바랍니다.^^

  • 질문좀 2014/02/12 17:33

    pinkwink님의 글을 보고 밸런싱 로봇을 공부하는 학부생입니다.
    파라미터를 추정 중에 J_m값이 이상하여 질문드려요ㅠㅠ 정의 함수는 (-m*g*l*sin(u(1))/(J_m+m*l^2))-(f_theta*u(2)/(J_m+m*l^2)),(u(1) : theta , u(2) : dot_theta)로 정의 했고요. 1/s블럭에 초기값도 동일하게 설정했는데
    J_m의 값이 음수(-)로 결과가 나왔습니다. 제가 알기론 J_m은 절대 음수가 될 수 없는 것으로 알고 있는데요.어떻게 하면 J_m값이 제대로 나올 수 있을까요?ㅜㅜ

    • PinkWink 2014/02/13 09:03

      부호에 대해 좀 더 생각해보셔야하며, 특히 각도의 방향(+-) 설정은 올바른지 확인하셔야합니다.

      음이 되는 순간 각 변수의 값을 체크하시다 보면 나타날수없는 값을 가지는 변수를 발견하게 되는데, 그걸 중심으로 수식을 다시 역으로 따라가다보면 틀린부분을 찾던지 혹은 잘못된 코드를 찾던지 되더라구요^^