검색결과 리스트
글
최근에 가속도센서를 이용한 각도 측정과 그 한계에 대해 이야기 했었습니다. 그래서 회전각도 혹은 기울어진 각도를 검출하기 위해 대표적인 각속도센서인 자이로 센서를 테스트해보았습니다. (참고로 극도로 초보적인 테스트니까 혹시 자이로에 대해서 잘 아시는 분들은 안읽고 지나가셔도 된다는...^^) 먼저 대상으로 삼은 센서는 요즘 제가 부쩍 자주 들어가보는 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 : 관련페이지
'The Robot > HardwarePart' 카테고리의 다른 글
| 자이로센서 myGyro300SPI의 통신문제 해결 (3) | 2009/06/22 |
|---|---|
| 자이로센서를 이용한 각도 측정시 가속도센서로 보정하기 (82) | 2009/06/17 |
| 자이로센서의 출력에 온도를 고려하기 (21) | 2009/06/15 |
| 자이로센서를 이용한 각도검출과 그 한계 (84) | 2009/06/13 |
| 가속도센서를 이용한 각도 측정과 그 한계 (96) | 2009/06/09 |
| [Cortex M3] 엔코더해석 결과를 일정시간간격으로 시리얼통신으로 전송하기 (34) | 2009/06/04 |
| [Cortex M3] 단순 시리얼통신 테스트 ComPortMaster (0) | 2009/06/04 |
| Cortex M3 LM8962 왕초보 설치기.... 헉헉 (10) | 2009/05/29 |
자이로는 정말 어려운것 같아요..
음.. 온도센서 결과값을 SPI로 받는 부분이 잘 안되셨나보네요
헉...제..제가 그랬나요^?^
예리하시군요...*.*
뭐 온도에 따른 보정을 하지 못했다 하더라도..
경향은 충분히 봤으니까요...크헉^^
(아 블로그주소라도 남겨주셨더라면 답방을 했을텐데... 아쉽습니다..^^)
저같은 평민이 읽을 수 있는 걸 달라능.. ;;
히~~
이 글은 저같은 머슴들을 위한...쿨럭...
아... 도토리.묵. 입양하셨더군요..ㅋㅋ^^
저는 후지전기 자회사인 부품판매회사에서 근무하고 있습니다. 그래서 저항, 컨덴서, 다이어도, 트랜지스터 및 각종 IC랑 인버터, 이오나이저등 기계들도 팔구요. 팔기만 하는지라 기술적인 수준은 무척 얕아서 늘 공부에 목말라요. Pink Wink님은 전공이 뭐예요? ^^ (참~ 전 검도쉐프랑 한집 사는 사람입니다.)
부부는 닮는 모양입니다...
여기까지 또 친절히 방문해 주시다늬...
ㅎ^^ 그래도 근무하실 정도면
이제 전문지식을 가지게 되었을텐데..
처음에 적응하신 그 적응력에 찬사를 보냅니다...^^
핑크 윙크님은 ~^^
아시는 부분이겠지만...
다른 분을 위해서..
MyGyroSPI300에 12Bit ADC 기능을 할 수 있는 핀이 두개 있습니다. NT-gyro 300 에서 나오는 x,y 축 출력 값을 MyGyroSPI300에 넣어서 사용하면 SPI 통신으로 3축 자이로 값을 모두 얻을 수 있습니다. 게다가 12BitADC로 된 값으로요..
그러니까 스케일 펙터 값이 약간 변경 됩니다.
3.3V/1024 에서 -> 3.3V/4096으로만요 ~
먼저 댓글 감사합니다...^^
ADC기능이 있다는 건 알고있는데
이미 withrobot에도 문의를 했지만...
(또 제가 뭔가 실수한 것이겠지만...)
[자이로값, 온도값, Adc1, ADC2]
를 연달아 호출하면
물론 타이머인터럽트 안에서요...
이게 나오는 순서가 하나씩 밀려서 나옵니다.
[ADC2번 자이로 온도 ADC1]
이렇게요...ㅋㅋ
물론 전체적으로 그 변환값은 들어오니까
밀리는가부다 하고 사용하면 되는데
그래도 찜찜하고 왜 그런지를 모르겠네요..ㅋㅋ^^
계속 들여다 보고있습니다...^^
자이로센서로 각도값 산출하는것은 그냥
각도값 += (자이로현재값-자이로오프셋) X 스케일펙터 X 0.01
이런식으로 계산되나요?
0.01은 ADC 출력주기로 설정하는건가요?
음~~
+= 이라고 하셨으니 계속 더한다는 것이니
맞습니다... 일단은...
실험을 하면서 그래프를 받아보시면
아시겠지만, 그 자이로 오프셋을 잡기 위해
몇초이상 기다리셔서 평균치를 잡는 것을
많이들 사용하시더군요...ㅋㅋㅋㅋ
적분한 값에서 시간딜레이가 관찰되는 것은 자이로 센서의 LPF때문입니다. 출시초기 bandwidth는 0.87Hz로 설정되어 있고, 아주 낮은 cut-off frequency이죠. 이는 PCB상의 BP1을 바꿔 달거나, R1을 추가로 달면(기본적으로 안달려있죠) 바꿀 수 있습니다. R을 하나 더 다는건 쉬운일이다 생각해서 그렇게 만들어놨습니다만, 학생입장에서 생각해 보니 1608 사이즈 칩저항이 용량별로 쉽게 만져볼 수 있는 소자는 아니라는 생각도 듭니다.
어쨌건, 원하는 시스템 퍼포먼스가 정해지면 적당한 시뮬레이션을 거쳐 원하는 bandwidth를 산출하고, 이에 맞는 필터를 사용해야만 합니다. 불편하다고 투덜거릴 수 있지만, 현실적으로 겨우 10만원짜리 자이로센서에서 바랄 수 있는것이 그정도랍니다. 당장 invensense의 IDG-300만 봐도 센서 출력단의 LPF가 얼마나 중요한지 딱 보이지 않습니까...
참고로 보통 1000불 이하는 자이로센서 취급 안해줍니다. 그만큼 성능이 떨어진다는 뜻이죠. 그리고 그 이상의 자이로센서는 무기통제규약에 묶여 수출 규제 품목입니다 ^^;; "나 돈 많아"라고 하며 구매할려고 여기저기 알아보다 보면 CIA에서 전화 옵니다 -_-;;
예...필터때문이라는 것을 알고있었습니다.
그리고 그 가격에 좋은 제품이라는 것도 알고있지요..
(제가 본문에서 말한 가격부분은 제 입장(전 백수라~~)에서 이야기 한것입니다...)ㅠㅠ
ㅎㅎㅎ
그러니 감사하며 사용한다는...^^
그런데 1000불 이상의 자이로센서가 무기통제규약에 묶여있다는 이야기는 처음 알았네요... 헉... 놀랬다는...^^
이해하기 쉽게 잘 설명 해 놓으셧네요^^
참고 할게요 ^^
도움이 되셨다니 다행이네요^^
안녕하세요? 위드로봇의 mygyro300SPI를 사용하고 있는 학생입니다. 센서모듈의 LPF 차단주파수를 바꾸려면 R1저항에 저항값을 추가하여 차단주파수를 변경할 수 있다는 내용을 사용설명서에서 보았는데 실제로 R1저항을 추가하게 되면 차단주파수는 바뀌겠지만, 필터의 DC이득또한 바뀌어서 감쇄된 신호가 나오더군여..
그리고 핑크윙크님께.. 글의 맨 윗부분에 스케일팩터는 3.3V던 5V던 간에 4.1일 것 같습니다. 원래대로라면, 님의 실험구성에서 진자의 움직임이 약 1~2Hz일때 사인파의 진폭이 감쇄되어서 나오는 것이 정상일 것 같습니다.
안녕하세요^^
전 그 칩저항 제거하는게 정말 어렵더라구요^^ (수전증이...ㅜ.ㅜ)
irmus님께서는 여기 잘 안오시는데.. 가끔들러서
느리게 공부하는 절 한심하게 생각하실지도 몰라요...ㅜ.ㅜ
여기서 BP1의 Cap만 제거하면 40Hz의 차단주파수를 갖는 LPF로,
4.1의 스케일 팩터에 대해 신호감쇄와 위상지연이 없는 신호를 얻을 수 있습니다.
캡? 음... 제거해볼까요? 없는돈에 어렵게 산건데 망치면 어쩌나 하고 걱정했지요...^^
좋은 정보 감사합니다. ^^
그런데 궁금한점이 한 가지 더 있어 질문좀 드릴려구 합니다. ^^
myGyro61EB모델이 지금 막 출시를 할려는거 같은데
이 모델은 8.8Hz의 로우패스필터를 내장하고 있습니다. 최대 2.5KHz를 필터링 한다구 적혀있습니다.
아직 기초가 많이 부족한 학부생인데.. ㅠ
로우패스필터가 높은 주파수를 차단하고 하이패스필터가 낮은 주파수를 차단한다고만 알고있습니다. ^^;
그렇다면..
1. 낮은 주파수라함은 범위가 어느정도를 말하는것인지요..?
2. 높은 주파수라함은 범위가 어느정도를 말하는것인가요..?
3. 가속도 센서나 자이로 센서로 각도를 추출해서 사용할려고 합니다. 제가 원하는 각도는 수평에서 0도를 기준으로 좌로 기울경우 -10도(최대 -15도까지)를 오른쪽으로 기울 경우 10도(최대 15도까지) 정도만을 제어하면 되는데 이럴 경우에도 필터의 대역폭과 상관이 있는지요?? 상관있다면 어떤(로우??하이??패스)필터를 사용하면 되는지요?
데이터시트를 보시면 현재의 Cut-off 주파수에 대해 설명이 있을겁니다. 그리고 몇번 저항 혹은 몇번 캐패시터를 어떻게 수정하면 차단주파수가 어떻게 변한다는 공식이 있을 겁니다. 설정 각도의 문제가 아니라 사용환경에서의 문제로 인해 필터값이 변경되는 경우가 많습니다.
어렵지 않아여 ㅋㅋ
인두기로 지지고 떼면 되요 ㅋㅋ
화이팅!!
고장나지 않습니다 ^^
훨씬 좋은 특성을 얻을 수 있어여
ㅎㅎ 그런가요? 조금 있다가 지금 하고 있는 작업이 끝나면
공간상의 각도 추정을 테스트해야하는데
한번 도전해보겠습니다...^^
덧붙여서..
칼만필터를 공부해보심이 어떨까여?
제가 동일한 시스템을 동일한 실험장비로 구성하여(핑크윙크님의 실험장치구성이 매우 기발하시던군여^^, 고가의 시험장비를 구입할 여력이 안되니 ㅠ.ㅠ 사실 실험실에 3축 짐벌이 있는데 사용할줄 몰라서여 하하) 칼만필터를 이용해서 결과를 내 보았습니다.
정말 좋은결과가 나오던군여 ㅋ
그놈의 게으름이 원인인게지요...ㅜ.ㅜ
사실.. 해야겠다는 생각을 꽤 오래전부터했습니다만...
잘 되지를 않네요....^^
저번에 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) ;
적분의 방법이 큰 문제가 있는걸까요?
조언 부탁드릴게요 ^^;;
즉, 현재값은 이전 5개의 결과의 평균이라고 보겠다는 것입니다. 흔히 Moving Average라고 하더군요...^^
그리고, 음... 10ms씩 2초동안의 ref를 평균내서 빼는 것인가요? 이 부분은 저도 잘 모르겠네요... 제가 자이로를 적분할때는
ADC상에서 center를 만약 GyroCenter라고 하면
Gyro = (현재자이로-GyroCenter)*scaleFacor
라 두고, 이 Gyro값을 5개구간 평균을 사용하고
Angle = Angle + Gyro*sampleTime
이라고 계산을 하는데요^^
안녕하세요 처음뵙겠습니다
자이로를공부중인 학생입니다^^
자이로를 적분하여 각도를 구하기 위해 많은검색과 글들을보았습니다
각속도 = (측정값-정지값)*스케일펙터
* 스케일펙터 = 입력전압/분해능/감도
라는 공식을 많이보았는데요 여기서 스케일 펙터가 의미하는바를 잘모르겠습니다
측정값에-정지값(초기값)을 빼서 ( 각도 += 각속도*샘플링시간)
그값을 샘플링시간을곱해 계속더해준다면
그래프의 면적이 머리속에 그려지지만 이스케일펙터를 곱한다는 개념은 안서더군요
데이타시트를 참조하여 민감도(sensitivity) 부분을 참조하여 이 민감도를 고려한다면모를까
입력전압 대 분해능이란것이 실시간적인 양자화데이타를 뽑아내는것인지
또 굳이 데이타를 뽑아낸다하더라도 번거롭게 이런과정을하는 의미를모르겠습니다 ㅜ
스케일팩터는 하드웨어적인 부분입니다.
만약 측정범위가 -300도/sec부터 300도/sec인 자이로가 있다고 치죠.
그런데, 이 센서의 아날로그 출력이 0V부터 3.3V라면 그 중심인, 1.65V를 사실상 0도/sec라고 봐야겠죠. 그리고 나면 +- 1.65V의 공간이 +-300도/sec를 잡게 되는 겁니다. 그러니, 센서의 출력값을 각속도로 환산하기 위해서는
각속도 = ( 센서의 출력 - 1.65V ) * 300/1.65
라고 해야합니다. 여기서 300/1.65 가 소위말하면 스케일펙터의 역활입니다. 위 본문의 내용은 그걸 좀 더 자세히 설명한것입니다.
친절한답변 감사드립니다 ^^ 이해가 쏙쏙되네요 ,,ㅎㅎ
네.. 감사합니다. 또한 이해가 되었다니 다행입니다.
샘플링 타임에관해서도 한가지만 더 여쭈어볼께요 ㅎ
ADIS16100 에서의 conversion time 을 보니 20Mhz or 16Mhz 일시 800ns의 시간이 표기되있더라고요 저는일단 while문안에집어넣어 샘플링시간을 주먹구구식 대입을통해 대략?의 90도를 맞추었습니다
이런대입방식은 온도에따라서도 또 달라질까봐 다시한번보고있는데요
그럼 타이머를 써서 제가원하는 샘플링 타임을 설정 800ns 의 conversion timer을 가지니 타이머도 800ns 에 맞추어 돌리면 되는것인가요?
전 800ns를 타이머로 사용하지 않았습니다. 제가 수행한 대부분의 실험은 대체로 10ms의 샘플링타임을 가지도록 되어있습니다. 이유는 개인적입니다^^. 800ns의 응답시간이라면, 결과를 읽어오는데 아무 무리가 없을겁니다.
후후후 잘나왔어요 ^^
네.. 축하드립니다.^^
안녕하세요? pinkwink님 블로그에서 가속도 센서에 대해 공부하고있는 학생입니다.(감사하다는^^)
현재 속도나 인터럽트, SPI 문제 때문에(그 외 다른 부분도 있어서..) my300GyroSPI를 통해 ADC 핀에 NT-Gyro300를 연결해서 데이터를 받아들이고 있습니다.
회로구현에서 NT-Gyro300을 AVR에 바로 ADC를 통해 연결시키는 회로구현 방법과, my300GyroSPI를 통해 연결시키는 방법을 동일하게 해도 되는지 궁금합니다.
만약에 달라야 한다면 어떻게 회로구현을 해야 하는지 혹시 도움을 받을 수 있을까요?(지금 연결은 했는데 값이 많이 떨려서요ㅜ)
결과에 노이즈가 실려있는것은 정상입니다. my300GyroSPI에 있는 ADC에 연결하는 부분은 그저 연결만 해주면(일반적으로 프로세서에 연결하듯이)됩니다.
(--)(__)(--) (꾸벅)
안녕하세요~ 핑크윙크님~^^ ㅋㅋ
또 질문이 있어서 이렇게 들렀습니다. ㅋㅋ 다름이 아니라 선배가 사용하던
자이로 센서를 제가 받아서 사용할려구 하는데 값이.. ㅎㄷㄷ;;
그냥 단순히 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 사이에서만 움직이네요.. ㅠ
이번엔 안태웠는데.. ㅠ 고장이 맞는건가요? ㅜ
저런.. 제가 도와드릴 부분이 아닌듯합니다^^ 흔들어도 값의 변화가 없다는 것이 고장을 의심케합니다만....ㅠㅠ
안녕하세요~ 핑크윙크님~^^
저는 자이로센서를 이용한 마우스를 개발중에 있는 학생입니다.
자이로센서의 움직임을 통하여 마우스 커서의 위치를 잡는 방식을 매트랩으로 작성하려고 하는데요...
자이로 센서에서 각속도를 산출하고 그 값을 적분하면 각도가 된다고 하는데 각속도값을 어떻게 적분하여야하는건가요??
단순한 적분을 말씀하시는거라면
http://pinkwink.kr/25 에 나와있듯이 cumsum 명령을 사용하신후 샘플링 타임을 곱하시면 됩니다
안녕하세요~ 다시 빵입니다.
각속도를 적분하여 각도를 구한다면
그 각도값을 가지고 자이로 센서의 움직인 거리를 산출하려고 합니다.
어떻게 해야하나요??? 제가 자이로센서도 매틀랩도 초보라서
도움 부탁드립니다.
거리를 자이로센서로 측정하시겠다는 말씀이신가요?? 각속도를 측정하는 자이로센서로 바디의 움직인 거리를 측정하는 방법을 말씀하신거라면... 저도 잘 알지 못한답니다. ㅠㅠ
핑크윙키님~ ㅋㅋ
또 질문이 있어서 왔어요 ㅋㅋㅋㅋ
자이로 센서가 제대로 작동하고 있었던 거네요 ;;
연산해서 나온 값이 누적오차가 너무컸어요; 설마 그게 자이로의 각도일줄은... ;;
제가 생각하던 자이로 센서가 아니네요 ;;
아직 잘 다루진 못해서 자이로센서에 대해서 뭐라 할 말이 없지만..
자이로 센서에 대한 첫인상은 쫌 ㅡㅡ;..
많이 실망을.. ㅋㅋ
이것땜에 몇일동안을 ....
누적 오차가 심하네요.. ㅠ
가만히 둬도3~4 정도 에서 움직이네요... ㅠ
자이로 센서에 대한 첫인상은 언제나 모든이에게 강렬하죠 ㅋㅋㅋ
X축을 받아서 각도를 구하는데
한쪽으로는 값이 나온느데 반대쪽으론
ㅡ 만 표시가 되네요 ;;
흑... ㅠ
언제나... 사소한 오류가 저희를 괴롭힙니다.^^
-값은 출력이 되네요 ^^;
5자리까지 출력하는 printf 헤더가 잘못된거였네요...
이제 자이로 보상만 하면 되는데.. ㅎ
핑키윙크님이 말씀하신,, 그리고 글올리신
[자이로 센서로 각도 출력시 가속도 센서로 보정]?? 여기서 말씀하신
보정이 자이로의 이런 누적 오차를 보상하기 위해 가속도를 사용하신걸로
이해하면 될까요?? ㅋ
연달아 세개의 댓글을 등록하셔서 여기다 답변을 달면 되겠네요^^
오류는 잡으신것 같고...
자이로의 드리프트 오차를 잡기 위해 가속도센서를 보정용으로 사용한 것입니다. (적어도 저는 그렇게 사용을 했습니다..^^)
안녕하세요,
궁금한점이 생겨서 이렇게 말씀드립니다...
사용하시는 스케일벡터 * 민감도 = 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님은 저식대로 하시면 값이 제대로 나오던가요;;;
초기오차를 말씀하신거라면....
자이로센서를 적분해서 구하는 각도는 초기값을 알지 못합니다. 다시 말하면, 자이로센서에게 초기값을 알려줘야하는 것이죠. 그리고, 나머지는 위의 글과 똑같이 실험했습니다.^^
저도 완전한 각도까진 안했지만 각도를 구할 경우 0.001의 주기로 돌렸거든요? 그런데 저같은 경우는 0.001을 곱하니 숫자가 너무 작게 변해요 ㅋ
그래서 0.01을 곱하니 좀 제대로 된 값이 나오더라구요 ㅋ
이 값이 변하는 범위가 0도에서 90도 까지 돌리니 0도에서 66도 정도까지가 나오더라구요
그래서 이 구간을 90도에 맞게 바꾸면 각도는 나올거 같아요 ㅋ
뭐 어째뜬 다시 가속도 센서와 자이로 센서를 섞어서 사용해야 겠지만요.. ㅎ
현재 이 문제는 아주 중요한 문제입니다. 내가 1ms로 샘플링을 설정했는데, 그게 아닌것 같다는 말씀이자나요...
확실하진 않지만, 언듯 하나 의심해볼만한것은
내가 설정한 1ms로 정말 작동중인가??? 하는 것입니다. ADC의 변환과정, 통신을 통해 전송하는 과정(bps에 대해 데이터 전송량을 따져봐야합니다.) 등등으로 혹시 1ms를 초과해서 사용하지는 않을까? 라는 의심을 해볼 필요가 있습니다.
혹시 타이머 인터럽트를 쓰는데, 1ms마다 걸리도록 했는데, 타이머 인터럽트 후에, 인터럽트내부 코드를 실행하는데 시간이 대략 5ms??정도, 그래서 결국 6ms마다 타이머인터럽트를 거는 것과 같은 건 아닌가?? 하는 의심을 해볼 필요가 있습니다.
하여간 비정상적인 결과이니 여기저기 의심의 눈초리를 보내줘야겠는데요ㅠㅠ
네 ^^ 답변 정말 감사드립니다. ^^
몇 일 전에 제가 LED와 오실로스코프를 이용하여
타이머 주기, AD 변환 과정, 통신으로 인한 시간 Delay 모두를 체크 했었는데 타이머는 1ms로 뛰게 했는데 약 1.3ms정도로 뛰더군요.
AD 변환은 한 개 변화당 123us정도 소모되구요
그런데 변환된 AD값을 가지고 자이로 센서의 각도를 구할 때
시간이 조금 많이 걸리는듯 했어요
그 시간은 지금은 기억이 안나네요 ㅠ
소스를 좀 정리하고 라이브러리를 만들고 소스를 모두 다 조각 조각내서
최대한 객체지향 적으로 짤려고 대공사를 했거든요 ㅋㅋ
프로젝트도 진행하게 되서요 ㅋㅋ
그래서 지금 소스는 다 바꿨는데 가속도 센서로 각도값이 안나온다는 ;;; ㅋ
또 사소한 문제겠지만요.. ^^; 항상 문제가 생기지만 사소한 문제고...
그 문제를 해결하기 전까진 알수없는... ㅠ
얼른 가속도 다시 추출하고 나서 핑크윙크님 말씀처럼 다시 한 번 시간을
모두 다 확인 해 볼께용 ㅋ
그런데 만약 다른곳에선 시간 지연이 없거나 미미한데 AD나온 값을
연산하는 과정에서 시간이 2~5ms이상 걸린다면.. ;;
소스를 최대한 간결하게 다시 연산과정을 바꿔야 되겠죠? ㅋ
많튼 변화를 주신 모양이군요...^^
한 주기의 코드를 경량화시키는 것도 아주 중요하지만
그 코드가 1ms안에 모두 실행될 수 있다면
타이머를 다시 가동시키는 코드의 위치를
타이머인터럽트가 일어나자나마 처음 실행되는 곳에 넣어 두는 것도 간단한 방법중에 하나입니다.
그러면 주기는 항상 1ms에 맞춰 집니다.
그리고, 실제 펜들럼과 비슷한 대부분의 시스템들은
경험에 의한 말이긴 하지만, 대략 10-20ms에서도 충분히 제어가 가능합니다. 꼭 1ms로 하신 이유가 없다면, 샘플링타임을 살짝 늘리는것도 괜찮습니다.
오오~~~ 초 스피드 답변 *_*~ ㅋㅋㅋ
아직도 열공 하시나봐용 ^^
지금 막 다시 가속도 센서의 각도를 잡고 왔어요 ㅋㅋ 역시나.. ;; ㅋ
음.. 아직 정확한 이유는 잘 모르겠는데..
로우패스필터로 걸러낸 값을 각도로 환산하니까 문제가 생기더라구요..
그래서 바로 ADC된 값으로 일단 각도를 다시 뽑아놨구요.. ㅋ
이제 시간을 다시 재보러 갈까 합니다 ㅋㅋ
연산 시간이 많이 길다면 핑크윙크님이 말씀처럼 한 번 해봐야 겠어요 ㅋ
그리고 아직 제가하는 프로젝트의 프레임은 안나왔는데 제가 하고있는건
전에도 한 번 말씀 드렸는데 자전거예요 ㅋㅋ
자전거에 모형 로봇을 올려서 MURATA 라는 일본의 로봇처럼 만들려구 했는데요 (MURATA 라고 치면 바로 나와요 ㅋ)
아마 제가 실력이 많이 모자라서 거기까진 힘들거 같아서 오토바이모양으로 만들까 합니다. ㅋ 그게 자전거 보단 좀 더 수월할거 같아서요.. ㅋ 물론 실력이 되면 자전거를 하고싶지만.. ㅠ
그래서 첫 MCU인 AVR로 지금 자이로 가속도 센서를 테스트중이고요..
실제로 로봇에 올릴 땐 Cortex M3를 올릴예정이예요 ㅋ
후배가 한창 Cortex를 공부하고 있고요 ㅋㅋ 센서 제어를 맡은 제가 센서를 하고 있어요 ㅋ 조만간 곧 Cortex도 만져야 된다는 ㅠ
ㅎㄷㄷ..
네.. 좋은 성과와 좋은 공부 되시길 바랍니다.^^
그리고 좋은 일주일 시작하세요^^
네 ^^
핑크윙크님은 복받으실듯.... ㅋㅋ
물론 잘하시는 분들도 이 블로그를 찾아오시겠지만,
아직 많이 부족한 사람들한테 너무 큰 도움이되요.. ^^
제가 어떻게 보답할 방법은 없지만..
정말 기회가 되면 맛있는 밥한끼라도 사드리고 싶어요... ㅋ
너무 많은 도움을 주셔서요... ㅎ
ㅎㅎ 그..그럼 클릭이라도 ㅋㅋ (응?? 뭘???)
하여간 도움이 된다면야 저도 뿌듯합니다. ^^
?? 클릭?? 어떤걸 클릭하란 말씀이신가요?? ㅋ
어떤거죠? ㅋ 당최 무슨 뜻인지 알 수가 없어서요 ㅠㅜ
티스토리 추천? 음.. 아닌가.. 뭐지.. ㅠ
ㅎㅎ,, 농담입니다. 제가 절대 푼돈이나 벌자고 한 이야기는 아닙니다. ㅎㅎㅎ^^
네, 그런뜻이 아닌건 알고있씁니다. ^^
전에 티스토리 관련해서 글 읽을 때 창원대라고 하셨죠?
경남 창원시에 있다고 네이버에 나오네요 ㅋㅋ
핑크윙크님 제가 혹 창원에 가게되면,, 갈일이 없으면 졸업할 때가 되서라도
한 번 찾아뵐께요 ㅋㅋㅋ
진짜로요 ㅋㅋ 약속입니당 ㅋㅋ
그냥 고마움의 표시로 밥한끼 사고싶다는... ㅎㅎ
밥 사드린다는 약속은 꼭 지킬께요 ㅋㅋㅋㅋ
고기~ 콜?? ㅋㅋ
저희 종족이 고기에 좀 약합니다. 좋은 성과를 비랄께요^^
핑크윙크님~ ㅋ
요즘 시험기간이라 그런지 다른 분들도 글을 안올리시네요 ^^;
얼른 제가 만들고 싶은 놈 빨리 계속 만들고 싶은데 시험... ㅎㄷㄷ ㅠ
시험 너무 싫어요 ㅋㅋㅋ
과목도 제가 듣고싶은 과목만 듣고싶은데.. ㅋㅋ
만들고 싶은거 만들고... ㅠ
세상은 왜이렇게 하기 싫은것들도 해야되는 걸까요... ㅎ
하고싶은 공부만 하면 안되나요,, 왜,, ㅜ
(셤기간에 공학제 서류 쓰다가 너무 뜸한것 같아 잠시 들렀음...^.^;)
ㅎㅎ 저도 같은 생각으로.. 지금 머리가 아픕니다. 전 진원님과는 달리 채점(^^) 때문에.. ㅎㅎㅎ 이거 뭐 진도를 못나가고 있어요^^
안녕하세요 자이로센서에서 나온 각속도를 적분하면 각도가 나오잖아요
그럼 가속도 센서에서 출력되는 각도 값이랑 편차가 있나요? 똑같은 위치에 두고 두개의 데이터를 받았을경우에요...
http://www.pinkwink.kr/78 에 보면 같은 상황에서 두 센서의 결과가 그래프로 나타나있습니다.
윙크님 궁금한게 있습니다.
각속도를 x축 +-방향으로 움직이면 일정값이 나왔다가 다시 초기화되서 0이됩니다.
근데 여기서 가속도센서를 각도를 +방향으로 움직이면 자이로도 0으로 초기화됩니다. 근데 가속도를 -방향으로 움직이면 자이로가 값이 변하구 초기화가 안되는데 이유를 잘모르겠어요 ㅠㅠ 각속도는 원래대로 0으로 돌아와야되는거아닌가요??
죄송합니다. 뭔가 문제를 설명해주셨지만... 제가 알 수 있는게 없습니다.. 뭐라 도움을 드리지 못해죄송합니다...ㅠㅠ
안녕하세요~~
정말....보면서 대단신거같아요~~ㅜㅜ
아직 초보라 궁금한게잇는데요;;
엔코더참값을 그래프로 보는거 MATLAB 으로 하신건가요..??
그리고 엔코더 싸고 실험용으로 쓸만한것좀 추천좀요..ㅜ
네.. 데이터를 시리얼 통신으로 PC로 전송시켜서 MATLAB에서 그린것입니다. 엔코더는 Autonics껄 당시 많이 사용했습니다만. 요즘은 인터넷으로 찾아보시면 가격이 착한 엔코더들을 찾으실수있을 겁니다.
pinkwink 님 도저히 모르겟습니다 ㅠㅠ
진짜 미쳐버 릴거 같아요..
도데체 자이로센서 각속도는 구햇는데..
각도는 어떻게 구하나요??
적분의 뜻은 알고 있습니다. 시간과 속도를 곱해서 각도를 출력 하시겟다는
거잔아요,, 그런데 각도= 각도+ 각속도*셈플링타임??
이 셈플링 타임이 뭐에요 그냥 0.01만 곱해주면 되나요??
이렇게 쓰니까 이상하게 나오는데 ㅠㅠ
샘플링타임은 mijong님이 설정하는 값입니다. 샘플링 타임을 10ms로 설정하셨다면 뭐 당연히 0.01이겠지요. 그리고 자이로의 각속도 출력을 적분해도 참값인 각도라고 말하기에는 드리프트에러가 심할겁니다. 그리고 하나더... mijong님이 자이로센서에서 구하신 각속도... 그게 정말 참이라고 생각할수있는 각속도가 맞을까요? 공학자로서 비판적이면서 논리적으로 생각해서... 내가 구한 각속도는 믿을만할까? 라는 의문을 가져보실 필요가있습니다. 그것을 확인하기 위해 역시 참이라고 믿을 수 있는 엔코더 (혹은 뭐든지)에서 구한 각도를 차분해서 구한 각속도와 자이로에서 구한 각속도를 비교해 보는 실험도 괜찮습니다. 단순히 그것 하나만 수행해도 느끼고 배우는게 많습니다.^^
샘프링타임 설정은 어떻게 해주나요?? 혹시 타이머 인터럽트를 쓰나요??
이런;; 타이머는 아직 공부 안햇는데 ..
저런... '미분', '적분' 모두 가장 중요한것은 '시간'입니다.
저의 경우는 타이머인터럽트를 10ms마다 발생시키고
인터럽트구문안에서 모든 루틴을 처리하게 만들어서 정확한 시간을 확보했습니다.
그럼 각도=각도 +각속도 *0.01
이라는 식을 타이머 인터럽트 인터럽트 발생 하는데다가 넣어 줘도 상관없나요??
네 그렇습니다.
음 방금 타이머 하나 만들어서 시간은 16.얼마 마이크로 세크 마추고
각도 =각도 +각속도 *0.016... 해주니 돼는거 같네요>>
네.. 축하드립니다.
안녕하세요~ gyro에 대하여 궁금한게 있어서 이렇게 질문합니다~^^
nxt gyro sensor를 LabView프로그램을 이용하여 각속도(rad/s)값을 받아 들입니다. 그런데 자꾸 멈춰있을때 기준값이 20정도의 임의의 값을 표시하는데 뭐가 문제일까요?
정지상태에서 각속도(각도가 아닌)가 0이 나오지 않는다면, (지구자전을 검출할 정도의 고성능이 아니라면) 초반 바이어스를 잡지 못해서일수도 있습니다. nxt gyro senso를 사용해보지 않아서 모르겠지만, 다른 설정에 문제가 없다면, 바이어스를 20정도 내리시면 되지 않을까요.
안녕하세요 블로그 아주 잘 보고 있습니다. 다름이 아니고 무인 오토바이 제어라는 프로젝트를 하는데 저희 팀이 정말 백지 상태라서요..자이로센서 값을 바로 시뮬링크로 받는 방법을 찾다가 이 블로그에 오게 되었습니다. 센서는 NT-ARSv1을 사용하고 있습니다.! 어떻게 해야 하는지 염치 불구하고 질문 드립니다!
시뮬링크 라이브러리에 보시면, 시리얼통신관련 함수가 제공됩니다. 만약 잘 찾아지지 않으면, document에서 검색해보시면 됩니다. 통신을 성사시키는건 맷랩의 메뉴얼대로 하면 되는거라 쉽게 될 수 있습니다. 그상태에서 받은 데이터를 숫자로 변환하는 부분이 필요하실겁니다. 그리고나서 변환된숫자와 다시 다음에 들어온 숫자와 비교해서 자릿수를 조절하는 부분이 필요합니다. 음... 일단 좀 분량이 많으니 먼저 맷랩 도큐먼트를 확인해보시길 바랍니다.
안녕하세요 핑크윙크님 질문있습니다..
저기 위에 myGyro300SPI에서 스케일 팩터를 구하는 공식에서 3/5mV 부분에 5mV는 어떤 값을 넣은것이죠?
묻는 이유는 제가 L3G4200D 자이로센서 스케일 팩터를 구하려고합니다..
자이로센서는 3.3V로 작동하고 Sensitivity가 데이터시트에 8.75mdps/digit이라고 써있습니다. 16bit로 값을 출력해 냅니다. dps는 dgree per second의 단위 입니다.
여튼 계산식대로 계산하다보니 저부분의 값을 왜 구해줘야하는 지와 단위부분에서 좀 차이가 나서 좀 아리까리 하고 있습니다.
전 8.75mdps/bit*파이/180을 해주었습니다. 근데 값이 좀 이상하게 나와서...
예전기억을 좀 더듬는거라 아닐 수도 있지만,
다른건 다 아실거고,
제가 입력한 3/5는 단순한 이유였습니다.
이 센서가 5V max였는데, 제가 사용했던 DSP2812가 3V max라 전압기준치를 바꾼겁니다.
즉, 제공된 Sensetivity 4.1이 5V일때로 되어있길래 그리 바꾼거고, 미리 단위를 붙인건 그냥 단위환산의 편의를 위해서였습니다^^