Robotics/Control Theory

ROS2 × PX4로 시작하는 자율비행 드론 제어 (6) 쿼드로터 운동 모델

항공학도 2025. 5. 19. 13:42

이 블로그 시리즈에서는 Gazebo + ROS 2 + PX4(MAVROS)를 활용해 드론을 제어하고, 최적 제어 알고리즘 Model Predictive Path Integral (MPPI) 를 직접 구현하는 과정을 기록합니다. 이후에는 더 진화된 강화학습(RL) 기반 제어로까지 확장하며, 최신 오픈소스 생태계가 실제 연구·개발 파이프라인에서 어떻게 유기적으로 엮이는지 보여드릴 예정입니다.

Generated by ChatGPT, super cool!

지난 글(5편)에서는 MPPI Controller에 대해 간단히 살펴보았습니다. 이번글에서는 이제 MPPI (Model Predictive Path Integral) 에서 "Model"이 무엇을 의미하는지에 대해 알아보겠습니다. 살짝 긴 설명 글이 될 것 같은데요, 이 개념을 잘 이해하고 넘어가야 MPPI에 대해 완전히 이해할 수 있다고 생각됩니다.

1. 운동 모델 (Dynamic Model) 이란?

실제 쿼드로터 (편의상 드론이라고 부르겠습니다)의 운동 특성을 수식과 파라미터로 표현한 것을 운동 모델 (dynamic model) 이라고 합니다. 또한 이를 비행 실험, 계측 장비로 역추정하는 과정을 운동 모델 식별 (Dynamic Model Identification) 이라고 합니다. 드론은 구조가 간단해서 식별없이 적당한 제어기 튜닝을 통해 해결하는 경우도 많지만, 드론이 나오기 이전에 고정익과 헬리콥터에서는 운동모델 식별만으로도 수십 편 논문이 나올 만큼 제어기 설계에 있어 매우 중요한 부분 이었습니다. 

아무튼 그렇다면 왜 운동 모델이 중요할까요?

이전 글에서 알아본 것 처럼 MPPI는 "현재 상태에서의 제어 입력 → 수 step 뒤 위치·자세"를 수백 번 시뮬레이션 해서 최적 제어 입력을 선택합니다. 이때 예측이 부정확하면 최적 제어 입력도 부정확하게 되기 때문에 제어 입력이 운동모델을 거쳐 나오게 되는 다음 상태 출력을 합리적으로 근사해야 합니다. 결국 모델 정확도 = 미래 궤적 예측 정확도 = 제어 품질 이 됩니다. 

제어 입력 → 로봇의 운동모델 → 로봇의 움직임

이번 글에서는 제어기의 결과값인 제어 입력 벡터를 4개 모터 각각의 속도로 변환하고 사전에 정의된 드론의 운동 모델을 통해 다음 상태로 변환하는 방법을 알아보도록 하겠습니다. 그 방법은 다음과 같습니다

  1. 4개의 제어입력 벡터 (추력, 롤모멘트, 피치모멘트, 요 모멘트) $u$ 를 각각의 모터 속도 ($\omega^2$)로 믹싱
  2. 모터 속도 ($\omega^2$)를 추력과 모멘트의 방정식으로 변환
  3. 추력·모멘트를 다음 상태(위치·속도·자세·각속도)로 예측

제어기 출력으로부터 다음 상태를 예측하는데 이는 다음과 같이 두 부분으로 나눌 수 있다.
(계산 부분):                            원하는 추력·모멘트 → 모터 속도$^2$ 계산 → 로봇의 운동모델
(예측 부분):                            → 추력·모멘트 예측 가속도 예측속도·위치 / 각속도·자세 예측

 

2. 제어 입력이란? - 드론이 이해할 수 있는 4개의 신호

그럼 먼저 제어 입력 (Control Input)에 대해 알아보겠습니다. 드론은 네 개의 모터를 이용해 비행하며, 이들 모터각각의 회전 속도 변화를 통해 3차원 공간상에서 6자유도 (3축 이동 + 3축 회전)을 구현합니다 (참고: 쿼드로터는 어떻게 나는가?).

즉, 드론의

롤, 피치, 요 동작은 모두 네 개 모터의 출력 “차이”를 이용
고도 (상승/하강) 는 네 모터의 출력 “합” 을 변화

