30.4.5. 멀티로터의 위치 유지(Position Hold) 시 적분기 와인드업 방지(Anti-windup) 및 외란 관측기(Disturbance Observer) 연동 데이터 역추적

30.4.5. 멀티로터의 위치 유지(Position Hold) 시 적분기 와인드업 방지(Anti-windup) 및 외란 관측기(Disturbance Observer) 연동 데이터 역추적

멀티로터가 Loiter 모드(또는 Hold 모드)에 진입하여 목표 위치(Position Setpoint)에 대기하는 동안 기체는 바람(강풍, 돌풍) 혹은 비대칭 페이로드 무게와 같은 외부 환경적 요인(외란, Disturbance)에 끊임없이 노출된다. PX4-Autopilot은 단순히 PID 제어를 넘어서 환경적 외란을 거부(Disturbance Rejection)하고 현재 좌표를 사수하기 위해 **외란 관측기(Disturbance Observer)**의 개념을 내부적으로 연동하며, 이에 대응하는 적분기(Integrator)가 통제 불능 상태에 빠지는 것을 막기 위한 동적 안티-와인드업(Dynamic Anti-windup) 로직을 제공한다.

본 장에서는 위치 제어기(mc_pos_control) 내부에서 적분기와 외란 저항력이 어떻게 긴밀하게 상호작용하는지, 소스 코드 및 역학 모델 측면에서 깊이 있게 살펴본다.

1. 적분기(Integrator)의 외란 관측기(Disturbance Observer)적 역할

위치 제어와 속도 제어 루프에서 P(Proportional) 제어는 즉각적인 오차에 반응하고 D(Derivative) 제어는 오차의 변화율(진동)을 억제한다. 하지만 기체에 지속적인 일방향 외력(예: 북쪽에서 남쪽으로 5m/s로 지속해서 부는 바람)이 가해진다면, P 제어기만으로는 오차 상태를 완전히 0으로 만들 수 없는 **정상 상태 오차(Steady-state Error)**가 필연적으로 발생하게 된다.

PX4에서는 별도의 비선형 외란 관측 모델을 추가하기보다, 속도 제어 루프의 적분기(Velocity Integrator) 자체를 외력의 방향과 크기를 추정하는 일종의 상태 관측기로 활용한다.

\vec{I_{wind\_dist}} \approx K_I \cdot \int_{0}^{t} (\vec{V_{setpoint}} - \vec{V_{current}}) d\tau

바람이 드론을 남쪽으로 밀어내 구하고 있다면, 적분기는 오차를 누적하여 드론 스스로가 북쪽으로 일정한 속도/가속도를 내도록 반대 추력 지시를 적립한다. 적분기의 누적값은 결과적으로 바람 벡터의 크기 및 방향과 비례하는 역추적 데이터가 되므로, ULog에서 vehicle_local_position_setpoint 내의 적분기 항 데이터(thrust_int)를 파싱하면 현재 기체에 작용하는 환경적 외력의 스펙을 실시간으로 역추정(Reverse-tracking)할 수 있다.

2. 적분기 와인드업(Windup) 문제 정의 및 구조적 한계

적분기가 유용하지만 제어 한계(추력 한계, 경사각 한계 등)에 도달한 상황에서도 오차가 계속 누적되는 상황이 발생할 경우 치명적인 적분기 와인드업(Windup) 문제가 발생한다.
가령 돌풍이 멀티로터의 물리적 최대 극복 속력(MPC_XY_VEL_MAX 또는 MPC_THR_MAX)을 상회하여 기체를 밀어낸다면 다음과 같은 제어 불능 프로세스가 발생한다.

  1. 드론이 밀려나면서 속도 제어 PI 루프의 적분값이 한계치까지 계속해서 누적된다.
  2. 이후 돌풍이 갑자기 멈춘 순간, 이미 누적되어 한계치(Saturation)에 도달해 있는 적분기 출력이 즉각적으로 사라지지 않는다.
  3. 기체는 축적되어 있던 맹렬한 가상의 저항력을 모터 출력을 통해 폭발시키며 바람이 불던 반대 방향으로 크게 급가속해버리는 심각한 오버슈트(비행 튕김 현상)를 발생시킨다.

