이번에 태국학회에 다녀 왔습니다. 이번에 다녀온 학회에서 발표한 내용을 잠시 소개할까합니다. 주제는 가속도센서와 자이로센서를 이용한 각도추정인데요. 이미 이전에 [[프로젝트/HardwarePart] - 자이로센서를 이용한 각도 측정시 가속도센서로 보정하기]에서 말씀드린적이 있습니다. 그 내용에서 보정용 필터의 계수들을 최소자승법(least-square)[[공학기초/Theory] - [공업수학] 최소자승법 Least Square]로 도출하는 방법에 대해 이야기하는 것입니다. 




   가속도센서와 자이로센서를 이용한 기존의 각도 추정에 대한 정리 !  
 



위 그림은 자이로센서의 적분을 통해 각도를 추정할때 보정용으로 가속도센서에서 측정된 각도를 사용할때 많이 사용하는 보정방법중 하나입니다. 위 블럭을 식으로 꾸며보면,


인데요. 그 의미를 좀 명확히 알기 위해 식을 풀어보면

 
이 됩니다. 즉, 말로 이야기하면, 자이로를 적분한 각도에는 하이패스필터를 가속도센서에서 도출된 각도에는 로우패스필터가 장착된것입니다. 이 보정법이 정확하고도 아름답게 작동되는 환경은 좌우로 마구 흔들리는 환경이라도 그 평균은 거의 가속도센서의 값이 참값일때 가장 잘 작동됩니다.^^ (보통의 경우 대부분 그렇다고 할 수 있나요?^^)
 
그런데 위 필터의 계수인 Kp, Ki를 선정하는 것이 그리 쉽지는 않습니다. 무작정선정하면 또 안될거구요. 그래서 생각한것이 최소자승법입니다.



   필터계수를 구하는 체계적인 방법에 대한 고찰 !  
 


먼저 위 실험기구를 구성하구요. 자이로와 가속도센서를 장착하고, 센서의 성능을 확인하기 위해 엔코더를 설치했습니다. 자이로와 가속도센서만으로 각도를 검출하는데 문제가 있도록 하기위해([프로젝트/HardwarePart] - 가속도센서를 이용한 각도 측정과 그 한계[프로젝트/HardwarePart] - 자이로센서를 이용한 각도검출과 그 한계 참조) Arm부분과 Pole부분은 모두 회전을 허용하고 있습니다.

처음 필터 수식에서

 
엔코더에서 도출된 각도를 theta_e라고 두고 자이로 출력을 theta_g, 가속도센서에서의 출력을 theta_c라고 합니다.

 
그러면 위와 같이 미지수행렬(Kp, Ki)을 구성하고 나머지로 묶어낼수가 있게 됩니다.


그러면 위에서처럼 최소자승법을 사용할 수 있게 되는 것이지요이 때, A, B는


입니다. 
실험을 수행하고 얻은 계수는


입니다. 이를 다시 대입하여 성능을 확인해보니


참값과의 비교결과가 정말 잘 나오는 군요. 대략 한시간 이상을 실험해도 드리프트는 없습니다. 응답속도는 엔코더의 값을 해석하는 속도보다 대략 10ms정도 느립니다. 당연히 저희가 잡은 한 스테이트, 즉 샘플링타임이 10ms라 아마 한 스테이트정도의 응답이 늦게 나오는것 같네요^^ 

이 논문덕분에 즐거운 태국학회를 하고 왔네요^^



본 논문은 WASET (World Academy of Science, Engineering and Technology) 에 Volume 60, December 2009, ISSN: 2070-3724에 수록되었습니다.




http://pinkwink.kr/trackback/242 관련글 쓰기

  1. 자이로와 가속도센서를 이용한 각도추정 필터를 C로 구현하기

    2010/02/10 12:37 Tracked from PinkWink's Blog  삭제

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

