Quadrotor20152014. 7. 15. 23:55

요새 초음파센서를 이용한 고도제어를 구현하고 있는데.. 이것도 테스트하는게 제일 골치아프네요 ㅠㅠ


그래서 테스트에 앞서 제가 구현한 고도 PID결과가 맞는지 검증하기 위해 이론을 바탕으로한 시뮬레이터를 만들어 봤습니다


이론이라 그런지.. 결과는 대 만족이었지만 실제 쿼드에서 돌리려니 이런저런 문제가 또 발생하네요.. 이건 이 후 포스팅에서 다루기로 하고 여기선 시뮬레이터에 대한 내용만 다루겠습니다.


먼저 구현한 시뮬레이터 구조도는 이렇습니다



시뮬레이터 전제는 이렇습니다


여기서 먼저 알아둬야할 것은 우리가 흔히 말하는 무게의 단위가 kg이 아니라는 겁니다. 무게는 F(힘)이고 F=ma에 의해 단위는 (=N)입니다. 따라서 저울로 측정한 제 쿼드의 무게는 800N이 된다는거죠. 바닥에 놓여있는 제 쿼드는 항상 지면을 800N으로 밀고있다고 할 수 있습니다. 


프롭을 돌리면 바람에 의한 추력(F=힘)이 발생될테고 점점 세게 돌린다면 어느순간 800N의 추력을 내게 됩니다. 그럼 이제 쿼드 기체는 힘의 평형 상태인거죠. 이상태에서 조금만 더 프롭을 세게 돌린다면 쿼드는 뜨기 시작합니다. 


이 때, (추력-800N)만큼의 힘을 받는 쿼드 기체는, F=ma에 의해 질량의 반비례한 가속도로 뜨기 시작합니다.


가속도는 속도를 낳고, 속도는 위치를 변화시키죠. 이 내용을 가지고 시뮬레이터를 구현해보았습니다.


그리고 제가가진 초음파센서도 심플하게 모델링해 넣고 측정값을 바탕으로 프롭의 속도를 조절하는 PID제어기를 시뮬레이션 해봤는데 결과는 다음과 같습니다.




황색이 쿼드의 높이고 파랑, 초록, 빨강 순으로 P, I, D 제어량 수치(y축과 관련x)입니다.


그래프는 아주 맘에 듭니다 뜨기 시작한 후 약 2초 안에 원하는 40cm에 수렴하니까요..


하지만 이렇게 되었다고 쿼드에 적용하고 프롭을 돌릴순 없는게 함정.. ㅠ 실제 센서의 노이즈와 여러 변수에 대한 대책도 있어야하니까요..


실제 쿼드에 적용한 이야기는 다음 포스팅에서 다루기로 하겠습니다.



-------------------------------------------------------------- 14년 7월 16일 추가 -------------------------


수렴할 때 왜 I제어량만 많느냐에 대한 설명을 빼먹었네요..


보통 모터의 속도제어같은 경우 P가 증가된 상태에서 I와 D가 0 근처에서 왔다갔다 거리는 결과가 나오는데 이건 그렇지가 않아서 고민을 많이 했습니다. 틀린거 아닌가?


처음 생각엔 가속도를 가지도 위치를 제어하려고 하니까 적분항이 이렇게 나오는구나~ 하고 넘어갔는데 지금은 다른 이유가 있는거 같아요


I가 정상 상태 오차를 커버해준다는 점을 생각해보면, p로 인한 제어량이 무게를 이기지 못하면 결국 위치는 0이니까.. 정상상태 오차가 40이 되어버리는거잖아요? 정상상태 오차가 100%니까 결국 I제어량만 남을것이다~ 라는 생각이 드네요


-------------------------------------------------------------- 14년 10월 14일 추가 -------------------------


PID제어를 모두 사용하지 않고 baseThrottle + P + D로도 가능할거 같다는 의견을 남깁니다. 여기서 baseThrottle은 기체의 무게(mg)와 같은 추력을 발생시키는 throttle값입니다.



-------------------------------------------------------------- 15년 8월 20일 추가 -------------------------

쿼드콥터 모델링 시 duty가 곧 추력이라고 해놨는데.. duty는 모터 회전 속도를 만들어 냅니다.


추력은 모터 회전 속도의 제곱에 비례한다는 사실을 덧붙여 추가합니다.









