본문 바로가기

Robot/Project

자이로센서를 이용한 각도 측정시 가속도센서로 보정하기

 이미 가속도센서를 이용한 각도 측정과 그 한계에서 가속도센서에 병진운동 성분이 있다면 그 기울어진 각도는 가속도센서만으로는 추정할 수 없음을 이야기 했습니다. 또한, 자이로센서를 이용한 각도검출과 그 한계에서 자이로센서는 그 적분시 적분오차를 계속 누적해서 가져가기 때문에 또한 자이로센서만으로는 역시 기울기의 추정이 어렵다고 이야기했습니다. 물론, 자이로센서의 출력에 온도를 고려하기에서 온도보정을 잘 하면 그 적분오차에 의한 드리프트 현상을 상당히 막을 수 있다는 것을 실험해보았습니다. 그러나, 온도보정은 오차를 내지 않겠다, 즉 오차를 최소한으로 막아보겠다는것이지, 혹시 모르게 발생한 오차를 막아내지는 못합니다. 그래서 인터넷을 조금만 서치해보면 나오는 가속도 센서를 이용한 보정을 저도 한번 수행할려고 합니다. 원래 이 글은 2007년 말에 실험이 완료된 것이지만, 당시에 저는 작업지시와 지도만 했고 실제 실험은 후배들이 수행을 했었는데, 이번에 제가 Cortex M3도 공부할겸해서 직접 실험까지 수행했습니다...(헉헉... 생각보다 힘들더라는...켁)



이전 글에서 수행한 실험으로 위 두 센서의 용도를 잡았습니다. 상대적으로 응답속도가 빠른 NT-Gyro300을 가속도센서로 보정해서 Pitch와 Roll를 잡고, myGyro300SPI만을 이용해서 Yaw를 잡기로 했습니다. 그래서 기구부는


이렇게 myAccel3LV02와 myGyro300SPI를 나란히... 이쁘게 두고



그 위에 다시 NT-Gyro300을 위치시키기 위해 기판을 붙이고,


저렇게 달았습니다. 원래는 NT-Gyro300이 저렇게 수직으로 달리는게 아니라 수평하게 연결되어야하지만, 실험기구부에 연결하기 위해 임시로 저렇게 했습니다.




이렇게 위와같이 Cortex와 통신할 겁니다. 가속도센서는 I2C통신으로 자이로는 SPI로 마지막으로 NT-Gyro300은 '길'님의 댓글처럼 myGyro300SPI의 여분의 ADC두채널에 연결했습니다. 이유는 디지털통신이 가지는 장점인 노이즈에 강하다는 것을 이용할 목적과 CPU의 리소스를 조금이라도 절약(음...뭐 딱이 절약할정도로 많이 사용하지도 않지만...ㅜ.ㅜ)하기 위해서라고 그냥 해두겠습니다...^^


저렇게 병진운동성분에 대한 결과를 보기 위해 회전하는 중심이 아니라 회전하는 진자의 끝에 연결하고 흔들어볼것입니다.


온도에 대한 보정은 위와 같습니다. 두 자이로센서의 온도보정상수는 실험을 통해 측정했습니다. 그게 확실한지는 알 수 없으니 그저 지나가시는 고수님이 있다면 저렇게 해도 되는지 확인부탁드립니다. 이게 왜 이렇게 된거냐면... NT-Gyro300은 본래 온도를 출력하는 기능이 없습니다. 그런데 같은 환경에서 다른 센서가 온도를 출력하니까... 보정상수만 좀 다르게 하면 어떻게 잘 되지 않을까하고 그냥 생각한겁니다...크...


위 그림은 엔코더의 미분(차분)치와 온도를 고려한 두 자이로의 각속도값을 비교한것입니다. 하실 각도값은 엔코더가 정확할진 몰라도 저속에서는 엔코더의 미분치는 오히려 오차가 많을 수 있습니다. 비록 그 값을 한 바퀴에 2000펄스를 사용한다고해도 말이지요. 저 결과는 적분을 해 봐야 알 듯 합니다.^^


