쿼드콥터 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 카페...
정말 쿼드콥터를 사랑하시는 분들이 많이 있는 카페인듯....