작성자: 박준규

쿼드콥터의 경우 FC에서 4개의 값을 얻어와야한다 (4개의 모터를 제어하기 때문)

모터 최대 출력의 펄스를 (ESC에게 전달되는 값) 2000마이크로초, 최소를 1000마이크로초라고 가정하겠다.

쿼드콥터는 다양한 비행 모드가 있다.

Rate mode - 드론의 각도가 고정되어 날아간다. 오토파일럿 없는 헬기와 비슷하다. 즉 45도 pitch 날아가다가 조종기 pitch를 0으로 하면 계속 45도로 날아가는 모드이다. 아래 코드는 rate mode 기준이다.

motor1 = rc_throttle - roll_adjust - pitch_adjust - yaw_adjust;
motor2 = rc_throttle + roll_adjust + pitch_adjust - yaw_adjust;
motor3 = rc_throttle - roll_adjust + pitch_adjust + yaw_adjust;
motor4 = rc_throttle + roll_adjust - pitch_adjust + yaw_adjust;
//모터 위치에 따라 roll, pitch, yaw adjust의 부호가 달라진다

조종기의 roll, pitch, yaw adjust값과 실제 (모터의)adjust 값을 최대한 일치시키기 위해 모터의 PID제어가 필요하다.

Untitled

Derivative 값은 노이즈에 취약하기 때문에 PI 제어만 사용하는 것도 나쁘지 않을 수 있다.

Proportional 값은 현재 값과 목표 값의 차이를 이용하고 Integral 값은 누적된 값의 차이를 이용한다.

PI 제어 수식

PI 제어 수식

이를 코드로 바꿔본다면:

//pitch_adjust 예시
#define KP 2.0    //proportional 값 
#define KI 2.0    //integral 값
//위 값들을 잘 튜닝하면 드론이 안정하게 잘 날아오른다. 
//MultiWii나 ArduPilot에서 PID값을 손쉽게 튜닝할 수 있다.

float error = desired_pitch - current_pitch;

proportional = KP * error;
integral += KI * error * dt;

output = proportional + integral;    //pitch_adjust output

조종사 입장에서 더 쉬운 비행모드인 Stabilize 모드는 45도로 날아가다가 조종기에서 pitch를 0으로 하면 드론이 0 pitch로 돌아가는 (stabilize) 모드이다. 이 모드는 Stabilise PID와 Rate PID가 합쳐져야겠다.

Untitled