보정필터없이 결국 온도에 대해서만 적분한 결과입니다. 희한하게 NT-Gyro300이 좀더 좋은 성능을 보이는건 또 뭐라 할 말이 없습니다. ㅎㅎ.. 그리고, 80초와 90초사이에서 또 90초와 100초 사이에서는 움직이던 애를 제가 어느각도에서 잡고 멈춘겁니다. 음 그래프로보니 제 손이 그리 정확하진 않네요^^



72초 부근을 확대했습니다. 확실히 myGyro300SPI는 시간 딜레이가 100ms가 넘어갑니다. 그러나 ADC를 수행한 NT-Gyro의 경우는 저정도 가로축에서는 시간지연이 확인되지 않을 정도입니다. 실제론 대략 10-20ms정도입니다.



이건 뭐 당연한 이야기지만 가속도센서만으로 각도를 잡은겁니다. 손으로 천천히 움직인 70초부근에서 90초지역까지는 기가막히게 잘 따라가지만, 나머지 병진운동이 좀 빨라지면 역시 신뢰할 수 없습니다.





위는 보상필터의 개념입니다. 저 블럭을 수식으로 바꿔보면



위와 같이 전개됩니다. 정말 우연히 보상필터의 각도와 자이로의 적분 각도가 모두 참이라면 저 마지막 결론식의 우변은 그냥 theta가 됩니다. 여기서 사용한 개념은 자이로를 적분한 결과에서 드리프트되는 결과는 극 저주파 영역이라고 보고 Highpass 필터를 설계하고 보상신호의 각도 값에서 병진성분 및 ADC결과 나타나는 노이즈는 고주파 영역이라고 보고 Lowpass 필터를 설계한 겁니다. 당연히 방금 이야기했지만, 둘 다 참값이 나오면 결과식을 보시면 분자와 분모가 일치해서 약분되어버립니다.


위 보상필터의 개념은 세종대학교 홍성경교수님의

Fuzzy logic based closed-loop strapdown attitude system for unmanned aerial vehicle (UAV) - Sung Hyung Hong. Sensors and Actuators A 107 (2003) 109-118

에 개제된 내용을 제가 조금 풀어서 설명한 것입니다.



위 보정필터를 적용한 결과는


위와 같습니다. 보정필터를 myGyro300SPI(빨강색)에 적용할 필요는 없지만, 그냥 결과가 궁금해서 같이 수행했습니다.^^ 50초가 넘어갈때까지 드리프트가 보이지 않음을 알 수 있습니다. 물론 손으로 멈춘 82초대와 92초대역에서 오차가 좀 심하다는 것을 알 수 있지만, 자이로만 적분했을때와 비교한다면 상당히 개선되었음을 또한 알 수 있습니다.



위는 72초대를 확대한 것인데, 보상필터의 영향으로 NT-Gyro300의 결과가 살짝 앞서서 나타나는 현상이 있습니다.

일단, 요기까지...^^
이번엔 센서부를 구성했습니다. 틈틈히 계속 테스트를 해서 동일조건에서 같은 결과가 나타나는지를 계속 확인해야하겠습니다.^^. 그래도 이제 어느정도 좋은 결과를 얻고 있다는 생각입니다. 남은 과제는 평면상에서의 회전은 그렇다 치고, 공간상에서의 회전을 측정해야하는데, 물론 지금의 결과로 그냥 확장하면 되겠지만, 항상 제가 궁금하게 생각하는것은 참값과의 비교입니다. 당연히 참값과 비교해서 오차는 얼만지 응답속도는 얼만지 알아야겠지요. 그런데 공간상에서는 엔코더를 사용하기가 좀 난감하네요... 어떻게 실험기구를 구상해야할지.ㅋ 난감~


반응형