One quadcopter. One model. End to end.
The Djinborn T4 — a 450-class survey quadcopter — modelled as a single multibody composition that flies a closed-loop 6-DoF mission in simulation. Airframe, propulsion, battery, sensors, and control loops, all on one living digital replica.

Every subsystem, on one canvas.
Nothing is stubbed or assumed constant — the airframe, drivetrain, energy source, sensing, and control all carry their own physics.
Hub body
One rigid structure, 1.6 kg all-up including a 0.43 kg payload. Inertia Jxx = Jyy = 0.018, Jzz = 0.032 kg·m².
Four arms
Rigid offsets at ±0.225 m in an X configuration. The airframe geometry — not a hand-tuned mixer — sets every moment arm.
Propulsion
Four 880 Kv BLDC motors through ESCs, each spinning a 10×4.5 two-blade prop. Hover thrust 3.924 N per rotor at ~5300 rpm.
Battery
A 4S Li-ion pack — 14.8 V nominal, 6.0 Ah, 0.04 Ω internal resistance — modelled as a real source, not a constant rail.
Sensing
An IMU with a complementary filter fusing gyro and accelerometer into roll and pitch estimates.
Control
Cascaded PID: a three-axis attitude loop, an altitude + vertical-velocity cascade, and a position loop — the same gains the lumped model flew.
Built from geometry, not hand-coded mixing.
In the multibody model the airframe's forces and moments emerge from its geometry. Four FrameForce wrenches inject rotor thrust and reaction torque at the arm tips, and the net roll, pitch, and yaw moments fall out of the four arm positions automatically. The mixer is reduced to pure control allocation — duty cycles to four motor commands — with no physics aggregation. Orientation is carried as a rotation matrix on SO(3) (Ṙ = R·skew(ω)), which sidesteps the gimbal-lock singularity Euler angles hit near ±90°.
- N-variable acausal Frame connector: 15 across (position, 3×3 rotation, angular velocity) + 6 flow (force, torque). — ADR-0066
- A pure-DJL multibody kit — Body, FixedTranslation, FrameForce — with no Rust or Julia changes. — ADR-0067
- Roll, pitch, and yaw moments emerge from arm geometry instead of a hand-coded mixer. — ADR-0068

It flies, closed-loop.
A 12-second mission: at t = 0 the altitude setpoint steps to 10 m; at t = 2 s a 15° roll step comes in. A stiff Rodas5P DAE solver integrates the coupled electrical, mechanical, and control equations together. The drone climbs and holds — altitude settles at 9.562 m, roll tracks to 0.262 rad — while motor-1 armature current sits at about 6.05 A, comfortably inside its 25 A limit.
Identical to the lumped reference.
The geometry-built multibody model and a monolithic RigidBody6DoF reference fly the same mission to every printed digit. Two analytic gates back it up: open-loop hover holds vz ≈ 2e-15 m/s, and an imposed roll rate produces a gyroscopic pitch acceleration of −2.667 rad/s², exactly as theory predicts.
| Multibody | Lumped reference | |
|---|---|---|
| Altitude (m) | 9.5622 | 9.5622 |
| Roll (rad) | 0.261913 | 0.261913 |
| Motor-1 current (A) | 6.05405 | 6.05405 |
The details that decide stability.
NED sign convention
Altitude is +down in the body frame, so a climb means ż < 0. A single negation gain feeds the controller an up-is-positive altitude; get the sign wrong and the closed loop diverges.
Duty-domain clamping
The attitude controller saturates in ESC duty space (±0.3 for roll/pitch, ±10 for yaw), not in radians. Clamping there preserves the cascade structure and stops inner-loop integrator windup.
No gimbal lock
Orientation lives on the rotation matrix (SO(3)) — nine states updated by Ṙ = R·skew(ω). No trig singularity at ±90° pitch, at the cost of nine states instead of three Euler angles.
Gyroscopic coupling
The four rotors carry net angular momentum hz = J·(−w1 + w2 − w3 + w4); the precession torque τ = ω_body × h is injected through a flow connector whose double-negative resolves to the correct sign — and matches the analytic precession gate.
From text model to digital twin.
Everything above is pure-text DJL. The parser lowers it to a flat intermediate representation, then to a ModelingToolkit symbolic system that the Julia worker integrates with Rodas5P, streaming live scopes back into the browser. The same model exports as an FMI co-simulation unit for Simulink, dSPACE, and other FMI hosts — a design-iteration digital twin you refine long before any hardware exists.
See it run on your own models.
Book a guided walkthrough and we'll open the Djinborn — or a model from your domain — and fly it end to end.
