예전에
를 소개한 적이 있는데요. 그후
을 다시 소개했었습니다.  그런데 방문하신 몇몇 분들께서 C-code로 다시 표현해달라는 이야기를 하셨는데요. 사실 포스팅을 해야겠다고 생각만 하고 미뤄두고 있었네요. 근데 결과를 보시면 정말 간단하다는 사실에 아마 경악을 금치 못하실 겁니다.^^. 일단 다시 그 보정 필터의 개념도를 보도록 하지요.


위에 있네요. 저 그림에 주석을 좀 달고 다시 시작해보겠습니다.




먼저 

          Temp1
          intTemp1
          Temp2
          FilterAngle

순서로 구하게 됩니다. 그림상에 마지막부분의 FilterAngle은 단지 라디안(radian)을 degree로 표현을 다시 하는 것 뿐입니다. 결국 FilterAngle이라는 변수가 최종값으로 필터의 결과입니다. 



위에서 보상신호는 가속도센서에서 출력된 값을 이용해서 구한 각도입니다. 가속도센서의 출력이 아니라 거기서 구한 각도라는 것을 확인해주세요. 가속도센서에서 각도를 구하는 방법은 
을 확인해주시구요. 그리고 자이로신호라고 되어있는 부분은 자이로신호를 그대로 넣어둔것이 아니라 자이로 신호에 스케일팩터를 반영
해서 각속도(rad/sec)의 결과입니다. 즉, 보상신호는 가속도센서에서 출력된 각도이고, 자이로신호는 자이로에서 출력된 각속도입니다. 

이제 그림의 Temp1을 계산하는 루틴입니다.

Temp1 = (-Pre_AccAngle) + Pre_FilterAngle;

위 코드에서 Pre_AccAngle은 이전의 가속도센서에서 구한 각도입니다. Pre_FilterAngle은 이전의 보정필터의 결과값입니다. 위 그림과 함께 보시면 됩니다.

다음은 intTemp1인데요. 이건 단순히 Temp1을 적분하면 되므로

IntTemp1 = IntTemp1 + (Temp1 * Ts);

위와같이 구현하면 끝입니다. 여기서 Ts는 sampling time으로 설정하고 계신 값을 그대로 사용해주면 됩니다. 혹시나 하고 이야기하는 거지만, 프로세서에서 구현하시는 분들은 타이머인터럽트를 사용하셔서 일정시간마다 계산하도록 하셔야합니다.

이제 Temp2인데요. 위 그림에서 보시다시피 Temp2는 Temp1에 Kp를 곱하고 intTemp1에 Ki를 곱하고, 그러고 난 다음 자이로의 출력각속도와 더해주어야합니다.

Temp2 = (-Kp * Temp1) + (-Ki * IntTemp1) + GyroAngularVel;

이렇게 되지요. GyroAngularVel이 자이로의 출력값입니다.



마지막으로 Temp2를 적분해서 FilterAngle을 구해야겠네요.

FilterAngle  = FilterAngle + (Temp2 * Ts);

위에 제시된 딱 4줄이 보정필터 전부입니다.^^. 이렇게 간단해서 제가 포스팅을 잘 못하고 있었습니다. 쓸말이 없어서 말이지요^^. 하지만, 제어블럭도를 잘 모르시는 경우 위 블럭만으로는 코드를 작성하는데 어려움이 있을거라는 생각이 들어서 이렇게 포스팅을 합니다.


   NT-ARSv1 (각도 측정, 자이로 센서 가속도 센서 이용, ARS, IMU) 
 
자이로 센서와 가속도 센서를 이용한 각도 측정의 어려움을 해결할 수 있는 ARS모듈로 낮은 가격과 작은 크기를 가지며, 금속 케이스가 있어 활용도가 높음. NT-ARSv1 : 관련페이지

 


