Skip to the content
FixTheRobot Explore Robotics / UAV / Module 5 / M5-T1

UAV Systems Engineering · Module 5

M5-T1: UAV equations of motion

There is not one UAV model but a ladder of them: choose the simplest that is faithful to the question you are asking.

  • Lesson 1 of 17
  • UAV Guidance, Navigation and Control (GNC)
  • Established engineering
  • About 14 minutes to read

Planning, control design and simulation each need a different level of model. This lesson sets out the ladder from a 3-D point mass to a full rigid body with wind, shows how the frames and the airspeed triangle connect them, and states when each rung is appropriate.

Learning objectives

After this lesson, you should be able to:

  • Write the kinematic and dynamic equations of a rigid-body UAV in the body and world frames.
  • Relate ground velocity, airspeed and wind with the wind triangle.
  • Select a model (point mass, planar, full rigid body) for planning, control and simulation.
  • Compute heading and groundspeed for a wind-corrected flight with code.

Conceptual explanation

A rigid-body UAV has the translational and rotational equations of lesson M1-T5. Three simplifications are used in practice: a point-mass model with acceleration as input (for planning and outer-loop MPC), a planar model (altitude held, horizontal motion only), and the full rigid body with motor dynamics (for simulation and inner-loop design). Aerodynamic forces depend on the velocity relative to the air, so wind enters through the airspeed.

Model ladderA three-dimensional point mass with acceleration input is used for planning. A rigid body with attitude dynamics and thrust and torque inputs is used for control design. Adding motor dynamics and aerodynamics gives the simulation model. Each level is valid for slower dynamics than the one below it.Point massa = inputRigid bodythrust + torques+ actuatorsmotor lag+ aerodynamicsdrag, winduse the lowest rung whose bandwidth covers the question
The model ladder.
Animation of the force balance of a planar quadrotor as it tilts from minus 30 to plus 30 degrees. With the thrust held at the hover value the horizontal component of thrust accelerates the vehicle sideways but the vertical component falls below the weight, so the vehicle also accelerates downwards. With the thrust raised by one over cosine of the tilt the vertical forces balance and only the sideways acceleration remains, g times tan of the tilt. A chart plots the two vertical accelerations against tilt.
m a=R[0, 0, T]−m g z^m\,a=R[0,\,0,\,T]-m\,g\,\hat{z}: the thrust vector rotates with the body, its horizontal part accelerates the vehicle and its vertical part fights gravity. At constant T=m gT=m\,g the vertical acceleration is g(cos⁡ θ−1)g(\cos \,\theta -1); to hold altitude T=m g/cos⁡ θT=m\,g/\cos \,\theta , which is why thrust margin limits the tilt. Computed from the force balance. (Looping, about 6 seconds; drawn and computed for this course with illustrative values.)

Engineering intuition

Each rung is valid when the dynamics it omits are much faster than the behaviour you care about. A planner thinking in seconds can treat the attitude loop as instantaneous (a point mass); a controller tuning the attitude loop at 20 rad/s cannot. And because lift and drag depend on airspeed, a wind of 5 m/s is not a small disturbance for a 10 m/s fixed-wing: groundspeed upwind may be half the airspeed, and the heading needed to track a line is no longer the line’s direction.

Mathematical formulation

Kinematics and dynamics in the world frame (zz up), with RR body-to-world, vv world velocity, ω\omega body rates, thrust TT, drag force FdF_{d} as a function of airspeed vav_{a}:

1. Translation: where the vehicle goes

Position kinematics
p˙=v\dot{\mathbf{p}} = \mathbf{v}
Position changes at the rate of the velocity (world frame).
Translational dynamics (Newton’s second law)
m v˙=R[00T]⏟thrust  −  mg z^⏟weight  +  Fd(va)⏟dragm\,\dot{\mathbf{v}} = \underbrace{\mathbf{R}\begin{bmatrix}0\\0\\T\end{bmatrix}}_{\text{thrust}} \;-\; \underbrace{m g\,\hat{\mathbf{z}}}_{\text{weight}} \;+\; \underbrace{\mathbf{F}_d(\mathbf{v}_a)}_{\text{drag}}
Mass times acceleration equals the sum of three force vectors: thrust, weight and drag. The thrust is along the body z axis; R rotates it into the world frame. The minus sign in front of the weight is a direction, not a negative weight: see the note below.

