28.4.3. 상태 천이 충격 완화: 스무딩(Smoothing) 및 범프리스 트랜스퍼(Bumpless Transfer)
커맨더의 허가를 받고 FMM의 자체 검열(checkActivationConditions)까지 통과하여 비행 모드 스위칭이 논리적으로 확정되었다고 치자. 하지만 제어 공학의 세계에서, 소프트웨어 구조체의 포인터를 갈아 끼우는 것과 거대한 질량을 가진 기계를 물리적으로 제어하는 것은 전혀 다른 이야기다.
1. 계단 입력(Step Input)의 공포: 오버슈트(Overshoot)와 역기전력
새로운 비행 모드(새로운 FlightTask)가 눈을 뜨고 처음 뱉어내는 타겟 위치(Setpoint)는, 이전 모드에서 기체가 실제로 날고 있던 현재 상태(Actual State)와 물리적으로 엄청난 괴리(단차)가 존재할 확률이 높다.
PID 제어기 입장에서 이 거대한 위치 오차(Position Error)는 수학적으로 살인적인 **계단 입력(Step Input)**으로 다가온다. 제어기의 P 게인(Gain)은 이 거대한 오차를 순식간에 0으로 메우기 위해 모터 시스템에 풀 액셀러레이터(100% PWM) 명령을 때려버리고, 모터는 감당할 수 없는 토크로 회전하며 기체를 미친 듯이 홱 꺾어버린다. 조종사들은 흔히 모드 스위치를 켤 때 기체가 움찔거리거나 위로 튀어 오르는 불쾌한 이 현상을 **‘범프(Bump)’**라고 부른다.
2. 범프리스 트랜스퍼(Bumpless Transfer)의 철학
PX4 아키텍처는 비행 모드가 전환되는 그 찰나의 순간, 조종사나 탑승객이 전혀 느끼지 못할 만큼 기체가 크림처럼 부드럽게 새 궤적에 올라타도록 **범프리스 트랜스퍼(Bumpless Transfer)**라는 고급 제어 기법을 FMM 베이스라인에 융합해 두었다.
경로의 충격을 완화(Smoothing)하는 PX4의 3단 방어선은 다음과 같다.
- 동기화 (Initialization Reset): 새로운 모드의 첫 번째 제어 목표값을 “네가 논리적으로 가고 싶은 곳“이 아니라, “현재 기체가 관성을 받으며 날고 있는 바로 그 물리적 위치와 속도“로 강제로 덮어씌워 오차(Error)를 0으로 스무딩하는 수학적 타협 기법이다. (28.4.3.1.1절 참조)
- 모션 플래닝 (Slew Rate Limiting): 첫 단추를 현재 기체 상태와 동기화시켰다면, 이제 진짜 목표점을 향해 모션 프로파일(가속도와 저크 제한)을 적용하여 궤적을 부드러운 S자 곡선으로 깎아 올리는 램프(Ramp) 필터링 기법이다. (28.4.3.1.2절 참조)
- 적분기 스무딩 (Integrator Bleed-off): 이전 비행 모드가 거친 바람과 싸우며 오랫동안 누적시켜 두었던 과거의 잔재, 즉 하위 PID 제어기 내부의 I-term(적분항)을 전환 순간 갑자기 0으로 폭파시키지 않고 점진적으로 방출(Bleed off)하여 기체가 툭 떨어지는 현상을 막는 하위 제어기 단의 세탁 로직이다.
이어지는 단락들에서는 새로운 FlightTask가 무덤에서 깨어나는 첫 번째 루프(activate() 및 update() 주기)에서 이 범프리스 트랜스퍼가 소스 코드 레벨로 어떻게 정교하게 구현되어 있는지 해부해 본다.