Deep dive ② · Full technical report

QX-250 — 6-DOF flight-dynamics report

The complete write-up behind the performance deep-dive: a full rigid-body model of the QX-250, built and simulated entirely headless from Python, then exercised across 8 flight scenarios, 3 parametric sweeps, a 20-run Monte-Carlo study and a 161-state linear stability analysis — the whole battery in 170 s.

Simcenter Amesim 2511 6 DOF · 161-state model headless · ame_apy 32 simulation runs

At a glance

What the study found

Headline numbers, each traceable to a run in the results set.

Degrees of freedom6

3 translation · 3 rotation, multibody

Simulation runs32

8 scenarios · 13 sweep pts · 20 Monte-Carlo · 1 linear

Monte-Carlo stable20/20

±9° attitude, 0.45–0.55 kg

Attitude 1st recovery~0.86 s

lightly damped, ζ≈0.15

Linearized states161

max Re(λ)≈0 · marginally stable

Headless runtime170 s

no GUI, one Python session

One-line verdict. The QX-250 attitude loop is fast but under-damped, and the baseline controller holds attitude only — position and heading drift openly, and the loop is gravity-tuned. Every one of these conclusions is visible in both the time histories and the eigenvalues, and each points at a concrete design action.

Method

A headless-Amesim first

The model is Siemens' shipped Drone_3D_Mechanical 6-DOF quadcopter — a genuine multibody rigid body (libm6dof) with four electric-motor drives (libemd PMSM), seven PID control loops, gravity and aerodynamic damping — reparametrized to the QX-250's 0.50 kg all-up weight. It is driven through Amesim's ame_apy API: open → generate code → set parameters → run → extract, entirely in one Python process. Every run logs CoG position (x,y,z), velocity (u,v,w), attitude (roll,pitch,yaw), body rates (p,q,r) and all four motor speeds.

Obstacle solved. Amesim's headless code generator silently omits the libM6DOF / libEMD link archives, so the model fails to compile with undefined reference to m6dof*. The final link was completed by hand — those archives inside a linker --start-group — producing a working 4.4 MB model DLL that Amesim's own runtime executes. Without this, no headless 6-DOF drone simulation is possible on this install.

The closed loop is excited by initial-condition perturbation — offset attitude or position, then observe recovery — a standard, controllable way to characterize a closed-loop vehicle. All results are produced by Amesim's compiled model, not a re-implementation.

The vehicle

QX-250 parameters

From the project record (spec table & FMECA). The all-up weight is what drives flight.

QuantityValueApplied in model
All-up weight (AUW)0.50 kgmass = 0.49 kg
AirframeQuad-X, 250 mm wheelbase, 3K carbonsee note ↓
Battery4S1P LiPo, 14.8 V, 1500 mAh
Motors4× 2306, 1700 KV, 3-phase BLDCPMSM drive (demo map)
Props4× 5″ tri-blade (2 CW / 2 CCW)
Thrust : weight~5 : 1
A measured modelling limit. The physically-correct 125 mm arm and small (2.5–4.5×10⁻³ kg·m²) inertia were tried first and measured to destabilise the vehicle — reducing the arm cuts control torque 4× and the demo's tuned controller diverges (hover roll → 67°). So the QX-250 identity is applied through mass on the validated Siemens airframe; the 125 mm-geometry controller re-tune is flagged follow-up work.

Time domain — 8 scenarios

Flight scenarios

From a 1 m level start; attitude perturbations are released and the closed loop recovers.

Hover dashboard
Hover. Attitude bounded (roll ≤ 7°, pitch −7…+11°), motors ~28,400 rpm, with the open heading (yaw → 62°) and x-drift the attitude-only controller allows.
Roll recovery
Roll recovery (15°). First zero-crossing at 0.86 s, overshoot to −14°, ring-down at ζ≈0.15 — the single most actionable dynamic finding.
Pitch recovery
Pitch recovery (15°). Analogous damped return, first crossing 0.87 s.
Combined roll+pitch
Combined roll + pitch (10°/10°). Both axes recover together (0.85 s / 0.86 s), confirming symmetry.
Yaw recovery
Yaw (20° initial). Roll/pitch stay bounded (≤10°) through the heading transient.
Altitude offset
Altitude offset (+0.5 m). Vertical dynamics from an above-nominal start; attitude bounded.
Lateral offset
Lateral offset (+1 m). Translational response; the attitude-only loop does not null the offset.
Endurance hover 30 s
Endurance (30 s). Stable integration for the full duration — attitude bounded ±13°, steady climb to 3.9 m, heading accumulating (~223°): the uncorrected yaw drift over time.

