Page 174 - 만들면서 배우는 아두이노 드론
P. 174

8.2 균형

균형을 잡는 방법은 간단합니다. 가만히 놓아두면 기울어지거나 균형에서 벗어나기
마련인데, 이럴 때 프로펠러를 조작하여 기울어지는 반대쪽으로 기체를 기울여주며
다시 균형을 찾아가는 것입니다. 복원하는 힘이 너무 강하면 다시 기울어지거나 균형
을 잃게 되는데, 이럴때는 PID 튜닝을 통해 잘 균형을 잡을 수 있도록 해야합니다.
반대로 힘이 너무 약하면 복원을 못하는데 이때도 역시 PID 튜닝을 통해 바로 잡도
록 합니다.

한편, 현재 균형을 잡고 있는지, 균형을 잃었다면 어느 방향으로 얼마나 균형을 벗어
나 있는지를 알아야 오류값을 측정할 수 있는데, 이는 센서의 값을 읽어온 후 계산을
통해 알 수 있습니다. 끊임없이 현재의 각도를 계산하고 이 각도와 기준값과의 차이
를 계산하고 이 값(오류값)을 PID 제어를 거쳐 보정하는 것입니다.

8.3 슈도코드(PSEUDOCODE)

      previous_error = 0
      integral = 0
      start:

         error = setpoint - measured_value
         integral = integral + error*dt
         derivative = (error - previous_error)/dt
         output = Kp*error + Ki*integral + Kd*derivative
         previous_error = error
         wait(dt)
         goto start

이 예제를 보면, 먼저 루프 밖에서 두 변수를 0 으로 초기화한 후 루프가 시작됩니다.
현재 “error” 는 “setpoint”(설정값)에서 “measured_value”(측정값)을 빼줌으로서 계
산됩니다. 그 후, “integral”(적분)과 “derivative”(미분)값이 계산되고, 이 두 값과
“error” 가 미리 정해진 게인(gain)과 결합되어 “output”(출력)이 유도됩니다. 현재
“error”는 다음 미분 때 쓰이기 위해 저장되고, 프로그램은 dt 정도 멈춥니다. 그리고
루프가 다시 시작됩니다.

                                                      173
   169   170   171   172   173   174   175   176   177   178   179