본문 바로가기

Lab./Quadcopter

쿼드콥터 PID 파형분석


쿼드콥터 PID 파형이다.

쿼드콥터의 분해능은 현재 2000 일것이다...(아니면 1000이거나....이 캡처는 예전거라 정확히는 잘....)

청색 : 기울기로 단위는 deg 이다. 
적색 : P 제어값
녹색 : I 제어값
흰색 : D 제어값  (자이로값)

미분값은 자이로값이다.    왜 미분값과 자이로값을 동일시하는지는 다음에 보도록 하자!!!

현재의 상태는 모터의 출력이 달라 왼쪽 모터가 더 세게 돌아 오른쪽으로 기울어져 있는 상태이며
기울기에서 오른쪽으로 기울이짐이 + 왼쪽으로 기울어짐이 - 이다.

파형을 분석하면 
처음에 적색이 높이 뛴것은 그때부터 PID제어를 시작한 것이다.  
기울어져 있기 때문에 가장 먼저 P 값이 반응을 하여 P제어상수 만큼의 출력을  나타내기 시작했고 그 출력으로 인해 
미분값(자이로)이 생겨 0으로 수렴되어 간다. 그러는 와중에 기울기 값이 +이므로 I (누적오차)는 계속 커져  모터의 출력의 오차를 상쇄시켜준다.

그리하여 수평을 잡게 되는 것이다.....

PID......  무척이나 신기한 녀석....

PID 를 사용하기 전에 PI 까지는 그래도 나름 생각해봤었는데.... D제어는 상상도 못했다.
그리고 D 제어값이 생각보다 강력하던걸?.....

아마도 가속도센서를 쓰지 않고  3축 자이로 센서만 사용하는 멀티콥터의 경우
D 제어만으로 (나머지는 조종실력으로)  균형을 유지하는 듯 하다.



http://cafe.naver.com/kbsoft/5610


Y_err[2]=Y_err[1]; //전전편차
Y_err[1]=Y_err[0]; //전편차
Y_err[0]= (Y_angle_aim - Y_angle); //현재의편차

case 1

Y_kp_ctr = Y_kp* Y_err[0] ; //p gain*오차 = P제어기 출력값 

Y_err_sum += Y_err[0] / 100; // 누적오차는 곱해주면 안되고 나눠줘야하고
Y_ki_ctr = Y_ki*(Y_err_sum); // = I 제어기 출력값

Y_kd_ctr= Y_kd* ( Y_err[0]-Y_err[1]) * 100; // 나누기가 아니고 곱하기로 해야하고
// D 제어기 출력

Y_angle_a = Y_kp_ctr + Y_ki_ctr + Y_kd_ctr;


Case 2
Y_kp_ctr = Y_kp* Y_err[0] ; //p gain*오차 = P제어기 출력값 

Y_err_sum += Y_err[0] / 100; // 누적오차는 곱해주면 안되고 나눠줘야하고
Y_ki_ctr = Y_ki*(Y_err_sum); // = I 제어기 출력값

임시버퍼 = Y_kp_ctr + Y_ki_ctr;
임시버퍼 -= 해당축 자이로각속도값 ;

Y_angle_a = 임시버퍼 * Y_kd;

난 뱅기 제어에는 주로 케이스 2를 사용하는경우가 많음.............

 

쌍둥이 아빠 이기성님의 덧글이다.
저기있는 몇줄이 바로 PID 제어 코드이다.

실로 몇줄 안되는 저 코드의 위력이 어마어마함을 느낄수 있었다.

쿼드콥터를 만들며 가장 많은 도움을 받은 곳이 바로 저 네이버 kbsoft 카페...

정말 쿼드콥터를 사랑하시는 분들이 많이 있는 카페인듯....