최근에 가속도센서를 이용한 각도 측정과 그 한계에 대해 이야기 했었습니다. 그래서 회전각도 혹은 기울어진 각도를 검출하기 위해 대표적인 각속도센서인 자이로 센서를 테스트해보았습니다. (참고로 극도로 초보적인 테스트니까 혹시 자이로에 대해서 잘 아시는 분들은 안읽고 지나가셔도 된다는...^^) 먼저 대상으로 삼은 센서는 요즘 제가 부쩍 자주 들어가보는 Withrobot의 myGyro300SPI와 인터렉트의 NT-Gyro300이라는 두 제품입니다. 먼저 myGyro300SPI는 Analog Devices사의 ADIS16100을 모듈화한것이구요. NT-Gyro300은 InvenSense사의 IDG-300을 모듈화한 것입니다.



I. myGyro300SPI


 위에 보이는 myGyro300SPI는


제품사양에도 나와있듯이 칩의 윗쪽 방향 중심의 회전... 즉 칩입장에서 yaw 각속도 검출만 가능하며 +-300도/s의 측정범위를 가집니다. 그 출력값은 SPI통신으로 전송되고 필터를 내장하고 있습니다. 필터대역은 0.87Hz입니다. 이 대역을 모듈의 R,C를 바꾸어 변경가능하긴 한데, 만만치 않은 가격(10만원이 약간 안되는)의 제품을 간크게 뜯기엔 좀 어려워보입니다.^^


저부분도 약간은 아쉬움이 남는 부분인데, 3번핀에 5V를 인가해야하고, 3.3V대상 프로세서라면 동작전원을 4번핀에 별도로 3.3V를 인가해야합니다. 약간은 불편..(ㅜ.ㅜ).. 11,10,9번핀은 뭐 별도 내장되어있는 2개의 ADC를 위한것으로 일단은 사용하지 않을꺼니까 1번부터 8번만 연결하시면 됩니다.


위 계산처럼 만약 도/s의 단위라면 출력값에 0.3275를 rad/s라면 0.0057을 곱해서 사용하시면 됩니다. 아참 위의 3/5부분에서 3을 3.3으로 바꿔서 다시 계산하세요...ㅋㅋ^^


이전 가속도센서 테스트때도 사용한 그 기구부의 회전중심축에 자이로를 연결하고 엔코더의 출력에서 계산 각도를 샘플링타임 0.01초에 맞춰 미분(차분)해서 자이로와 비교했습니다. 위에 계산된 스케일펙터가 정확함을 알 수 있네요. 그러나~~ 참값인 파랑색을 뒤따라 나오는듯한 인상을 받습니다. 당연히 어떤 필터가 설계된 상태이니 시간지연은 어쩔 수 없는것일겁니다.




II. NT Gyro300


위의 NT-Gyro300은


핀배치도만 봐도 알 수 있듯이 아날로그출력을 가집니다. 일단 칩입장에서 피치와 롤각속도 두개를 검출할 수 있습니다. 뭐 아날로그 출력이니 전원, 그라운드 빼면 한축당 하나씩만 물려주면 되겠습니다.^^



위에 스케일펙터를 계산해 두었습니다. 그게 맞는지 엔코더의 미분치와 비교해보겠습니다.


뭐 대략 일치한다고 볼 수 있습니다. 그러나. myGyro300SPI에 비하면 어마어마한 노이즈를 가지고 있다는 사실을 알 수 있습니다. 저 노이즈를 가급적 시간지연없는 범위안에서 5개의 샘플링구간을 평균하는 것으로 다시 잡았습니다.


myGyro300SPI만큼은 아니지만 어느정도 노이즈가 잡힌듯 보입니다. 그러나 장점도 있습니다. 바로 시간지연이 얼마 없다는 것입니다. 두개의 각속도그래프와 엔코더의 미분치를 같이 놓고 보겠습니다.





III. 두 센서의 적분을 이용한 각도 검출

이제 적분해서 두 센서를 같이 비교해보겠습니다.




적분은 많이 사용하는 ZOH(Zero-Order Hold)로 보통 사각형의 넓이 구하기 입니다. 출력값에다가 샘플링타임(0.01초)을 곱해주면 됩니다. 파랑색 참값(엔코더)에 비하면 NT-Gyro300은 드리프트현상이 myGyro300SPI에 비하면 심하다는 사실을 확인할 수 있습니다. 그러나 시간지연측면에서는 당연한 이야기지만 그 반대입니다. 시간지연 정도는 참값(엔코더)에 비해 NT-Gyro300이 0.02초, myGyro300SPI가 0.13초입니다. 사실 100ms가 넘는 시간지연은 아무리 노이즈가 작다하더라도 좀 우울하다는 생각이듭니다. 물론 2족보행로봇과 같은 느린응답도 괜찮은 시스템의 경우는 괜찮겠지만, 저처럼 무인항공을 목표로하고 있다면 좀 난감하다고 말해야겠습니다. 그러나, 아직은 어떻게 될지 몰라서 둘다 계속 테스트를 해야겠습니다.

마지막으로 정지시 드리프트 정도를 보겠습니다.


역시 myGyro300SPI가 내장된 필터의 역활때문인지 훨씬 우수한 성능을 보여줍니다. 물론 온도센서에 대한 보상은 하지 않았습니다. 일단은 자이로 모듈자체의 성능이나 특성을 비교하고 싶었기 때문입니다. 그리고 온도센서를 이용한 보정이라 하더라도 충격에 대해 자이로의 측정범위를 넘어선다면 그걸 자이로만으로 해결하기는 어려워보입니다. 즉, 어차피 외부의 다른 센서를 이용해서 보정할 생각이기 때문에 그냥 ... 테스트했습니다. (절대 온도센서결과값을 SPI로 받는 부분이 이상하게 잘 안되서 말하는 핑계는 아닙니다... 흑흑)

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

 