시켜 이루어집니다. 이렇게 네 모터의 속도를 조합함으로써 궁극적으로 드론의 위치와 자세를 제어할 수 있습니다. 결국 모터의 속도 제어를 통해 드론은 총 추력 $(T)$과 3개의 회전 (Roll·Pitch·Yaw) 모멘트를 형성하게 됩니다. 여기서 각 성분은 다음과 같은 의미를 갖습니다.

  • $T$ (Total Thrust, 총 추력): 기체를 위로 들어올리는 전체 추력으로, 네 개 프로펠러가 함께 만들어 내는 상승력
  • $M_{\phi}$: 드론의 롤($\phi$)축, 즉 기체를 옆으로 기울이는 동작입니다.
  • $M_{\theta}$: 드론의 피치($\theta$)축, 즉 기체를 앞뒤로 기울이는 동작입니다.
  • $M_{\psi}$: 드론의 요($\psi$)축, 즉 기체를 좌우로 회전시키는 동작입니다.
기호
물리적 의미 단위 조종기에 빗댄 직관
$T$ 총 추력 (Throttle) N 스로틀 스틱을 올리면 ↑, 내리면 ↓
$M_{\phi}$ Roll 모멘트 N·m 오른쪽 스틱 좌우로 밀어 몸체를 기울임
$M_{\theta}$ Pitch 모멘트 N·m 스틱 앞뒤로 밀어 앞·뒤로 기울임
$M_{\psi}$ Yaw 모멘트 N·m 왼쪽 스틱 좌우로 비틀어 헤딩 회전

이처럼 총추력 $T$는 드론의 상승력, 모멘트 $M$는 세 축 회전력을 의미합니다.

*더 깊이 이해하고 싶다면… 네 개 신호가 모터 속도로 바뀌는 과정과 쿼드 믹서 행렬을 그림으로 정리한 예제가 있습니다.
👉 참고 : 쿼드로터 신호출력 해당 글에서 “추력·롤·피치·요 모멘트 ↔ 모터 4개 속도” 변환을 단계별로 시각화해 두었습니다.

 

3. 모터 속도로부터 위치,자세가 예측되는 원리: 운동모델

제어 입력으로부터 모터 회전 속도가 정해지면, 드론의 운동 모델로부터 추력과 모멘트속도 제곱에 비례하는 상수’로 바로 계산할 수 있고, 이를 통해 드론의 위치와 속도를 계산할 수 있습니다. 이처럼 모터 속도² → 추력·모멘트 → 가속도 → 속도·위치로 표현되는 드론의 운동모델을 구현해도보록 하겠습니다

A-1. 모터 속도를 추력으로 바꾸기 (모터 속도² → 추력·모멘트)

  1. 각 모터 속도를 라디안/초 (rad/s)로 환산
  2. 제곱 후 $k_f$를 곱하면 해당 모터가 내는 힘
                                                                        $추력 F_z = k_f \Sigma w_i^2$

                                                                        $k_f: 추력상수 N/(rad/s)^2$
  3. 네 모터 힘을 모두 더하면 총 추력
                                                                        $F_z = \Sigma_{i=1}^4 F_i$

예를들면,
               호버링에 필요한 총 추력이 기체질량 1kg x 9.81 = 10N 이라고 가정합니다.
               모터 4개의 속도를 모두 550rad/s로 돌렸더니
                   $F_z = 4 \times k_f (550)^2 = 10N$이 나왔다면,
               "550rad/s가 호버링 RPM이구나" 를 실험으로 확인한 셈이고, 이를 역으로 계산하면
                   $k_f = 8.3 \times 10^{-6}$ 인것을 알 수 있습니다.

A-2. 모터 속도를 롤·피치 모멘트로 바꾸기

드론은 모터 암 길이 $l$을 이용해 모터 힘 차이를 회전력으로 바꿉니다.

  • Roll ($\phi$) 모멘트
    롤 모멘트는 왼쪽-오른쪽 힘 차이로 만들어집니다.
    수식으로는:

$M_{\phi} = k_fl[(w_0^2+w_1^2)-(w_2^2-w_3^2)]$