댓글을 달아 주세요

  1. 일일신 2010/01/07 17:34  댓글주소  수정/삭제  댓글쓰기

    제가 수학엔 잼병이라~~~~ ㅠ.ㅠ;
    간단한 C 코드라도 볼 수 있으면 정말 좋겠는데요...
    올려 주실 수 있나요??

    • PinkWink 2010/01/09 06:48  댓글주소  수정/삭제

      필터부분을 말씀하시는건가요?
      실제 적용된 코드는 언제 제가 포스팅을 할려고 합니다..^^
      잠시 기둘려주세용^^

  2. sens 2010/02/05 17:07  댓글주소  수정/삭제  댓글쓰기

    필터부분정말 궁금합니다 ^ ^
    코드 올려 주신다니 목 빠지게 기다리고 있겠습니다 ^ ^

  3. 2010/04/11 23:38  댓글주소  수정/삭제  댓글쓰기

    비밀댓글 입니다

    • PinkWink 2010/04/12 00:20  댓글주소  수정/삭제

      자이로와 가속도센서 혹은 자이로와 기울기센서를 이용한 각도검출에서 제가 사용한 필터는 블로그에 올라와 있는것이 전부입니다. 그리고, 자이로만 테스트한 결과를 공개하였지만, 저도 드리프트가 있었습니다. 그래서 자이로만 사용하는 것을 일찍이 포기하고 다른방법을 찾았던 것인데요^^

      일단 자이로+가속도센서, 자이로+기울기센서 두 가지 방법을 모두 테스트를 해보시는 것이 좋을것 같습니다. snow님의 구현환경에서 무엇이 더 나을지 선택해야할테니까요^^

      그리고 제가 테스트했던 그 방법은 자이로의 출력인 각속도를 약간씩 조절해서 드리프트를 막겠다는 것입니다. (블럭의 흐름만 가지고 이야기한다면 말이지요....^^)

      좋은성과있기를 바랍니다.^^

  4. 박재완 2010/04/17 01:04  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 매번 질문만 하는 부산대 박재완입니다.

    보통 실험후 x값과 y값을 알게되면 그 규칙성을 찾기위해
    최소자승법이나 칼만필터를 이용하는 것으로 알고 있습니다.
    최소자승법은 데이터값사이에서 오차를 고려해서 선형적으로 식을 추정해 내는것으로 이해가 되는데
    칼만필터는 아무리 검색해봐도 선형적인 또는 규칙성을 찾아내는 식을 표현한다기보다는
    미래에 나타날 오차를 추정한다 로만 나와 있어서
    이게 x값과 y값 사이에 규칙성을 찾는데 어떤 역할을 해내는지 도저히 이해가 안가네요

    무지의 늪에서 허우적대는 저를 구원해 주세요

    • PinkWink 2010/04/17 01:40  댓글주소  수정/삭제

      ㅎㅎ 당연하지요. 제 블로그에 오시는 분들은 당연히 그냥 아는 사람이라서.. 질문할게 있어서... 가.. 가장 많지 않겠습니까...^^

      그러나 이번 질문에는 제가 답을 드리기가 어렵겠는데요^^ 다른 포스팅에도 비슷한 질문이 있는데, 제가 동일하게 답을 드렸거든요^^

      저는 칼만필터를 공부한 적이 없답니다. 물론 공부해야겠다고 생각은 하고 있는데.. 역시 생각만...ㅜ.ㅜ

  5. 박재완 2010/04/17 15:57  댓글주소  수정/삭제  댓글쓰기

    답변 감사합니다.

    하는 김에 자이로, 가속도, 기울기 세개를 동시에 써서

    즉, 자이로센서에 가속도센서와 속도가 느린 기울기센서를 2개다 보정을 해서 실험해보려 하는데요

    왜 이제껏 이런 실험이 없었는지궁금해서요..

    각도를 검출하는데 자이로와 가속도 센서만으로도 충분해서 그런걸까요??

    자이로 가속도 기울기 센서 이3개를 보정해서 쓰면 미련한 시도가 될까요??

    • PinkWink 2010/04/18 09:52  댓글주소  수정/삭제

      글쎄요.. 왜 자료로 없는지는 모르겠지만
      해본 사람이 있었을 거라는건 확실하겠지요^^

      그리고 실제로 시도해보시면... 알겠지만...
      ^^;;;

      한번 해 보시는것도 나쁘지는 않을거라 생각합니다..^^

  6. 박재완 2010/05/12 14:27  댓글주소  수정/삭제  댓글쓰기

    제 문제가 A행렬에서 1/S 를 계산할수 없는건데

    라플라스 S값을 수식으로 계산하셨는지, 아니면 실험을 통해서

    1/S(쎄타인코더-쎄타가속도) 값을 계산하셨는지 궁금합니다.

    도움 부탁드립니다.

    • PinkWink 2010/05/12 14:32  댓글주소  수정/삭제

      라플라스 표현법에서 1/s가 시간영역에서는 적분을 의미하니, 전 실험치를 적분해서 사용했지요^^

  7. 박재완 2010/05/12 14:45  댓글주소  수정/삭제  댓글쓰기

    천재이십니다!!!
    존경을 표합니다. 'ㅁ'

  8. 돼지돌이 2010/06/03 19:35  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 ^^

    태국에서 논문을 발표하신 내용이, 이 테마와 밀접한 관련이 있는것 처럼 말씀하시는데요

    괜찮으시다면, pinkwink님의 논문 제목을 알고싶습니다.

    한번 읽어 보고 싶다는... 괜찮으시다면 좀 가르쳐 주세요 ^^a

    • PinkWink 2010/06/03 23:45  댓글주소  수정/삭제

      글 하단에 첨부시켰습니다만....ㅜㅜ
      관광(^^)차 작성한 허덥한 내용입니다.
      그리고 본문과 논문은 큰 차이가 없습니다.

  9. 재오리 2010/06/07 20:12  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 자이로 보정 필터를 다음과 같이 구성을 했습니다.

    FilterAngle = Kh*(FilterAngle + Gyrodata*ts) + Kl*AccAngle;

    여기서 FilterAngle은 보정된 각도, Gyrodata는 자이로의 출력데이터, ts는 샘플링 타임, AccAngle는 가속도 센서로 계산된 각도입니다.

    그리고 여기서 최소 자승법을 이용해서 Kh와 Kl값을 구하려고 합니다.

    그래서 식을 [EncAngle+Gyrodata*ts AccAngle]*[Kh Kl]' = [EncAngle]로 두고 최소 자승법을 이용했는데요 생각만큼 좋은 성능이 나오지가 않았습니다. 여기서 EncAngle은 엔코더로 계산된 각도값입니다.

    제가 최소자승법을 적용하는 방법이 잘못된 것인가요?

  10. 재오리 2010/06/08 16:05  댓글주소  수정/삭제  댓글쓰기

    자이로 데이터는 하이패스 시키고 가속도 데이터는 로우패스 시키는 필터입니다. 단지 코드상으로 간략하게 표현이 된 상태입니다.

    실험해 봤을때 Kh=0.99, Kl=0.01로 주면 대체로 값이 잘나오는데 이를 최소제곱법으로 적용해 얻은 게인을 적용하면 좋은 결과가 나오지 않네요.

    위쪽에서 보는 FilterAngle(i) = Kh*[FilterAngle(i-1)+Gyrodata*ts] + Kl*AccAngle(i) 이부분에서 FilterAngle의 이전값을 사용하기 때문에 최소제곱법을 바로 적용하기 힘든 것인가요? 상관없을 것 같은데 어떻게 생각하세요? 참고한 자료 링크도 함께 올립니다. http://web.mit.edu/scolton/www/filter.pdf

    • PinkWink 2010/06/09 12:43  댓글주소  수정/삭제

      네.. 일차필터였군요. 바로이해하질 못하고 연필로 좀 쓰면서 이했습니다. (머리가 원체 나빠놔서...ㅠㅠ)
      제가 최소좌승법을 말씀하신 1차필터에 적용한 결과 잘 적용이 되는것을 확인하였습니다.
      관련글을 포스팅해야겠다는 생각이 불현듯 드는군요^^
      하여간 결론은 이상이 없는데요...^^

  11. 재오리 2010/06/09 13:27  댓글주소  수정/삭제  댓글쓰기

    그렇습니까? 헉 역시 능력자이시군요 ㅎㅎ
    저도 어찌어찌 최소자승법을 적용해봤는데 맞는지 모르겠네요ㅋ
    염치 없지만 한가하실 때 관련글 포스팅 한 번 부탁드립니다. ㅋ;

    • PinkWink 2010/06/09 15:11  댓글주소  수정/삭제

      다시 읽어보니 저의 댓글이 좀 건방졌습니다. 죄송합니다. ㅠㅠ. 그저 "재오리"님의 말씀을 확인을 했을 뿐입니다. "재오리"님 덕분에 논문 주제하나를 잡았습니다. 그래서 논문으로 한번 써볼까 생각중입니다. 필터의 차수별 장단점 비교 정도??? 뭐 실험을 좀 더 해봐야겠습니다만...ㅠㅠ
      그래서 논문이 완료될때까지는 포스팅을 살짝 미룰려고 합니다. 그래도 포스팅 하겠습니다. ^^

  12. 조현우 2010/07/28 20:20  댓글주소  수정/삭제  댓글쓰기

    아...좋은 정보인데 중간중간 사진이 안나와서 이해가 어렵네요
    저만 그럴까요? 흑 ㅠ

  13. 조현우 2010/08/03 16:59  댓글주소  수정/삭제  댓글쓰기

    안녕하세요~ 다른 컴퓨터로는 잘 나오던군요 >,<
    포스팅된걸 보면서 시뮬레이션을 하고 있는데요

    일단 3축 가속도 센서와 2축 자이로 센서를 이용하구 있구요
    최종적으로 3축에 작용하는 중력을 빼려고 각도를 먼저 구하고 있습니다.

    근데.. 이 필터를 사용하기 전에
    적분된 자이로 각도와 가속도(Z축을 기준으로 회전) 된 모습이 많이 다른데..
    원래 초기 값이 이렇게 이용되는건지 궁금합니다.

    그리고 위의 필터의 계수를 구하기 위해서 Encoder를 이용한
    참값을 통해 추정을 하셨는데..

    그런 이상적인 모델이 없는 상태에서는 계수를 구할수가 없는건가요?ㅠ

    정말 하면할수록 어려운 작업이네요 ㅋ

    점점 바보 같다는 생각이 듭니다. ㅠㅠ

    밑에는 참고하시라고 초기 각도 추정 시뮬레이션 결과를 첨부합니다.
    (메일이라서 주소가 좀 길어요 ㅠ)

    http://wwl319.hanmail.net/Mail-bin/view_submsg3.cgi?TM=jOi5o%2BGuQw1q4J6fZnrdsC7jtCRMdxSgrplW5kHY4Pf3b8wBPVvJPlbm1DZg7%2FvX0xQG70qur5i1qdHQqNRJiriO18UkLO00WmY0kSw%2BJhJ1zeUXGMWXSMCZ0Ovu5bsIKMDo1QynWrDSdsO%2B0kjD%2BHfwpf0uzYYNkFgcnzYvcHx%2FBbFai%2BqiyJWPFsrX5U9XJWQWVriX9eAOGTzFQZJcxgSie72YJmQ6Is8wSTSVjcz3SfNlRtky30LloTfBHfUDUiZO5FXxG18myTPsBmame4zSCg6sfMAskIgFZTE7eXOk6EiB%2FgK8wwQjt7RGp6qyvaDgQYD0sau6MKqgHRKDczSEe1KrpztP4bRv65i8E3IaJcCMK0171Aon645TrINhbeho0WfpzpGWnRfCHFDUxyJsF5gwsXydRcgaq4OOy7P91ukbPqzOjnUhMP8nFfLuTyD00%2BOsBMzAY4Gp1dKWQHNCcu5TAmNJH8tEiCApN5ss6vtNYV77ByGg4Ls%2FWzyanLkRyMagAxP01xkxT%2BizPn0O2x6uU%2BkVyG6lz%2F5GT5d%2ByswP0uHo0uX5dkLYSwES08HmFqXrS4p01xQvkwtsVw%3D%3D&MSGID=0000000000000NQ&pos=1014&bodylen=48184&realname=ex.jpg&downtype=&contenttype=image/jpeg&attnum=1&attid=0.1

    자이로의 결과 값을 한번 더 적분하면
    가속도를 이용한 각도와 비슷할것 같았는데

    전혀 엉뚱한 결과가 나오더군요 ㅠㅠ

    ////참고로
    Gyro는 Angle+=(Gyro_Y-Offset)*ScaleFacter*ts
    로 구해진거구요
    Acc_angle은 Atan(Acc_Y-center /Acc_Z)로 구해진 것입니다.
    라디안은 Degree로 바꿔줬구요 ^^

    • PinkWink 2010/08/04 06:10  댓글주소  수정/삭제

      참값과 비교하지 않고 어떻게
      "저희의 각도 추정은 참 잘되고 있습니다..."
      라고 말할 수 있나요...??^^

      위의 내용이 좀 어려우시다면

      1차필터를 가지고 해보세요..

      http://pinkwink.kr/338

      미지수가 한개뿐이라... 테스트하기엔 괜찮으실겁니다.^^

  14. 돼지돌이 2010/09/03 11:47  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 ^^
    오랫동안 손을 놓고 있다가; 다시 필터에 대해서 필요하게 되어서 위크님의 논문을 읽고 시도 했습니다. 음... 최소좌승법으로 하니... 추정속도가 많이 느리더군요...

    여기서 질문하나 있습니다. 추정은 아주 잘되는데요, 역시... 양날검과 같이 어려운점도 있습니다. 추정이 잘되면, 병진운동에 대한 센서 튀는 값 까지 따라간다... 그리고, 병진운동에 대해서 센서 튀는 값까지 잡으면, 추정하는 각이 많이 약하다 입니다.... 쩝;;;

    제가 설계를 잘못해서 그런가... 아니면, 이 부분에 대한것은 역시 풀어야 할 숙제로 남아 있으신 겁니까?! 궁금하네요;;;

    • PinkWink 2010/09/03 15:59  댓글주소  수정/삭제

      전.. 제 블로그에 있는 방식과 같은 각도 추정 방법과 관련해서는 더이상 무언가를 진행할 생각이 없답니다. 현재 제가 사용하는 범위에서는 아주 만족스러운 결과가 나오거든요...^^