비행 안정성 향상을 위한 알고리즘

드론의 비행 안정성을 향상시키는 알고리즘은 드론의 위치, 속도, 자세(roll, pitch, yaw)를 안정적으로 유지하기 위해 설계된 다양한 제어 기술을 포함한다. 이 장에서는 비행 안정성을 확보하기 위한 대표적인 제어 알고리즘 몇 가지를 설명한다.

PID 제어 알고리즘

PID 제어기(Proportional-Integral-Derivative Controller)는 드론의 비행을 안정적으로 유지하는 데 널리 사용되는 제어 알고리즘 중 하나이다. PID 제어기는 비례, 적분, 미분의 세 가지 항목을 결합하여 드론의 출력 값을 조정한다.

u(t) = K_p \cdot e(t)

여기서 K_p는 비례 이득(proportional gain), e(t)는 시간 t에서의 오차이다.

u(t) = K_i \cdot \int_{0}^{t} e(\tau) d\tau

여기서 K_i는 적분 이득(integral gain)이다.

u(t) = K_d \cdot \frac{de(t)}{dt}

여기서 K_d는 미분 이득(derivative gain)이다.

전체 PID 제어기 식은 다음과 같다.

u(t) = K_p \cdot e(t) + K_i \cdot \int_{0}^{t} e(\tau) d\tau + K_d \cdot \frac{de(t)}{dt}

상태 피드백 제어 (State Feedback Control)

상태 피드백 제어는 드론의 모든 상태 변수를 측정하고 이를 기반으로 제어 신호를 생성하는 방식이다. 이 방법은 상태 공간 모델을 사용하여 시스템을 설계하고 제어한다.

상태 공간 표현:

\mathbf{\dot{x}} = \mathbf{Ax} + \mathbf{Bu}
\mathbf{y} = \mathbf{Cx} + \mathbf{Du}

여기서 \mathbf{x}는 상태 벡터, \mathbf{u}는 입력 벡터, \mathbf{y}는 출력 벡터이다. \mathbf{A}, \mathbf{B}, \mathbf{C}, \mathbf{D}는 시스템 행렬이다.

상태 피드백 제어법은 일반적으로 다음과 같은 형태를 갖는다.

\mathbf{u} = -\mathbf{Kx}

여기서 \mathbf{K}는 상태 피드백 행렬이다.

LQR 제어기 (Linear Quadratic Regulator)

LQR 제어기는 시스템의 상태 공간 모델을 기반으로 최적의 제어 입력을 계산한다. 제어 목표는 상태와 제어 입력의 가중치 합계를 최소화하는 것이다.

LQR 성능 지수는 다음과 같다.

J = \int_{0}^{\infty} \left( \mathbf{x}^T \mathbf{Qx} + \mathbf{u}^T \mathbf{Ru} \right) dt

여기서 \mathbf{Q}는 상태 가중치 행렬, \mathbf{R}은 제어 입력 가중치 행렬이다.

LQR 제어 입력은 다음과 같이 표현된다.

\mathbf{u} = -\mathbf{Kx}

여기서 \mathbf{K}는 다음 리카티 방정식을 통해 얻은 피드백 행렬이다.

\mathbf{A}^T \mathbf{P} + \mathbf{P} \mathbf{A} - \mathbf{P} \mathbf{B} \mathbf{R}^{-1} \mathbf{B}^T \mathbf{P} + \mathbf{Q} = 0

\mathbf{P}는 리카티 방정식의 해이다.

예제 코드

PID 제어기 예제 코드

다음은 Python을 사용하여 PID 제어기를 구현한 예제 코드이다.

class PIDController:
    def __init__(self, Kp, Ki, Kd):
        self.Kp = Kp
        self.Ki = Ki
        self.Kd = Kd
        self.prev_error = 0
        self.integral = 0

    def update(self, setpoint, measured_value, dt):
        error = setpoint - measured_value
        self.integral += error * dt
        derivative = (error - self.prev_error) / dt

        output = self.Kp * error + self.Ki * self.integral + self.Kd * derivative
        self.prev_error = error

        return output

pid = PIDController(Kp=1.0, Ki=0.1, Kd=0.05)
dt = 0.1  # 100 ms
setpoint = 1.0  # 목표 값
measured_value = 0.8  # 현재 측정 값

control_signal = pid.update(setpoint, measured_value, dt)
print(f"Control Signal: {control_signal}")

상태 피드백 제어기 예제 코드

아래는 Python을 사용하여 상태 피드백 제어기를 구현한 예제이다. SciPy 라이브러리를 사용하여 선형 시스템의 상태 공간 모델을 정의하고 피드백 행렬을 계산한다.

import numpy as np
from scipy.signal import place_poles

A = np.array([[0.0, 1.0],
              [0.0, -0.5]])

B = np.array([[0.0],
              [1.0]])

desired_poles = np.array([-2.0, -3.0])

place_obj = place_poles(A, B, desired_poles)
K = place_obj.gain_matrix

print(f"Feedback Matrix K: {K}")

def state_feedback_control(x):
    u = -K @ x
    return u

x = np.array([[0.5], [0.1]])
control_signal = state_feedback_control(x)
print(f"Control Signal: {control_signal}")

LQR 제어기 예제 코드

아래는 Python을 사용하여 LQR 제어기를 구현한 예제이다. SciPy 라이브러리를 사용하여 리카티 방정식을 풀고 최적의 피드백 행렬을 계산한다.

import numpy as np
from scipy.linalg import solve_continuous_are

A = np.array([[0.0, 1.0],
              [0.0, -0.5]])

B = np.array([[0.0],
              [1.0]])

Q = np.array([[1.0, 0.0],
              [0.0, 1.0]])

R = np.array([[1.0]])

P = solve_continuous_are(A, B, Q, R)

K = np.linalg.inv(R) @ B.T @ P

print(f"LQR Feedback Matrix K: {K}")

def lqr_control(x):
    u = -K @ x
    return u

x = np.array([[0.5], [0.1]])
control_signal = lqr_control(x)
print(f"Control Signal: {control_signal}")

이 장에서는 드론의 비행 안정성을 향상시키기 위해 널리 사용되는 여러 제어 알고리즘을 다루었다. PID 제어기, 상태 피드백 제어기, LQR 제어기의 이론과 구현 방법을 설명하고 Python 예제 코드를 제공하였다. 이러한 알고리즘을 적절하게 활용하여 드론의 안정적이고 정확한 비행을 달성할 수 있다.

추가 참고 자료