'pid'에 해당되는 글 2건

  1. 2014.07.15 쿼드콥터 고도제어 시뮬레이터 5
  2. 2013.08.25 쿼드콥터 PID제어 1
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 너를위한노래
Quadrotor20132013. 8. 25. 01:16

아직 제가 만드는 쿼드콥터의 PID제어가 완성된건 아니지만 시간이 좀 나서 포스팅해봅니다.


PID제어의 기본에 대해서는 따로 공부가 필요한 부분입니다. 관련 정보는


위키백과 - PID제어

PID제어 관련 포스팅


요 두군데를 참고하기 바랍니다.


먼저, PID는 Feedback이 일어나기 때문에 무엇을 가지고 무엇을 제어하는가가 첫번째가 되어야 합니다.


제 경우에는 쿼드콥터를 가지고 많은 고민을 했습니다.


쿼드콥터의 경우 센서에서 받아온 자세값을 가공하여 그에 맞는 다음 자세를 출력해야하는데, 출력은 결국 각 모터의 PWM값이 될겁니다.


근데 여기서, 받아온 자세값은 분명 각 모터 자체의 위치값인데 출력은 모터의 회전수란 말이죠. 모터의 회전수는 모터의 추력과 연결되고, 이는 결국 모터 자체의 가속도 값이 되지 않습니까? 위치값을 받아서 가속도값을 출력해야하니까 받아온 위치값을 두번 미분해서 사용해야하나..? 이런 생각이 들더라구요..


그냥 일단 해보자는 식으로 위치값의 오차로 PWM출력을 줘봤는데 잘 되질 않아서 더 저런 생각이 들었던 것 같습니다.


그래서 논문도 찾아보고 여기저기 쿼드콥터 카페도 찾아보고 했는데


결론은 그냥 자세값(roll, pitch, yaw)를 가지고 PWM출력하는게 맞더라구요.. ㅠ


아예 확신을 가지고 논문 참고해서 PID제어기를 다시 만들어서 돌려보니 어느정도 되는거같습니다 ㅠ


그래도 좀 불안정해서 센서값과 P, I, D각 제어값들을 뽑아서 그래프로 그려보니까 문제가 있더라구요..


P는 그냥 센서값에 비례하니때문에 진동에 영향을 덜 받지만 I나 D는 그렇지가 않더라구요. 


그나마 I는 계속 누적되니까 화이트노이즈같은 진동은 어느정도 무시되서 비교적 잘 누적되는 성향을 보이는데


D가 문제예요.. 손으로 누르는 힘에 잘 저항하게 D게인을 높이면 진동에 의한 노이즈까지 잘 반영해서 출력값이 알아볼수도 없게 요동치더라구요.. 


그렇다고 D를 낮추면 반응이 느리고.. 적당히 중간으로 잡아놓으면 수평을 유지하긴하는데 다소 불안하게 왓다갓다하고.. 


그래서 뭔가 변화를 줘보기위해 D제어 입력에만 LPF를 씌워봤습니다. 결과는 한결 나아졌지만 역시 LPF를 통과해서그런지 다소 반응이 느린감이 있더라구요. 


센서를 쿼드 중앙에 나사 한개로만 고정시켜서 그런가~ 싶어서 고정 판도 제작했어요. 오늘 드릴질하고 난리도아니었음 ㅠ


방진 고무나 댐퍼 얘기가 카페같은데서 나오긴 하는데 소프트한걸 쓰면 자세값을 바로 반영 안할거같고 딱딱한걸 쓰면 진동따위 그대로 전달해버릴거같아서 별로 땡기질 않네요 ㅠ


누가 옆에서 이럴땐 이러면 돼~ 하고 조언을 해주면 속편하겠는데.. 그런 사람도 없고.. ㅋ


쓰다보니 푸념으로 바뀌었네요.. 다음 포스팅에서는 좋은 글로... ㅋㅋㅋ



Posted by 너를위한노래