Posted by 너를위한노래
Quadrotor20152014. 6. 10. 11:50

자이로센서를 사용해서 처음 각도를 출력해보면 이해가 안가는 부분이 있습니다. 


기체는 가만히 있는데 출력값은 처음 0도에서 시작해서 무한대로 점점 발산해 간다는 점입니다.


센서가 고장났나 싶어서 좀 더 비싼 센서를 사서 테스트해보면 발산해 가는 양이 조금 줄었을 뿐 시간이 지나면 똑같이 발산해 갑니다.


뭔가 문제가 있다고 판단하고 조사를 하다보면 자이로 센서에는 약간의 바이어스(Bias:치우침)값이 포함되어 있고 이걸 같이 누적하다보니 각도값이 발산해 간다는 점입니다.


이는 자이로 센서의 특징이라고 합니다. 센서가 공장에서 출하될 때 센서의 내부에 물리적인 오차가 생기는 것 같습니다.(음.. 밑에 P.S.에 이에 대한 궁금한 점 써놓았음..)


실제로 디지털 자이로센서가 움직이지 않을 시, 기체의 각속도는 0이므로 센서 출력값도 0이 나와야 정상입니다.


하지만 대부분의 센서의 출력값은 0이 나오질 않습니다. 0이 아닌 다른값이 나오기 마련입니다. (물론 항상 일정한 숫자가 나오지 않고 어떤 숫자 근처에서 미세하게 왔다 갔다 하고있겠죠)


이걸 자이로센서의 바이어스라고 하더라구요.. 


이 바이어스의 값이 몇인지 알고 있다면 매 샘플링마다 나온 값에 바이어스를 빼 주면 올바른 값이 나오겠죠.


그래서, 작년 제 쿼드같은 경우에는 호버링 전에 바닥에 가만히 있는 상태에서 1000개의 출력치를 모아 둔 다음 평균내서 바이어스를 측정했었습니다.


이 과정을 거치면 확실히 바이어스가 제거되는 효과가 있습니다. 제거 전 각도값 발산이 1분에 10도였다면 제거 후에는 1분에 0.2도 정도니까요.


하지만 1분에 0.2도 정도의 오차는 없어지질 않습니다. 1000개를 평균내더라도 10000개, 100000개보다는 부정확하니까요.


이를 더 보완하기 위해 HDR(Heuristic Drift Reduction)알고리즘이 있습니다.


어렵지 않고 아주 간단한데요, 작동 방식은 아래와 같습니다.



 

 



※ 블록다이어그램의 내용 중 w_set부분이 다소 부자연스럽지만(?) 그냥 넘어가도 될 듯 합니다.    



은 위에서 언급한 N개의 데이터 평균값을 이용한 바이어스의 정도입니다. 이를 제거한 다음 도 마저 제거 하는데, 를 구하는 방법은 이렇습니다.


센서의 현재 출력(t=n)과 바로 직전의 센서 값(t=n-1)의 차이에 따라 를 조정해 갑니다. 이미 를 구했다면 는 아주 조금씩 조정해 나가야 합니다. 참고 문헌에서는 를 0.001과 같이 미소한 값을 사용하라고 되어있네요.


누누히 말씀 드리지만 이런 필터류의 설계는 이렇다할 정답이 없습니다. 적용하고자하는 시스템이 맞게 필터 장단점의 트레이드오프 관계를 잘 절충해야 합니다.


직관적인 내용이니 위 그림을 자세히 들여다보시면 충분히 이해가 가실거라 생각합니다~!


P.S. 음.. 여러번 실험하다보니 궁금한 게 생겼는데.. 혹시 자이로센서가 온도같은거에 영향을 받는지 아시는분 있다면 댓글 부탁드릴게요~



출처 - http://blog.daum.net/pg365/227





Posted by 너를위한노래
hStory2014. 4. 18. 11:53

올 해 들어 이것저것 바빠서 포스팅을 거의 못했네요.. 대충 휘갈겨 놓은 글을 비공개로 해놓고 다음에 다듬고 올린다는게 한달이 넘어가고.. ㅜ


바쁜만큼 글의 퀄리티가 조금 떨어지더라도 포스팅을 하긴 해야겠네요.. 시간이 지나면 까먹으니까 그때그때 해야지..



'hStory' 카테고리의 다른 글

앞으로의 포스팅 계획  (0) 2016.05.11
Posted by 너를위한노래