http://pinkwink.kr/trackback/75 관련글 쓰기
  • 이전 댓글 더보기
  • irmus 2009/06/24 18:18

    적분한 값에서 시간딜레이가 관찰되는 것은 자이로 센서의 LPF때문입니다. 출시초기 bandwidth는 0.87Hz로 설정되어 있고, 아주 낮은 cut-off frequency이죠. 이는 PCB상의 BP1을 바꿔 달거나, R1을 추가로 달면(기본적으로 안달려있죠) 바꿀 수 있습니다. R을 하나 더 다는건 쉬운일이다 생각해서 그렇게 만들어놨습니다만, 학생입장에서 생각해 보니 1608 사이즈 칩저항이 용량별로 쉽게 만져볼 수 있는 소자는 아니라는 생각도 듭니다.
    어쨌건, 원하는 시스템 퍼포먼스가 정해지면 적당한 시뮬레이션을 거쳐 원하는 bandwidth를 산출하고, 이에 맞는 필터를 사용해야만 합니다. 불편하다고 투덜거릴 수 있지만, 현실적으로 겨우 10만원짜리 자이로센서에서 바랄 수 있는것이 그정도랍니다. 당장 invensense의 IDG-300만 봐도 센서 출력단의 LPF가 얼마나 중요한지 딱 보이지 않습니까...

    참고로 보통 1000불 이하는 자이로센서 취급 안해줍니다. 그만큼 성능이 떨어진다는 뜻이죠. 그리고 그 이상의 자이로센서는 무기통제규약에 묶여 수출 규제 품목입니다 ^^;; "나 돈 많아"라고 하며 구매할려고 여기저기 알아보다 보면 CIA에서 전화 옵니다 -_-;;

    • PinkWink 2009/06/24 18:53

      예...필터때문이라는 것을 알고있었습니다.
      그리고 그 가격에 좋은 제품이라는 것도 알고있지요..
      (제가 본문에서 말한 가격부분은 제 입장(전 백수라~~)에서 이야기 한것입니다...)ㅠㅠ
      ㅎㅎㅎ
      그러니 감사하며 사용한다는...^^

      그런데 1000불 이상의 자이로센서가 무기통제규약에 묶여있다는 이야기는 처음 알았네요... 헉... 놀랬다는...^^

  • 엘리 2010/01/24 17:24

    이해하기 쉽게 잘 설명 해 놓으셧네요^^
    참고 할게요 ^^

  • irmus님께 2010/02/02 14:41

    안녕하세요? 위드로봇의 mygyro300SPI를 사용하고 있는 학생입니다. 센서모듈의 LPF 차단주파수를 바꾸려면 R1저항에 저항값을 추가하여 차단주파수를 변경할 수 있다는 내용을 사용설명서에서 보았는데 실제로 R1저항을 추가하게 되면 차단주파수는 바뀌겠지만, 필터의 DC이득또한 바뀌어서 감쇄된 신호가 나오더군여..

    그리고 핑크윙크님께.. 글의 맨 윗부분에 스케일팩터는 3.3V던 5V던 간에 4.1일 것 같습니다. 원래대로라면, 님의 실험구성에서 진자의 움직임이 약 1~2Hz일때 사인파의 진폭이 감쇄되어서 나오는 것이 정상일 것 같습니다.

    • PinkWink 2010/02/03 08:56

      안녕하세요^^
      전 그 칩저항 제거하는게 정말 어렵더라구요^^ (수전증이...ㅜ.ㅜ)

      irmus님께서는 여기 잘 안오시는데.. 가끔들러서
      느리게 공부하는 절 한심하게 생각하실지도 몰라요...ㅜ.ㅜ

  • irmus님께 2010/02/02 14:43

    여기서 BP1의 Cap만 제거하면 40Hz의 차단주파수를 갖는 LPF로,
    4.1의 스케일 팩터에 대해 신호감쇄와 위상지연이 없는 신호를 얻을 수 있습니다.

    • PinkWink 2010/02/03 08:57

      캡? 음... 제거해볼까요? 없는돈에 어렵게 산건데 망치면 어쩌나 하고 걱정했지요...^^

    • 박진원 2010/05/21 16:41

      좋은 정보 감사합니다. ^^

      그런데 궁금한점이 한 가지 더 있어 질문좀 드릴려구 합니다. ^^
      myGyro61EB모델이 지금 막 출시를 할려는거 같은데
      이 모델은 8.8Hz의 로우패스필터를 내장하고 있습니다. 최대 2.5KHz를 필터링 한다구 적혀있습니다.
      아직 기초가 많이 부족한 학부생인데.. ㅠ

      로우패스필터가 높은 주파수를 차단하고 하이패스필터가 낮은 주파수를 차단한다고만 알고있습니다. ^^;

      그렇다면..

      1. 낮은 주파수라함은 범위가 어느정도를 말하는것인지요..?

      2. 높은 주파수라함은 범위가 어느정도를 말하는것인가요..?

      3. 가속도 센서나 자이로 센서로 각도를 추출해서 사용할려고 합니다. 제가 원하는 각도는 수평에서 0도를 기준으로 좌로 기울경우 -10도(최대 -15도까지)를 오른쪽으로 기울 경우 10도(최대 15도까지) 정도만을 제어하면 되는데 이럴 경우에도 필터의 대역폭과 상관이 있는지요?? 상관있다면 어떤(로우??하이??패스)필터를 사용하면 되는지요?

    • PinkWink 2010/05/22 09:51

      데이터시트를 보시면 현재의 Cut-off 주파수에 대해 설명이 있을겁니다. 그리고 몇번 저항 혹은 몇번 캐패시터를 어떻게 수정하면 차단주파수가 어떻게 변한다는 공식이 있을 겁니다. 설정 각도의 문제가 아니라 사용환경에서의 문제로 인해 필터값이 변경되는 경우가 많습니다.

  • 위에글 2010/02/04 16:24

    어렵지 않아여 ㅋㅋ
    인두기로 지지고 떼면 되요 ㅋㅋ
    화이팅!!
    고장나지 않습니다 ^^
    훨씬 좋은 특성을 얻을 수 있어여

    • PinkWink 2010/02/05 00:37

      ㅎㅎ 그런가요? 조금 있다가 지금 하고 있는 작업이 끝나면
      공간상의 각도 추정을 테스트해야하는데
      한번 도전해보겠습니다...^^

  • 위에글 2010/02/04 16:28

    덧붙여서..
    칼만필터를 공부해보심이 어떨까여?
    제가 동일한 시스템을 동일한 실험장비로 구성하여(핑크윙크님의 실험장치구성이 매우 기발하시던군여^^, 고가의 시험장비를 구입할 여력이 안되니 ㅠ.ㅠ 사실 실험실에 3축 짐벌이 있는데 사용할줄 몰라서여 하하) 칼만필터를 이용해서 결과를 내 보았습니다.
    정말 좋은결과가 나오던군여 ㅋ

    • PinkWink 2010/02/05 00:50

      그놈의 게으름이 원인인게지요...ㅜ.ㅜ
      사실.. 해야겠다는 생각을 꽤 오래전부터했습니다만...
      잘 되지를 않네요....^^

  • snow 2010/03/30 23:07

    저번에 NT-Gyro300 자이로의 드리프트 때문에 문의 드렸던 학생입니다.^^;
    5개의 샘플링 구간을 평균하셨다는게.. 무슨 뜻인지 알 수 있을까요?
    10ms씩 2초동안, 즉 200개의 데이터를 평균내서 reference로 사용하는데도,
    초당 1도의 드리프트가 발생한다는..ㅠ scale factor도 구하고.. 다 괜찮은 것 같은데..
    아무리 생각해도 초당 1도의 드리프트라는게 너무 심한듯 해서요..
    적분은 이런식으로 하고 있습니다.
    2초뒤의 gyro값이 second_Gyroval값으로 저장하고
    reference와의 차이에 sampling time을 곱해서 계속 더해주는 방법입니다.

    second_Gyroval = ADBuf[0] ;
    dAngle = (second_Gyroval - ref_Gyroval) * AD_scalefactor ;
    Gyro_Angle += (dAngle * 0.01) ;

    적분의 방법이 큰 문제가 있는걸까요?
    조언 부탁드릴게요 ^^;;

    • PinkWink 2010/03/31 09:05

      즉, 현재값은 이전 5개의 결과의 평균이라고 보겠다는 것입니다. 흔히 Moving Average라고 하더군요...^^

      그리고, 음... 10ms씩 2초동안의 ref를 평균내서 빼는 것인가요? 이 부분은 저도 잘 모르겠네요... 제가 자이로를 적분할때는

      ADC상에서 center를 만약 GyroCenter라고 하면

      Gyro = (현재자이로-GyroCenter)*scaleFacor

      라 두고, 이 Gyro값을 5개구간 평균을 사용하고

      Angle = Angle + Gyro*sampleTime

      이라고 계산을 하는데요^^

  • 김기현 2010/05/04 02:30

    안녕하세요 처음뵙겠습니다
    자이로를공부중인 학생입니다^^
    자이로를 적분하여 각도를 구하기 위해 많은검색과 글들을보았습니다

    각속도 = (측정값-정지값)*스케일펙터
    * 스케일펙터 = 입력전압/분해능/감도

    라는 공식을 많이보았는데요 여기서 스케일 펙터가 의미하는바를 잘모르겠습니다

    측정값에-정지값(초기값)을 빼서 ( 각도 += 각속도*샘플링시간)


    그값을 샘플링시간을곱해 계속더해준다면



    그래프의 면적이 머리속에 그려지지만 이스케일펙터를 곱한다는 개념은 안서더군요

    데이타시트를 참조하여 민감도(sensitivity) 부분을 참조하여 이 민감도를 고려한다면모를까


    입력전압 대 분해능이란것이 실시간적인 양자화데이타를 뽑아내는것인지



    또 굳이 데이타를 뽑아낸다하더라도 번거롭게 이런과정을하는 의미를모르겠습니다 ㅜ

    • PinkWink 2010/05/04 10:53

      스케일팩터는 하드웨어적인 부분입니다.
      만약 측정범위가 -300도/sec부터 300도/sec인 자이로가 있다고 치죠.
      그런데, 이 센서의 아날로그 출력이 0V부터 3.3V라면 그 중심인, 1.65V를 사실상 0도/sec라고 봐야겠죠. 그리고 나면 +- 1.65V의 공간이 +-300도/sec를 잡게 되는 겁니다. 그러니, 센서의 출력값을 각속도로 환산하기 위해서는

      각속도 = ( 센서의 출력 - 1.65V ) * 300/1.65

      라고 해야합니다. 여기서 300/1.65 가 소위말하면 스케일펙터의 역활입니다. 위 본문의 내용은 그걸 좀 더 자세히 설명한것입니다.

  • 김기현 2010/05/06 15:43

    친절한답변 감사드립니다 ^^ 이해가 쏙쏙되네요 ,,ㅎㅎ

    • PinkWink 2010/05/06 16:24

      네.. 감사합니다. 또한 이해가 되었다니 다행입니다.

  • 김기현 2010/05/06 23:01

    샘플링 타임에관해서도 한가지만 더 여쭈어볼께요 ㅎ
    ADIS16100 에서의 conversion time 을 보니 20Mhz or 16Mhz 일시 800ns의 시간이 표기되있더라고요 저는일단 while문안에집어넣어 샘플링시간을 주먹구구식 대입을통해 대략?의 90도를 맞추었습니다
    이런대입방식은 온도에따라서도 또 달라질까봐 다시한번보고있는데요
    그럼 타이머를 써서 제가원하는 샘플링 타임을 설정 800ns 의 conversion timer을 가지니 타이머도 800ns 에 맞추어 돌리면 되는것인가요?

    • PinkWink 2010/05/07 10:19

      전 800ns를 타이머로 사용하지 않았습니다. 제가 수행한 대부분의 실험은 대체로 10ms의 샘플링타임을 가지도록 되어있습니다. 이유는 개인적입니다^^. 800ns의 응답시간이라면, 결과를 읽어오는데 아무 무리가 없을겁니다.

  • 김기현 2010/05/07 12:52

    후후후 잘나왔어요 ^^

  • 이영현 2010/05/13 20:59

    안녕하세요? pinkwink님 블로그에서 가속도 센서에 대해 공부하고있는 학생입니다.(감사하다는^^)
    현재 속도나 인터럽트, SPI 문제 때문에(그 외 다른 부분도 있어서..) my300GyroSPI를 통해 ADC 핀에 NT-Gyro300를 연결해서 데이터를 받아들이고 있습니다.
    회로구현에서 NT-Gyro300을 AVR에 바로 ADC를 통해 연결시키는 회로구현 방법과, my300GyroSPI를 통해 연결시키는 방법을 동일하게 해도 되는지 궁금합니다.
    만약에 달라야 한다면 어떻게 회로구현을 해야 하는지 혹시 도움을 받을 수 있을까요?(지금 연결은 했는데 값이 많이 떨려서요ㅜ)

    • PinkWink 2010/05/14 14:20

      결과에 노이즈가 실려있는것은 정상입니다. my300GyroSPI에 있는 ADC에 연결하는 부분은 그저 연결만 해주면(일반적으로 프로세서에 연결하듯이)됩니다.

  • 박진원 2010/05/21 22:49

    (--)(__)(--) (꾸벅)

    안녕하세요~ 핑크윙크님~^^ ㅋㅋ
    또 질문이 있어서 이렇게 들렀습니다. ㅋㅋ 다름이 아니라 선배가 사용하던
    자이로 센서를 제가 받아서 사용할려구 하는데 값이.. ㅎㄷㄷ;;
    그냥 단순히 ATmega 128의 ADC 0,1,2번 핀으로 값을 받아서 출력하는건데요..^^
    NT-Gyro300 이걸 쓰고있어요 ㅋ 넌컨넥트 3핀 제외하고
    GND = 그라운드// VDD = 3.3v// Vref, y, x 를 ADC 0, 1, 2번 핀으로 받습니다. 그런데 값이 왜 일정하다 싶을 정도로 세 핀 모두 249,250,251에서 왔다갔다 하는지요... ㅠ
    이것두 센서가 고장난걸까요...? ㅠㅜ 그럼 안되는데.. ㅠ
    암것두 안하구 그냥 연결했는데 이렇게 출력이 나오네요.. ㅠ

    제품 설명서를 보니 Vref, y, x 가 각각 1.23v, 1.5v, 1.5v 라고 나와있던데
    직접 오실로로 찍어보니 1.24, 1.26, 1.56으로 나오네요.. ㅠ
    흔들어도 변화도 없구 계속 249~251 사이에서만 움직이네요.. ㅠ

    이번엔 안태웠는데.. ㅠ 고장이 맞는건가요? ㅜ

    • PinkWink 2010/05/22 09:55

      저런.. 제가 도와드릴 부분이 아닌듯합니다^^ 흔들어도 값의 변화가 없다는 것이 고장을 의심케합니다만....ㅠㅠ

  • 2010/05/26 02:11

    안녕하세요~ 핑크윙크님~^^
    저는 자이로센서를 이용한 마우스를 개발중에 있는 학생입니다.
    자이로센서의 움직임을 통하여 마우스 커서의 위치를 잡는 방식을 매트랩으로 작성하려고 하는데요...
    자이로 센서에서 각속도를 산출하고 그 값을 적분하면 각도가 된다고 하는데 각속도값을 어떻게 적분하여야하는건가요??

    • PinkWink 2010/05/26 11:05

      단순한 적분을 말씀하시는거라면
      http://pinkwink.kr/25 에 나와있듯이 cumsum 명령을 사용하신후 샘플링 타임을 곱하시면 됩니다

  • 2010/05/28 11:06

    안녕하세요~ 다시 빵입니다.
    각속도를 적분하여 각도를 구한다면
    그 각도값을 가지고 자이로 센서의 움직인 거리를 산출하려고 합니다.
    어떻게 해야하나요??? 제가 자이로센서도 매틀랩도 초보라서
    도움 부탁드립니다.

    • PinkWink 2010/05/29 14:59

      거리를 자이로센서로 측정하시겠다는 말씀이신가요?? 각속도를 측정하는 자이로센서로 바디의 움직인 거리를 측정하는 방법을 말씀하신거라면... 저도 잘 알지 못한답니다. ㅠㅠ

  • 박진원 2010/06/04 01:43

    핑크윙키님~ ㅋㅋ
    또 질문이 있어서 왔어요 ㅋㅋㅋㅋ
    자이로 센서가 제대로 작동하고 있었던 거네요 ;;
    연산해서 나온 값이 누적오차가 너무컸어요; 설마 그게 자이로의 각도일줄은... ;;
    제가 생각하던 자이로 센서가 아니네요 ;;
    아직 잘 다루진 못해서 자이로센서에 대해서 뭐라 할 말이 없지만..
    자이로 센서에 대한 첫인상은 쫌 ㅡㅡ;..
    많이 실망을.. ㅋㅋ
    이것땜에 몇일동안을 ....
    누적 오차가 심하네요.. ㅠ
    가만히 둬도3~4 정도 에서 움직이네요... ㅠ

    • PinkWink 2010/06/04 04:55

      자이로 센서에 대한 첫인상은 언제나 모든이에게 강렬하죠 ㅋㅋㅋ

  • 박진원 2010/06/04 02:23

    X축을 받아서 각도를 구하는데
    한쪽으로는 값이 나온느데 반대쪽으론
    ㅡ 만 표시가 되네요 ;;
    흑... ㅠ

    • PinkWink 2010/06/04 04:55

      언제나... 사소한 오류가 저희를 괴롭힙니다.^^

  • 박진원 2010/06/04 02:35

    -값은 출력이 되네요 ^^;
    5자리까지 출력하는 printf 헤더가 잘못된거였네요...
    이제 자이로 보상만 하면 되는데.. ㅎ
    핑키윙크님이 말씀하신,, 그리고 글올리신
    [자이로 센서로 각도 출력시 가속도 센서로 보정]?? 여기서 말씀하신
    보정이 자이로의 이런 누적 오차를 보상하기 위해 가속도를 사용하신걸로
    이해하면 될까요?? ㅋ

    • PinkWink 2010/06/04 04:57

      연달아 세개의 댓글을 등록하셔서 여기다 답변을 달면 되겠네요^^
      오류는 잡으신것 같고...
      자이로의 드리프트 오차를 잡기 위해 가속도센서를 보정용으로 사용한 것입니다. (적어도 저는 그렇게 사용을 했습니다..^^)

  • 돼지돌이 2010/06/04 19:35

    안녕하세요,
    궁금한점이 생겨서 이렇게 말씀드립니다...
    사용하시는 스케일벡터 * 민감도 = 0.3275 인걸로 말씀하시는데요
    저렇게 한다면... 0 ~ 90' 이동시 가속도 센서와 초기 오차가 거의 없나요?!
    전 저렇게 하니까... 오차가 20도 이상 나던데요...
    그렇다면, 튜닝을 해야 하는건가요?!
    전 공식이 이렇습니다. 가만히 놔두면 center값이 2048이 아닌... 2084가 나옵니다. 이건 보정한다고하구요...
    그리고, 저같은 경우 timer/count로 1ms마다, 자이로, 가속도, encoder값을 받는데요
    각도 = 각도 + ((Gyro_data-2084) * 0.3275) * 0.01(주기임)
    근데.. 이 식에서 0.01이 아닌 다른값을 곱해주니... 값이 너무 크게 나오고... 실질적으로 0.01을 해줘야지만... 각도를 검출할수가 있더군요... 원래 주기는 0.001인데... 0.01을 해줘야 하더군요... ㅠ.ㅠ
    pinkwink님은 저식대로 하시면 값이 제대로 나오던가요;;;

    • PinkWink 2010/06/05 10:14

      초기오차를 말씀하신거라면....
      자이로센서를 적분해서 구하는 각도는 초기값을 알지 못합니다. 다시 말하면, 자이로센서에게 초기값을 알려줘야하는 것이죠. 그리고, 나머지는 위의 글과 똑같이 실험했습니다.^^

  • 박진원 2010/06/06 12:06

    저도 완전한 각도까진 안했지만 각도를 구할 경우 0.001의 주기로 돌렸거든요? 그런데 저같은 경우는 0.001을 곱하니 숫자가 너무 작게 변해요 ㅋ
    그래서 0.01을 곱하니 좀 제대로 된 값이 나오더라구요 ㅋ
    이 값이 변하는 범위가 0도에서 90도 까지 돌리니 0도에서 66도 정도까지가 나오더라구요
    그래서 이 구간을 90도에 맞게 바꾸면 각도는 나올거 같아요 ㅋ

    뭐 어째뜬 다시 가속도 센서와 자이로 센서를 섞어서 사용해야 겠지만요.. ㅎ

    • PinkWink 2010/06/06 13:21

      현재 이 문제는 아주 중요한 문제입니다. 내가 1ms로 샘플링을 설정했는데, 그게 아닌것 같다는 말씀이자나요...

      확실하진 않지만, 언듯 하나 의심해볼만한것은

      내가 설정한 1ms로 정말 작동중인가??? 하는 것입니다. ADC의 변환과정, 통신을 통해 전송하는 과정(bps에 대해 데이터 전송량을 따져봐야합니다.) 등등으로 혹시 1ms를 초과해서 사용하지는 않을까? 라는 의심을 해볼 필요가 있습니다.

      혹시 타이머 인터럽트를 쓰는데, 1ms마다 걸리도록 했는데, 타이머 인터럽트 후에, 인터럽트내부 코드를 실행하는데 시간이 대략 5ms??정도, 그래서 결국 6ms마다 타이머인터럽트를 거는 것과 같은 건 아닌가?? 하는 의심을 해볼 필요가 있습니다.

      하여간 비정상적인 결과이니 여기저기 의심의 눈초리를 보내줘야겠는데요ㅠㅠ

  • 박진원 2010/06/07 02:54

    네 ^^ 답변 정말 감사드립니다. ^^
    몇 일 전에 제가 LED와 오실로스코프를 이용하여
    타이머 주기, AD 변환 과정, 통신으로 인한 시간 Delay 모두를 체크 했었는데 타이머는 1ms로 뛰게 했는데 약 1.3ms정도로 뛰더군요.
    AD 변환은 한 개 변화당 123us정도 소모되구요

    그런데 변환된 AD값을 가지고 자이로 센서의 각도를 구할 때
    시간이 조금 많이 걸리는듯 했어요
    그 시간은 지금은 기억이 안나네요 ㅠ
    소스를 좀 정리하고 라이브러리를 만들고 소스를 모두 다 조각 조각내서
    최대한 객체지향 적으로 짤려고 대공사를 했거든요 ㅋㅋ
    프로젝트도 진행하게 되서요 ㅋㅋ
    그래서 지금 소스는 다 바꿨는데 가속도 센서로 각도값이 안나온다는 ;;; ㅋ
    또 사소한 문제겠지만요.. ^^; 항상 문제가 생기지만 사소한 문제고...
    그 문제를 해결하기 전까진 알수없는... ㅠ
    얼른 가속도 다시 추출하고 나서 핑크윙크님 말씀처럼 다시 한 번 시간을
    모두 다 확인 해 볼께용 ㅋ
    그런데 만약 다른곳에선 시간 지연이 없거나 미미한데 AD나온 값을
    연산하는 과정에서 시간이 2~5ms이상 걸린다면.. ;;
    소스를 최대한 간결하게 다시 연산과정을 바꿔야 되겠죠? ㅋ

    • PinkWink 2010/06/07 03:03

      많튼 변화를 주신 모양이군요...^^
      한 주기의 코드를 경량화시키는 것도 아주 중요하지만
      그 코드가 1ms안에 모두 실행될 수 있다면
      타이머를 다시 가동시키는 코드의 위치를
      타이머인터럽트가 일어나자나마 처음 실행되는 곳에 넣어 두는 것도 간단한 방법중에 하나입니다.
      그러면 주기는 항상 1ms에 맞춰 집니다.
      그리고, 실제 펜들럼과 비슷한 대부분의 시스템들은
      경험에 의한 말이긴 하지만, 대략 10-20ms에서도 충분히 제어가 가능합니다. 꼭 1ms로 하신 이유가 없다면, 샘플링타임을 살짝 늘리는것도 괜찮습니다.

  • 박진원 2010/06/07 03:14

    오오~~~ 초 스피드 답변 *_*~ ㅋㅋㅋ
    아직도 열공 하시나봐용 ^^
    지금 막 다시 가속도 센서의 각도를 잡고 왔어요 ㅋㅋ 역시나.. ;; ㅋ
    음.. 아직 정확한 이유는 잘 모르겠는데..
    로우패스필터로 걸러낸 값을 각도로 환산하니까 문제가 생기더라구요..
    그래서 바로 ADC된 값으로 일단 각도를 다시 뽑아놨구요.. ㅋ
    이제 시간을 다시 재보러 갈까 합니다 ㅋㅋ
    연산 시간이 많이 길다면 핑크윙크님이 말씀처럼 한 번 해봐야 겠어요 ㅋ
    그리고 아직 제가하는 프로젝트의 프레임은 안나왔는데 제가 하고있는건
    전에도 한 번 말씀 드렸는데 자전거예요 ㅋㅋ
    자전거에 모형 로봇을 올려서 MURATA 라는 일본의 로봇처럼 만들려구 했는데요 (MURATA 라고 치면 바로 나와요 ㅋ)
    아마 제가 실력이 많이 모자라서 거기까진 힘들거 같아서 오토바이모양으로 만들까 합니다. ㅋ 그게 자전거 보단 좀 더 수월할거 같아서요.. ㅋ 물론 실력이 되면 자전거를 하고싶지만.. ㅠ
    그래서 첫 MCU인 AVR로 지금 자이로 가속도 센서를 테스트중이고요..
    실제로 로봇에 올릴 땐 Cortex M3를 올릴예정이예요 ㅋ
    후배가 한창 Cortex를 공부하고 있고요 ㅋㅋ 센서 제어를 맡은 제가 센서를 하고 있어요 ㅋ 조만간 곧 Cortex도 만져야 된다는 ㅠ
    ㅎㄷㄷ..

    • PinkWink 2010/06/07 03:41

      네.. 좋은 성과와 좋은 공부 되시길 바랍니다.^^
      그리고 좋은 일주일 시작하세요^^

  • 박진원 2010/06/07 03:46

    네 ^^
    핑크윙크님은 복받으실듯.... ㅋㅋ
    물론 잘하시는 분들도 이 블로그를 찾아오시겠지만,
    아직 많이 부족한 사람들한테 너무 큰 도움이되요.. ^^
    제가 어떻게 보답할 방법은 없지만..
    정말 기회가 되면 맛있는 밥한끼라도 사드리고 싶어요... ㅋ
    너무 많은 도움을 주셔서요... ㅎ

    • PinkWink 2010/06/07 05:51

      ㅎㅎ 그..그럼 클릭이라도 ㅋㅋ (응?? 뭘???)
      하여간 도움이 된다면야 저도 뿌듯합니다. ^^

  • 박진원 2010/06/07 19:14

    ?? 클릭?? 어떤걸 클릭하란 말씀이신가요?? ㅋ
    어떤거죠? ㅋ 당최 무슨 뜻인지 알 수가 없어서요 ㅠㅜ
    티스토리 추천? 음.. 아닌가.. 뭐지.. ㅠ

    • PinkWink 2010/06/07 19:24

      ㅎㅎ,, 농담입니다. 제가 절대 푼돈이나 벌자고 한 이야기는 아닙니다. ㅎㅎㅎ^^

  • 박진원 2010/06/07 21:19

    네, 그런뜻이 아닌건 알고있씁니다. ^^
    전에 티스토리 관련해서 글 읽을 때 창원대라고 하셨죠?
    경남 창원시에 있다고 네이버에 나오네요 ㅋㅋ
    핑크윙크님 제가 혹 창원에 가게되면,, 갈일이 없으면 졸업할 때가 되서라도
    한 번 찾아뵐께요 ㅋㅋㅋ
    진짜로요 ㅋㅋ 약속입니당 ㅋㅋ
    그냥 고마움의 표시로 밥한끼 사고싶다는... ㅎㅎ
    밥 사드린다는 약속은 꼭 지킬께요 ㅋㅋㅋㅋ
    고기~ 콜?? ㅋㅋ

    • PinkWink 2010/06/07 22:50

      저희 종족이 고기에 좀 약합니다. 좋은 성과를 비랄께요^^

  • 박진원 2010/06/14 22:23

    핑크윙크님~ ㅋ
    요즘 시험기간이라 그런지 다른 분들도 글을 안올리시네요 ^^;
    얼른 제가 만들고 싶은 놈 빨리 계속 만들고 싶은데 시험... ㅎㄷㄷ ㅠ
    시험 너무 싫어요 ㅋㅋㅋ
    과목도 제가 듣고싶은 과목만 듣고싶은데.. ㅋㅋ
    만들고 싶은거 만들고... ㅠ
    세상은 왜이렇게 하기 싫은것들도 해야되는 걸까요... ㅎ
    하고싶은 공부만 하면 안되나요,, 왜,, ㅜ

    (셤기간에 공학제 서류 쓰다가 너무 뜸한것 같아 잠시 들렀음...^.^;)

    • PinkWink 2010/06/14 22:33

      ㅎㅎ 저도 같은 생각으로.. 지금 머리가 아픕니다. 전 진원님과는 달리 채점(^^) 때문에.. ㅎㅎㅎ 이거 뭐 진도를 못나가고 있어요^^

  • 자이로정복 2010/07/04 13:48

    안녕하세요 자이로센서에서 나온 각속도를 적분하면 각도가 나오잖아요
    그럼 가속도 센서에서 출력되는 각도 값이랑 편차가 있나요? 똑같은 위치에 두고 두개의 데이터를 받았을경우에요...

    • PinkWink 2010/07/04 14:24

      http://www.pinkwink.kr/78 에 보면 같은 상황에서 두 센서의 결과가 그래프로 나타나있습니다.

  • 빡구 2010/09/09 11:37

    윙크님 궁금한게 있습니다.
    각속도를 x축 +-방향으로 움직이면 일정값이 나왔다가 다시 초기화되서 0이됩니다.
    근데 여기서 가속도센서를 각도를 +방향으로 움직이면 자이로도 0으로 초기화됩니다. 근데 가속도를 -방향으로 움직이면 자이로가 값이 변하구 초기화가 안되는데 이유를 잘모르겠어요 ㅠㅠ 각속도는 원래대로 0으로 돌아와야되는거아닌가요??

    • PinkWink 2010/09/13 04:08

      죄송합니다. 뭔가 문제를 설명해주셨지만... 제가 알 수 있는게 없습니다.. 뭐라 도움을 드리지 못해죄송합니다...ㅠㅠ

  • 문준모 2011/02/07 18:46

    안녕하세요~~
    정말....보면서 대단신거같아요~~ㅜㅜ
    아직 초보라 궁금한게잇는데요;;
    엔코더참값을 그래프로 보는거 MATLAB 으로 하신건가요..??
    그리고 엔코더 싸고 실험용으로 쓸만한것좀 추천좀요..ㅜ

    • PinkWink 2011/02/08 10:18

      네.. 데이터를 시리얼 통신으로 PC로 전송시켜서 MATLAB에서 그린것입니다. 엔코더는 Autonics껄 당시 많이 사용했습니다만. 요즘은 인터넷으로 찾아보시면 가격이 착한 엔코더들을 찾으실수있을 겁니다.

  • mijong 2011/03/03 20:46

    pinkwink 님 도저히 모르겟습니다 ㅠㅠ

    진짜 미쳐버 릴거 같아요..

    도데체 자이로센서 각속도는 구햇는데..

    각도는 어떻게 구하나요??

    적분의 뜻은 알고 있습니다. 시간과 속도를 곱해서 각도를 출력 하시겟다는

    거잔아요,, 그런데 각도= 각도+ 각속도*셈플링타임??

    이 셈플링 타임이 뭐에요 그냥 0.01만 곱해주면 되나요??

    이렇게 쓰니까 이상하게 나오는데 ㅠㅠ

    • PinkWink 2011/03/04 08:59

      샘플링타임은 mijong님이 설정하는 값입니다. 샘플링 타임을 10ms로 설정하셨다면 뭐 당연히 0.01이겠지요. 그리고 자이로의 각속도 출력을 적분해도 참값인 각도라고 말하기에는 드리프트에러가 심할겁니다. 그리고 하나더... mijong님이 자이로센서에서 구하신 각속도... 그게 정말 참이라고 생각할수있는 각속도가 맞을까요? 공학자로서 비판적이면서 논리적으로 생각해서... 내가 구한 각속도는 믿을만할까? 라는 의문을 가져보실 필요가있습니다. 그것을 확인하기 위해 역시 참이라고 믿을 수 있는 엔코더 (혹은 뭐든지)에서 구한 각도를 차분해서 구한 각속도와 자이로에서 구한 각속도를 비교해 보는 실험도 괜찮습니다. 단순히 그것 하나만 수행해도 느끼고 배우는게 많습니다.^^

  • mijong 2011/03/04 17:07

    샘프링타임 설정은 어떻게 해주나요?? 혹시 타이머 인터럽트를 쓰나요??

    이런;; 타이머는 아직 공부 안햇는데 ..

    • PinkWink 2011/03/04 17:11

      저런... '미분', '적분' 모두 가장 중요한것은 '시간'입니다.
      저의 경우는 타이머인터럽트를 10ms마다 발생시키고
      인터럽트구문안에서 모든 루틴을 처리하게 만들어서 정확한 시간을 확보했습니다.

  • mijong 2011/03/04 17:57

    그럼 각도=각도 +각속도 *0.01

    이라는 식을 타이머 인터럽트 인터럽트 발생 하는데다가 넣어 줘도 상관없나요??

  • mijong 2011/03/05 18:50

    음 방금 타이머 하나 만들어서 시간은 16.얼마 마이크로 세크 마추고

    각도 =각도 +각속도 *0.016... 해주니 돼는거 같네요>>

  • 좋은날 2011/05/19 22:39

    안녕하세요~ gyro에 대하여 궁금한게 있어서 이렇게 질문합니다~^^
    nxt gyro sensor를 LabView프로그램을 이용하여 각속도(rad/s)값을 받아 들입니다. 그런데 자꾸 멈춰있을때 기준값이 20정도의 임의의 값을 표시하는데 뭐가 문제일까요?

    • PinkWink 2011/05/20 07:54

      정지상태에서 각속도(각도가 아닌)가 0이 나오지 않는다면, (지구자전을 검출할 정도의 고성능이 아니라면) 초반 바이어스를 잡지 못해서일수도 있습니다. nxt gyro senso를 사용해보지 않아서 모르겠지만, 다른 설정에 문제가 없다면, 바이어스를 20정도 내리시면 되지 않을까요.

  • 흑흑 2011/11/12 17:32

    안녕하세요 블로그 아주 잘 보고 있습니다. 다름이 아니고 무인 오토바이 제어라는 프로젝트를 하는데 저희 팀이 정말 백지 상태라서요..자이로센서 값을 바로 시뮬링크로 받는 방법을 찾다가 이 블로그에 오게 되었습니다. 센서는 NT-ARSv1을 사용하고 있습니다.! 어떻게 해야 하는지 염치 불구하고 질문 드립니다!

    • PinkWink 2011/11/12 20:37

      시뮬링크 라이브러리에 보시면, 시리얼통신관련 함수가 제공됩니다. 만약 잘 찾아지지 않으면, document에서 검색해보시면 됩니다. 통신을 성사시키는건 맷랩의 메뉴얼대로 하면 되는거라 쉽게 될 수 있습니다. 그상태에서 받은 데이터를 숫자로 변환하는 부분이 필요하실겁니다. 그리고나서 변환된숫자와 다시 다음에 들어온 숫자와 비교해서 자릿수를 조절하는 부분이 필요합니다. 음... 일단 좀 분량이 많으니 먼저 맷랩 도큐먼트를 확인해보시길 바랍니다.

  • 샤인^hermit 2012/01/12 22:13

    안녕하세요 핑크윙크님 질문있습니다..
    저기 위에 myGyro300SPI에서 스케일 팩터를 구하는 공식에서 3/5mV 부분에 5mV는 어떤 값을 넣은것이죠?

    묻는 이유는 제가 L3G4200D 자이로센서 스케일 팩터를 구하려고합니다..
    자이로센서는 3.3V로 작동하고 Sensitivity가 데이터시트에 8.75mdps/digit이라고 써있습니다. 16bit로 값을 출력해 냅니다. dps는 dgree per second의 단위 입니다.
    여튼 계산식대로 계산하다보니 저부분의 값을 왜 구해줘야하는 지와 단위부분에서 좀 차이가 나서 좀 아리까리 하고 있습니다.
    전 8.75mdps/bit*파이/180을 해주었습니다. 근데 값이 좀 이상하게 나와서...

    • PinkWink 2012/01/13 09:56

      예전기억을 좀 더듬는거라 아닐 수도 있지만,
      다른건 다 아실거고,
      제가 입력한 3/5는 단순한 이유였습니다.
      이 센서가 5V max였는데, 제가 사용했던 DSP2812가 3V max라 전압기준치를 바꾼겁니다.
      즉, 제공된 Sensetivity 4.1이 5V일때로 되어있길래 그리 바꾼거고, 미리 단위를 붙인건 그냥 단위환산의 편의를 위해서였습니다^^

  • 커피향기 2012/03/17 20:22

    근데 머하시는분이세용? 박사?너무똑똑하네여~~

    • PinkWink 2012/03/18 12:43

      그렇지는 않아요... 약간 어리버리하다는...ㅠㅠ

  • 광분한버팔로 2012/04/15 14:17

    안녕하세요 자이로센서에 대해 검색하다가 우연히 들어오게 되었습니다.
    제가 4학년인데요. 종합설계라는 명목하에 '센서테스트베드'제작을 하게 되었습니다.
    아직은 초반이라 많이 모르지만 많은 도움 받고 가요^^
    자주 올께요 ㅎㅎ

  • LimDJ 2012/06/26 22:51

    안녕하세요~
    지금 쿼드콥터를 졸업작품으로 만들고 있는 한밭대학교 4학년 학생입니다. 2학년때부터 세그웨이며... 이것저것 제어에 관련된 글을 많이 보면서 공부했는데요... 4학년이 되니 이제야 이해가 조금씩 가네요 -.-;; 하하하

    일단 궁금한점 이렇게 질문 올립니다. 혹시나 싶어 댓글에 저랑 비슷한 상황이 있나 싶어서 읽어봤는데요...
    음... 비슷한게 없어서 질문드려요..

    일단 제가 쓰는 프로세서는 ATmega128 입니다. ATmega128의 경우 5V 동작에 ADC가 10bit 라서 1bit가 감지할수 있는 전압이 5000mV / 1024bit = 4.8828125mV/bit 가 됩니다.
    그런데 여기서 쓰는 NT-Gyro300의 감도 자체가 2mV/도/sec 인데요.. 이렇게 되면

    약 5mV로 감지하는 AVR이 2mV로 센서값을 주는 센서랑 만나는 경우 각도 추출이 제대로 될지 의문입니다...
    지금 실제로 가속도 센서의 각도값과 각속도에서 나온 것을 적분해서 하니.. 오차가 너무 심하네요 ㅠㅠ
    드리프트 현상을 줄이기 위해서 일종에 필터를 거쳤습니다. 가만히 있어도 진동하는 값을 임의로 뺐습니다.
    (포스팅한것에서 이동평균법을 해서 다시 해 볼 생각입니다!! 일단은 질문 봐주세요 ^-^;;)

    그렇게 해서 짜여진 프로그램이 다음과 같은데요(while문 안에서 ADC가 일어납니다.)
    #define gyro_x_filter 1 // 자이로 필터 값
    {
    temp = 302 - read_adc(0); // 302는 reference 값이고 - read_adc(0)은 ADC0번 이용한겂니다.
    if( gyro_x_filter+1 >= temp && temp >= -gyro_x_filter ) temp = 0; // 값이 진동을해서 이렇게 거쳐서 했구요
    gyro_roll_x = temp; // 각속도 값을 넣고
    gyro_x = gyro_roll_x * 0.00244140625; // 위 줄은 각속도 bit값을 각도 바꾸는 값입니다.
    }
    gyro_val[bit] * ( 5000[mV] / 1024[bit]) * (1[도/sec] / 2[mV]) * 0.001[sec,샘플링타임] = 0.00244140625
    이렇게 해서 나왔습니다.

    이렇게 해서 1ms 타이머를 가지는 TIM0 카운터에 프로그램은
    {
    theta_gyro += gyro_x;
    }
    여기서 적분형태로 되어서 더해 집니다.

    질문1. 각도가 가속도 센서에서 얻은값이 30도면 자이로에서 얻은값은 50도, 60도->100도, 90도->150도 이렇게 나오는데요... 이 문제의 가장 큰 원인이 무엇일까요?ㅠㅠ 스케일 펙터가 잘못된건가요?;;

    질문2. 개선을 하려면 어떻게 하는게 좋을까요?( 프로세서를 바꾸기는 힘들어서요... 센서중에 P0-GMD-20-01)이 있는데요 3축 각속도 출력을 SPI로 하는데 이걸로 해야할까요?)

    질문이 엄청 길어졌네요 ^-^;
    으 바쁘신 와중이라도 도와주시면 정말 감사하겠습니당!!

    • PinkWink 2012/06/27 09:27

      먼저 스케일팩터가 이상하네요. 너무 작아요.ㅠㅠ.
      제 생각에는 4.XX 정도의 값이 나오지 않을까 하는데요.
      만약 도/sec로 단위를 보신다면 말이죠.
      그리고, 자이로의 ADC 센터값을 302로 보셨는데, 여기도 다시 실햄해 보실 필요가 있습니다. 1024의 센터는 512인데, 302까지 내려갔다면 실험을 통해 얻으신건가요?
      일단,
      MEMS 자이로센서의 BIAS값과, SCALE-FACTOR를 구하는 것은 가장중요합니다.
      그런데 한가지... 그냥 적분해서 각도만 볼려고 하지 마시고, 자이로의 출력을 도/sec 든 rad/sec든, 자신의 출력값인 각속도 그대로를 참값과 가까운지 확인하셔야합니다.
      저도 위에 참값인증 그래프를 올려두었습니다만,
      각속도(센서의 출력)가 참에 가까운지 아닌지를 확인하며 검증하는 동안,
      스케일팩터도, 센서의 바이어스 수치도 모두 잡힐 겁니다. 제가 실험해본결과 스케일팩터마저 조금씩 바뀌더군요ㅠㅠ
      그럼 좋은 결과 있으시길 빕니다.^^

  • DY 2012/07/23 20:14

    안녕하세요. 초보적인 질문 하나 올려도 될까요 ?ㅠ
    제가 마이크로마우스를 하면서 마우스에 자이로를 쓸려고 합니다. 회전각을 구하기위해 쓸려고 합니다. 자이로센서를 회전을 할때에만 동작하도록 설계를 해 놓으면 오차는 생겨도 그 오차가 계속 누적되진 않겠지요 ?? 물론 회전의 유무를 판별하는 정보는 다른 곳에서 받습니다.
    아 그리고 하나더 질문이있습니다ㅠ가속도 센서로 물체가 이동한거리를 계산하도록 만들고 싶은데 아무리 인터넷을 뒤져봐도 확실히 나오는게 없습니다...혹시 아시는것이 있으면 조언좀 부탁드립니다 !!

    • PinkWink 2012/07/24 10:15

      Yaw각 회전을 자이로만으로 측정하시면 자이로의 각속도를 적분해야할텐데요. 그러면 비싼 자이로가 아니면 오차누적현상은 생깁니다. 저렴한 MEMS형을 사용하실거라면, 보정용 센서가 하나더 필요하실겁니다. 물론 필터도 설계되어야하구요.
      그리고, 가속도센서로 이동거리를 잡는것도 역시 아주 어렵습니다.
      가속도센서의 출력인 가속도를 한번적분 속도, 다시한번적분 위치.. 즉 두 번이나 적분하셔야하는데요.
      한번만 적분해서 각도를 얻는 자이로도 오차누적으로 고생하는데, 두번이나 적분하는 건 아주 어렵다고 보셔야합니다.
      마이크로마우스라면, 어차피 슬립이 거의 없다면, 차라리 바퀴의 이동각도를 거리로 환산하시는게 더 정확할겁니다.

  • mslayer 2012/08/21 13:39

    안녕하세요. 혹시 기억하실지 모르겠습니다만 병원에서 연구용으로 자이로센서를 사용한다고 말씀드렸던 사람입니다. 또 막히는 부분이 있어 이렇게 질문드립니다. ^^;

    이전 질문에서 '그래도 기준이 되는 참값이 필요하다'라고 답을 주셨었는데요, 뒤늦게 optical analysis와 저희 자이로 센서 사이에 비교를 해보았습니다.

    그랬더니 자이로센서로 얻은 결과가 터무니없이 크게 나왔었습니다. 그래서 제작사에 문의를 하니 3축의 자이로센서와 가속도 센서의 값을 fusion해야 비슷하게 나올 거라는 답을 주었습니다. 그리고 검색을 해보니 핑크윙크 님께서 상보 필터로 논문을 쓰신 것도 나오고, 칼만 필터 이야기도 나오고 그러더군요.

    제가 궁금한 점은, 좀 엉뚱합니다만, 상보 필터를 적용하는 것이 이렇게 논문을 쓸 정도로 복잡한 과정이 필요한지... 입니다. 즉 정형화된 코드가 없는지에 대해서 여쭈고 싶습니다.

    • PinkWink 2012/08/21 16:21

      상보필터 자체에 대한 내용으로 적은 논문이 아니라 어떻게 하면 상보필터를 잘 설계할 것인가에 관한 논문입니다.
      제 블로그에서 1차, 2차 필터에 대해 C로 구현하는 방법이 소개되어있는데, 그것을 사용하시면, 구현에는 큰 무리가 없습니다. 또한, 간단히 차단주파수를 설정하면, 아주 쉽게 필터 계수를 확립할 수 있습니다.

  • mslayer 2012/08/21 19:20

    감사합니다. 제가 문외한인지라, 저희가 모방하려는 논문의 세팅을 기준으로 좀 더 여쭤보려고 합니다.

    이 사람들은 2nd order band pass filter를 사용했습니다. (0.5~5Hz) 논문 본문에는 complementary filter를 사용했다는 말이 없는데, 저자에게 문의를 하니 accelerometer 결과와 gyrosensor 결과를 fusion했다고 하고, 자기는 칼만 필터는 써보지 않았다고 대답해서 아마도 상보 필터를 사용한 것 같습니다. (게다가 저에게 읽어보라고 보내준 논문도 상보 필터였습니다. 나름 성의를 보여준 셈인데 저에겐 읽을 수 없는 암호문이었습니다;)

    1. 핑크 윙크 님께서 말씀하신 차단 주파수라는 말이 무엇인지 잘 모르겠는데요, 혹시 위의 세팅에서 0.5~5Hz에 해당하는 뜻인지요.

    2. 제가 무식하나마 이해한 걸로는 상보 필터에서 얻어지는 각도는 'high pass filter를 적용한 gyrosensor 각도 + low pass filter를 적용한 accelerometer 각도'인 것 같습니다. 그런데 저희 결과는 모두 3축인데요, 그럼

    '3축 gyrosensor 결과를 하나의 값으로 바꿈 --> high pass filter 적용
    3축 accelerometer 결과를 하나의 값으로 바꿈 --> low pass filter 적용' 이런 것인가요, 아니면

    '(x축 gyro 결과' x high pass filter 적용) + (x 축 accelero결과' x low pass filter 적용) 이렇게 한 축 마다 값을 구해서 하나로 합치는 것인지 궁금합니다.

    • PinkWink 2012/08/22 09:38

      http://pinkwink.kr/78 에서 보시면, 중간쯤 high/low pass 필터가 있습니다. 이 둘을 더했을때 '1'이 되어야만 합니다. 상보필터에서 가장 중요한 부분이며 필터의 안정성을 확보하는 부분입니다. 이 조건만 맞으면, 됩니다.
      그러나 각 축별로 모두 상보필터를 걸어야합니다. yaw, pitch, roll 각각 필터가 설계되어야합니다. 문제는 그렇게 되면, 각도가 일그러지게 되는데, 이를 오일러변환을 통해 3차원에서 잡아야합니다.
      그러나, 칼만의 경우는 바로 한번에 나타나도록 설계가 가능합니다. 물론 상보필터의 경우도 수식으로 표현하면 가능합니다만, ㅠㅠ.

  • 2012/08/21 22:06

    비밀댓글입니다

    • PinkWink 2012/08/22 09:44

      정말 쉽게, 칼만이든 상보든 아무것도 모르는 상태에서 쉽게 접근할 수 있는 교재가 http://pinkwink.kr/451 에서 제가 소개한 적이 있습니다. 이 책을 보시면, 아주 쉽게 잘 설명되어있어서, 바로 적용이 가능하실 겁니다. 칼만필터 책입니다만, 상보필터도 다루고 있습니다.
      그리고, http://devicemart.co.kr/goods/view.php?seq=31082 제가 만들거나, 제가 일하는 회사에서 만든건 아닙니다만, 위 제품을 구매하면, 소스코드를 CD에 담아서 줍니다. 그 소스코드를 열람하면, 많은 정보를 얻으실수있을겁니다.
      마지막으로, 아직도 말씀하신것만 들었을때는 약간 개념을 잘못 잡고 계신것이 아닌가 하는 생각이 듭니다.
      기본적으로는 자이로센서를 적분하면 각도를 얻을 수 있습니다.
      3축의 회전각도를 얻고 싶으시다면, 당연히 3축자이로센서를 사용하면 됩니다. 그러나, MEMS형 값싼 자이로들은 오차가 심합니다. 결국 보정해야하는데요.
      x,y축 중심의 회전각도를 측정하기 위해서 보정용 센서로는 3축 가속도센서가 딱입니다.
      그러나, z축 중심, 즉 yaw각은 안됩니다. 가속도센서로 yaw변화량을 읽을 수 없기 때문입니다.
      그래서 하나의 센서가 더 필요합니다. 통상 지자기센서를 사용합니다. 그런데 이 지자기센서는 오차가 너무 크고, 오류가 많습니다. 사용상 주의를 좀 하셔야할겁니다.

  • mslayer 2012/08/22 10:47

    어떻게 보면 한심한 부탁이었는데도 자세한 답변 감사드립니다. 책과 기계를 사서 공부를 좀 더 해보는 것이 좋겠군요.

    사실 제가 얻고 싶은 것은 엄밀히 3축의 회전각도는 아닙니다. 손가락에 센서를 걸고 움직이면 3축에 대한 데이터가 다 나올텐데요, 저희가 관심이 있는 것은 손가락 관절이 얼마나 움직이냐 하는 것입니다. 3축 회전각도 세 가지를 통해서 이런 각도를 구할 수 있는 방법이 있는지는 모르겠습니다만, 이 주제를 시작했을 때는 찾지 못했고, 결국 x 축에 대한 회전각도만 얻었던 것입니다. x축 회전 각도로만 계산한 논문이 있기도 했구요. 이 무시무시한 오차를 발견하기 전까지는 논문을 쓰려고 준비 중이었습니다. 지금은 x축에 대한 자이로 센서 값 + 가속도 센서 보정으로 이 오차를 수정해보려고 하고 있습니다.

    • PinkWink 2012/08/23 09:26

      몇 천원에서 몇 만원짜리는 일반적으로 필터를 설계해도 1-2도 정도 오차가 납니다.
      이것이 본 주제가 아니라면, 상용으로 판매되는 제품을 사용하는 것이 무리가 없어보이는데요. 그렇진 않은 모양이네요.
      그래도 상보필터의 경우는 기존의 필터들 중에서는 상당히 쉬운편이기 때문에 좋은 성과가 있으실것 같습니다.
      화이팅입니다.

  • mslayer 2012/08/22 20:41

    아; 한 가지만 더 여쭤보려고 합니다. 제가 병원에서 일하고 있는 것은 이미 말씀드렸고, 센서를 환자 분들 손가락에 묶어서 x 축 각속도를 얻어보고 있습니다. 그런데, 이걸 적분해보면, 어떤 사람은 -40~20도 사이에서 왔다 갔다하고, 어떤 경우에는 20도~80도 사이를 움직입니다. 사실 가장 낮은 값에서 가장 큰 값의 간격은 둘 다 똑같은데 말이죠. 지금까지는 둘 다 간격은 똑같으니까.. 하면서 넘어갔는데요, 생각해보니 좀 이상한 느낌이라 질문드립니다. 센서가 이상한 걸까요?

    • PinkWink 2012/08/23 09:33

      어떤 자이로를 사용하셨는지 모르겠습니다만,
      MEMS형 자이로의 경우 유명한 오류가 몇개 있습니다. 그 중에서, 원래 각속도가 0인 기준점을 잠아야하는데, 이 기준점이 전원을 인가할때마다 조금씩 다르다는 것과, 온도에 따라, 측정되는 각속도 값이 조금씩 변한다는 것이 문제인데요. 정확한 원인은 저도 잘 모르겠네요.
      만약 몇 백만원 이상의 가격을 가진 센서라면 꽤 괜찮은 필터가 이미 내장되어 있을겁니다.
      혹은 자이로의 값을 신뢰할 수 있을 수준의 성능이던지요.
      간단히 실험을 한번 해보시죠.
      각도기 바로 앞에 두시고, 몇 십번 정도 0도에서 45도사이를 움직이며 각도 변화량을 한 번 체크해보시는게 어떨지요.(간단하니까요)

  • ballbot 2013/05/15 02:15

    안녕하세요, 항상 블로그 잘 보고 있습니다.
    여쭤볼게 있는데요, 제가 쓰는 자이로 센서가 값이 x축은 -2.xx에서 (xx의 진폭이 조금 큽니다.) y, z축은 0.xx에서 진폭을 하는데요. 원래 이렇게 떨림이 있나요?? 이경우에 상보필터를 적용하려면 자이로의 offset값을 찾기위해 이동평균필터를 써야하나요?? pink님이 이곳에 추천해주신 책을 보고 상보필터를 적용해봤는데요, 가만히 있어도 각도값이 아주 조금씩 증가합니다. 그리고 혹시 그 책을 보셨는지 모르겠지만, 흠 최종 각이 각 X 0.001해서 나오네요. 이건 크게 상관없는건가요? 1000곱하면 각도니.. 이것도 왜그런지 모르겠네요.
    가장 궁금한점이 자이로 값이 원래 가만히 있어도 떨리는지와 이 경우에 칼만 또는 상보필터를 적용하려면 자이로값의 떨림을 제거한 후에 적용해야 하는건지가 궁금합니다.

    • PinkWink 2013/05/16 09:00

      offset 즉 bias된 수치를 조금 더 정확히 아실려면 한 몇 초간 센서를 정지시키고, 그때 들어온 수치들을 평균을 내보면 됩니다. 그러면 bias정도는 알 수 있습니다. 그리고 저가의 MEMS들은 원래 노이즈가 극심합니다. 특히 정지했을때는요. 움직이면 좀 괜찮아지구요.
      샘플주기가 1ms라면 5ms정도 구간을 이동평균을 사용하시거나 혹은 저역통과필터를 사용하시면 괜찮을 겁니다. 그 후 신호를 가지고 상보필터를 적용해보시면 또한 괜찮을 겁니다.

  • nalma 2014/02/10 20:11

    안녕하세요. 블로그 정말 잘보고있습니다 ㅎ
    다름이 아니라 제가 P0-GMD-20-01 디지털 3축 자이로 센서를 사용하고 있는데요
    이 데이터시트에 ADC의 분해능이 나오질않아서 질문을 드립니다.
    스케일 펙터를 구할때
    스케일펙터 = 출력전압/ADC분해능/센세티비티
    이렇게 알고있는데요
    ADC분해능을 알수 없다면 어떻게 계산을 해주어야하죠??
    디지털로 출력되는 센서에서의 각속도 구하는 공식도
    아날로그 일때랑 동일한건가요??

    • PinkWink 2014/02/11 14:41

      ADC 분해능은 센서가 아니라 ADC 분해를 하는 쪽 ... 그러니까 MCU쪽을 보셔야합니다. 10비트로 분해한다면 1024가 분해능이 되는거죠. 그건 사용자가 알아야하는 것입니다.

  • nalma 2014/02/11 16:21

    흠 센서자체가 디지털 값을 출력하는데도 ADC를 봐줘야하는건가요???
    센서 자체가 디지털값을 출력하는데 이 디지털값이 각속도값인지 뭔지 잘 모르겠네요 ㅠㅠ
    제가 영어를 못해서 그러는지 데이터 시트를 찾아봤을때 16bit의 디지털값이 출력된다는데 이 출력되는 값이
    각속도인지 뭔지 나와있질 않아서요...
    그래서 그냥 적분을 해주어 봤는데 이 적분해준 값도 이상하게 나오네요...
    계산값 = 이전계산값 + (측정값 * dt) 이렇게 해서 각도로 만들어주는거 아닌가요??

    • PinkWink 2014/02/11 18:46

      댓글을 달았다가 변경했습니다. 다시 말씀드려야겠네요.
      데이터시트에 Sensitivity가 나타나 있네요.
      250으로 스케일을 정하면
      8.75 mdps/digit 로 나타나 있네요...
      한 비트당 0.00875 degree/second 라고 합니다.

  • 김기욤 2014/04/11 12:54

    안녕하세요 자이로 센서 공부하는 학생인데요ㅠㅠㅠ
    LPY530AL MEMS motion sensor를 사용하고있고 자이로 센서를 이용해서 각도를 실시간으로 어떻게 변하는지 보고싶은데 아무리 위에글을 읽어도 각도 추출하는 계산방법을 잘모르겠어서요ㅠㅠ
    공식으로 좀 알려주실수 있을까요..?ㅠㅠㅠㅠ

    • PinkWink 2014/04/14 10:23

      자이로에서 각도는 단순 적분입니다 단 여러가지 필터를 적용하겠다면 상황은 달라집니다만 단순하게는 적분입니ㅏ

  • opkicc 2014/05/13 03:57

    안녕하세요 컴퓨터전공하는 학생인데요 혹시 자이로센서 pitch각 값을 출력할수 있는 방법이 있을까요?

    • PinkWink 2014/05/14 12:31

      피치든 롤이든 하나의 각도라면 제가 상보필터로 올려논 글이 있습니다. 블로그 상단 오른쪽 검색창에서 상보필터라고 검색해 보시면 됩니다.

1 ... 22 23 24 25 26 27 28 29 30 ... 37