Why is the weight term negative?

The weight itself is not negative: its size is the positive number mgmg (for example 14.7 NN for a 1.5 kg vehicle). What carries the sign is its direction. In this lesson the world frame has zz pointing up, and z^=[0,0,1]⊤\hat{\mathbf{z}} = [0,0,1]^{\top} is the unit vector along it. Gravity pulls down, opposite to ẑ, so the weight force vector is

Weight as a vector (z up)
Fweight=− mg z^=[00−mg]\mathbf{F}_{\text{weight}} = -\,mg\,\hat{\mathbf{z}} = \begin{bmatrix} 0 \\ 0 \\ -mg \end{bmatrix}
The minus sign says “down”. Its magnitude is mg.

Check it on the zz (vertical) component. The thrust, level, gives +T. The weight gives −mg. So mv˙z=T−mgm\dot v_z = T - mg. If TT > mg the vehicle climbs, if TT = mg it hovers, and if TT < mg it sinks. With a z-down frame such as NED, z^\hat{z} points down, so the same weight is written +mg z^\hat{z} and thrust is −TT z^\hat{z}: the physics is identical and only the sign convention changes. The same applies to drag, whose minus sign in −½ρCdA∥va∥va\rho C_{d}A\Vert v_{a}\Vert v_{a} means “opposite to the airspeed”.

2. Rotation: how the vehicle points

Attitude kinematics
R˙=R [ω]×,[ω]×=[0−rqr0−p−qp0],ω=[pqr]\dot{\mathbf{R}} = \mathbf{R}\,[\boldsymbol{\omega}]_{\times}, \qquad [\boldsymbol{\omega}]_{\times} = \begin{bmatrix} 0 & -r & q \\ r & 0 & -p \\ -q & p & 0 \end{bmatrix}, \quad \boldsymbol{\omega} = \begin{bmatrix}p\\q\\r\end{bmatrix}
The matrix [ω]× performs the cross product: [ω]× a = ω × a. The angular velocity ω = (p, q, r) is expressed in the body frame.
Rotational dynamics (Euler’s equation)
J ω˙=τ  −  ω×Jω\mathbf{J}\,\dot{\boldsymbol{\omega}} = \boldsymbol{\tau} \;-\; \boldsymbol{\omega} \times \mathbf{J}\boldsymbol{\omega}
Inertia times angular acceleration equals the applied torque minus the gyroscopic coupling.

3. Wind and drag

Airspeed
va=v−w\mathbf{v}_a = \mathbf{v} - \mathbf{w}
The velocity relative to the moving air; w is the wind velocity in the world frame.
Quadratic drag
Fd≈−12 ρ Cd A ∥va∥ va\mathbf{F}_d \approx -\tfrac{1}{2}\,\rho\, C_d\, A\, \lVert \mathbf{v}_a \rVert\, \mathbf{v}_a
Drag opposes the airspeed, not the ground velocity, and grows with its square.

4. Putting it together

Causal chain
[Tτ]⏟inputs  →  Jω˙=τ−ω×Jω    ω  →  R˙=R[ω]×    R  →  mv˙=⋯    v  →  p˙=v    p\underbrace{\begin{bmatrix} T \\ \boldsymbol{\tau} \end{bmatrix}}_{\text{inputs}} \;\xrightarrow{\;\mathbf{J}\dot{\boldsymbol{\omega}}=\boldsymbol{\tau}-\boldsymbol{\omega}\times\mathbf{J}\boldsymbol{\omega}\;}\; \boldsymbol{\omega} \;\xrightarrow{\;\dot{\mathbf{R}}=\mathbf{R}[\boldsymbol{\omega}]_\times\;}\; \mathbf{R} \;\xrightarrow{\;m\dot{\mathbf{v}}=\cdots\;}\; \mathbf{v} \;\xrightarrow{\;\dot{\mathbf{p}}=\mathbf{v}\;}\; \mathbf{p}
Torque changes the angular rate, the angular rate changes the attitude, the attitude redirects the thrust, and only then does the horizontal velocity change. The thrust T acts on the velocity directly.

