이번에 태국학회에 다녀 왔습니다. 이번에 다녀온 학회에서 발표한 내용을 잠시 소개할까합니다. 주제는 가속도센서와 자이로센서를 이용한 각도추정인데요. 이미 이전에 [[프로젝트/HardwarePart] - 자이로센서를 이용한 각도 측정시 가속도센서로 보정하기]에서 말씀드린적이 있습니다. 그 내용에서 보정용 필터의 계수들을 최소자승법(least-square)[[공학기초/Theory] - [공업수학] 최소자승법 Least Square]로 도출하는 방법에 대해 이야기하는 것입니다.
가속도센서와 자이로센서를 이용한 기존의 각도 추정에 대한 정리 ! |
위 그림은 자이로센서의 적분을 통해 각도를 추정할때 보정용으로 가속도센서에서 측정된 각도를 사용할때 많이 사용하는 보정방법중 하나입니다. 위 블럭을 식으로 꾸며보면,
인데요. 그 의미를 좀 명확히 알기 위해 식을 풀어보면
이 됩니다. 즉, 말로 이야기하면, 자이로를 적분한 각도에는 하이패스필터를 가속도센서에서 도출된 각도에는 로우패스필터가 장착된것입니다. 이 보정법이 정확하고도 아름답게 작동되는 환경은 좌우로 마구 흔들리는 환경이라도 그 평균은 거의 가속도센서의 값이 참값일때 가장 잘 작동됩니다.^^ (보통의 경우 대부분 그렇다고 할 수 있나요?^^)
그런데 위 필터의 계수인 Kp, Ki를 선정하는 것이 그리 쉽지는 않습니다. 무작정선정하면 또 안될거구요. 그래서 생각한것이 최소자승법입니다.
필터계수를 구하는 체계적인 방법에 대한 고찰 ! |
먼저 위 실험기구를 구성하구요. 자이로와 가속도센서를 장착하고, 센서의 성능을 확인하기 위해 엔코더를 설치했습니다. 자이로와 가속도센서만으로 각도를 검출하는데 문제가 있도록 하기위해([프로젝트/HardwarePart] - 가속도센서를 이용한 각도 측정과 그 한계, [프로젝트/HardwarePart] - 자이로센서를 이용한 각도검출과 그 한계 참조) Arm부분과 Pole부분은 모두 회전을 허용하고 있습니다.
처음 필터 수식에서
엔코더에서 도출된 각도를 theta_e라고 두고 자이로 출력을 theta_g, 가속도센서에서의 출력을 theta_c라고 합니다.
그러면 위와 같이 미지수행렬(Kp, Ki)을 구성하고 나머지로 묶어낼수가 있게 됩니다.
그러면 위에서처럼 최소자승법을 사용할 수 있게 되는 것이지요이 때, A, B는
입니다.
실험을 수행하고 얻은 계수는
실험을 수행하고 얻은 계수는
입니다. 이를 다시 대입하여 성능을 확인해보니
참값과의 비교결과가 정말 잘 나오는 군요. 대략 한시간 이상을 실험해도 드리프트는 없습니다. 응답속도는 엔코더의 값을 해석하는 속도보다 대략 10ms정도 느립니다. 당연히 저희가 잡은 한 스테이트, 즉 샘플링타임이 10ms라 아마 한 스테이트정도의 응답이 늦게 나오는것 같네요^^
이 논문덕분에 즐거운 태국학회를 하고 왔네요^^
'Robot > Project' 카테고리의 다른 글
[밸런싱 로봇 만들기] 2. 로봇 기구부 구성하기... (30) | 2010.05.12 |
---|---|
[밸런싱 로봇 만들기] 1. 연재를 시작하며... (18) | 2010.05.06 |
자이로와 가속도센서를 이용한 각도추정 필터를 C로 구현하기 (146) | 2010.02.10 |
최소자승법을 이용한 각도추정 보정필터의 설계 (78) | 2010.01.01 |
자이로센서의 보정용으로서 가속도센서와 기울기센서의 성능비교 (0) | 2009.08.02 |
기울기센서 SA1 테스트 (12) | 2009.07.28 |
자이로 센서 Identification 선형특성 파악 (0) | 2009.07.23 |
자이로 myGyro300SPI 통신문제 (보완질문) (2) | 2009.06.22 |
안녕하세요~ 열심히 관련글을 정독하고선 약간의 희망을 갖고 질문하나 올립니다.(아! 그 전에 멋진 글 감사합니다~^^*) 최소자승법으로 필터계수를 추정하기 전글(자이로센서를 이용한 각도 측정시 가속도센서로 보정하기)에서는 테스트할 때 진자를 손으로 잡은 부분과 다시 진자를 민 부분이 있던데 혹시 이 테스트에서도 그렇게 해 보셨나요? 손으로 잡고 있을때 결과가 전글보다 좋은지 궁금합니다. 제가 적용하고자 생각하는 곳은 차량 주행중 피치와 롤각을 얻어보고자 하거든요... 위와 같이 구현하면 가능하겠죠?ㅋ
네.. 진동이 있을경우 오차가 심하다고 하니 조금 불안해지네요.. 진동이 심하다고 함은 병진운동 성분이 아니라 상하(연직방향)운동 성분을 의미하겠죠? 진동에 대해 필터계수를 능동적으로 바꾸는 논문을 검색해 봐야겠네요.. 혹시 아시는 논문 있으면 추천도 좀 부탁할게요.. 이쪽 프로젝트는 처음이라 맨땅에 해딩하고 있습니다!^^;;
이곳에서 많은정보 얻어갑니다.. 감사합니다
정말 궁굼한게 핑크윙크님 학부생 이신가요..?
전공은 무엇이신지,,
도트 theta _e는 뭔가요??
이제 저두 자이로의 각속도 출력과 가속도 센서로 각도 출력 해보고 ..
자이로 각속도를 타이머를 이용해서 각속도를 누적해서 각도를 출력하고
엔코더는 아직 못구햇어요 ㅠㅠ;;;;
아무튼 ki와 kp의 값을 구하는게 문제인데..
일단 간단하게 출력된 값들중에 최소 10가지 데이터를 뽑아서
각각 의 theta값에 대입한뒤 평균을 내서 윙크님이
쓰신 값이랑 비교해 보려고 하거든요..
이렇게 해도 되나요???
그리고 만약에 이렇게 하면 1/s 는 어떻게 처리해 줘야하는지??
그리고 도트theta_e의 경우 차분이면 뭔가요?? 그러니까 원래식의 1/s가 없어지면서 미분하는건 알겟는데 실제 적으로 무슨 뜻인지 모르겟네요.. dot_theta
g는 각속도라는 값이 있지만 도트 e는 뭔지?? 모르겟네요 ㅠㅠ
ㅎㅎ 질문이있는데요
혹시 자이로의 누적 되어 생기는 오차가 점점많아져 나중에 엔코더의 값이 0이나왓을때 자이로가 누적되서 약20도정도를 가르킨다면 이거는 값을 구하기 어려운가요?? 이 필터가 자이로의 누적도 보상해준거 아닌가요??
포스팅 해주신 것들이 많은 도움이 됐습니다 감사합니다!
맡고 있는 프로젝트 보고서 쓸 시에 참고문헌에 넣고 싶은데
혹시 위에 언급하신 직접 작성하신 논문 제목 좀 알 수 있을까요??
궁금한게 있습니다. 여기서 보면 dot theta g는 gyro의 각속도값을 나타내나요? 각도로 만들어서 표현하나요? 논문자료에서도 보면 dot theta e가 있는데 이것은 encoder의 값을 미분해서 각속도 성분으로 만들어서 계산을 하는건가요? dot의 개념을 잘 모르겠네요 dot는 미분아닌가요? 각속도값 그대로 사용하라는 얘기인게 맞는가요?
그렇군요~저는 또 각속도를 미분했다는말인줄알고ㅎㅎ저는 어쩔수 없는 상황때문에 기울기센서로 각속도를 보정하는데 생각처럼 잘 안돼네요..기울기센서의 응답성이 너~~무 느려서... bandwidth가 1Hz....아주 죽을맛입니다..
Rate의 응답성도 그리 빠르지가 못해서.. 뭔가 헤쳐나갈 방법이 없을까요?
하드웨어는 변경이 불가능해서요..어쩔수없이 울며겨자먹기로 해야죠... 칼만필터 말만들어도 덜덜 되는데요ㅎㅎ
지금 열심히 이것저것 하면서 테스트를 진행중입니다. 칼만필터는 제가 너무 몰라서 배열에 데이터넣고 반복적인 실험으로 최상의 값을 찾아서 넣을려고하고있습니다.. ^^;; 여기서 질문하나 보상필터가 온도에 따른 bias error도 보상가능합니까? 야외에서 실험하는도중 Kp,Ki값이 틀어진거같아서요 기본적인 rate의 에러만 보상하는 회로인가요? 온도보상은 안되는거같은데..그게 궁금합니다.
아하 그렇군요...ㅠㅠ.. 요새같이 갑자기 날씨가 아침저녁으로 온도차가 크니까 값이 이상하게 나오더라고요 전 제가 코딩상 뭐가 문제가 있었나했죠...24시간을 기준으로 한번 데이터를 뽑아봐야겠네요 어차피 온도는 롱텀이니까 쭈~욱 받아봐야겠네요
안녕하세요 핑크윙크님...
위에 있는 ki kp를 구하는 식을 매트랩으로 코딩하는 데 있어서
제가 매트랩을 잘 못다루는 관계로 위의 식을 매트랩소스로 코딩을 하는데 한계에 부딪치고 있습니다.
가능하다면 매트랩으로 코딩한 소스를 좀 얻을 수 있으면 감사드리겠습니다.
레퍼런스로 사용하고 싶어서 그렇담니다.
항상 좋은 자료 올려주셔서 감사드립니다.. _(_ _)_ 꾸벅
안녕하세요.. 자이로 가속도 공부하고있는 대학생입니다.
저위의 식대로 kp ki를 추정해보려고합니다.
일단 자이로센서와 가속도 센서 모두 값은 제대로 출력이 되는것을 확인하였습니다
저같은경우 NTC사의 자이로, 가속도를 사용하였구요. 가속도는 수평일때 z-y 각도를 atan 해서 45도가 정확히 나오고 기울이는대로 그 각도값이 매우 잘 나오고있습니다.(진동에 매우 민감하더군요 ㅠ)
자이로 같은경우 수평일때0 이고 기울이면 -1 -2 -3 이런식으로 떨어지고 반대방향으로 기울이면 1 2 3 이런식으로 증가하지만 30초? 40초정도 작동하고있으면 오차값이 쌓이게 되어 값이 몇백으로 마구마구 증가하게 되어 기울여지는 정도를 보기 어려워집니다.
이러한 상태.. 즉 가속도 , 자이로를 작동하는데까지 성공한상황에서 보상필터를 만들어보려고하는데
kp ki를 추정하는 과정에서 굉장히 애를 먹고있습니다.
저같은경우 엔코더 없이 자이로 따로 가속도 따로 켜서 값을 추정해내었는데
위와 같은 방식으로 구하려고보니 theta_e 즉 엔코더가 없는 상황인데 그렇다면 어떤식으로
kp ki를 추정해야 할지 막막합니다. 사실 엔코더가 뭔지도잘모르겠구요
일단 수평값이 가속도는 45도 자이로는0 으로 시작하는데 kp ki를 추정하기 위해선
두값이 비슷하게 나오도록 맞춰줘야 하는건가요?
그리고 이런상황에서 보상필터를 짜기 위해 무엇을 참고하여 따라가면 좋을까요? ㅠ
MCU는 아트메가128 , 프로그램은 코드비전을 사용하고있습니다.
좋은 정보 감사합니다. ^^
우선 글 정말 잘 봤습니다^^
안드로이드를 통해 실험중입니다.
엔코더가 없다면 e에 대한 값들이 측정이 안되는데 그럼 kp와 ki의 미지수 값을 구할 수 없는건가요?ㅜㅠ
안녕하세요, 위에서 소개해주신 방법으로 게인을 튜닝하는데 있어서 궁금한 점이 있습니다.
엔코더로 얻은 각도 / 가속도센서로 얻은 각도 / 자이로센서로 얻은 각속도 이 세 데이터를 각 샘플링 타임마다
받아와서 배열로 하여 데이터로 사용중에 있습니다.
for n = 1:size
temp = Encorder.signals.values(n) - Acc.signals.values(n)
int_temp = cumsum(temp)*ts
dot_Encorder_theta = (Encorder.signals.values(n) - pre_Encorder_theta)/ts;
A = [temp,int_temp];
B = Gyro.signals.values(n) - dot_Encorder_theta;
y = (A'*A)\A'*B;
pre_Encorder_theta = Encorder.signals.values(n);
end
위와 같이 코드를 작성했는데 매번 루프를 돌때 마다 Y값(Kp,Ki) 이 제각각 다른값으로 나올텐데 위에서 말씀하신것
처럼 실험을 통해 도출된 gain이라고 말할 수 있는 Y값이 최종적으로 루프를 다 돌았을 때인지 궁금합니다.
혹시 위 코드가 잘못된 건가요..?
센서로 각도를 구하는데 있어서 PinkWink님의 글이 많은 도움이 되었습니다. 감사합니다.
혹시 이곳에 연재하신 가속도,자이로 센서 관련 글들의 그림들과 논문의 최소자승법식을 졸업논문에 인용하여도 괜찮을까요?
2차식 필터인가요?? 대게 1차식 형태만 봤는데 처음 알았습니다..