http://pinkwink.kr/trackback/254 관련글 쓰기
  • 가속도, 자이로 센서 보정 문제. Trackback from Heineken Dark. 2010/07/27 18:18 [ DELETE ]

    연구실을 이사하고 새로운 환경에서 테스트 하던 중 발견한 문제점 입니다. 자이로, 가속도 센서의 AD값들을 그대로 PC로 전송하여 MATLAB에서 필터링 하면 보시다시피 빨간 그래프가 잘 따라 갑니다. 하지만, DSP(2812)내에서 필터링을 수행하면 대략 2초 정도의 딜레이가 발생하네요.. 모두 같은 측정치를 가지고 실험한 것입니다. 필터링 된 결과가 산출되었을 때마다 자이로 측정값, 가속도 측정값, DSP내에서 필터링 된 각도 값, 엔코더 값을..

  • 드디어 공들인 제품이 나옵니다. G.INS - ARS (관성항법장치) Trackback from PinkWink's Blog 2011/04/08 13:27 [ DELETE ]

    2011년 1월 17일... 이 날짜는 오랜기간 학교에서만 생활하던 제가 처음으로 입사한 날입니다. [관련글] 입사후 야심차게^^ ARS 모듈을 개발하고있었는데, 딱 2주쯤 후 설날연휴에 날짜도 깔끔하게 2011년 2월 1일에 오른쪽 다리가 그만 똑 하고 부러졌었죠...ㅠㅠ[관련글] 그럼에도불구하고, 설연휴를 꼬박 병원에 있고도 4일을 더 까먹고, 다시 출근을 감행한것이 2월11일이었습니다. 그리고, 회사 연구소의 많은 동료들과 함께 다시 개발에..

  • 이전 댓글 더보기
  • 박진원 2010/05/23 19:28

    필터를 사용할려구 합니다. ^^
    자이로 센서가 지금 뽕난건지 오작동을 해서 일단 가속도 센서 하나만으로
    필터를 사용해서 어느정도의 성능을 보이는지 확인해 보려고 합니다. ^^
    NTrex사의 mma7260 3축 가속도 센서 입니다. ^^
    이 센서만 사용해서 위의 필터를 적용해볼려고 합니다.
    자이로 센서의 각도값이 들어가는데 저 부분을 빼고 연산을 해도
    필터가 되는지요??
    물론 자이로 센서와 같이 사용할 때 보다는 못해도 가속도 센서에서 나온
    각도에 대한 보상이 되는지 알고싶습니다. ^^

    • PinkWink 2010/05/23 21:33

      글쎄요... 말씀하신 상황에서 실험해보지 않아서 잘 모르겠습니다...ㅠㅠ
      그러나.. 가속도센서 저역통과필터만 잘 설계되어도 어느정도 성과는 나타납니다.

  • 박진원 2010/05/24 03:09

    핑크윙크님이 적어주신
    [자이로와 가속도 센서를 이용한 각도추정 필터를 C로 구현하기] <= 이걸 가속도 센서만으로 필터를 구성할려고 하는데요,,
    이 필터로만으로도 가능한지 여쭤본거였었어요 ^^; ㅋㅋㅋㅋ
    자이로 부분을 그냥 무시하고 가속도 부분만 적용해서 위에 식대로 해도 가능한건지요.. ^^ 안되는건가요?? ㅠ

    또 저역통과필터라 하시면 로우패스필터를 말씀하시는건가요? 아날로그(추가 회로)가 아닌 디지털(코딩) 필터를 말씀하신거 같은데 맞나요?

    • PinkWink 2010/05/24 03:58

      예.. 그래서 제가 그 대답을 드린것입니다. 두개의 센서를 융합하겠다는 필터인데, 하나만 쓴다면, 다른 하나의 신호는 '0'으로 두실건가요??? 아니면... 어떻게 ... 그래서 실험해보지 않아서 잘 모르겠다는 대답을 드린것입니다. 또한, 제가 소개한 필터는 자이로센서에서 구한 각도에는 고역통과필터를, 가속도센서에서 구한 각도에는 저역통과필터를 달아놓은 것이니... 가속도센서만 사용한다면, 그냥 저역통과필터를 다는 것과도 같을 것입니다. 또, 인터넷을 서치해보니 가속도센서에 저역통과필터만 잘 설계해도 오차만 생각한다면, 큰 차이가 없다는 글을 읽은 적이 있긴 합니다.

  • 박진원 2010/05/24 03:10

    로우패스필터를 코딩으로.. 참고할만한 자료가 있을까요..? ㅠ
    필터에 대해선 겁부터 먹게 되네요 ㅠㅜ

    • PinkWink 2010/05/24 04:03

      예.. 디지털. 즉, 프로세서 상에서의 저역통과필터를 말씀드린것이 맞습니다. 이 부분은 인터넷 서치를 조금 해보셔야할 듯합니다. 아니면, 디지털신호처리..관련 교재를 참조하셔도 될 듯합니다. 진원님의 경우 신호처리관련 과목을 배우지 않으신듯하니 뭐라 장담할 수는 없습니다만, 생각만큼 그리 어렵진 않습니다. 그리고 하나더 말씀을 드리면, 그냥 수업을 들어야하니까 배우는 사람에 비해 진원님의 경우 필요해서 알려고 찾아보는것이기 때문에 그냥 수업을 듣고 아는 사람보다는 분명 빠르게 습득하실 수 있을 것입니다.

  • 박진원 2010/05/24 10:21

    아~ 그런 말씀이셨군요.. ^^; ㅋㅋ
    제가 이해를 잘못한거네요 ㅋㅋㅋㅋ
    답변 정말 감사드립니다. ㅋㅋㅋㅋ
    디지털 신호처리를 아직 배우지 않아서요 ㅠㅜ
    네이버링 해서 얼른 자료를 더 습득해야겠어용 ㅋㅋㅋㅋ
    정말 감사드립니다 ^^~*

    • PinkWink 2010/05/24 12:59

      검색한다는 걸 네이버링이라고 하나요?^^ 처음알았군요. 돟른 성과 있으시길 바랍니다.

  • 박진원 2010/05/24 15:12

    보통 방대한 량의 정보때문에 구글에서 검색할 땐
    구글링 한다라고 하더라구요 ㅋㅋ
    전 네이버에서 찾아볼려구 네이버링으로 ^^;; ㅋㅋㅋㅋ

    IIR필터 자료 어렵게 찾아서 성공은 했어요 ^^ ㅋㅋ
    확실히 필터인지는 잘 모르겠는데 암튼 결과물을 봐선
    훨씬 깨끗한 파형이 나오더라구요 ^^
    그래도 좀 더 깔끔하게 선형으로 나오길 바랬는데.. ㅡㅡ;
    제가 너무 많은걸 바랬나봐요 ㅋㅋㅋ
    그래도 이정도 성과로 만족합니다. ㅋㅋㅋㅋ
    내일 세미-세미나에서 테스트한거 발표하고.... 발표하기 전까지
    자이로 각도라도 추출할 수 있으면 좋으련만..
    테스트 발표해서 선배들이 가능성 보이면 제가 원하는 프로젝트, 전에
    말씀드린거 하게 해주신다고들 하셨거든요.. ㅠ
    꼭 만들어보고 싶은데... ㅋㅋㅋㅋ

    • PinkWink 2010/05/24 16:27

      네... 항상... 뭔가를 할려고 애쓰시는 분들은.. 어떤 형태로든 좋은 성과가 나오더군요... 화이팅입니다.

  • 이경태 2010/05/31 17:39

    안녕하세요! 저는 대전의 한 대학생입니다. 프로젝트로 motion capture를

    해보려고 합니다. 자이로센서 + 가속도센서를 팔꿈치에 달아 가슴과의

    상대적인 위치를 알려는 데요. 제가 초보라 ㅠ 자이로센서를 잘 이해하지

    못하는 것 같아서 질문드립니다. ㅠㅠ

    보통 판매하는 것들이 2축 자이로 센서인데,,,,, roll, pitch, yaw중 두개를

    재는 것인가요?

    인체의 팔과같이, 축의 길이가 고정되었을때, 축의 끝부분의 공간상 위치를

    측정하기 위해서는 3축 자이로센서가 필요한지 궁금합니다.

    또한 자이로센서가 각가속도를 측정하는 데, 회전축이 chip의 중심인 지,

    팔꿈치에 달아서 축이 어깨가 되도록 만들 수 있는 지 궁금합니다.

    마지막으로 (^^;;) 제가 이해한 바로는

    가속도센서 만드로는, 각도에따라 중력가속도의 축에 따른

    분배를 예측할 수 없어서 motion capture를 할 수 없다. 는 것이 맞는지요?

    그렇다면 자이로센서는 중력가속도에 영향을 받지 않는지 궁금합니다.

    제가 이쪽을 잘 모르고 글솜씨도 별로라 잘 전달이 되었는지 모르겠네요 ^^;;

    귀찮으시더라도 헤매고 있는 초보를 위해 답변 부탁드립니다.

    감사합니다!

    • PinkWink 2010/05/31 19:24

      motion capture가 뭔가요?? 흠흠... (이런 무식이...ㅠㅠ)
      일단... yaw-pitch-roll을 측정하실려면 당연히 3축 자이로, 혹은 1축 자이로를 세개..혹은 2축자이로를 2개...뭐 그렇게 하셔야합니다.
      일반적인 강체로 끝의 위치는 기구학적 해석을 할때 각도만 생각하면 되는 걸로 알고 있습니다. 그리고 당연히 자이로모듈의 메인 자이로 칩을 중심으로한 회전각도이며, 자이로의 경우는 중간에 또 다른 회전축이 없다면, 그냥, 같은 각도가 됩니다. (이걸 중학교인가 고등학교인가 기억은 잘 안나는데 동위각?? 인가요?? 아무튼 그렇게 생각하시면 됩니다.)

      그러나 마지막 질문 - 가속도센서만으로는 각도에 따라 중력가속도의 축에 따른 분배를 예측할 수 없다???? ==> 이 말씀은 무슨말씀이지 잘 모르겠습니다.

  • 돼지돌이 2010/05/31 19:34

    안녕하십니까?! ^^

    와, 정말 놀랍습니다;;; 아직 칼만필터 등도,,, 잘모르지만,

    최소좌승법(least-square)로 이렇게 추정하시다니;;; 설마 간단하게 머리속에서 나오셨다는건 아니시겠죠 ㅠ.ㅠ 그렇다면 절망하겠습니다. ㅎㅎ;;


    요지는 이게 아니라, 혹시 pinkwink님이 구현하신, 필터와 칼만 필터와의 비교를 해보셨습니까?!

    만약, 해보셨거나, 생각으로 가늠하신다면, 어느정도의 성능차이가 날까요...

    제법 궁금해 지는군요, 물론;;; 제가 구현하고, 글을 올려야 하는게 맞지만, 아직 실력이 좀 많이 모자라서요... 시간이 오래 걸릴것 같아서, 여쭈어 봅니다.

    • PinkWink 2010/05/31 23:50

      지나친 과찬은 저를 우쭐하게 만드는 역효과가 있답니다...ㅠㅠ 그러나 하여간 감사합니다. 그러나 안타깝게도 저는 칼만필터를 공부한 적이 없습니다. 할려고는 했는데 쉽게 시간이(사실은 게을러 빠져서 말이죠..ㅠㅠ) 안 나네요... 그래서 답변을 드리기가 좀 어렵습니다만, 인터넷으로 잠시 서치해본결과 칼만필터의 경우 잘 나온것은 아주 잘 나오는 것 같습니다.

  • 박재완 2010/06/03 23:48

    안녕하세요 pinkwink님, 그 동안 잘 지내셨는지요 ^^
    또 여쭤볼게 생겨서 이렇게 또 불쑥 찾아왔습니다. 이번에도 자이로와 가속도센서 보정에 관한 궁금증인데, 홍성경 교수님의 논문에서는 자이로센서에 가속도센서를 보정하여 비행체에서 실시간으로 각도(roll axis)를 추정하는 방법인걸로 알고 있습니다.
    pinkwink님의 자료를 참고한 저의 경우는 자이로센서와 가속도센서로 실험하면서 실시간으로 data를 받고, 실험후 그 data를 가지고 매트랩으로 conventional filtering estimator 을 이용하여 Kp와 Ki값을 찾을수 있었습니다.
    제 생각으로는 실험후 Kp값과 ki값을 알게 될 경우, 시스템을 구성해서 실시간으로 입력이 conventional filtering estimator을 통과하면 바로 원하는 출력을 얻을 수 있는 것으로 생각을 하였는데요,
    먼저 실험을 통해 Kp와 Ki를 구한다음에, 실험후
    실제 차량이나 비행체에서 conventional filtering estimator를 구성해서 자이로와 가속도센서로부터 입력을 받아 실시간으로 출력을 얻는 시스템을 구성하는 것이 맞는지 궁금합니다.
    호… 질문을 하다 보니 또 길어졌네요….
    즐거운 금요일보내시고, 또 즐거운 주말 보내시기 바랍니다.

    • PinkWink 2010/06/04 00:48

      네.. 필터계수를 구하는 것은 뭐 Real-time이 아닙니다만, 어차피 필터가 Real-time으로 동작하길 바라는 거지 필터계수를 구하는 과정이 Real-time이길 바란건 아니니까요. 필터계수를 구하고 나서 적용하면 Real-time으로 각도를 추정할 수 있게 되지요. 재완님도 역시 즐거운 주말을 보내세요^^

  • 김태환 2010/07/03 22:01

    PinkWink 오늘도 기초적인 질문좀 드리겠습니다
    Ts : sampling time 말인데요... 제가 AVR에서 타이머 인터럽트를 실행시켜서 SPI통신 데이터를 받아오는데요 이때 발생하는 타임인터럽트 시간이 sampling time이 되는건가요?
    그러니까 타임인터럽트 발생(1/16us * 1024 * 256 = 16.384ms)시간을 Ts 값으로 적용하면 되는건지요....
    그리고 필터 계수 말인데요 Kp=0.1973, Ki=0.00546 이 값들을 제 환경에 바로 적용시키면 안되나요? 제 환경에 맞게 계수를 다시 찾아야 하나요?
    계수를 찾을 때 필요한게 자이로센서와, 가속도센서에서 추출되는 각속도, 각도를 이용해 http://pinkwink.kr/242에서 설명하신 공식에 대입하여 계수를 구하면 되는건가요?
    그런데 제가 엔코더가 없어서 theta_e 값을 추출할수가 없는데 어떻게 다른 방법은 없을까요?

    • PinkWink 2010/07/03 22:44

      일정간격으로 데이터를 받아 뭔가를 처리할때...
      그 일정간격이 sample time이 되지요..
      그런데.. 꽤 복잡한 시간을 사용하시는군요..
      10ms정도로 세팅하셔서 사용하시면 계산도 편할텐데요^^
      그리고, 필터계수는 환경마다 최적화된 수치가 조금씩 달라지더군요...^^

      여러번 말씀드리지만, 센서의 성능을 확인하기 위해서라도 참값(혹은 참값이라고 믿을 수 있는)과의 비교는 필수라고 저는 항상생각합니다. 그 방법은 상황마다 다르겠지만 말이죠... 그 부분은 제가 드릴 수 있는 도움이 없네요....ㅠㅠ

  • 2010/07/04 00:48

    비밀댓글입니다

    • PinkWink 2010/07/04 05:05

      응?? 사용할 수 없는 페이지라는데요...ㅠㅠ
      일단 그리고, 결과그래프의 그림화일 링크정도가 아니면 제가 확인하긴 좀 그렇습니다.^^.

  • 2010/07/04 16:16

    비밀댓글입니다

    • PinkWink 2010/07/04 16:45

      (엑셀화일은 확인하지 않았습니다..ㅠㅠ)

      그림화일로 된 결과를 봤을때, 결과가 안좋군요...^^
      그런데 y축 단위가 뭔가요??

      일단 결과를 보면

      자이로센서를 적분한 각도의 단위는 라디안이지 않을까하고
      가속도센서에서 구한 각도는 degree가 아닐까하는데요.
      (그냥 그래프만 봤을때)
      실제 적용도 단위를 다르게하셨나요??? 그러면... 안될텐데요..
      확인을 해보세요...^^

      그리고 엑셀도 최소좌승법에 때라 최적화 기능을 제공합니다.

      http://www.pinkwink.kr/204

      를 한번 확인해보세요.

      아 그리고, 복잡한 2차필터보다는 간단한 1차필터를 한번 사용해보시지요.

      http://www.pinkwink.kr/338

      에 소개했습니다.

  • 김태환 2010/07/04 17:09

    바쁘실텐데 귀찮게 해드려서 죄송합니다. 매번 이렇게 친절하게 답변해주셔서 진심으로 감사드립니다!!
    일단 Y값은 특별한 의미 없구요 엑셀에서 데이터 지정해서 차트출력시킬때 최대값, 최소값 을 기준으로 출력된 부분입니다.
    제가 데이터 실험하면서 단위를 생각을 안하고 그냥했네요...
    라디안이던 디그리던 두 단위중 한 단위로 통일시켜야 되는군요... 수정하도록 하겠습니다.
    그런데 답변 내용중에서 좀 이해가 안가는 부분이 있습니다.
    일단 자이로센서 가속도에서 각도는 아래 식으로 적분하였습니다.
    Angle=Angle+(각속도 * ts)
    그런데 이 출력된 데이터는 필터에 적용 시키지 않았는데 최종 출력된 데이터가 단위차로 문제가 발생할수 있는 부분이 있을까요?

    • PinkWink 2010/07/04 17:35

      전 그렇게 말씀드린게 아니라, 단위가 다른 두 센서의 결과로 필터링을 하신게 아닌가..?라는 의미였습니다.
      그렇다면 필터결과의 그림은 y축에 7이라고 되어있던데 그건 7도인가요? 0.7도인가요?

  • 김태환 2010/07/04 18:17

    제가 답변 내용을 잘 못 이해했었네요...
    FilterAngle 차트에서 Y축 최대값은 7입니다.

    가속도센서 각도=atan((acc_x-1250)/(acc_z-1250))*(180/PI)
    자이로센서 각속도=(gyro-1935)*0.0051

    이 두수식에서 나온 데이터 단위를 통일시키란 뜻이죠?
    그럼 두 센서의 단위를 어떻게 통일 시키면 되나요?

    • PinkWink 2010/07/04 18:22

      모든 단위는 라디안으로 두시고
      마지막 그림그릴때만.. 편의상 degree를 사용하시는 것이 괜찮을겁니다.

  • 2010/07/04 19:48

    비밀댓글입니다

    • PinkWink 2010/07/04 20:23

      그런가요?? 참값과 비교를 할 수 없으니.. 전 잘 모르겠습니다.^^
      그래도 비슷하게 나온다니.. 다행입니다.^^

  • 2010/07/27 18:24

    비밀댓글입니다

    • PinkWink 2010/07/28 06:42

      살펴보겠습니다. 도움이 될는지는 모르지만 말이죠..^^

  • 최빡구 2010/07/29 20:57

    안녕하세요.
    아주 초보초보입니다.
    글을 읽다가 궁금한게있어요.

    Temp1 = (-Pre_AccAngle) + Pre_FilterAngle;

    부분에서 -Pre_AccAngle 가속도 이전 각도라고하셨는데 이전각도는 어떻게 알수있나요?? 구할수있나요???? 그리고 이전 보상필터값두 어떻게 알수있는건가요??

    • PinkWink 2010/07/30 05:02

      위에 소개된 코드가 다 끝나고
      마지막줄에

      Pre_AccAngle = AccAngle;

      이라고 두면, 다음번에 현재값을 이전값으로 쓸수 있지요. filterAngle도 마찮가지구요^^

  • 빡구 2010/08/02 23:13

    kp,ki 게인값은 제가 정하는건가요?? 노가다로 찾아야되는건가요??
    그리고 로우패스필터,하이패스필터를 구성해줘야되는건가요???
    아니면 위에 알고리즘만구현되면 로우패스,하이패스 효과가 되는건가요??
    ㅠㅠ 제가 이해력이 부족해서요~

    • PinkWink 2010/08/02 23:22

      게인값은 찾아야합니다.
      위 코드 자체가 로우/하이패스필터의 역활을 합니다.
      http://pinkwink.kr/78
      에 설명을 좀 더 자세히 하였습니다

  • 빡구 2010/08/26 00:20

    핑크윙크님
    혹시 보정되서 나온 각도가요. 모터의 진동때문에 값이 떨리수가있나요??
    만약에 그렇다면 해결방법이있나요?? 그리고 이유를 알고 싶습니다~

    • PinkWink 2010/08/26 00:46

      센서에 인가된 진동은 당연히 센서 출력에 영향을 미칠테니 성능이 나빠지겠죠. 진동이 있는 상태에서 센서값들을 받아서 Kp, Ki를 수정해보셔야하며, 만약 그래도 잘 되지 않는다면, 2차필터를 3차필터로까지 확대해보시는 것도 방법을 것입니다만, 장담하긴 힘듭니다.

  • 빡구 2010/08/26 11:10

    핑크윙크님
    답변 감사드립니다. 저기 궁금한게 또있는데요

    보정되서 나온 각도가요.
    가속도의 각도와 거의 흡사하게 값이 나오나요??
    제가 보정된 각도를 LCD에 뿌려보니깐 가속도센서의 각도랑 거의 똑같이 나오더라구요. 이게 맞게 된건지 궁금해서요.
    만약에 아니라면 보정된 각도는요. 어떻게 나와야되는건가요??

    • PinkWink 2010/08/26 14:01

      그럴수도 있고 아닐수도 있습니다. 가속도센서를 닮든 자이로를 닮든 그게 중요한것이 아니라 참값과의 비교가 중요한겁니다.

  • 빡구 2010/08/26 15:04

    답변 감사합니다~
    핑크윙크님
    비교를 할려면 어떻게 해야되나요??
    보정된 값과 어떤것과 비교를 해야되는건가요??
    아니면 두개의 센서의 각도를 서로 비교해야 되는건가요??

    • PinkWink 2010/08/26 15:06

      각도를 추정하는 저의 글을 보시면, 모두.. 참값과 비교를 합니다. 물론 완전한 참값을 찾을 수는 없지만, 가장 참값과 비교하기 편한 엔코더와비교를 하지요. http://pinkwink.kr/78 를 보시면, 제가 사용한 실험장비가 나와있습니다.

  • 빡구 2010/08/26 15:23

    핑크님 그럼 혹시 엔코더는 DC모터에 달려있는 엔코더를 사용해두 되는건가요???

    • PinkWink 2010/08/26 15:56

      어떤 엔코더든 무슨 문제겠습니까.. 단... 그래도 한바퀴에 512펼스정도는 되어야.. 레졸루션이 괜찮을겁니다.

  • mijong 2011/04/20 14:17

    음 ki kp 값이요 matlab 의 파라미터 추정으로 구하신거 맞죠 ?? ^^

    • PinkWink 2011/04/20 15:27

      그 부분은 저는 크게 세 가지를 블로그를 통해 제시했는데요.

      첫번째는 http://pinkwink.kr/242 와 http://pinkwink.kr/409 에서 제시한 최소자승법을 이용한 방법이고,
      두번째는 MATLAB이 제공하는 parameter estimation http://pinkwink.kr/311 을 이용하여, http://pinkwink.kr/338 처럼 구하는 방법이고,
      세번째는 http://pinkwink.kr/409 에서 소개한 논문에 안에 보이듯이 차단주파수를 이용하는 방법입니다.

      안타깝게도 세가지 방법중에서 딱 뭐가 항상 좋다라고 말씀드리기는 어렵습니다.

  • mijong 2011/04/20 16:43

    ㅎㅎ 저는 matlab 을 사용하려구요..

    그리고 좋은 제어기를 위해서는 동역학 모델을 세우는 것이 좋다고 하셧자나요

    밸런싱로봇 만들면서 동역학 모델 어떻해야 하나 한 보름 동안 고민하다가
    님의 블로그에서 각도 가 넘어지는 상태의 각도인지 일어서는 각도의 상태인지를 구분하기위해 동역학모델을 사용하셧다고 햇는데요

    저는 한번 동역학 모델을 세우지 않고 -.-;;

    그냥 밸런싱로봇의 머리부분에다가 가속도 센서를 하나 더추가하여서

    넘어지는 상태의 가속도를 측정하면 이걸 구분 할수 있지 않을가 생각
    해서 보상필터+ 넘어지는 가속도 측정 이런 식으로 만들려 하거든요
    물론 동역학 모델이 없어서 좋은 제어기 설계는 아니지만 아이디어 는 좋다고 생각하는데 어떻까요?

    • PinkWink 2011/04/20 18:57

      꼭 동역학 모델이 있어야 좋다는 것은 아닙니다.
      그리고, 넘어지는 각도상황을 알려고 동역학을 구했다고 말하지 않았던걸로 기억납니다만.. 아무튼
      동역학 같은거 모르고, 고려도 안했지만, 무지 잘 만들어진 수없이 많은 작품들을 알고 있습니다.
      그리고, 밸런싱로봇만 말씀을 드리면
      동역학을 알고 모르고를 떠나 밸런싱로봇이 기울어지는 각도와 밸런싱로봇의 이동거리(바퀴쪽 엔코더)와 그 속도값만 알아도 충분하지 않을까 생각합니다.
      그러나 이것은 단지 저의 의견일뿐입니다.^^

  • mijong 2011/05/04 19:53

    윙크님 안녕하신가요 ^^
    정말 대단 하신거 같아요 지금 자이로 가속도 값을 뽑아서 메트랩돌리는데
    토할거 같습니다.
    ki kp 값을 뽑기위해 윙크님이하신matlab 에 들어가서 파라미터 추정하기를 보며 열심히 하고있는데요 입력 에 가속도 와 자이로는 in1 이라는 아이콘을 가져다 놓고 출력에 out1이라는 아이콘을 놓고 했는데 이렇게 하는게 맞죠??? 위에 스코프 아이콘은 나중에 출력 값을 확인 하기위한건가요

    휴 한숨만나오네요

    • PinkWink 2011/05/05 09:49

      파라미터 추정하실땐, 스코프는 안달아도 되구요.
      자이로의 각속도, 가속도센서에서 얻은 각도를 IN으로 잡아주고,
      OUT에는 참값이라고 여길 수 있는 (엔커더에서 얻은 각도 같은것) 것을 잡아주면 됩니다.

      참고로 No pain, no gain...을.. 생각하시구요..^^

  • mijong 2011/05/08 17:01

    음 자세히 읽어 보니까 자이로 신호에 자이로 각속도를 넣는다 라고 되있는데 자이로 센서에서나오는 값이 각속도 인데 그럼 자이로 에서 나온값을 그냥 출력해서 하나요?? 저는 자이로 센서에서 나온 각속도를 적분 누적해서 자이로 각도를 구해 넣는줄 알았는데요 또 그렇게 하니까 잘나오고 해서 .. 윙크님 자이로 각속도가아니라 자이로 각도 넣는거 맞죠 ??

    • PinkWink 2011/05/08 19:45

      자이로입력에는 자이로에서 구한 각속도(바이어스와 스케일팩터가 모두 고려된)가 들어가고, 가속도센서라고 표기된 곳은 가속도센서에서 구한 각도(삼각함수등을 이용한)를 연결하는 것입니다.

  • mijong 2011/05/11 14:00

    그런데 ki kp 변수를 구할때요 메트랩돌릴때 값을 추정하기위해서 제가 가속도 값과 자이로 값에 가속도 센서값은 윙크님이 말씀하신대로 가속도센서 삼각함수를 사용한 각도값을 넣엇고 자이로 값에는 자이로를 적분 누적한 각속도가 아닌 각도 즉 적분한값을 넣었거든요 그래서 kikp를 구햇어요 이부분 잘못된건가요?? 그러니까 변수구할때도 자이로 각도가 아닌 각속도를 넣어야하나요??

    • PinkWink 2011/05/11 14:48

      저는 상보필터의 블럭을 꾸밀때 분명 자이로센서에서 구한 각속도를 입력하도록 했습니다. 그러니 당연히 같은 블럭도로 파라미터를 구한다면 각속도를 입력해야겠지요.^^

  • mijing 2011/05/11 15:03

    gg 억 2개월 동안 뻘짓햇네요 ㅎㅁ

    • PinkWink 2011/05/11 15:52

      아니죠.. 그 2개월도 소중한 경험이 될겁니다.^^

  • mijong 2011/05/11 19:13

    근데요 윙크님 다시 자이로 각속도를 출력해서 메트랩으로 돌려보는데 show plot에서 추정값이랑 엔코더 값이랑 비교 해보는거 있잖아요 거기서 1도정도 파라미터 추정값이 상승하고 또 파라미터 추정을 하다가 중간에서 멈추네요 회색선이 엔코더값이면 파란색 필터 값이 중간에서 멈추네요 왜그럴까요??

    • PinkWink 2011/05/12 07:55

      시뮬레이션 시간의 문제일 수도 있습니다.
      수집된 데이터가 24초라면
      시뮬링크의 시뮬레이션 시간도 24초로 잡아주어야합니다.
      보통 시뮬링크는 10초가 디폴트로 아마 되어있을 겁니다.

  • mijnong 2011/05/12 17:40

    음 그렇군요 ^^ 다시해볼게요 ㅋ
    감사합니다.

  • mijing 2011/05/15 20:14

    윙크님 메트랩으로 다시 돌린결과 그래프는 잘나옵니다. 약간 3,4도정도 오차가 있는데 자이로 속도가 좀 잘못 나와서 그런거 같구요 아주 깔끔하게 잘따라가네요 그런데 이제는 필터와 엔코더의 실제값을 비교해보고 실제 하드웨어에서도 이 값이 잘먹어서 나오는지 확인하려고 데이터를 뽑는순간 ㅠㅠ
    그래프로 뽑아보니 메트랩에서 추정한 그래프처럼 깔끔하게 나오지를 않더군요 완전 찌그러져서 나오는데요 역시 필터를 프로그래밍상으로 구현하는데 문제 가있는거 같습니다. 전 temp1 과 temp2를 메인문의 while(1)에넣어놓고 filterangle 와 int_temp1을 타이머 인터럽트안에 같이 넣어주어서 돌렷거든요

    • PinkWink 2011/05/16 07:58

      여러가지 구현방법이 있을테니...
      그 각각을 뭐라 말씀드리긴 그렇습니다.
      일단 이 포스팅에서는 모든 구문이 10ms마다 발생하는 타이머인터럽트안에 넣어두었습니다.
      그리고, 바로 C로 구현하지 마시고
      m-file로 구현을 한번 해보세요.
      시뮬링크로 구현되던것을
      m-file로 짜보고도 이상이 없으면
      그 구문을 C문법에 맞춰 주면 됩니다.

  • mijing 2011/05/15 21:08

    그리고 look이란 변수를 만들어서 look이 0이면 temp1계산 1이면 int_temp1계산 이런식으로 순서대로 계산되도록 유도햇는데요 가만이있으면 1도에서 왔다갓다하고
    이동시키면 좀 오차는 나도 맞는거같은데요 진자 운동 하면 이러네요 가끔 가만이 있어도 갑자기 값이 엄청나게큰값으로 튀네요 ;;
    아혹시 제가 자이로를 rad/sec 이아니라 theta/sec
    고 가속도센서도 rad 가아니라 theta로 넣었는데요 ..
    그리고 filterangle과 int_temp1은 적분 타이머를 따로 써야하나요??

    • PinkWink 2011/05/16 08:00

      내부적으로는 모두 radian 혹은 rad/sec로 만들어야합니다.
      각도를 확인할때만... 우리에게 익숙한 degree 혹은 degree/sec로 보시구요.

  • mijong 2011/05/16 13:35

    m-file라뇨?? m-file로 구현한다는게 무슨 말씀이신가요 ^^;;;;;;;;;;
    그리고 제가 타이머 시간을 딱안떨어지고 소수점 밑에 좀 많이 나오거든요;; 샘플링 시간도 문제가 있는거 같은데 윙크님이 보시기에도 샘플링시간을 떨어지게 맡추는게 춸씬 좋은거겠죠?

    • PinkWink 2011/05/17 07:52

      C로 코딩해서 하드웨어에서 수정보완하는 시간보다
      알고리즘을 m-file로 구현해서 확인하는 시간이 좀 더 짧을거라는 말씀이었습니다.
      그리고 타이머를 이용해서 정확한 시간을 알면 좋습니다.
      이 포스팅에 있는 코느를 테스트할때 저는 모두 타이머인터럽트안에 두었습니다.

  • mijing 2011/05/19 21:58

    가속도센서의 각도도 라디안으로 그리고 자이로센서의 각속도도 라디안 /sec로 바꾸라는 말씀이시죠 그런데 왜 그렇게 하나요?? 그냥 theta로하면 왜 안돼죠??
    그냥 해도 상관없을거 같은데요???ㅠㅠ왜 그렇죠??
    그리고 제가 agmega128 쓰는데 이걸계산하기에는 힘들기때문에 그런거 아닌가요 혹시 ㅠㅠㅠ 만약 그렇다면 저는 6개월동안 뻘짓하는게 되는데요 두렵네요;; 윙크님 지금 그래프가 비슷하게 따라는 가는데 완전히 안따라가고 엔코더값은 줄어들지만필터값은 따라가는듯하면서도 나중엔 일정한값으로 진동하고 ㅠㅠ 아이 atmega128이 계산을 못하면 다른걸생각해볼텐데요 과연 연산이 가능한가요 ㅠㅠ 도움을주세요 ㅜㅜ

    • PinkWink 2011/05/20 07:52

      글쎄요. 그거야.. 애초부터 rad으로 유도되었기 때문일까요... 하여간 rad입니다.
      그리고, 위의 코드를 실행하는데 (변수선언빼고 딸랑 4-5라인...)
      마이크로프로세서의 성능이 그리 고성능이 필요한것은 아닙니다.
      10ms정도의 샘플링이라면, 위 코드를 실행 못할게 없거든요.
      실제.. 제 블로그에 방문하신던 한 분도 atmega를 사용해서 된다고 하셨거든요.

  • mijing 2011/05/21 20:31

    라디안값으로 구해서 c로 다시구현해봣는데요 필터값이 대폭팔햇어요ㅠㅠㅠㅠㅠ filterangle 값이 그냥 팍하고 커지네요 제가 알고리즘을 잘못 짠지는 모르겟지만 혹시 윙크님 대략적으로 c는 어떻게 짜셧나요??
    pre_filterangle,pre_accangle는 그냥 가속도센서 라디안각도랑 필터 값 그냥그대로 넣어줫어요ㅠㅠ
    음 중간에 값이 튀네요 왜그런지 찻아봐야겟네요 ㅠㅠ

    • PinkWink 2011/05/21 16:25

      이 포스팅의 주제가 C로 짠건데요...
      각 변수의 의미는 또한 본문에 표현되어있습니다.

      아 그리고, 기존의 degree단위나 rad단위나 코드자체는 같습니다.
      그냥 입력되는 두 데이터가 radian단위와 radian/sec 단위로 입력하고
      출력되는 것이 radian이니 관찰할때만 degree로 바꾸면 될 뿐 입니다.

  • mijing 2011/05/22 18:20

    gg 윙크님 도저히 모르겟습니다. ㅠㅠ 각 변수가 어떤 값인지도 알고있고 ki kp값도 구햇고 temp1 int_temp1 temp2 filterangle 순서로 값을 구하기위해서 순서대로 적분 타이머에도 넣어줘 봣고요 순서를 위해 적분하는거 2개변수는 적분타이머에 넣어주고 변수를 설정해서 순서대로 들어가게도 해봣는데도 나중에 값이 팍 뛰어서 엄청큰값으로 가네요 제가 당근이라는 카페에 적은 질문인데 좀만 도와주세요 거의 다왓는데 포기 하는건 제가 아쉬울거 같아요 ㅠㅠ
    가만히 있으면 잘되는데 움직미면 개망해요 ㅠㅠ
    http://cafe.naver.com/carroty.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=131834&

    • PinkWink 2011/05/22 18:46

      저는 10ms의 타이머 인터럽트안(Ts=0.01)에

      Temp1 = (-Pre_AccAngle) + Pre_FilterAngle;
      IntTemp1 = IntTemp1 + (Temp1 * Ts);
      Temp2 = (-Kp * Temp1) + (-Ki * IntTemp1) + GyroAngularVel;
      FilterAngle = FilterAngle + (Temp2 * Ts);
      Pre_FilterAngle = FilterAngle;

      라고 넣어두었습니다. 각 변수들의 의미는 아신다고 하셨으니...
      아 이것저것 고민하기 싫은 귀차니즘으로 모든 변수는 그냥 더블형으로 글로벌로 처리했습니다.^^

      그리고 Pre_AccAngle은 가속도센서에서 구한 라디안단위의 각도
      GyroAngularVel는 자이로센서에서 구한 라디안/sec 단위의 각속도 입니다.

      Kp Ki는 아마 대체로 0부터 2사이의 값이었던걸로 기억이 납니다.

      그러고난 결과인 FilterAngle를 관찰하면 라디안단위의 각도를 확인할 수 있습니다.

      많은 고민을 하고 계시겠지만, 조금더.. 고지가 얼마남지 않았으니 힘내시길 바랍니다.

  • mijong 2011/05/24 10:57

    답변감샇바니다. ㅠㅠpre_accangle는 어떻게 처리해주셧나요?? 그냥 acc값을 넣어 주셧나요??그리고 저 ki kp 값이 200 얼마랑 2. 얼마 가나왓는데요 이거 실험 상황에 따라 다르게 나올수 있죠?? 그리고 제가 prefilterangle를 안해줫엇네요 이거 해주니까 가만히 있으면 값이 뛰지는 않는데 움직이면 값이 부왘 하고 ;;;; 뛰어 버리네요 .. 혹시 pre_accangle 값때문에 일지도 모르겟네요 pre_acc값 어떻게 처리해주셧나요???

    • PinkWink 2011/05/24 13:50

      본문에도 나와있지만, 이전 샘플타이밍에서 구한 가속도센서에서 계산한 각도입니다. 한가지 더 주의하실 점은 가속도센서에서 구한 각도와 자이로센서에서 구한 각속도의 방향이 맞아야합니다.

  • mijong 2011/06/13 20:20

    먼저 2주년 되신거 늦엇지만 축하드리고요 ㅋ
    다시 해봣는데 요
    혹시 자이로 속도 부호에 문제 가있나보니까
    별문제없고요
    근데 자이로센서에서 궇나 각속도의 방향과 가속도센서에서구한 각도 방향이 같아야 한다는게 무슨말이시죠 말그대로 부호가 같아야된다는거죠 ㅋㅎ 아직도 각도 추출 안되네요 추출된값을 보면 마치 그냥 가속도 센서값에서 좀 더 커진값같아요 ㅠㅠ

    • PinkWink 2011/06/13 20:54

      네.. 말 그대로 부호(방향)이 같아야한다는 거죠..^^
      음... 그리고 무지 애쓰고 계실텐데 아직 잘 안된다고 하시니 제가 다 안타깝습니다. 에구...

  • mijong 2011/06/16 21:14

    혹시 시뮬링크의 필터를 잘못설계한게 아닐까요??
    저는 보상신호 자이로 신호에 ln1,ln2 를 놔주고 나머지는같고 filterangle라고 써잇는 부분있잔아요 거기에 out1을 넣어 주엇어요 그리고 추정을 햇지만 결과 값을 확인해보니 회색선 엔코더 값을 따라가지못하고 마치 가속도 센서 같이 작은 범위에서 왓다갓다 하네요 진동할때만요 손으로 잡고 움직이는건 따라가는데요 ..

    • mijong 2011/06/16 21:30

      마치 가속도 센서값같아요 혹시 필터 설계할때 각소자에 설정해주어야 한다 라던가 하는 거가 있나요>??
      그리고 샘플링타임이 0.01초인데 이건 메트랩 파라미터추정상에서 고려하지 않아도 되나요??? 만약 샘플링타임을 고려한다면 어떻게 해야하나요 ㅠㅠ 정말 여기 오래도 오네요 댓글보니까 다른사람들은 잘만되는거 같은데 왜저만 안되는지 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ그리고 데이터를 추출한 시간은 상관없죠?? 10초든 20초든 비슷한 값이 나오나요??
      하여튼 분명히 소스 문제는 아닌거 같다는 결론은 냇습니다. ㅠㅠㅠㅠ

    • PinkWink 2011/06/17 07:51

      손으로 움직일때는 잘 되지만, 자유진동시켰을때는 안되는다는 것은 역시 게인값을 잘못 설정한것으로 보입니다.

    • PinkWink 2011/06/17 07:53

      당시 사용한 각 센서들이 노이즈가 많아서 RC로 로우패스필터를 설치했습니다만... 그게 있으나 없으나 크게 보면 차이는 없습니다. 단지 작은 크기로 실려있던 노이즈를 제거 한 거니까요. 그리고 샘플링 타임은 시뮬레이션 환경설정에서 fixed pooint로 두고 샘플타임을 0.01로 설정해야합니다. 시뮬레이션 전체 길이는 뭐 충분히 길다면 큰 상관은 없었습니다.

  • mijing 2011/06/17 16:25

    시뮬레이션환결설정은어디서하나요????

    • PinkWink 2011/06/17 16:45

      시뮬링크화면 상단 메뉴의

      Simulation -> Configuration Parameter

      Type : fixed step
      Fixed step size : USER SETTING

      입니다.

  • mijong 2011/06/17 17:14

    음 타입을 fixed step 으로 하고 하고서 parameter estimation에 들어가서 할려니까 too many input argument 라고 뜨는데요 이거 데이터량도 9초 정도 만 넣는데 왜 많다고 나오는지요 ?????????? ㅎ

    • PinkWink 2011/06/17 17:18

      그 경우는 이미 에스티메이션 툴박스에서 mijong님이 시간축을 입력하신 경우이기 때문에 fixed step을 사용하지 않으셔도 됩니다.

  • mijong 2011/06/17 17:45

    음 잠시 정신이 없엇네요 안되서 일단요 엔코더의 실제 값과 자이로 속도 값과 가속도 센서의 값을 잘뽑앗습니다.
    자 이제 메트랩에서 data라는 변수에 각값을 합쳐서 시간도 0.01 간격으로 잘맟추어서 t라는 변수에 넣고요 이제 윙크님이 쓰신 파라미터 추정 을 하는 방법에 대한 포스팅을 잘따라갓지요 그리고 showplot 를 햇더니요 회색의 엔코더 값이보이고 파라미터추정값과 자이로 가속도의 값을 연산해 나온 파란색 선이 보이더군요 그런데.. 분명히 실제 값을 따 라가면서 나와야될 파란색 선계산값과 회색선 엔코더값이 불일치 하더라고요 따라서 당연히 게인 값이 잘못 계산된거일거구요 분명히 엔코더 자이로 가속도 센서값은 제대로 나오고요 즉 진동일때 자이로 속도가 엔코더를 따라가고 (고주파) 손으로 움직이는 부분 (저주파)일경우에는 가속도 센서가 잘따라가고요 자 그럼 이제 게인값이 잘못 나왓고 입력된 각 data값이 잘못돼지 않앗다는걸 알앗는데요 그럼 제가 이실험에서 무엇을 수정해야 제대로된 게인값과 파란색선이 회색의 엔코더 값을 잘따라가게 할수 있을 까요 ?? ㅠㅠ 너무 힘들어요 ㅠㅠ
    진짜 이렇게 매일 질문을다는데요 답변해주시는 윙크님 정말 감사합니다. ㅠㅠ

    • PinkWink 2011/06/17 17:49

      어감만 봐도... 분노가 느껴집니다만...
      저로서도 어떻게 해드리기가 힘드네요....
      말씀하신 내용들은 모두 맞습니다.

  • mijong 2011/06/17 17:55

    ㅠㅠ 흑 분노는 아니고요 ;; 화난거 처럼보엿다면 죄송요;;; 음 그러니까 위의 글은 좀 차분해진다음 쓴글이라서요 ^^ 음 지금 제실력으로 이실험에서 뭐가 잘못됫는지도 모르겟고 여기서 그만두면 시간도 아깝고 해서 요 안되니까 자기 자신한테 화가 나더라고요 ^^ 혹시 윙크님 의견을 듣고 싶어서 그럼니다. 님의 생각에 과연 제가 어떤 실수 를 햇을지 윙크님 생각을 듣고싶습니다. 정말 죄송한데 혹시 메일은 안받으신다고 하셧지만요 정말죄송한데 제 가 뽑은 데이터를 보내드릴순없을까요 ??ㅠㅠ
    그리고 제가 줄을 많이 연결해서 이게 마찰 이되서 게인값을 추출하는데 영향이 있을수도 있나요??

    • PinkWink 2011/06/17 18:46

      ㅎㅎ... MATLAB에서 실험한 데이터를 이용해서 필터 계수를
      a1(Kp)에 1.414 a2(Ki)에 1을 두고,
      그리고 그 결과를 보시고 잘 되는지 아닌지 알려주세요.
      (아 실험은 약간 느리게 움직여보세요. 대략 초당 1번에서 2번정도의 느낌)
      만약 잘 된다면 에스티메이션에서의 문제일거고
      만약 저 게인이 정말 이상하게 안 맞다면, 실험데이터나 다른 곳의 문제이겠죠...^^

      그리고, 제 메일은 pinkwink.korea@gmail.com입니다. 그러나 데이터를 보내신다고 해도 제가 확인할만한 시간이 없을 수도 있습니다. 전 현제 휠체어생활을 아직도 하고 있어서 집에서는 꼼짝없이 침대에 누워있거든요.

  • mijong 2011/06/18 11:47

    얏홍 !!!!!!!!!! 윙크님이 말씀하신대로 그 게인 값을 넣으니까 약간오차가 있지만 많아봣자 약 10도정도?? 게인값이 완전히 맞지 않아서 그럴수있다 생각하면 꽤나 잘나와요 그렇다면 실험데이터와 소스상의 문제는 아니고 메트랩에서 게인 값을 구하는 과정에 문제가 있나보네요 그렇다면 제가 정확한 게인값을 얻기위해서는 메트랩을 다시 돌리면서 구해봐야하는데요 음...에스티메이션에서 의 문제라는게 혹시 제가 시뮬링크에서 잘못 필터를 설계하셧다는 말씀이신가요??
    분명히 윙크님 포스팅 잘따라가서 햇는데요 ㅠㅠ
    그리고 잘정리해서 메일로보냇는데 한번만 봐주시면 감사하겟습니다. ㅠㅠ

    • PinkWink 2011/06/19 08:39

      이제보면.. 게인을 설정하는 부분의 문제라고 결론을 내 볼수도 있겠네요. 그리고 메일을 보내셨다고 제가 꼭 확인한다고 장담드릴수는 없습니다. 다시 말씀드리지만, 다리를 다친 이후로 오랫동안 의자에 있으면 다리가 부어서 통증이 심하거든요. 그래서 정시 퇴근을 하다보니 다른 데이터를 확인할 시간이 그리 많지 않습니다.

  • 2011/07/02 22:57

    비밀댓글입니다

    • PinkWink 2011/07/03 12:59

      이 포스팅에서 적분은 두 군데서 일어나며 그 변수를 저는
      IntTemp1과 FilterAngle로 잡았습니다.

      그리고 위 포스팅에서 밝혔듯이 그 때의 적분은

      IntTemp1 = IntTemp1 + (Temp1 * Ts);
      FilterAngle = FilterAngle + (Temp2 * Ts);

      와 같이 처리하고 있습니다.

  • 어려운쿼드 2012/08/13 18:07

    블로그 내용 잘보고있습니다...
    하나 질문이 있는데요...

    센서에서 읽은 값은 센서 좌표(기체좌표)이기 때문에 오일러각을 이용해서 지구좌표로 전환해야 하는걸로 알고있는데..

    이러한 추가 작업 없이도 위와 같은 코딩을 짜면 지구좌표 기준의 롤과 피치각이 나오는 건가요??

    • PinkWink 2012/08/17 09:12

      일단, 지금은 절대각도입니다. 가속도 센서로 지구 중력방향을 보니까요.

  • 타키 2012/10/09 15:23

    작성하신 글을 보고 아래 댓글을 쭈욱 읽어보니 완벽하진 않지만 이해가 되네요.
    필요한 지식이였는데 너무 감사합니다.

  • 윤원혁 2012/12/02 23:39

    안녕하세요

    숙제로 자이로와 가속도센서를 이용해 자세 추정을 하는 프로젝트 도중 많은 도움이 되었습니다
    그런데 아직은 결과가 잘 안나오네요 ㅠㅠ 그래서 한가지 궁금한 점이 있어 질문드립니다

    우선 프로젝트 내용은 x, y방향 가속도센서와 z방향 자이로를 이용해 보드의 자세를 추정하는 거구요(z축이 중력가속도 방향과 수직일때) 저는 가속도 센서에서 나오는 a_x와 a_y 값을 이용해 theta_acc = arctan(ax/ay)를 구했는데요
    여기서 얻은 thetaa_acc값을 어떻게 해야 될지 잘 모르겠습니다.. 우선 각도를 나타내는 방법이 여러가지가 있는데
    0~2pi 범위로 나타내면 되는지 궁금합니다. 그리고 +z방향으로 회전하는 경우 즉, 각속도가 양수인 경우에는 theta_acc가 양수인게 맞지만 -z방향으로 회전하는 경우는 음수인게 맞는것 같은데 이를 어떻게 처리해야 할지 잘 모르겠습니다..

    답변 부탁드릴게요.. 감사합니다

    • PinkWink 2012/12/05 09:02

      초기부호를 잘 설정하셨으면, actan도 부호가 잘 나옵니다. 꼭 부호에 대해 고민하실 것은 없습니다.
      단, actan를 사용하는 경우 90도에 대해서는 대응할 수 없습니다.
      일단 알고리즘 학습단계라면, 그냥 -90~90 범위에서 먼저 보시는게 나을듯합니다.

  • 윤원혁 2012/12/02 23:42

    위에 댓글들을 보니 역시 가속도센서에서 나온 값과 각속도의 부호가 같아야 한다고 되어있네요
    그럼 가속도센서에서 얻은 값을 -2pi~2pi 범위의 숫자로 바꿔서 계산해주면 되는건가요??
    저는 ATmega128을 이용하고 있는데 내장된 atan 합수를 쓰니 -pi/2~pi/2로 출력해주는 것 같더라구요

    • PinkWink 2012/12/05 09:04

      actan 함수를 한 번 그려보시면 됩니다. 그 함수가 90도에서 정의된 값이 없거든요.

  • balancing 2014/05/14 04:16

    안녕하세요.
    그동안 블로그를 참조하면서 프로젝트를 하는데에 지대한 도움을 받아서 감사의 말씀 먼저 드립니다.
    현재 balancing 로봇을 만들고 있는데 외바퀴로 Unicycle 형태로 만들고 있습니다.
    일단 보조바퀴를 달아서 앞뒤제어를 먼저 하려고 하는데에 있어 pinkwink님의 동역학설계방법 및 lqr제어기 설계를 참고하여 게인값을 구하는데 까지는 따라하였는데 실제로 적용시켜보았더니 제대로 작동하지가 않아서 원인을 살펴보다가 현재 센서값을 IMU를 이용하여서 sci통신을 이용하여 1ms단위로 받고 모터인터럽트도 1ms로 하여 연산을 하고 있습니다. IMU에서 받은 각도값을 이용하여 각속도를 구하여 적용시켰는데 각도 및 각속도값에서 문제가 있는 듯하여 아날로그센서를 이용하려고 하고 있습니다. 서론이 길어서 죄송합니다.... 서론에 대한 내용에서도 도움을 구할 수 있으면 좋을 듯 하여 같이 언급하였습니다.... 결국에 질문은 앞의 글에서 처럼 폴에 센서와 엔코더를 달아서 실험을 하여 Kp와 Ki값을 구하여 필터를 구현한다고 한다면 실험한 환경은 폴에서이고 실제 적용할 곳은 제 로봇인데 그렇게 실험한 값을 사용할 수 있는 것인지 알고 싶습니다.
    말이 길어져서 죄송합니다..... 도움을 주신다면 정말 감사하겠습니다..!

    • PinkWink 2014/05/14 12:33

      물론 실험환경이 실제 시스템을 100%담지는 못할겁니다만, 그래도 실제환경과 흡사하다고 해도 될 겁니다. 그냥 실험을 따라하는 것이 아니라, 내가 구동시키는 온도, 진동, 충격 등을 실험할때 잘 반영하면 됩니다.
      그리고 제어기가 시뮬레이션과 실제 구동에서 차이가 나는 것은 많은 이유가 있기 때문에 다각도에서 잘 확인해보셔야할듯 합니다.

  • 공대생 2014/05/18 12:04

    IMU 관련 질문입니다.. pitch, roll 보정은 가속도센서와 자이로센서를 상보필터 2차식으로 융합해서 보정했는데, yaw 값은 지자기 센서와 가속도센서로 얻은 값 이 후에 어떻게 처리해야할지 모르겠습니다 ㅠㅠ compass_yaw 값이 적분과정이 없어서 오차누적은 없지만 값 자체 오차가 있더라구요...(Y축으로 수직이동한 것 처럼 이상적인 각도에서 붕 떠 있어요ㅠㅠ) 상수로 처리하는 문제인지 아니면 자이로로 얻은 yaw와 어떤 식을 통해 융합되는건지 궁금합니다!! (그리구 제가 compass yaw 값을 잘못 구했을 수도 있는데.. compass_yaw식 아신다면 알려주실래요ㅠㅠ 논문참고했는데 안되네요ㅠㅠ)아참! 좋은글들 덕분에 그동안 프로그래밍을 많이 성공시켰는데, 너무 감사합니다~!

    • PinkWink 2014/05/18 23:28

      그건 지자기 센서의 결과를 봐야합니다.
      상보필터의 주 컨셉은 주파수특성이 다른 두 센서를 융합한다는 것으로... 지자기센서와 자이로의 융합도 결과를 보고 융합할 것이지 아닌지를 정해야합니다.
      아니면 아예 칼만필터를 써야할지도 모릅니다^^

1 ... 12 13 14 15 16 17 18 19 20 ... 37