Reading each equation

The equations of the rigid-body UAV with wind, each read in words.
EquationIn wordsWhat it tells you
p˙=v\dot{\mathbf{p}} = \mathbf{v}Position changes at the rate of the velocity.Definition of velocity. Position is the integral of velocity.
mv˙=R[0,0,T]⊤−mgz^+Fdm\dot{\mathbf{v}} = \mathbf{R}[0,0,T]^{\top} - mg\hat{\mathbf{z}} + \mathbf{F}_dMass times acceleration equals the sum of the forces: thrust, weight and drag.Thrust is along the body zz axis, so RR decides where it points. Tilt the vehicle and part of the thrust goes sideways: that is how it translates.
R˙=R[ω]×\dot{\mathbf{R}} = \mathbf{R}[\boldsymbol{\omega}]_{\times}The orientation changes at a rate set by the body angular velocity.If ω=0\omega =0 the attitude is frozen. [ω][\omega ]ₓ is the matrix that performs the cross product, [ω][\omega ]ₓ a =ω×=\omega \times a. A rotation matrix has no gimbal lock, unlike Euler angles.
Jω˙=τ−ω×Jω\mathbf{J}\dot{\boldsymbol{\omega}} = \boldsymbol{\tau} - \boldsymbol{\omega}\times\mathbf{J}\boldsymbol{\omega}Inertia times angular acceleration equals the applied torque minus the gyroscopic coupling.Rotors produce τ\tau by speeding up some motors and slowing others. The ω\omega × Jω\omega term is small for a symmetric vehicle at modest rates but matters in flips.
va=v−w\mathbf{v}_a = \mathbf{v}-\mathbf{w}Airspeed is the velocity relative to the moving air.Hovering over the ground (v=0)(v=0) in a 5 m/s wind gives va=−wv_{a}=-w: the vehicle feels a 5 m/s headwind.
Fd≈−12ρCdA∥va∥va\mathbf{F}_d \approx -\tfrac12\rho C_d A\lVert\mathbf{v}_a\rVert\mathbf{v}_aDrag opposes the airspeed and grows with its square.Doubling the airspeed quadruples the drag. Holding position in wind therefore needs a steady lean: tan⁡ θ=Fd/(m g)\tan \,\theta =F_{d}/(m\,g).

Symbols and units

Symbols used in the equations of motion.
SymbolMeaningFrameUnit
pp, vvposition, velocityworldmm, m/s
mm, ggmass, gravitational acceleration (about 9.81)–kg, m/s2m/s^{2}
TTtotal thrust, the sum of the four rotor thrustsalong body zzNN
RRrotation matrix: turns body-frame vectors into world-frame vectors––
ω\omega angular velocity (roll, pitch, yaw rates)bodyrad/s
JJinertia matrix, nearly diagonal for a symmetric airframebodykg·m2m^{2}
τ\tau torque produced by differential rotor thrust and rotor drag torquebodyNN·mm
ww, vav_{a}wind velocity, airspeed vectorworldm/s
ρ\rho , CdC_{d}, Aair density (about 1.2 kg/m31.2\,\mathrm{kg}/\mathrm{m}^{3} at sea level), drag coefficient, reference area–kg/m3m^{3}, –, m2m^{2}

Why the vehicle must tilt

The only force the rotors can create points along the body zz axis. A quadrotor has four inputs for six degrees of freedom, so it is underactuated: it cannot push sideways. The chain that results is

Chain from motors to position
motor speeds→(T,τ)→ω→R→thrust direction→acceleration→v→p\text{motor speeds} \to (T,\boldsymbol{\tau}) \to \boldsymbol{\omega} \to \mathbf{R} \to \text{thrust direction} \to \text{acceleration} \to \mathbf{v} \to \mathbf{p}

Torque changes the angular rate, the angular rate changes the attitude, the attitude redirects the thrust, and only then does the horizontal velocity change. That is why controllers are nested loops: a slow position loop asks for a tilt, a faster attitude loop tracks it, and a still faster rate loop commands torque.

