본문으로 바로가기

이제 기나긴 밸런싱 로봇 만들기 연재를 완결지어야겠습니다.^^. 성질 급하신 분들은 제일 아래 동영상을 먼저 보고 오셔도 됩니다.^^ 제가 만든 방식대로 따라하실려면 이 글에서 제가 링크를 건 모든 문서를 읽어보시길 권장합니다. 왜냐하면, 이번 연재는 실제로 로봇을 만들어가면서 작성된 글이기 때문에 제가 실수하거나 의문이 들었던 부분들도 모두 들어있고, 다시 그 실수나 의문을 해결해가는 과정도 있기 때문입니다. 또한, 단순한 기초지식은 다루지 않았습니다. 특히, 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 기초 연재할때는 진도가 잘 나가길래 아무생각없이 이번연재를 수행했다가 생각보다 진도가 나가지 않아 죄송스럽습니다. 다음 부터는 연재할때 좀 생각하면서 해야겠어요...^^ 

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


댓글을 달아 주세요

  1. 이전 댓글 더보기
  2. Majing 2015.05.07 16:35 신고

    현재 소스 인사이트라는 툴을 이용해서 소스를 짜고 있는데요
    txprintf를 뿌려지는 값을 이용해서 각 파라미터들의 방향을 다 확인을 했고요
    psi값과 엔코더 각도값을 비교해봤을때 보상필터의 약간의 드리프트 현상은 보이지만 센서값은 linear하게 나옵니다... ㅜ 공중에서 각도를 앞뒤로 기울이면서 R_VOL , L_VOL , pwm에 들어가는 값들을 보면 지연이 그렇게
    심한것은 아닌데요 바닥에 실제로 놓고 모터를 가동시켜서 theta값이 기울어지는것에 따라 변할때 dot_theta값이 상당히 크게 한번 나오면 pwm값이 제가 막아놓은 max 값에 도달해서 계속 max값으로 바퀴가 도는 현상이나타나더라고요....
    그래서 제어기값을 핑크윙크님처럼 theta에대해서 굉장히 적게 주면 max값으로 바로 도달하는 현상은 없지만
    균형을 잡지 못하고 계속 쓰러지네요 .....
    그리고 핑크윙크님은 pwm값을 그냥 넣으시던데 저같은 경우 pwm TBPRD는 2000이고
    실제로 로봇을 바닥에 두었을때 바퀴가 움직이는 PWM은 100정도구요...
    그래서 dot_theta에 값의 변화를 줄여보기 위해서 인터럽트 주기를 10ms 늘려서 해보고있는 중이긴한데
    theta값에서 뭔가 이상한게 아닌가하는 생각이 드네요 ㅜ

    • BlogIcon PinkWink 2015.05.08 13:07 신고

      그리고 theta가 기울어지는 것도 있긴하자민...
      부호는 모든 상태를 궤환해서 계산되는 제어 입력에 의해 결정되어야합니다.
      예전에 보니 누구는 자이로의 부호를 바로 모터 가동 부호로 보던데.. 그러면 안되요...
      그리고.. 제어입력의 정도 R을 높여서 낮춰보고 주요 상태의 가중치를 변경해보는 것이 더 좋을 듯 합니다.

  3. 갱해이 2015.05.08 00:47 신고

    안녕하세요. 핑크윙크님~
    이제는 어느정도 넘어지지 않을려는 움직임이 보입니다.
    근데 제어를 하다가 궁금한 것이 생겨서 다시 이렇게 글을 올립니다.
    1. theta의 값이 로봇이 제자리에 가만히 있기 위한 제어변수인데, theta입력값을 엔코더로 결정을 하는데
    이 값이 -360~360( 각도로 표현할 경우 )의 범위인지 아니면 바퀴가 회전할때마다 계속해서 누적을 하는건지,
    혹은 0~360(각도로 표현할 경우)의 범위인지 궁금합니다.
    우선은 -360~360의 범위로 제어를 하고 있는데 이렇게 되면 바퀴가 한바퀴 이상이 될경우 로봇의 위치 제어가
    불가능한게 아닌지..
    2. theta의 방향이 여전히 궁금합니다.
    저는 우선 게시물의 그림처럼 제어변수의 방향을 설정해놨습니다.
    그래서 psi와 theta의 방향이 일치하게 됩니다. 근데 psi와 theta의 방향이 같을 경우 LQR GAIN값이 pinkwink님처럼 6개의 값이 모두 음수가 뜹니다. 근데 여기서 생각을 해보면 기울어진 각도에 의해서 바퀴가 회전을 하면, psi에 의해서 theta의 값이 커지게 됩니다. 이렇게 되면 세그웨이가 다시 위치를 찾아올수가 있을지...의문입니다. 현재 저의 로봇은 어느 정도 넘어지지 않으려 하지만 한쪽 방향으로 쭉 가게 되는 현상이 일어납니다...

    pinkwink님 덕분에 여기까지 세그웨이를 제작하게 되었네요 ㅠㅠ감사하게 생각합니다.
    열심히 마무리해서 좋은 세그웨이 만들도록 하겠습니다.

    • BlogIcon PinkWink 2015.05.08 13:11 신고

      일단 theta를 이용해서 로봇의 이동 거리를 잡는 것은 360도 이후에 계속 커지게 해야합니다. 그리고... 한 쪽으로 흐른다는 것은 로봇의 이동 변위인 theta측 가중치를 높이거나 점검해보셔야할 듯 합니다. 그래도 이정도까지 진행하셨다면 엄청나게 애를 쓰신건데.. 대단하십니다.^^

  4. Majing 2015.05.09 21:10 신고

    핑크윙크님
    아무래도 제 하드웨어가 핑크윙크님꺼보다 작기도 하고 기어비가 일단 3.8: 1 이기 떄문에
    공중에서 모니터링을 하면 바퀴가 한번 돌면 계속 theta값이 커져서 바퀴가 제가 막아놓은 max pwm까지
    증가했었는데 바닥에 놓고 각각의 파라미터에 대해서 가중치를 조절하다 보니 이제는 제법 잘서게됬네요
    좋은 연재 덕분에 세그웨이를 만들수 있었네요 ㅎㅎ

    • BlogIcon PinkWink 2015.05.10 10:17 신고

      네.. 일단.. 음
      여하튼.. 제가 뭐 딱히 도와드런건 없지만...
      그래도 잘 되었다니.. 아주아주.. 축하드립니다.^^

  5. 갱해이 2015.05.14 04:48 신고

    안녕하세요. pinkwink님
    순간의 실수로 기어가 아작나고.. 황동으로 다시 기어,피니언을 제작해서 4:1의 기어비에서 10:1의 기어비로 바꿨습니다. 현재 게인값을 찾고 있는중인데. psi와 dot_psi로는 어느정도 직각으로 선 상태에서 이동하는 걸 확인하고 theta, dot_theta값을 바꾸고 있습니다. 근데 http://blog.naver.com/climax701 ( 이제 시작한 제 블로그입니다..)에 동영상처럼 발산되는 움직임을 보이고 있는데... 어떤식으로 게인값을 조절해야 할 지 모르겠습니다.. 조언좀 부탁드리겠습니다.

    • BlogIcon PinkWink 2015.05.14 15:36 신고

      일단 로봇의 전진방향의 게인 설정이 좀 낮을 수 있습니다.
      그걸 좀 높이고...
      전체 적인 제어 입력을 살짝 높여보는게 어떨까요????^^
      그나저나.. 로봇이 엄청 귀엽네요...

    • 갱해이 2015.05.15 01:00 신고

      안녕하세요. pinkwink님..
      전진방향의 게인값이.. psi값 말씀하시는건가요..
      도저히 k1,2,3,4번을 바꿔봤는데.. 도통 감이 안오네요..
      어떻게 설정을 변경해야할지...모르겠어요..
      저렇게 발산하면.. 어떤 게인값을 바꿔야하는지..
      조금만 더 자세히 말씀해주시면.. 감사하겠습니다..ㅠ

    • BlogIcon PinkWink 2015.05.15 12:57 신고

      혹시 방향을 전환할때 바퀴의 미끄러짐 현상은 없나요???
      또 혹시 로봇이 기울어지는 각도는 정상적으로 보이나요???

    • 갱해이 2015.05.16 03:43 신고

      http://blog.naver.com/climax701/220360968416
      안녕하세요 pinkwink님!!
      구간평균법을.. 제가 무시했었습니다..ㅠㅠ
      그래서 구간평균법을 사용해서 게인값조절을 하니까
      중심을 드디어 잡긴 잡네요.!
      이제 phi를 건드려봐야겠어요.!! ㅎㅎ
      감사합니다!

    • BlogIcon PinkWink 2015.05.16 09:08 신고

      어이쿠~~ 축하드립니다. ㅎㅎㅎ
      뿌듯하시겠어요... ㅎㅎ^^

    • 갱해이 2015.05.16 20:28 신고

      아녜요~ pinkwink님 아니였음.. 꿈도 못꿧을껍니다..
      정말 감사드립니다. ㅎㅎ
      근데 이제 phi값을 맞추고 있는데.. phi게인값을 어떻게 조정해야할지
      감이 잘 안옵니다.. k2-1값을 올려버리면 45도정도 이상 로봇을 움직이면 홱~ 돌면서 뻑이나고.. 값을 낮게줘버리면 변하는 시간이 너무나 오래걸리고.. 그 중간값을.. 찾기가 어려워서.. phi값 맞추는 팁(?);이라 할까요.. 조언좀 부탁드립니다..ㅠ
      아.. 영상은.. 블로그http://blog.naver.com/climax701/220361468193에.. 올려두긴 했습니다.ㅠㅠ
      동영상에서는 손으로 전방,후방을 손으로 움직이게 해주면 phi값이 0이 되어지는데 가만히 내버려두면 얘가 어느 선에서 더이상 움직이지가 않습니다ㅠ

    • BlogIcon PinkWink 2015.05.17 11:02 신고

      일단.. 여러 실수나 혹은 뭔가 이상한 점이 없다는 가정하에...

      밸런싱로봇처럼 불안정한 아이에게 불안정하지 않는 다른 상태라도 갑작스런 변화를 유도하는 지령은 무리할 수 있습니다.

      45도를 회전하라고 할때.... 순차적으로 이동하라는 것도 한 번 실험해 보시는 것이 어떨까요??

    • 갱해이 2015.05.17 17:18 신고

      sci인터럽트를 이용하여 키보드 입력값으로 회전 각도를 0.5도씩 조절하여 실험을 하였는데.. 계속 불안정한 자세를 보입니다....
      최종으로 phi = 0인 지점까지는 가지만 불안정한 증세는 여전하네요..ㅜ

    • BlogIcon PinkWink 2015.05.18 12:13 신고

      그렇다면... 살짝 초반부부터 확인이 필요합니다.
      예를 들어...
      바퀴의 무게나 지름... 이라는 사소한 요소부터...
      phi를 담당하는 상태의 가중치까지 확인 혹은 변경하면서 점검해야할 것 같습니다.ㅠㅠ

  6. Majing 2015.05.17 16:19 신고

    https://www.youtube.com/watch?v=cO9zm4k8OSw&feature=youtu.be
    제가 만든 세그웨이에 SCI 인터럽트를 이용해서 조종까지 넣은 동영상을 찍어서 올려봤습니다.
    이블로그에 동영상 올리는 방법을 잘 몰라서요 ;;

  7. YUK 2015.05.17 16:26 신고

    https://www.youtube.com/watch?v=cO9zm4k8OSw&feature=youtu.be
    블루투스 연결로 노트북으로 조정하는 것까지 추가해보았습니다.
    많은 도움을 주셔서 감사드립니다.
    위에는 저의 세그웨이 동작 동영상입니다.

    • BlogIcon PinkWink 2015.06.06 12:36 신고

      아이쿠 저런 어쩌다가 스팸 필터에 걸려서 댓글이 표시가 되지 않았더군요.. 저런.. 요즘.. 티스토리의 필터 능력이 좀 많이 아쉽습니다.ㅠㅠ.
      그나저나 잘 보았습니다. 멋있네요~~~^^ 정말 재미있게 잘 보았습니다.^^ 그리고 축하드립니다.^^

  8. 유수민 2015.06.25 16:44 신고

    안녕하세요 pinkwink님 덕분에 졸작을 순조롭게 진행하고 있습니다!
    궁금한점이 하나 있는데요~ 동역학설계는 LQR 피드백 이득게인K를 구하기 위한 것이어서
    C코드에는 동역학 설계한 부분이 안 들어가도 되는건가요?
    아 그리고! theta, phi,psi 는 deg가 아니라 rad값으로 계산되야 하는건가요?

    • BlogIcon PinkWink 2015.06.25 17:39 신고

      네.. 시뮬레이션으로 위해 동역학이 필요했구... 이제 게인들만 있으면 되죠.. 당연히 radian 기준입니다.^^

  9. 신대섭 2016.01.13 16:30 신고

    안녕하세요. 밸런싱 로봇 만들고 싶어서요....혹시 자세하게 문의할 것이 많아서요...메일 주소좀 알려줄수 있나요? 공개 글보다는 메일로 질문을 드리고 싶어서요...부탁드립니다. .ds2fwz@hanmail.net 입니다. 수고하세요..

    • BlogIcon PinkWink 2016.01.13 19:56 신고

      네.. 메일은 제가 진지하게 읽어볼만한 시간적 여유가 없답니다.
      일단 간단하게 댓글로 먼저 질문을 하시는게 어떨까요?

  10. 밥이대세다 2016.02.15 14:52 신고

    작년에도 오래된 글에 달린 댓글에 자세히 답변해 주셔서 감사합니다^^
    이 블로그를 보고 동역학 모델이 뭔지도 모를 때 부터 참 많이 배워갔습니다 ㅎㅎ
    지금도 계속 역진자 로봇을 제작하고 있는데요.
    시뮬레이션을 이용하여 모터를 선정하고 싶은데, 제어기에서 나오는 힘이나, 무게 등의 단위를 맟추는게 힘들더군요..
    혹시 지금 하신 로봇에서 각 제원들의 단위나 힘(동역학 모델을 세울당시의 힘)의 단위에 대해 알려 주실 수 있으신가요??

    • BlogIcon PinkWink 2016.02.15 15:29 신고

      네.. 힘들 수 있습니다.
      일단 수식을 토크에 대한 식에서 멈추는 것이 좋습니다. 그러면 시뮬레이션에서 토크관련된 부분을 그래프로 보기 편한데요. 이 때 그 결과를 보고 기어비를 고려한 모터 토크를 확인해 볼 수 있습니다. 여기에 간단히 안전계수를 곱해서 잡을 수 있죠.
      또한 다시 모터를 전압까지 확대해서 모델링한 것을 시뮬레이션을 하면서 전류치도 확인해보실 수 있습니다.
      뭐 당연하지만.. 따로 할 것 없이 확인할 수 있기도 하구요. 아무튼.. 토크와 전류, 모터의 속도 등등을 확인해서 선정하셔야할 합니다. 그리고 이 과정은 생각보다 clear 하게 진행되지 않는답니다.ㅠㅠ

    • 밥이대세다 2016.02.15 16:55 신고

      많이 힘든 여정이 계속되고 있습니다..ㅎㅎ 전 한번도 로봇을 만들 때 이런것을 고려해본적이 없어서 더 애로사항이 많니요 ㅎㅎ(무조건 큰 모터사서 달아버렸다는..ㅎㅎ)
      여기서 문제가, 일단 토크에 대한 식에서 동역학 모델링을 마치고 그래프는 얻었는데요. 이 토크의 단위가 kg.m인가 N.m인가도 햇갈리는 지경입니다...ㅎㅎ 일단 시뮬레이션에서 무게는 모두 kg으로 계산을 하였고, 길이는 모두 m로 하였으니 그래프에서 나오는 토크의 단위는 kg.m라고 봐도 무방하겠죠? 참... 기초가 없으니 이렇게 힘이듭니다 ㅎㅎ

    • BlogIcon PinkWink 2016.02.16 10:18 신고

      아... 그 부분은 저도 처음 시뮬레이션이라는 것을 할때 엄청 고생하고 힘들어했던 부분입니다. 그리고 누구나 다 힘들어 하는 부분입니다.^^
      일단 직접 전개하신 수식에서 단위를 찾으셔야합니다. 그 수식대로 시뮬레이션이 된 것이니까요. 전개된 수식을 놓고, 라디안, 미터, 키로그램, 등등의 기초 단위들을 확인하시다보면 단위를 "내가" 어떻게 정해서 시뮬레이션을 했는지 알 수 있게 됩니다.

  11. 2017.02.20 23:46

    비밀댓글입니다

  12. 아재7 2017.03.14 23:37 신고

    안녕하세요 그 차분에 대한 영향을 낮추기 위해서

    5개의 값 받고 밀어내는 식으로 하여 나누기 평균값이용햇자나요

    5개가 아닌 10개로 해도 무관한가요 ?

    아니면 시스템의 속도에 지장이 갈거같나요 ?

    의견이 궁금합니다!

    • BlogIcon PinkWink 2017.03.15 09:19 신고

      moving average라고 합니다만, 그 구간에 대한 만족은 설계자가 결정해야할 부분입니다. 넓게 잡을 수록 time delay가 발생하게 되는데 이를 어디까지 허용해도 될지는 상황에 따라 다르거든요.

  13. 성공을위함 2017.03.15 10:03 신고

    안녕하세요~

    모터에 대해서 궁금한게 있는데요~

    모터의 토크가 벨런싱에 영향을 줄까요 ??

    예를 들어 토크가 쎈 놈이 토크가 약하고 회전이 빠른놈 보다 벨런싱 잡기 더 쉬울까요 ?

    • BlogIcon PinkWink 2017.03.15 17:11 신고

      적용가능한 범위에서 토크와 스피드와 모터의 크기는 서로 많은 연관관계가 있어서 완전히 극단적인 대답을 할 필요가 없어보입니다.
      동역학 식을 보시면 아시겠지만, 토크와 스피드 모두 중요합니다.
      그 둘이 모두 제어가능한 범위에 있어야겠지요..

    • 성공을위함 2017.03.16 09:20 신고

      넵 핑크님 말씀고맙습니다 .

      그럼 핑키님 경험으론

      토크가 쎈 놈과 빠르기가 빠른 놈
      (토크가 빠르기 반비례란 가정하에)

      둘 중 어느게 벨런싱 잡는게 편했나ㅣ요 ?

    • BlogIcon PinkWink 2017.03.16 10:31 신고

      잘 모르겠습니다.
      그저 적절히 사용해서...

    • 성공을위함 2017.03.28 14:15 신고

      핑크님!
      위에서 (dot_psi)를 구하실 떄

      gx 에 Gyros 라는 것을 곱해주었던데 곱해주는 이유가 무엇인가요?

    • BlogIcon PinkWink 2017.03.28 17:33 신고

      자이로의 스케일팩터로 데이터시트에 있습니다.

  14. 해봅시다 2017.04.03 22:00 신고

    핑크님

    제가 예쩐 핑크님의 댓글 중에서

    바퀴가 굴러가기 시작하는 시점을 0V로 잡고 제어를 하란 글을 봤는데

    통 찾을래야 안보이는 군요 ..

    다시 설명좀 해주실 수 있나요 ?ㅠㅠ

    • BlogIcon PinkWink 2017.04.04 10:37 신고

      전압을 0.1V를 줘도 움직이지 않는다면.. 천천 전압을 증가시켜서 예를들어 0.35V에서 움직이기 시작했다면... 거기를 0V로 보아야한다는 뜻이었습니다.
      결국.. 제어입력에다가 0.35V를 더하거나 (부호가 반대라면 -0.35V를 더하는 것으로) 보는 실험도 말씀드린 적이 있습니다.

  15. 해봅시다 2017.04.03 22:12 신고

    LQR 명령어를 통한 게인을 구한 후 어느정도 계속해서 게인값을 튜닝해주는 것은 필요한가요 ?

    엄청 크게도 튜닝값 변경이 필요한가요 ?

  16. 건건 2017.05.05 12:53 신고

    안녕하세요 글 잘보고 있는 학생입니다. 저는 세그웨이 대신 볼봇을 만들고 있습니다.
    https://www.youtube.com/watch?v=HvqNE6d7hRI
    영상입니다. 핑크윙크님이 NXT사의 세그웨이를 했던것을 보고 같은회사의 제품인 ballbot문서를 참고하여 제작하게 되었습니다.
    아직은 외력에 버티지못하는 상황인데 조언 부탁드립니다!
    타이머 인터럽트 주기는 10ms이고
    센서는 IMU를 썼습니다.

    • BlogIcon PinkWink 2017.05.10 13:30 신고

      우와~ 멋진데요~~ 대단하십니다.^^ 즐거운 공부중이시네요^^
      그나저나...
      화면을 볼때... 제자리 회전(yaw)에 대한 제어가 잘 되지 않는듯 하네요...

      그리고, 기구적 문제(옴니휠과 볼과의 적잘한 마찰 등)로 접근하기 전에...

      기울어지는 각도 2개, 제자리 회전 각도 1개, 로봇이 평면상 움직이는 거리에 대해 2개, 총 위치 개념의 상태가 5개, 이걸 미분한 상태까지 합하면 총 10개의 상태를 제어하고 있는 것이 맞나요?^^

    • 건건 2017.05.13 02:01 신고

      제자리 회전에 대한것은 nxt문서에 없더라구요....
      현재 기울어지는 각도 2개(roll, pitch)
      로봇이 평면상 움직이는 거리 2개
      이렇게 해서 총 위치개념의 상태 4개
      이걸 미분한 상태 4개 해서
      8개로 제어하고 있습니다.
      그리고 현재 모터의 성능이 좋지않아서 제어가 잘안된다고 생각하고 있습니다. 토크는 높지만 알피엠은 50입니다.....
      그리고 yaw는 공에대한 yaw와 로봇자체에 대한 yaw를 각각구해서 공이 움직이지 않게(공의 yaw =0), 로봇이 yaw로 움직이지않게(로봇의 yaw =0) 제어해야될것 같은데 nxt논문에는 서술되지않아서... 다른논문을 봐봤는데 무슨말인지 이해가 잘가지 않더라구요..그래서 yaw 제어는 포기하고 진행했습니다.

    • BlogIcon PinkWink 2017.05.13 09:00 신고

      nxt의 문서는 yaw에 대한 제어가 기술되어 있습니다. 지금 기준으로 roll이 없겠지요...
      아무튼.. 모터가 성능이 나쁘다는 것은 어떻게 아셨나요?^^
      모터측 속도그래프나 인가된 전압그래프를 보고 한계점을 찍는지 그래서 부족한 것인지 확인해보실 필요가 있습니다. 공이 지름이 커서 모터측 힘과 속도가 필요해 보이긴 하네요^^
      즐거운 작업을 하고 계셔서 제가 다 부럽습니다.^^

    • 건건 2017.05.13 14:19 신고

      볼봇 nxt문서에는 yaw에 관한게 없다는거였습니다! 모터에대한 조언 감사합니다!

    • BlogIcon PinkWink 2017.05.15 07:26 신고

      아.. 네.. 제가 본 nxt를 이야기하는줄 알았네요... 볼봇nxt 문서가 있는진 몰랐네요(하도 오래전이라..ㅠㅠ) 아무튼.. 재미있는걸 하시는게 부럽습니다. 화이팅입니다.

  17. 하이람 2017.09.09 01:41 신고

    안녕하세요 PinkWink님.
    밸런싱로봇을 만들고 있는데 pid제어에서 너무 정교하지 못하게 제어가 되는거 같아서 PinkWink님과 같은 lqr로 한 번 도전해 보려 합니다.
    몇가지 질문이 있는데...

    1. phi를 구할때 352줄에 *0.06/0.22는 무엇을 의미하는 건가요?

    2. 마지막에 volt_r과 volt_l을 구하셨는데
    이제 이걸 pwm %로 계산해서 모터에 인가하신게 맞으시죠?

    3.밸런싱로봇의 전달함수를 구하고 싶은데 동역학적 지식이 필요하네요.
    구글에 검색해도 동역학적으로 전달함수를 구하는 공식이나 방법을 찾을
    수 없어서 그런데 검색하면 나올 키워드가 따로 있을가요?

    • BlogIcon PinkWink 2017.09.11 09:17 신고

      넵.. volt 결과를 pwm에 맞춰 입력하도록 하고 있습니다. 그리고 말씀하신 그 숫자는 이제 저도 기억이 안나네요ㅠㅠ. 너무 오래전이라^^

    • 하이람 2017.09.11 20:05 신고

      앗. 그렇군요...

      그렇다면 음...PinkWink님 혹시나...
      phi가... 왼쪽 오른쪽 엔코더의 펄스값이 같다. 즉 모터2개가 서로 같게 돌아서
      352줄에 phi= 0; 이라고 강제적으로 코딩을 해버리면 u(2)는 0이 되고...

      결론적으로 u(1) / 2; 만 각 모터에 인가되서 될텐데...

      1. phi=0;이라고 강제적으로 못박아도 밸런싱 동작에는 영향이 없을까요??
      (YAW회전 상관없이... 오직 밸런싱..)

      2. 344줄 코딩을 보면
      엔코더의 펄스 개수만 필요하고 각 모터의 정방향 역방향은 알아야 할 필요가 없어 보이는데...
      제가 생각하는게 맞나요?
      엔코더로 오직 방향 상관없이 pulse만 받아오셔서 사용한 것 같습니다.



      여건상 ATmega128로 진행하고... 엔코더 카운터칩 구하기가 어려워 고생하고 있네요... 흑



    • BlogIcon PinkWink 2017.09.12 10:41 신고

      제어할 필요가 없다고 판단되는 상태는 센싱받지 않으면 됩니다.
      그러나 로봇의 위치 로봇의 자세에 관한 상태를 제어하지 않으면 그 움직임이 이상해 집니다.
      그리고 엔코더는 펄스만 받은게 아니라 가감이 되기 때문에 방향을 알게 됩니다.^^

    • 하이람 2017.09.12 19:18 신고

      생각해보니 카운트의 증감이 방향을 알려줄 수 있었군요!
      조금 더 질문을 드리겠습니다.

      1.
      m=0.169kg
      수치로보나 동역학 유도 식으로 보나
      m은 바퀴 2개가 아니라 1개의 무게로 보입니다.
      m+m+M 이 로봇 전체의 무게가 맞나요?
      M이 모터와 커플링 축도 포함시키고 오로지 바퀴 2개만 제외한 무게라 생각합니다.

      2.
      저의 엔코더도 한바퀴에 13pulse입니다.
      위의 댓글에 13p라서 고생할것이다.
      그래도 기어비가 50이라서 다행일것같다.
      라고 되어있는데...
      아마 정밀도가 낮다고 생각하신거 같습니다.

      전 기어비가 14에 체배를 안하고 계산하면 1바퀴에 13*14=182펄스
      즉 1펄스당 약 2도가 되는데
      이정도로는 밸런싱로봇에서 정밀도가 낮아서 체배를 해주는 편이 좋을까요??

      2도면 정밀도가 충분하다고 생각했는데 PinkWink님 댓글을 보면 한없이 부족하다고 생각이 듭니다.


    • BlogIcon PinkWink 2017.09.13 09:42 신고

      2도 단위로 측정한다는 말로 바꿔 생각하면 로봇의 바퀴가 실제로 1.2도 1.5도 일때는 0도인줄 알다가 2도가 되어야 2도인줄 안다는 건데요...
      레졸루션이 너무 낮지 않을까 걱정됩니다. 물론 저는 2도 정도까지 해본적이 없어서 성공하실 수도 있지만 말이죠.^^

  18. 하이람 2017.09.10 01:26 신고

    아 찾았습니다.
    도립진자를 응용해서 하는 방법이 있고 실험적으로 만든 로봇의 응답을 관찰하여 얻는 방법이 있군요...
    matlab에 pid 튜닝하는 기능이 있던데 여기에 로봇의 전달함수가 필요했습니다.
    도립진자 카트에서 전달수를 구하면 각도 전달함수와, 거리에 관한 전달함수 가 나오는데 각도 전달함수를 플랜트로 튜닝을 해보면 될 것 같습니다...

  19. 하이람 2017.09.15 23:33 신고

    컥. 앞전에 말씀드린 것처럼

    한쪽바퀴에만 엔코더를 연결하고 phi=0; 이라고 고정시켜놓으니
    역시 반시계방향으로 회전하네요... 엔코더 연결중입니다 ㅠㅠ...

    PiwkWink님 다른 댓글에 phi를 구하지 않으면 모터가 한방향으로 쭉 동작하는 현상이 생긴다고 하셨는데,
    처음에는 theta를 phi라고 잘못 쓰신줄 알았습니다.

    그런데 저도 지금 반시계 방향으로 돌다가 갑자기 한방향으로만 모터가 쭉 발진하는 현상이 생겨버리네요.

    phi는 단순히 yaw축 회전에만 관여한다고 생각했었는데 급발진?을 잡아주는 역할을 하는게 맞나요?

    • BlogIcon PinkWink 2017.09.18 08:24 신고

      뭐.. 정확한진 모르지만,
      몸은 잘 세워져서 0도를 유지해도 몸 자체를 한 쪽(앞뒤로든, 혹은 회전을 하든)으로 흐르게 하는 힘이 존재할 수 있습니다. 그래서 둘 다 제어를 해야하구요^^

  20. 하이람 2017.09.28 14:12 신고

    안녕하세요 PinkWink님
    이제 제 로봇에 대하여서는 시뮬레이션 결과가 아주 잘나오네요.
    그래도 제 로봇은 서지를 못하니...

    adc랑 pwm은 while문 에서 계속 수행하다가 10ms주기로 위의 타이머코드만 실행시키게 짜신거 같은데... 맞나요?

    그나저나 IDG300은 gx*scalefactor로 rad/s를 얻을 수 있군요...
    MPU6050은 계산해보니 gx/scalefactor*pi/180 을 해야 rad/s 가 나오네요.

  21. 하이람 2017.09.28 14:16 신고

    이제 dc모터의 pwm주파수를 찾아야 할 것같습니다...
    샘플링 타임이랑 똑같이 100Hz로 pwm을 발생시키니 로봇을 기울이는거에 따라 바로 모터가 도는데, 200Hz, 1KHz 등 주파수를 높이면 로봇을 30, 40도 기울여야 모터가 돌기 시작하네요... 그것도 약하게...

    다른 분들은 DC모터를 일반적으로 20KHz까지도 돌린다는데
    PWM 100Hz로 아주 느리게 돌리고 있으니....

    모터 최적주파수만 어떻게든 바꿔서 반응 빠르게하고,
    QR가중치 조절없이 바로 세우기라도 되었으면 좋겠습니다.

    졸업하기 참 힘드네요.

    • BlogIcon PinkWink 2017.10.12 02:14 신고

      음.. 제어 주기는 10kHz 정도라도 PWM은 높아야 합니다. 그리고 Q와 R을 조절해서 움직이는 적절한 값을 찾아야하구요^^