예를들면,
               ㆍ모터 1·2를 550 → 600 rad/s 로 +50 올리고
               ㆍ모터 3·4를 550 → 500 rad/s 로 −50 내리면
                 $\Delta w^2$≈55000 차이가 생기고, $k_fl\Delta w^2$만큼 왼쪽으로 기울입니다.
                 팔 길이 0.2 m, $k_f = 8.3 \times 10^{-6}$ 라면
                 Mϕ≈0.094 N⋅m의 롤 토크가 생깁니다.

  • Pitch ($\theta$) 모멘트
    피치 모멘트는 앞-뒤 모터 힘 차이로 만들어집니다.
    수식으로는:

$M_{\theta} = k_fl[(w_0^2+w_2^2)-(w_1^2-w_3^2)]$

        앞뒤 모터 순서만 달라졌을 뿐 계산 방식은 같습니다.

A-3. 모터 속도를 요 모멘트로 바꾸기

  • Yaw ($\psi$) 모멘트
    요 모멘트는 모터의 회전속도 차이로 생기는 반작용 토크입니다

$M_{\psi} = k_m[(w_0^2+w_2^2)-(w_1^2-w_3^2)]$

        CCW 모터(#1,#3)와 CW 모터(#2,#4)의 속도² 합 차이가 크면 클수록, 그 방향으로 기체가 돌아갑니다.
        $k_m$프로펠러 공기저항이 만드는 토크에 대한 상수입니다.

B-1. 추력,모멘트를 선가속, 각가속으로 바꾸기

프로펠러가 내는 힘은 항상 기체 몸통의 z축(위쪽)으로 작용합니다. 하지만 기체가 기울어져 있으면 이 축이 world 좌표계에서 기울어집니다. 따라서 몸통‑좌표계 힘 벡터를 오일러 각(혹은 쿼터니언)으로 만든 회전행렬에 곱해 world 좌표계 힘 벡터로 바꾸어야 실제 가속 벡터를 얻을 수 있습니다. 이렇게 바뀐 힘 벡터를 질량으로 나누어 가속도를 구하고, 여기에 지구 중력을 더하면 실제 선가속이 됩니다.

$a = R[0,0,F_z/m]^T + g$

B-2. 각가속 계산

드론을 단단한 강체 (Ribid Body)로 보면, 뉴턴-오일러 회전방정식은 다음과 같습니다.

 

 

        여기서
        $I = diag(I_{xx}, I_{yy}, I_{zz}) $ : 관성 모멘트 행렬
        $\omega = [p, q, r]^T$ : 바디축 각속도 (롤·피치·요 속도)
        $M = [M_{\phi}, M_{\theta}, M_{\psi}]^T$ : 컨트롤러가 원하는 롤·피치·요 모멘트
        $\omega^`=[p^`, q^`, r^`]$: 각가속

대칭 프레임(모터·배터리 배치가 균일)이라 자이로스코픽 결합 항이 크지 않다면 첫 항만 남기고 단순화해도 1 ㎐ ~ 50 ㎐ 기동 에서 5 % 이내 오차로 작동합니다. 즉

$\omega^` = I^{-1}M$
$\omega^` = [I_{xx}^{-1}M_{\phi}, I_{yy}^{-1}M_{\theta}, I_{zz}^{-1}M_{\psi}]$

즉, 롤,피치,요 모멘트가 곧 각가속의 분자이고, 관성 모멘트가 분모 입니다.

C. 적분 (속도, 위치 계산)

위치는 속도에 시간 Δt를 곱해 더하고, 속도·각도·각속도도 같은 방식으로 한 스텝 전진합니다.

$x_{k+1} = x_k + v_k\Delta t$
$v_{k+1} = v_k + a_k\Delta t$

이렇게 하면 “모터 속도² → 추력·토크 → 가속도 → 속도·위치” 라는 사슬이 완성됩니다. 이 체인이 현실과 멀어질수록 MPPI가 고른 ‘최적 입력’도 같이 빗나가니, 호버 추력 상수와 팔 길이 같은 파라미터는 반드시 실측 데이터에 맞춰 두어야 합니다. MPPI는 이 과정을 N개의 무작위 입력 시퀀스 각각에 대해 H 스텝씩 반복해 “가장 비용이 낮은 궤적”을 찾습니다.

다음 글에서는 이를 코드로 작성해보고 실제 MPPI 컨트롤러 코드도 작성하여 드론 최적 제어 명령을 생성하는 방법을 알아 보도록 하겠습니다.