Worked example: holding position in wind

Hovering with ground velocity v=0v=0 in a steady 5 m/s wind gives an airspeed of 5 m/s. With illustrative values ρ=1.2 kg/m3\rho =1.2\,\mathrm{kg}/\mathrm{m}^{3}, Cd=1.0C_{d}=1.0, A=0.1 m2A=0.1\,\mathrm{m}^{2} the drag is 12(1.2)(1.0)(0.1)(5)2=1.5 N\tfrac12(1.2)(1.0)(0.1)(5)^2 = 1.5\ \mathrm{N}, pointing downwind. For a 1.5 kg vehicle the weight is 14.7 N, so the lean angle that balances it is θ=arctan⁡(1.5/14.7)≈5.8∘\theta=\arctan(1.5/14.7)\approx 5.8^\circ, and the thrust rises to 14.72+1.52≈14.8 N\sqrt{14.7^{2} + 1.5^{2}}\approx 14.8\,\mathrm{N}. At 15 m/s of wind the drag would be nine times larger, 13.5 N, and the lean angle about 42∘42^{\circ}: the vehicle would be near the limit of its thrust and tilt margin. The numbers are illustrative; a real vehicle needs a measured drag coefficient.

What the equations leave out

The model is a rigid body with lumped drag. It omits motor and propeller lag (milliseconds), rotor drag in the rotor plane, ground effect, battery voltage sag and frame flexibility. These are accurate enough to ignore for moderate manoeuvres and matter for aggressive flight, high wind and system identification.

5. The wind triangle: which way to point

An aircraft moves through the air, and the air moves over the ground. The three velocities add like the sides of a triangle:

Wind triangle (vector form)
vg⏟ground velocity  =  V[cos⁡ψsin⁡ψ]⏟airspeed vector, along the heading  +  w⏟wind\underbrace{\mathbf{v}_g}_{\text{ground velocity}} \;=\; \underbrace{V\begin{bmatrix}\cos\psi\\ \sin\psi\end{bmatrix}}_{\text{airspeed vector, along the heading}} \;+\; \underbrace{\mathbf{w}}_{\text{wind}}
The vehicle points along the heading ψ and moves through the air at speed V; the wind carries it sideways. To follow a track the ground velocity must lie along the course χ.

Let c^=(cos⁡ χ, sin⁡ χ)\hat{c}=(\cos \,\chi ,\,\sin \,\chi ) be the unit vector along the desired course and n^=(−sin⁡ χ, cos⁡ χ)\hat{n}=(-\sin \,\chi ,\,\cos \,\chi ) the unit vector to its left. Split the wind into a part along the course and a part across it:

Wind components
w∥=w⋅c^    (tailwind if positive),w⊥=w⋅n^    (pushing left if positive)w_{\parallel} = \mathbf{w}\cdot\hat{\mathbf{c}} \;\;(\text{tailwind if positive}), \qquad w_{\perp} = \mathbf{w}\cdot\hat{\mathbf{n}} \;\;(\text{pushing left if positive})

The component of the airspeed across the course must cancel the crosswind, which gives the heading correction (the crab angle) and then the groundspeed:

Wind correction angle
sin⁡(ψ−χ)=−w⊥V\sin(\psi-\chi) = -\frac{w_{\perp}}{V}
Point into the wind by the angle whose sine is the crosswind divided by the airspeed.
Groundspeed
vg=Vcos⁡(ψ−χ)+w∥v_g = V\cos(\psi-\chi) + w_{\parallel}
The along-track speed: the airspeed component along the course plus the tailwind.

Worked example. Fly due East (χ=0)(\chi =0) at V=15 m/sV=15\,\mathrm{m}/\mathrm{s} with a 5 m/s wind from the South, so w=(0, 5)w=(0,\,5) pushes the vehicle North, to the left. Then w∥=0w_{\parallel }=0 and w⊥=5w_{\perp }=5. The correction is ψ=arcsin⁡(−5/15)≈−19.5∘\psi = \arcsin(-5/15) \approx -19.5^{\circ}: point 19.5∘19.5^{\circ} to the right of the course, towards the wind. The groundspeed is 15cos⁡(19.5∘)+0≈14.1 m/s15\cos(19.5^{\circ}) + 0 \approx 14.1\ \mathrm{m/s}, slightly less than the airspeed because part of it is spent fighting the crosswind. The code below reproduces these numbers.

