본문으로 바로가기

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

레고의 마인드 스톰의 문서를 확인한 이후, 밸런싱로봇의 동역학을 따라가보았었습니다. [관련글] 그 후, 허접한 마트에서 기구부를 구입하고, 모터의 파라미터를 도출했었습니다.[관련글] 이제, 나머지 파라미터를 구성하고, 모델을 선형화해서, 선형제어기를 구할려고 합니다. 그 후 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)을 변경해가면서, 제어기의 성능을 향상시키게 되겠지요.^^


댓글을 달아 주세요

  1. 이전 댓글 더보기
  2. 2016.11.28 23:51

    비밀댓글입니다

    • BlogIcon PinkWink 2016.11.29 13:02 신고

      위 동역학에 따르면...
      높이는 이너셔에 일차적으로 영향을 주고...
      이너셔는 필요로하는 힘에 관련됩니다.
      그리고 저는 메일로는 답변을 드리기 어렵습니다.ㅠㅠ

  3. 해보자해보자 2017.02.23 16:35 신고

    안녕하세요 ~

    위 글에서 보면 IMU 센서와 엔코더 센서 방향 고려하라 하셨는데 .

    같은 방향의 즉 반시계가 + 라 가정했으면 둘다 +로 되있는지 확인하라는 것인가요 ?

  4. 세그웨이123123 2017.02.23 22:56 신고

    안녕하세요. 핑크윙크님~
    시뮬링크를 통해서 구해진 게인 K 값에 대해서 질문하려고 합니다.

    구해진 값 K 에 대해서 각 K1 ,2,3,4 에 100씩 곱해주고 시뮬링크 실행시켜도 그래프는 동일 하게 나왔습니다 .

    결국 제가 곱해주는 값 100 은 게인이 달라진 거랑 같은 건데 구해진 게인 K 에는 모두 같은 숫자를 곱해주면 결과는 동일한건가요 ?

    두 개만 곱해줘도 발산하는 형태로 나오더군요..

    • BlogIcon PinkWink 2017.02.24 09:03 신고

      비율이 동일하면 거의 같은 결과가 나옵니다. 그러나, 제어입력부분을 그래프로 확인해보면 100배하셨다면 초반쯤에 아마 꽤 크게 (100배는 아니라도) 입력이 인가되고 있을 겁니다.

  5. 세그웨이123123 2017.02.26 01:06 신고

    안녕하세요 핑크윙크님.

    위에 답변 주신 것에 대해서 궁금증이 또 생겨서 질문드리려고 합니다 .

    U=-Kx 로 입력값이 들어가는데 U 값을 입력전압으로 나눠서 듀티 % 로 구해낸 뒤 듀티제어를 해줘야하는 건가요 ? 아니면 그냥 U=-Kx 그 자체로 Sys 에 모터 제어 입력값으로 이용하는 것인가요 ?

    • BlogIcon PinkWink 2017.02.27 10:04 신고

      이 글대로 꾸며졌다면... 출력은 전압입니다.
      실제 구현할때는 PWM을 사용하신다면 Duty-ratio로 변환해야겠지요.

  6. 세그웨이123123 2017.03.01 22:56 신고

    안녕하세요 질문하나 드릴려고 합니다 .

    LQR 방법을 통해서 저는 wheel 과 body 에 대해서만 정의해서 동역학 해석 하였고

    wheel 과 body 에 대한 각도는 핑크님과 같이 유사한 결과값이 나오는데요 .

    제가 모터 인가 전압이 5 ~-5 V 스펙을 가지고 있는데 . .

    결과 전압 값 출력 값이 0V로 수렴은 하나 최초 초기값이 11 ,12 근처에서 출발하는 현상을 볼 수 있었습니다 ..

    그래서 실제로 기구에 넣어봐도 실행이 잘 안되는 듯한 생각도 들었습니다 ...

    무엇이 문제일가요 ?

    제가 사진으로 한번 보여드리고 싶은데 댓글에 사진을 못남가군요 ㅠㅠ

    • BlogIcon PinkWink 2017.03.02 09:25 신고

      시뮬레이션의 제어기부분에 제한(saturation)을 걸면 됩니다.
      5V이상은 5V로 한정지어버리면 실제 시스템과 조금 더 유사해지겠죠

  7. 세그웨이123123 2017.03.01 23:08 신고

    위에 바로 글 단 학생입니다 .


    글이 수정이 안되더라고요 밑에 그래서 댓글 더답니다. ..


    그 위에 제가 실험 했을 때 초기 pitch 각도가 1.4 (deg) 일 때 측정 초기 출력 전압이 1~2v이더군요

    5.4 deg 일땐 5~6v 10.4 일 땐 10v 정도로 시뮬링크에서 응답을 주더라고요 ..

    이건 모터 스펙의 한계라고 봐도 되는 것 인가요 ?.

    • BlogIcon PinkWink 2017.03.02 09:26 신고

      시뮬레이션은 내 놓으라는 데로 잘 주니까^^ 그런거구요...
      위에 답변을 단 것처럼 제한을 걸어두시면 됩니다.

  8. 세그웨이123123 2017.03.02 12:36 신고

    엄 ..
    현재 제가
    시뮬링크 라이브러리 내에 VoltLimit 항목을 통해서 -5 ~5 를 줬음에도 저런 결과가 나왔습니다 .!!


    http://blog.naver.com/wltn9436/220948160855

    이 사이트에 제 시뮬링크 사진과 output 전압 출력 사진이 있는데요.

    초반 부분이 시간 0 에서는 offset 이 된채로 몇 ms 후 V가 인가 되는 형상을 볼 수 있는데 핑크님 말씀 해주신 것처럼 Volt limit 을 통해서 실제 시스템과 유사하게 한다라고 하셨는데 저래 되면 우선 몇 초 간은 5V 가 아닌 다른 값의 그래프 양상을 띄는 것 아닌가요 ?

    • BlogIcon PinkWink 2017.03.02 12:57 신고

      그러면 시스템에 실제 입력이 들어간 limiter와 model의 volt사이를 scope로 보셔야죠. 그래야 실제 시스템에 인가된 전압을 볼 수 있을 듯 합니다.

  9. 세그웨이123123 2017.03.02 16:17 신고

    넵 그랬더니 ... 실제 시스템에 작용하는v는 10v가 나오더라고요 ..

    제가 갖고 있는 모터의 전압은 5~-5 v인데 말이죠 ..ㅠㅠ

    그래서 위와 같은 질문을드렸었습니다.ㅠㅠ

    항상 답변해주셔서 감사핣니다 .

    • BlogIcon PinkWink 2017.03.03 10:13 신고

      네.. 그걸 5V로 한정해서 인가를 하는 블럭도 추가하셨으니... 모터에서의 제한이 실제와 같게 되지 않았나요?

  10. 세그웨이123 2017.03.03 13:24 신고

    안녕하세요 핑크윙크님
    좋은 답변 항상 감사드립니다.

    MATLAB등의 툴로 만든 다음 바퀴의 속도부분을 따로 뽑아보시면 최소한의 속도를 뽑아보았는데요.

    대략 초기 입력값에 대한 바퀴 속도가 200~300 대가 나왔습니다 .

    거기에 맞는 입력 전압으로 초기값이 PWM이 대략 300 정도 나왔고요 거기에 맞게 실제 기구에 PWM 300 을 주고 엔코더 값을 읽어 deg/s (제가 시뮬링크상에서 deg/s로 출력되도록 했습니다.) 읽어 들였더니 1900 정도가 나옵니다 .
    ( 실험 시에는 공중에 손에 든 채로 실험하였습니다.)


    이렇게 결과와 다르게 나온다면 엔코더 쪽의 코딩이 문제가 있는 걸가요 ? 아니면 실제 바퀴가 바닥과의 마찰에 의해서 2~300 이 나올수도 있는걸가요?

    • BlogIcon PinkWink 2017.03.03 17:19 신고

      여러가지 원인이 있을겁니다.
      일단 그런 차이를 무시해도 될지 아닌지는 사실 정답이 없습니다. 프로세스를 진행해보고 다시 돌아와서 점검해야할 수도 있습니다.

      일단, 바퀴부분의 이너셔 마찰, 모터의 계수, 모터와 바퀴의 기어비 등등...들이 비슷하게 맞으면 인가된 전압에 따른 RPM은 비슷해집니다. 오차는 제 기억에는 대략 10% 정도였습니다.

    • 세그웨이123 2017.03.03 19:21 신고

      답변 감사합니다.

      핑크님

      제가 연재4에 올라온 글에서

      거꾸로 매달아 노은 뒤 실험 하는 방법으로

      J_body 와 f_m 을 이용하였는데 이 실험에 따른 값 사용은
      제가 다른 파라미터에 대입한걸까요 ?

    • BlogIcon PinkWink 2017.03.06 09:37 신고

      그 실험에서 얻은 것은 로봇 기구 전체의 이너셔와 바퀴축의 마찰입니다. 맞게 사용하셨는지는 응?? 그건 제가 잘 모르겠는데요.ㅠㅠ.

  11. 도와주세요~ 2017.03.03 19:19 신고

    안녕하세요 핑크님.!

    lqr_out_x=-(K1*(phi*Deg2Rad) + K2*(the*Deg2Rad) + K3*(dot_phi*Deg2Rad) + K4*(dot_the*Deg2Rad));
    lqr_out_x = lqr_out_x * 900; //900일 때가duty 100%
    PWM=(int)(lqr_out_x/5.0f);
    OCR1A=PWM ;

    이런식으로 코딩을 했습니다 ..핑크님.

    분명 변수는 많은 것을 알지만..ㅠㅠ 제가 현재 센서의 각도도 동역학 유도 식에 맞게 다 변경하였고..
    센서값 출력도 다 확인을 마친 상태이지만 여전히 이리 저리 날뛰는 균형은 못잡는 현상이 나옵니다 .ㅠㅠ

    또한 인터럽트 시간도 초과하지 않은 채로 함수처리가 충분합니다. !!
    샘플링 타임은 10ms 구요 !

    다른 변수로는 뭐가 있을가요 도저히 체크 할 수 있는 게 무엇인지 생각이 안나서 조언좀 얻고 싶어서 글 올립니다!ㅠㅠ


    • BlogIcon PinkWink 2017.03.06 09:36 신고

      900을 곱하는 부분... 음... 뭐 저렇게 해도 되는 거죠? 아무튼...
      만약 기울어지는 정도에 따라 모터가 회전하는 방향이 로봇을 세우는 방향으로 움직이는 것이 맞는 듯 하다면...
      살짝... 전체적인 제어 입력을 한 번 낮춰보세요... lqr_ou_x한 변수에 100을 나눠본다든지 하는 것이죠... 그러고 만약 안정화되면 R값을 높이면 전체적인 제어게인이 내려갑니다.

  12. 벨런싱로봇 2017.03.06 08:49 신고

    안녕하세요 핑크윙크님~

    알려주신대로 해서 덕분에 밸런싱 로봇이 서게 되었습니다.

    허나 나온 K 게인에서 저는 값을 어느정도 튜닝이 했어야했고, 벨런싱은 잡으나 어느정도 떨림이 좀 있습니다만

    이런 경우엔 계속 상수값을 고쳐나가야하는건가요 ?

    아니면 파라미터를 고쳐나가야할가요 ?

    • BlogIcon PinkWink 2017.03.06 09:42 신고

      그건 아마 파라미터와 시뮬레이션의 미스매치... 기구적 문제 등등 다양한 문제가 있을 수 있습니다. 그러나 최종단 튜닝은 큰 거부없이 받아들여집니다.^^

  13. 아재7 2017.03.12 20:44 신고

    안녕하세요 핑크윙크님.
    현재 파라미터 값 다 추정한 후 MCU 를 통해 K 게인 값을 다 도출해냈습니다.
    그 결과 Kd=-0.3621 -14.0683 -0.2628 -1.4436 이런 식으로 나왔고 시뮬링크 결과도 잘나옵니다.

    하지만 실제 기구에 넣어보니 바로 넘어졌고, 여기서 값을 어느정도 고쳐가면 떨림이 잇는 채 서 있을 수는 있게 되었는데.. 이런 경우는 뭐를 고쳐봐야하나요 ?

    아무리 파라미터를 여러번 다시 고쳐 봐도 떨림은 여전히 있고 계속해서 움직이고 제자리에 있지 못합니다.ㅠㅠ

    • BlogIcon PinkWink 2017.03.13 08:04 신고

      이런경우에 대한 변수는 아주 많아서... 잘 모르겠습니다... 어느 정도의 튜닝을 필요하겠지만, 통상 수렴하는 경향은 거의 비슷하게 나타납니다...

    • 아재7 2017.03.18 04:38 신고

      마냥 수렴성 뛰는 것 까지 보았을때 진동은 엄청나되 수렴하는 것은 확인했습니다...

      진동이 심할 경우는 어떤 항을 건드려주는게 좋은가요 ?

    • BlogIcon PinkWink 2017.03.19 09:38 신고

      Q에서 속도에 대한 가중치를 줄이거나..
      R을 높이거나..
      혹은 속도 성분에 LPF를 설치해보는 것도 괜찮습니다.

  14. 해봅시다 2017.03.20 17:59 신고

    핑크님

    http://blog.naver.com/wltn9436/220948167246

    여기에 결과 영상을 올려놨는데

    이럴 경우 수정 보완하고 픈데 .아무리 해도 큰 변화가 업네요 ..ㅠㅠ

    현재 가중치는

    Q = [50 0 0 0; 0 50 0 0; 0 0 1 0; 0 0 0 1 ];
    R = 70;

    이러한데 말이죠 ㅠㅠ

    • BlogIcon PinkWink 2017.03.20 19:02 신고

      각도의 추정, 바퀴의 슬립, 등의 기계적 문제와...
      구현 중 내부적 오류 F/W의 실수 등등이 없다면...

      R을 100으로 한 번, 그리고, 10으로 한번 각각 ...
      그리고,
      Q는 로봇이 세워지는 것이 더더욱 중요하므로...
      상태 theta, phi, dot_theta, dot_phi에서 Q의 대각선상 수치를
      [10 50 1 5] 정도...
      혹은
      [10 200 1 2] 정도로 해서
      만약 개선이 된다면 다행이구요...

      그렇지 않다면...

      각도 추정부터 모터 전압.. 그리고 바퀴와 지면사이의 슬립여부 등을 모두 체크하셔야 할 수도 있습니다.

    • 해봅시다 2017.03.26 23:31 신고

      안녕하세요 핑크님.

      보통 LQR 제어로 통한 결과 게인값 기구에 넣을 시 떨림은 무엇이 원인이있는가요 ?

      차분에 의한 값 이외에 또 원인이 있을가요 ?

    • BlogIcon PinkWink 2017.03.27 08:49 신고

      흠...LQR이어서 진동이 생긴거라고 판단되지 않아서..ㅠㅠ.

      아무튼... 진동이 생길 수 있는 여지는 기계적 요인부터.. 속도 성분의 가중치까지 여러부분을 점검해 보셔야할 듯 합니다.

    • 해봅시다 2017.03.27 13:35 신고

      엔코더 차분을 해결하는 방법으로 저는 핑크님이 사용하신 평균값 하는 방법을 이용하고 있는데 이 이외에 방법이 또 있을까요 ?

      LPF 를 이용했는ㄷ ㅔ 반응이 꽤나 느리더라고요 ..ㅠㅠ

    • BlogIcon PinkWink 2017.03.27 14:09 신고

      저는 이동평균과 LPF를 사용해보았습니다. 그리고... 마지막에는 그냥 자이로 신호를 사용했습니다. 엔코더를 차분하는 것 보다 자이로 신호(어차피 각속도이니)가 더 부드럽더군요....

    • 해봅시다 2017.03.27 16:46 신고

      실제 LQR 에 들어간 상태 변수들이

      바퀴 각도 바퀴 각속도

      바디 각도 바디 각속돈데

      바퀴 각속도도 IMU 센서의 각속도로 썼단 말씀이신가요 .?

      그렇게 해도 괜찬은건가요 ?..ㅎㅎㅎ 제가 잘 몰라서...여쭤보는 것입니다

    • BlogIcon PinkWink 2017.03.28 09:11 신고

      로봇의 기울어지는 각속도겠죠

    • 해봅시다 2017.03.28 10:59 신고

      그렇군요 ...
      로봇의 기울어지는 각속도와
      바퀴의 각속도...
      통신으로 제가 동시에 출력 해봣는데 값이 많이 다르게 나오더군요 ...ㅠㅠㅠㅠ

      센서의 위치때매 그런걸가싶기도 하고 ...
      우선 그런것도 시도해보겠습니다. 감사합니다~

    • BlogIcon PinkWink 2017.03.28 17:32 신고

      네? 로봇의 각속도와 바퀴의 각속도는 엄연히 다릅니다.
      로봇의 각속도는 자이로와 가속도센서를 통해 얻었을 거고...
      바퀴의 각속도는 엔코더를 차분해서 얻었겠죠..ㅠㅠ

  15. 2017.03.28 18:34

    비밀댓글입니다

    • BlogIcon PinkWink 2017.03.29 09:24 신고

      자이로센서 이야기는 아마 당시 비슷한 글에 댓글을 달면서 (아이피로 봐서는 한 실험실인듯한데) 혼선이 있었습니다. 자이로센서는 뒤집어놓고 흔드는 실험을 생각하고 그 때 자이로를 사용했었다는 이야기한 것인데요...

      그리고 동영상을 보았을때 제 생각에는 정상적으로 보이지는 않네요.. 단 로봇의 이동 거리에 대해서도 게인이 적용되므로 이동 거리에 대한 요소를 제거하고 정상 판단을 해야 합니다.

      게인이 총 4개인데... 로봇의 기울임만 관장하는 게인외의 나머지를 0로 두고 한 10도 기울여 보세요.. 기울인 로봇을 세우는 방향으로 회전하면 정상이겠죠...(당연히)

      그 다음 로봇의 기울어지는 각속도 게인을 복원하고 (그럼 로봇의 기울기, 로봇의 기울어지는 각속도만 살아 있겠죠) 다시 비슷하게 기울여 보세요..
      그래도 정상이어야 합니다.

    • 2017.03.29 10:00

      비밀댓글입니다

    • BlogIcon PinkWink 2017.03.29 10:17 신고

      그렇다면.. 일단.. 로봇의 이동 거리를 의미하는 상태의 가중치가 아주 높다는 것을 의미할 수 있습니다. (다른 요인도 있을 거지만.ㅠㅠ)
      로봇의 기울어지는 각도와 각속도의 가중치를 더 높이고... R을 좀 더 높여서..

      결과적으로는 로봇의 이동거리와 이동 속도에 대한 게인을 낮추는 방향으로 한번 작업해 보시는 어떨까요

    • 2017.03.29 13:10

      비밀댓글입니다

    • BlogIcon PinkWink 2017.03.30 07:30 신고

      네.. 좋은 성과가 있으시길 바랍니다

  16. 해봅시다 2017.03.31 10:52 신고

    http://blog.naver.com/wltn9436/220971582504

    핑크님 사이트 영상한번 봐주세요~꽤나 안정적으로 변해가고 있지 않습니까ㅎㅎㅎ
    감사합니다 .

    저떨림은 엔코더를 아직 해결 못해가지구 남아있네요 ...
    가중치를 수백번 해본거 같은데도 말이죠 ..ㅠㅠㅠ
    원래 이렇게 길고 험난한 길이었나요 ?
    핑크님 대단합니다.!ㅎㅎㅎㅎ

    조언좀 주세요 핑크님!!!!

    항상 감사드립니다 .

    아 그리고 핑크님 제가 예의에 어긋난 질문인지 모르지만 ...
    혹시 어느학교 대학교에서 연구 중이신가요 ?

    제가 현재 학부생인데 4학년인데 대학원을 고민중이라 ...!!

    • BlogIcon PinkWink 2017.03.31 11:51 신고

      여전히 매끄럽진 못하네요.. 혹시 로봇의 기울어지는 각도에서 0도가 무게중심과 너무 다른건 아닌가요? 즉 0도를 유지하는게 아니라 예를들어 한 10도를 유지해야 무게중심적으로 센터인데 그러질 않아서 한 쪽으로 더 기울려고 하는 건 아닌가요? 뭐 아무튼.. 어느 정도 가시적 성과를 가지신걸 축하드립니다. 블로그 상단 우측 PinkWink 프로필을 보면 나오지만.. 전 2011년 학교를 졸업하고... 직장생활 중입니다.

    • 해봅시다 2017.03.31 13:27 신고

      IMU 센서의 위치를 정 중앙에 위치 시켰긴 한데 무게중심과는 거리가 꽤 멉니다.
      바퀴 중심으로부터 무게중심 거리가 6cm 이면 센서는 한 12cm 위치에 센서가 부착되어있습니다.

      이런 위치도 영향을 줄 수 있는건가요 ?

    • BlogIcon PinkWink 2017.03.31 14:41 신고

      아니요. 무게중심과의 거리가 아니라...
      음...
      무게중심으로 인해... 만약 뒤집었을때... 180도여야하는데.. 무게중심으로 인해 170쯤에서 멈춘다면..
      바로 세웠을때.. 0도가 아니라.. -10도 쯤에서 안정화될 확률이 있어서.. 그럴경우 문제가 될 수도 있지 않을까 해서요... 한번 확인해 보세요..

    • 해봅시다 2017.03.31 14:54 신고

      아 그걸 뒤집어서 센서 값을 확인해볼 생각 못했네요

      계속 혼자 손으로 눈 대중으로 세워서 정확하지 않다고 생각햇는데 ...

      감사합니다 .


      뒤집어서 180도가 잘나오는지 아닌지를 체크 해보란 말씀인 거 맞죠 ?

    • BlogIcon PinkWink 2017.03.31 15:48 신고

      네.. 그래서 만약 몇 도 이상 차이가 난다면... 센서의 각도를 보정하거나.. 혹은 센서의 기울기를 좀 기울여 주거나.. 혹은 기계적으로 밸런스를 맞춰주거나 해야 할 겁니다.

    • 해봅시다 2017.04.02 17:46 신고

      아 그런데 핑크님 모터의 전체 주기도 관련이 있을까요 ?!!!

      duty 를 따질 때 전체 주기요 !

      저는 전체주기가 8ms 로 되있거든요

    • BlogIcon PinkWink 2017.04.03 07:59 신고

      네... 그건 잘 모르겠습니다. 다양하게 안 바꿔봤거든요.~~

    • 2017.04.03 16:32

      비밀댓글입니다

    • BlogIcon PinkWink 2017.04.04 10:36 신고

      Q와 R은 원래 튜닝해야하는 요소입니다.
      좋은 결과에 아주 즐거우실듯 합니다. 저도 그랬거든요^^

    • 2017.04.04 14:11

      비밀댓글입니다

    • 해봅시다 2017.04.04 14:28 신고

      바퀴를 빼고 실시간으로 모터가 어떻게 움직이는지 보려고 확인중에 있는데요
      ...

      +29000 1
      +28000 1
      +29000 1
      +30000 1
      -32536 0
      -29536 0
      -28536 0
      -29536 0
      -31536 0
      +31000 1
      +29000 1
      +28000 1
      +29000 1
      +30000 1
      -32536 0
      -29536 0
      -28536 0
      -29536 0
      -31536 0
      +31000 1
      +29000 1
      +28000 1
      +29000 1
      +30000 1
      -32536 0
      -29536 0
      -28536 0


      이런 식으로 나옵니다.

      첫번째 열은 이제 MOTOR 출력 값이구요
      두번째는 방향에 따라 1,0 으로 표현한건데요..
      제가 쓰는 모터 듀티이 최대 MAX치는 1000입니다 .... 저는 MAX치 넘으면 MAX로 그대로 1000으로 limit 를 줬기 때문에 CW 로 1000 CCW 로 1000 이걸로 균형을 잡고 있는것 같습니ㅏㄷ.

      하지만 저렇게 엄청나게 큰 숫자가 나와서 항상 최대출력으로 방향만 바뀌고 왔다 갔다 되는 상황인데요 .... 결국 최대 출력에서 방향만 CW CCW 만 하고 있눈 것 같습니다 ...

      원래 이런건가요 ?...ㅠㅠ아니면 제가 어디가 잘못된걸가여ㅛ .

    • BlogIcon PinkWink 2017.04.04 19:35 신고

      지금 코드는 못 보겠고...
      개념적으로는

      if v > 0{v += 4}
      elif v < 0 {v -= 4}
      else v = 0

      정도겠죠^^

    • BlogIcon PinkWink 2017.04.04 19:38 신고

      그렇다면... 전체 제어 입력을 결정하는 v에 임시로 10, 100, 1000을 나눠보세요.. 혹시 더 안정화되는듯 하다면... R을 조절해서 전체 제어게인을 낮추는 쪽으로 한 번 해보구요..
      (그런데 바퀴가 안달려있으면 제어입력이 그렇게 크게 보일 수 있습니다. - 당연히 제어가 안되니까요...)

  17. 밸런싱하고싶어 2017.03.31 20:07 신고

    pink님 소중한 포스트 하나하나 잘 보고 있습니다 ... 그런데 모르는게 있습니다.. psi만 안정화 되면 되는거 아닌가요? 왜 phi 까지 0도로 안정화를 시켜야 하는거죠??
    그리고 f_w는 왜 0인지 궁금합니다

    • BlogIcon PinkWink 2017.04.01 11:25 신고

      그렇게 하면... 로봇을 바로 세우지만, 앞으로 가려는 힘이 존재하게 되어 로봇이 어느 방향으로 계속 진행하게 됩니다.

  18. 해봅시다 2017.04.04 14:33 신고

    하 .. 질문이 정말 많아서 죄송합니다 ..ㅠㅠㅠ
    공부할 수록 질문이 계쏙 생기는 군요 ..
    .


    저는 lqr결과를 lqr / 모터 입력전압 * (OCR최대값) 이런식으로 출력을 해주고 있는데요 .

    이떄 모터 입력 전압 값이 모터 자체가 12V짜리긴 한데 제가 베터리를 11.1v 짜리를 이용하기 땜에 그냥 모터 입력 전압에 11.1 로 나뉘었습니다. 그런데 생각을 해보니 베터리를 충전하면 완충 하면 12.6v 고 적당히 충전하면 11.1 근방일텐데 이게 ... 뭘로 나누던 상관업을가요 ?.. 충전 정도에 따라 입력전압이 바뀌지 안나 싶어서요

    이 후에 다시 U=-kx = lqr_out_X 값을 출력 시켜보았는데요
    모터의 입력 전압은 12V인데

    lqr_out_x 를 출력해보니 출력 값이 3~400 대가 출력되더라고요 ... 흠 .

    lqr_ou_x한 변수에 100이든 뭐든 어떤 상수를 함부로 나눠도 되는가에 대한 의문이 들기도 하고 ..

    핑크님 덕에 엄청 많이 배워갑니다 .

    정말 뭐라도 대접해드리고 싶은데 만날 기회가 있을려나 모르겠네요 ㅠㅠ

    • BlogIcon PinkWink 2017.04.04 19:39 신고

      사실.. 전압은 중요합니다. 실제 인가되는 전압을 측정해서 나눠줘야하기 때문인데요...
      그러나 실제로는 완충기준으로 테스트합니다. 그리고 많이 방전되면 충전하고^^

  19. 해봅시다 2017.04.05 11:58 신고

    U =-kx 에서 코딩시에도 U 값 제한주는게 맞겠죠?

    • BlogIcon PinkWink 2017.04.06 10:26 신고

      네... 제한합니다.^^

    • 2017.04.06 11:32

      비밀댓글입니다

    • BlogIcon PinkWink 2017.04.06 16:24 신고

      비최소위상 시스템의 제어기 다운 면모가 드디어 나타나는 군요^^
      축하드립니다.
      이상하게도.. 항상 같은 과정이라도 역시 처음엔 좀 많은 노력이 들더라구요...
      아마 비슷한 다른일을 하실땐 괜찮으실겁니다.^^....
      전.. 여기 저기 방황하긴 했지만... 지금은 로봇제어 쪽에서 일을 하고 있습니다^^

    • 2017.04.08 23:46

      비밀댓글입니다

    • BlogIcon PinkWink 2017.04.09 18:37 신고

      와~ 정말 대단합니다. 멋져요~~^^
      이런 시스템하나를 맞든 아니든.. 좀 길게 했던지 간에...
      직접 시도해보고 만족해보는 경험은 정말 소중한 경험인것 같습니다.^^
      축하드립니다.^^

  20. 글레이프니르 2017.06.14 15:14 신고

    동역학적으로 밸런싱을 위해서는 각도theta와 변위x가 필요하다고 하신글을 봤습니다.
    원래는 pid제어로 각도만을 가지고 error = 목표0도 - 현재각도theta로 하려고 했습니다.
    만약 엔코더로 변위x를 추가하여 pid 제어를 한다고하면
    pinkwink님께서는 theta와 x 변수 2개를 어떻게 활용하여 pid 수식을 완성하시겠습니까?

    • BlogIcon PinkWink 2017.06.14 17:38 신고

      나라면 어떻게 완성하겠냐고 물으신건가요???
      무슨 말씀이신지...
      제가 완성한건 본문에 있습니다만...
      위치 속도 각도 각속도를 상태로 보고 네 상태에 적절한 제어게인이 곱해지고, 다시 다 더해져서 모터에 인가할 전압을 결정하게끔 되어 있습니다.

    • 글레이프니르 2017.06.15 00:50 신고

      아. 제가 글을 혼란스럽게 썻네요.
      우선 감사합니다.

      pinkwink님께서 작성하신 lqr선형제어기 포스팅은 저의 졸업작품에 좋은 참고가 되었습니다.
      단지 모터사에서 데이터시트를 제공하지 않아(혹은 아직 준비중?) 우선 pid제어기로 마이크로프로세서 코딩을 짜려고 하는데, pid제어에선 목표값에 대한 현재값의 오차(error)값으로 제어가 이루어집니다.

      본래 간단하게 생각해서 error = 0도 - theta로 수식을 짜서 모터에 pwm으로 인가하면 로봇을 기울이면 0도로 밸런싱을 계속 잡을거라 생각하였습니다.

      그런데 다른분들 조언도 그렇고 pinkwink님 글도 그렇고 동역학적으로 밸런싱을 위해서는 각도theta와 변위x, 2개의 값이 필요하다는 것을 알게되었습니다.

      그렇기에 이 2개의 값으로 error를 어떻게 설정할까 고민이 되어서 한번 여쭈어본것입니다.

      현재 생각한것은 error = IMU각속도 - 단위시간당 엔코더펄스(각속도) 인데...

      잘못된 부품때문에 배송을 기다리는동안 공부중에 있어서 한 번 질문드려봅니다.






    • BlogIcon PinkWink 2017.06.15 07:52 신고

      제 생각에는
      각도의 에러는 IMU로 추정한 각도의 마이너스값입니다. 각도의 에러는 0 - 현재의 각도 일테니까요...
      위치의 에러는 만약 현재의 위치를 추종하도록 하는 것이 목적이라면 역시 0 - 현위치 = - 엔코더로 계산한 로봇의 위치
      가 될 듯 합니다.
      그럼 두 에러를 더한 것을 전체 에러로 보면 됩니다. 물론 가중치라는 개념을 약간 사용해야 각도를 더 중요하게 다루게 될 겁니다.

    • 글레이프니르 2017.06.16 10:22 신고

      음 모터사에서 응답이 아예없네요...
      대만회사꺼를 수입해서 파는모양이던데 그래서 그러나... 다른 조가 theta만으로 밸런싱로봇을 만들었더니 균형을 유지한상태로 한방향으로 계속 무한히 이동하네요. 역시 변위x는 필수인가봅니다... matlab pid 튜닝도 있길레 알아보니 밸런싱로봇의 전달함수가 필요하고 이 전달함수를 구하려면 동역학으로 구해야한다던데... 갈길이 먼듯합니다... 하하

    • 글레이프니르 2017.06.16 10:26 신고

      아 그리고 엔코더는 현재위치를 추종?이라기 보다는 밸런싱잡는 도중 한방향으로 무한히 가능 현상을 방지하려고 합니다.(아니 같은말인가 이게?)
      정지상태에서 밸런싱잡는거랑 밸런싱잡으러 이동중에 다시 밸런싱을 잡는거랑은 차이가 있어서 변위x를 차분한것이 필요하다고 하더군요.
      theta와 x 두개를 활용하여 pid짜는 것을 좀 더 고민해봐야 할듯 하네요.

    • BlogIcon PinkWink 2017.06.16 10:33 신고

      세그웨이 형식으로 탈것을 제작하는분들의 경우 위치에 대해서는 설계하지 않아도 된다고들 하는 경우도 있던데..
      제가 해보니 그 경우도 위치에 대한 제어기까지 설계를 해야 탑승감이 훨씬 좋더군요...

    • BlogIcon PinkWink 2017.06.16 10:34 신고

      네.. 여하튼... 제어 대상이 되는 상태는
      [로봇의 각도, 각속도, 로봇의 위치, 로봇의 속도] 가 최소입니다.
      거기서 적분까지 한 것을 추가로 잡는 경우도 많구요...
      여하튼.. 건투를 빕니다..
      미리 말씀드리지만...
      정말 정말 아주~~~ 재미있으며... 완료했을때 성취감은 정말 어마어마합니다.

  21. 하이람 2017.09.22 14:12 신고

    PinkWink님과 똑같이 동역학수식 matlab 돌려서 k게인 수치와 시뮬레이션 확인 하였습니다.

    그런데 제 로봇의 수치를 측정해서 변수등록하고 K 게인을 구한 후 시뮬레이션을 돌리면.... 안돌아갑니다 ㅠㅠㅠㅠ
    모든 변수 등록하고 그에 따른 k gain도 다시 얻었지만...

    Result of power is undefined in워닝과

    Derivative of state '1' in block 'balancing/BalancingRobot/Integrator' at time 0.045 is not finite. The simulation will be stopped. There may be a singularity in the solution. If not, try reducing the step size (either by reducing the fixed step size or by tightening the error tolerances에러가 ddot_theta첫 적분기에서 발생하네요.

    동역학적으로 밸런싱이 불가능 구조일 수 있는건가요?

    • BlogIcon PinkWink 2017.09.24 09:20 신고

      먼저... fixed step으로 바꿔보시는 것도 괜찮구요...
      그리고 모델을 표현한 부분도 유심히 다시 점검하셔야할지도 몰릅니다.
      그리고 비선형으로 시뮬레이션하셨다면.. 일단 선형으로 해보시는 것은 어떨까요..

    • 하이람 2017.09.24 20:51 신고

      fixed step, setp size 0.01로도 진행해보았고... 시뮬레이션 돌릴 때 선형으로 하는 방법이 따로 있었군요?

      찾아보고 시도해보아야겠습니다.

      근데 웃긴건 제 로봇 수치들에다가
      PinkWink님 모터 수치로 모터관련만 바꿔서 넣으니... (f_m, alpha 등) 잘 돌아가네요... 모터가 부족한 스펙의 모터가 아닌데 ㅋ;

    • BlogIcon PinkWink 2017.09.24 23:01 신고

      혹시 수치를 대입했을때, 분모항이 0이되지는 않는지 검증해 보세요~~
      혹시나해서~^^ 모터의 수치가 잘못되었다는것 보다는... 혹시 분모항 부분이 시뮬레이션이 잘못되었는지 확인해보는거죠^^