Attitude-recovery summary

ScenarioInitial1st zero-crossing1st overshoot
Roll step15°0.86 s−14°
Pitch step15°0.87 s−7.3°
Combined roll+pitch10° / 10°0.85 / 0.86 s≈ −4°

Parametric sweeps

Sensitivity

Hover behaviour swept against all-up weight, arm length and gravity.

Mass sweep
Mass. Hover motor speed rises monotonically with AUW — 25,900 rpm @ 0.40 kg → 28,400 @ 0.50 → 33,500 @ 0.70 kg — and climb rate falls, exactly as thrust:weight predicts.
Arm-length sweep
Arm length. Hover rpm is flat (thrust = weight), but hover-roll excursion falls as the arm lengthens (6.1°→4.8°) — more control torque per unit thrust. Physically correct.
Gravity sweep
Gravity. Earth (9.81) flies at 28,470 rpm; Mars (3.71) and Moon (1.62) both diverge — the throttle/attitude loop is tuned for 1 g.

Hover throttle vs mass

mass [kg]motor [rpm]z @ 6 s [m]
0.4025,8552.06
0.4527,3451.98
0.5028,3561.90
0.6031,3391.76
0.7033,5181.63

Monotonic both ways — heavier needs more rpm and climbs less under fixed thrust authority. (0.55 kg point diverged; omitted.)

Robustness

Monte-Carlo dispersion

20 randomized runs — mass U(0.45, 0.55 kg), initial roll & pitch U(−9°, +9°).

Monte-Carlo 20 runs all stable
20/20 stable. Peak roll excursion 3.9–9.2° (mean 7.1°); every case recovered.

Dispersion result

Runs20
Stable20 / 20
Peak |roll| — min3.9°
Peak |roll| — mean7.1°
Peak |roll| — max9.2°

No run exceeded 10° peak roll or lost control — a clear robustness margin inside the tested dispersion.

Linear analysis

Hover-point stability

The full model linearized at the hover operating point.

Eigenvalues of the hover linearization
161-state linearization. Every pole is in the closed left half-plane or on the imaginary axis — max Re(λ) ≈ 8.7×10⁻¹⁰. No unstable mode.

Reading the poles

The system is marginally stable: the rigid-body and heading/position modes sit on the imaginary axis (integrators, as a free-flying body with no position hold must), and the attitude modes are only lightly damped, hugging the axis. That is the linear counterpart of the time-domain finding — attitude actively but weakly damped, translation and heading neutrally stable. Precisely why the roll step rings before it settles.

Conclusions

What the simulations say — and what to do

These flight-mechanics findings sit alongside the stage-0 MADe reliability result (single-fault-intolerant — 24 order-1 cut sets). Together they say the QX-250 is aerodynamically flyable and robust in-envelope, but wants a firmer control law and has no rotor redundancy — both caught in simulation, before a test bench.

Transparency

Assumptions & limits

Every choice made without a human in the loop, recorded.

AreaChoiceWhy
Base modelSiemens 6-DOF Drone_3D_Mechanical demo, reparametrizedRobust vs. building a sketch blind; Siemens' own documented RFLP→Amesim practice
QX-250 identityMass 0.49 kg applied; demo arm/inertia/gains retainedThe 125 mm geometry destabilised the tuned controller (measured); re-tune is design work, not an unattended step
Motor modelDemo libemd PMSM map retainedExact 2306/1700 KV map identification out of scope; hover throttle set by demo curve
ExcitationInitial-condition perturbationControllable, needs no setpoint-wiring reverse-engineering

Recommended follow-up