vav_{a}
airspeed vector (velocity relative to the air).
χ\chi , ψ\psi
course (direction of ground velocity) and heading (direction the vehicle points).
ww
wind velocity.

The wind triangle has a solution only when VV ≥ the crosswind component: a vehicle slower than the crosswind cannot hold the track.

Architecture and data flow

The planner uses the point-mass model with limits derived from the rigid-body model (maximum horizontal acceleration ≈ g tan⁡ θmax⁡g\,\tan \,\theta _{\max}, lesson M5-T8); the controller uses the linearised rigid body (lesson M5-T7); the simulator uses the full model with wind and noise. Keep the model parameters in one place so that all three agree (lesson M5-T2).

Control input, state, measurement and feedback

The feedback loopA setpoint goes to the controller, which computes a thrust and torques. A mixer turns them into four motor commands. The motors and propellers act on the vehicle, which is also pushed by wind. Sensors measure the vehicle, an estimator fuses the measurements into a state estimate, and that estimate is fed back to the controller.Setpointposition, velocity, yawControllererror to T, τMixer + ESCfour motor commandsVehiclep, v, R, ω (+ wind)SensorsIMU, GNSS, baro, cameraEstimatorEKF: state estimatethe estimate, not the raw measurement, is what is fed back
The control loop around the equations of motion. The wind enters the vehicle as an unmeasured disturbance.
Roles of the quantities in the control loop.
RoleWhat it isExamples
Control inputWhat the controller commands.Physically the four motor speeds (ESC commands). In the equations they appear as the thrust TT and the three torques τ\tau ; a mixer converts between them.
StateWhat the equations describe.pp, vv, RR and ω\omega : 12 numbers (3 position, 3 velocity, 3 attitude, 3 angular rate).
MeasurementWhat sensors give, with noise and bias.Gyroscope: ω\omega . Accelerometer: specific force (thrust plus drag over mass; not gravity or velocity). GNSS: position and velocity. Barometer: altitude. Magnetometer: heading. Camera, lidar, optical flow, rangefinder: motion relative to the surroundings.
FeedbackThe estimated state compared with the setpoint.The estimator (for example EKF2 in PX4) fuses the measurements into p^\hat{p}, v^\hat{v}, R^\hat{R}, ω^\hat{\omega }. The controller acts on the error between the setpoint and this estimate.
DisturbanceAn unmeasured input.Wind ww (through the drag FdF_{d}), payload shifts, battery sag. Estimated by a disturbance observer or an EKF with wind states, not measured directly.

In flight: hovering in calm air, the four motors run at nearly the same speed with T=m gT=m\,g and ω≈0\omega \approx 0. To fly forward the controller speeds up the rear motors and slows the front ones, which produces a pitch torque; the vehicle pitches and the thrust acquires a forward component. To yaw it speeds up the motors that spin one way and slows the others. In a gust the airspeed and the drag change, the position and acceleration estimates show the push, and the controller leans into it. A controller can only be as good as its estimate, which is why the later modules on state estimation, visual-inertial navigation and fault detection exist.

Real-world UAV applications

  • Choosing the model for MPC (point mass with acceleration limits).
  • Wind-corrected waypoint tracking.
  • Simulation fidelity decisions.
  • Checking whether a vehicle can hold a track in forecast wind.

Implementation example

This runs as shown: a wind-triangle solver checked by reconstructing the ground velocity, the impossible-track case, and the energy effect of headwind on groundspeed.

import numpy as np

def wind_triangle(course_rad, airspeed, wind_xy):
    """Heading and groundspeed to track 'course' (angle of ground velocity from +x, ccw) in wind 'wind_xy' at 'airspeed'. None if the track cannot be held."""
    c = np.array([np.cos(course_rad), np.sin(course_rad)]); n = np.array([-c[1], c[0]])
    w_par, w_perp = wind_xy @ c, wind_xy @ n
    if abs(w_perp) > airspeed: return None
    delta = np.arcsin(-w_perp / airspeed)                           # wind correction angle
    heading = course_rad + delta
    ground = airspeed * np.cos(delta) + w_par
    return heading, ground