3. PX4의 능동적 안티-와인드업(Anti-windup) 소스 코드 분석

이러한 현상을 막기 위해 PX4의 속도 제어 클래스(PositionControl.cpp)에는 다각도의 조건부 적분 억제(Anti-windup) 메커니즘이 코드 레벨에서 적용되어 있다.

3.1. Clamping (Saturation 검사 기반 적분 차단)

시스템이 요구 가속도 한계(MPC_ACC_HOR_MAX)나 모터 한도(MPC_THR_MAX)에 걸렸음을 감지하는 경우, 제어기는 즉시 해당 축에 대한 적분 업데이트 로직을 멈춘다. 즉, 오차가 더 이상 수식적으로 의미가 없는 임계 상황을 인지하고 에러 누적 루틴(err += value * dt)을 return 처리해버린다.

// 가상의 소스 코드 로직 형태 단순화
if (is_thrust_saturated(axis)) {
    // 출력 포화에 도달했으므로 적분 루프를 일시 중지 (Clamping Anti-windup)
    // 외란이 드론의 물리력 한계를 넘은 상황임.
    integrator_velocity[axis] += 0; 
} else {
    integrator_velocity[axis] += error * Ki * dt;
}

3.2. 상태 전이(State Transition) 시의 적분기 리셋 및 감쇠(Decay)

기체가 수동 비행(Stabilized)에서 Loiter로 전환되거나, 대형 이동(Waypoint Navigation)을 끝내고 Loiter에 막 안착했을 때, 기존 이동 궤적에서 쌓인 잔여 적분항이 새로운 정지 궤도에 심각한 간섭을 미치지 않도록 해야 한다.

  • PX4는 모드가 전환되면서 속도 오차가 큰 폭으로 0 근방으로 갱신될 때 적분기를 물리적으로 0으로 하드 리셋(Hard-reset) 시키거나, 점진적인 지수 감쇠(Exponential Decay)를 적용하여 이전 상태량의 유산(Legacy)을 초기화한다.

4. Ardupilot의 Leash 기반 방식과의 비교 (제어 철학)

Ardupilot은 전통적인 AC_PosControl 라이브러리에서 Leash(가상의 고무줄 반경)를 사용하여 목표점에서 기체가 크게 이탈할 경우 목표점 자체를 기체 인근으로 잡아끌어 오차항(P항) 자체가 기하급수적으로 커지는 것을 원천 방지하는 방식에 크게 의존한다. 이 경우 오차의 한계가 정해져 있어 적분기 오류가 쉽게 임계치를 넘지 않는 효과가 있다.

반면 PX4-Autopilot의 구조는 오차 수식을 그대로 두되 제어기 아웃풋 말단에서 Back-calculation 기법(이상적인 제어출력과 클리핑된 실제 제어출력의 차이를 적분기에 역으로 보상해 주는 제어론)에 기반한 연산과 상태 변수 포화 검증 등을 통해 내부 수학 모델 자체를 견고히 하는 정통 모던 제어 시스템(Modern Control System)의 구조적 해법을 선호한다.

결론 및 엔지니어링 튜닝 지침

적분기 항(MPC_Z_VEL_IMPC_XY_VEL_I) 튜닝은 드론이 호버링 상태 시 불어오는 강풍에 얼마나 꼿꼿이 저항하느냐를 결정하는 핵심 파라미터이다.

  • MPC_XY_VEL_I 값을 너무 높게 세팅하면 바람의 영향을 즉각 상쇄하지만 약간의 외란(가스트, 돌풍 현상)에도 기체가 과도한 역추력을 일으켜 덜덜 떨리게(Jittering) 되며, 반대로 너무 낮으면 기체가 서서히 바람결에 밀려나 제자리를 잃고 표류(Drift)하게 된다.
  • 현장 테스터(또는 로봇 공학자)는 GCS를 통해 기체를 10m 상공에 Loiter 모드로 띄워 둔 채 강한 바람이 불 때의 ULog를 확보하고, 로그 내 thrust_int[0], thrust_int[1]의 진동 폭(Oscillation Amplitude)을 분석하여 와인드업이 발동하기 직전의 이상적인 K_i (적분 이득) 스펙을 찾아내는 과정을 거쳐야 한다.