V = 15.0
for course_deg, wind in ((0, (0, 0)), (0, (-5, 0)), (0, (5, 0)), (0, (0, 5)), (90, (5, 0))):
    h, g = wind_triangle(np.radians(course_deg), V, np.array(wind, float))
    v_air = V * np.array([np.cos(h), np.sin(h)]); v_ground = v_air + np.array(wind)                 # reconstruct: airspeed + wind = ground velocity
    assert abs(np.degrees(np.arctan2(v_ground[1], v_ground[0])) - course_deg) < 1e-9 and abs(np.linalg.norm(v_ground) - g) < 1e-9
    print(f"course {course_deg:3d}, wind {wind}: heading {np.degrees(h):6.1f} deg, groundspeed {g:5.1f} m/s")
assert abs(wind_triangle(0.0, V, np.array([-5.0, 0.0]))[1] - 10.0) < 1e-9                 # a 5 m/s headwind removes 5 m/s of groundspeed
assert wind_triangle(0.0, 4.0, np.array([0.0, 6.0])) is None                              # crosswind stronger than the airspeed: the track cannot be held
assert abs(np.degrees(wind_triangle(0.0, V, np.array([0.0, 5.0]))[0]) + 19.47) < 0.01     # crab angle into a 5 m/s crosswind at 15 m/s
Wind triangle: heading, groundspeed and infeasible tracks.

Common engineering mistakes

Planning in ground speed without wind

Energy, stall margin and control authority depend on airspeed.

Using a point-mass model beyond its bandwidth

Aggressive manoeuvres excite the attitude dynamics it ignores.

Frame confusion between body and world forces

Thrust is body-fixed, drag follows the airspeed vector.

Treating wind as zero-mean noise

It has a mean (and shear) that integral action or estimation must handle (lesson M5-T16).

Different parameters in planner, controller and simulator

Inconsistent models cause confusing behaviour.

Failure modes

Failure modes, symptoms and causes
Failure modeHow it shows upLikely cause
Cannot hold the trackVehicle drifts downwindAirspeed below the crosswind component
Planner infeasible trajectoriesTracker saturatesPoint-mass limits above what the rigid body provides
Unmodelled drag at speedTracking error grows with speedNo drag term
Altitude loss in strong windDescent while tiltingThrust margin consumed by tilt

Debugging approach

  1. Compare the three models on the same input and see where they diverge.
  2. Fit a drag coefficient from a constant-speed log.
  3. Check that planner acceleration limits are inside the thrust envelope.
  4. Log wind estimates (if available) and airspeed.

Practical exercises

  1. Derive the maximum horizontal acceleration for a vehicle with T/W=2T/W=2 at hover trim.
  2. Compute the heading and groundspeed for course 45∘45^{\circ}, airspeed 12 m/s, wind (3, −4) m/s.
  3. Add a quadratic drag to the point-mass model and find the terminal speed for a given tilt.
  4. Decide the model for a 20 Hz MPC.

Interview questions

Write an answer in your own words, then reveal the model answer. Nothing is sent anywhere.

Question 1

What is a point-mass UAV model good for?

Model answer

Outer-loop planning and MPC where the attitude loop is fast compared with the manoeuvre: acceleration is treated as the input, limited by what the thrust and tilt permit.

Question 2

What is the wind correction angle?

Model answer

The angle between heading and course needed so that airspeed plus wind gives the desired ground track.

Question 3

Why does airspeed matter for a UAV?

Model answer

Aerodynamic forces and control authority depend on velocity relative to the air, not the ground.

References and further reading

Primary papers, official documentation and standards. Each claim above that is specific to a tool or version points here.

What’s next

Mark this lesson

Saved in this browser and synced to your account when you are signed in.

Next lesson

M5-T2: Quadrotor dynamic modelling

Build a simulation-ready quadrotor model: parameters, motor dynamics, drag and integration step choice.