Droni e direzione della camera: quanto è affidabile lo yaw del gimbal nei video DJI?
Nell'articolo sull'altezza di scatto nei dati EXIF avevo concluso ammettendo che sui video non avevo ancora svolto controlli equivalenti. Li ho svolti nelle settimane successive su 61 video girati con il mio DJI Mavic 4 Pro fra il 30 dicembre 2025 e il 17 ottobre 2026, concentrandomi questa volta su un dato diverso dalla quota: la direzione verso cui guarda la camera.
In 52 di questi video la direzione dichiarata dal gimbal si discosta da quella del velivolo di almeno 5 gradi, e lo fa in modo stabile per quasi tutta la registrazione; in un caso ripreso a Bari, inoltre, il confronto con la scena restituisce una direzione molto più vicina al valore del velivolo che a quello del gimbal. La lezione è quindi la stessa dell'altra volta, applicata a un dato diverso: il valore registrato, il significato che gli diamo e la direzione reale della camera sono tre cose diverse, e conviene verificarle una per volta.
Un fotogramma normale, due direzioni diverse
Il fotogramma qui sotto mostra il lungomare di Bari all'alba, con edifici, imbarcazioni e la torre del Palazzo della Provincia quasi al centro, senza anomalie visive evidenti; nella telemetria dello stesso istante, tuttavia, il velivolo e il gimbal dichiarano direzioni separate da quasi venti gradi: 136,2° per il velivolo e 116,9° per il gimbal.
Stabilire quale dei due valori descriva la direzione effettiva della camera ha conseguenze concrete, perché da quel numero dipendono il cono di ripresa disegnato sulla mappa, la ricostruzione di ciò che era visibile da un certo punto e l'orientamento iniziale di un modello fotogrammetrico. Per questo non basta che il video appaia regolare: anche una ripresa visivamente perfetta può portarsi dietro una telemetria che ne descrive in modo inesatto l'orientamento.
Prua, rotta e direzione della camera
Prima di parlare di errori conviene distinguere tre grandezze che nel linguaggio comune si confondono.
- La prua è la direzione verso cui è rivolto il corpo del drone.
- La rotta è la direzione in cui il drone si sta spostando: si ricava da posizioni successive e può essere diversa dalla prua, perché un drone può traslare di lato o arretrare.
- La direzione della camera è dove punta l'asse ottico. Il gimbal può compensare o aggiungere rotazioni, quindi non coincide per forza con la prua.
Nei suoi SDK DJI usa il riferimento NED (nord-est-basso), in cui 0° è il nord e +90° l'est (DJI, Flight Control). Ma nelle stesse API convivono angoli assoluti e relativi: getYawRelativeToAircraftHeading(), per esempio, restituisce l'angolo fra gimbal e prua, non rispetto al nord (DJI, GimbalState). Il fatto che un campo si chiami «yaw» non dice, da solo, rispetto a cosa sia misurato.
Anche il nome commerciale «360° Infinity Gimbal» del Mavic 4 Pro va letto con attenzione: DJI descrive un'ampia escursione sull'asse di rollio, non un'imbardata libera a 360° (DJI, Infinity Gimbal Introduction). Quindi una differenza fra i due yaw è un indizio da interpretare, non una diagnosi di guasto.
Dove stanno i dati in un video DJI
Se nelle foto i dati interessanti stanno nell'XMP, nei video del Mavic 4 Pro la telemetria è contenuta nell'MP4, in una traccia chiamata djmd e codificata in Protocol Buffers. I sottotitoli .SRT che il drone salva accanto al video contengono invece tempi, posizione, quote e parametri di ripresa: non sono un'esportazione completa di quello che il drone ha registrato. In 61 file SRT che ho esaminato non c'era nessun campo di orientamento (yaw, pitch, roll, heading o gimbal).
ExifTool riconosce il protocollo del Mavic 4 e legge assetto del velivolo, posizione e quote (sorgente DJI.pm), ma nella versione che ho usato non esporta lo yaw del gimbal. Per leggerlo ho usato la mappatura qui sotto, che è il frutto di un'analisi locale e non una specifica del produttore:
| Grandezza | Percorso nel messaggio | Contenuto |
|---|---|---|
| Assetto del velivolo | 3-3-3 |
rollio, beccheggio, yaw (decimi di grado) |
| Assetto del gimbal | 3-4-3 |
beccheggio, rollio, yaw (decimi di grado) |
| Quaternione del gimbal | 3-4-4 |
usato come controllo interno |
| Contatore temporale | 3-1-2 |
microsecondi, usato per raggruppare i video |
Gli angoli del gimbal sono coerenti con il quaternione della stessa traccia, anche in una ripresa verticale. Si tratta di un buon controllo per scoprire assi scambiati o scale sbagliate, che però non costituisce una verifica esterna, perché angoli e quaternione possono derivare dallo stesso riferimento sbagliato ed essere perfettamente coerenti fra loro.
61 video, un solo drone
Il primo gruppo comprende 49 video girati fra Gargano, Pezze del Sole, Grecia, Polignano e Bari; poi ho aggiunto 12 riprese fatte apposta a Mola di Bari il 17 ottobre, di cui parlo più avanti. In tutto sono 213.576 campioni di telemetria, tutti dallo stesso esemplare (un solo numero di serie), un dettaglio da tenere presente perché 61 registrazioni dello stesso drone non equivalgono a 61 droni.
Per ogni campione ho calcolato la differenza fra yaw del gimbal e yaw del velivolo, riportata nell'intervallo fra −180° e +180°:
Δ = ψgimbal − ψvelivolo
Ho segnalato un video quando la mediana di Δ raggiunge almeno 5° in valore assoluto e almeno l'80% dei campioni resta entro ±5° da quella mediana: sono soglie che servono a scegliere i casi da approfondire e non vanno lette come tolleranze metrologiche. Sui 49 video iniziali il risultato è questo:
| Risultato | Video |
|---|---|
| Scarto mediano persistente di almeno 5° | 41 / 49 |
| Mediana fra 2,5° e 5° | 3 / 49 |
| Mediana entro ±2,5° | 5 / 49 |
| Mediane più estreme | −42,5° e +39,5° |
Prima di fidarmi dei numeri ho escluso l'errore più banale, cioè un problema nell'esportazione: ho riletto direttamente dagli MP4 originali tutti i 170.029 pacchetti di telemetria dei 49 video con un lettore separato. Il numero di campioni coincide in ogni file e la differenza massima rispetto ai valori esportati è 0,0°, un risultato che conferma la lettura ma non il significato fisico dei campi, perché la mappatura usata è la stessa in entrambi i casi.
Anche l'ipotesi, spesso avanzata, di un problema legato a una specifica versione del firmware non trova conferma nel campione: tre video del Gargano hanno il firmware 01.00.03.00, gli altri il 01.00.08.00, e lo scarto compare con entrambe le versioni.
Il campione, tuttavia, non permette di separare l'effetto del firmware da quello di luogo, data e condizioni di ripresa, che nel mio materiale cambiano insieme alla versione installata.
Bari, 6 ottobre: da zero a venti gradi nella stessa mattina
Il caso più istruttivo è quello degli undici video girati la stessa mattina a Bari: nei primi tre lo scarto è praticamente nullo, mentre dal quarto in poi si sposta intorno a −20° e vi rimane fino all'ultima ripresa.
| Video | Ora | Campioni | Mediana Δ | Min / max |
|---|---|---|---|---|
| 0061 | 06:02 | 2.225 | +0,5° | −7,2° / +3,1° |
| 0067 | 06:03 | 2.533 | −0,1° | −1,5° / +0,7° |
| 0068 | 06:04 | 4.850 | −1,0° | −5,6° / +3,1° |
| 0144 | 06:31 | 119 | −19,8° | −19,8° / −19,8° |
| 0235 | 06:41 | 2.590 | −22,1° | −30,0° / −14,2° |
| 0256 | 06:43 | 2.833 | −21,6° | −31,3° / −17,6° |
| 0267 | 06:45 | 6.488 | −21,0° | −23,0° / −20,3° |
| 0333 | 06:54 | 16.291 | −19,5° | −19,8° / −19,3° |
| 0349 | 06:59 | 139 | −20,9° | −21,0° / −20,9° |
| 0355 | 07:00 | 11.308 | −19,8° | −24,5° / −14,5° |
| 0356 | 07:03 | 210 | −19,3° | −19,4° / −19,2° |
Poiché tutti e undici i video hanno lo stesso firmware, il salto non si può attribuire a un aggiornamento. Particolarmente interessante è il video 0144, che dura pochi secondi e in cui il drone è praticamente fermo, con quota rispetto al decollo pari a zero: lo scarto di quasi venti gradi è dunque già presente prima che il drone inizi a spostarsi.
Nei video in movimento le due direzioni ruotano insieme, anche durante le virate, pur restando separate di circa venti gradi. Un semplice ritardo del gimbal nell'inseguire la prua produrrebbe invece uno scarto crescente nelle rotazioni veloci e tendente a zero a drone fermo, mentre qui lo scarto persiste anche in stazionamento.
Due curve parallele, d'altra parte, non escludono che la camera fosse davvero ruotata di venti gradi rispetto al corpo, e per distinguere le due possibilità serve un riferimento indipendente, che in questo caso può essere ricavato dalla scena.
La prova della scena: il Palazzo della Provincia
Nel fotogramma 137 del video 0356 la torre del Palazzo della Provincia è quasi al centro dell'immagine. Conosco la posizione del drone (dalla telemetria) e quella della torre (dalla cartografia), quindi posso calcolare l'azimut dal drone alla torre: circa 133,9°, a poco meno di un chilometro.
La torre non è esattamente al centro, ma circa 5 pixel a destra su 2.000. Per una camera senza distorsione e con l'asse quasi orizzontale, lo scostamento angolare di un punto dal centro dell'immagine è:
α = atan[ 2 (u/W − ½) · tan(FOV/2) ]
dove u è la posizione orizzontale del punto in pixel, W la larghezza dell'immagine e FOV il campo visivo orizzontale. Con la camera principale a 28 mm equivalenti (circa 65,5°) la correzione è di appena +0,18°, e la direzione dell'asse ottico risulta circa 133,7°.
| Fotogramma 137 | Valore | Differenza dalla scena |
|---|---|---|
| Direzione ricavata dalla scena | ≈ 133,7° | — |
| Yaw del velivolo | 136,2° | ≈ +2,5° |
| Yaw del gimbal | 116,9° | ≈ −16,8° |
Il valore del gimbal risulta quindi difficilmente compatibile con la direzione reale della camera, mentre quello del velivolo è molto più vicino. Questo non vuol dire che la prua sia esatta: restano circa 2,5° di differenza e non ho costruito un bilancio completo dell'incertezza, che dovrebbe includere le coordinate del drone e della torre, il centro ottico, la distorsione, l'eventuale ritaglio e il riferimento del nord. Per dare un'idea della scala, 5 metri di errore laterale a 900 metri valgono circa 0,3°.
Resta da considerare la declinazione magnetica, che varia con luogo e data e va calcolata con un modello apposito (NOAA, Magnetic Declination). Non l'ho applicata, ma per questo confronto il calcolo non è indispensabile: due riprese fatte nello stesso posto a mezz'ora di distanza hanno praticamente la stessa declinazione, che quindi non può spiegare il salto da zero a −20° osservato nella stessa mattina.
Il secondo riscontro, e la focale che cambia il conto
Il secondo controllo usa il video 0056 del 3 ottobre, che inquadra il Teatro Margherita e, sullo sfondo, Corso Vittorio Emanuele II. L'asse della strada, ricavato da OpenStreetMap, ha un azimut di circa 265,0–265,3°.
In questo caso il punto di fuga è circa 60 pixel a destra del centro, e la scelta del campo visivo pesa molto di più. Controllando l'SRT ho scoperto un dettaglio che cambia il conto: il campo focal_len riporta 70 mm, non 28 come nel primo caso. Con 70 mm equivalenti il campo visivo scende a circa 28,8° e lo scostamento di 60 pixel vale 0,88°, non 2,2°. La direzione dell'asse ottico finisce intorno a 264,1–264,4°, fra il gimbal e il velivolo.
Il secondo caso, quindi, non permette di dire con certezza quale valore sia giusto, ma insegna una cosa utile: basta usare la focale sbagliata o confondere il valore di un istante con la mediana di tutto il video per spostare il risultato di gradi. Anche la focale va letta fotogramma per fotogramma: in alcuni video cambia durante la ripresa (in uno da 168 a 672 mm, valori compatibili anche con lo zoom digitale).
Lo scarto cambia quando il drone si riaccende
Il contatore temporale interno della telemetria sembra ripartire da zero a ogni accensione: sottraendolo all'orario del nome del file, i 49 video si raggruppano in 15 sessioni, e dentro ciascuna lo scarto tende a restare simile:
| Sessione | Mediane dello scarto |
|---|---|
| Grecia, 23 agosto, prima accensione | −9,9° e −11,8° |
| Grecia, 23 agosto, accensione successiva | −1,8° e −2,1° |
| Polignano, 26 settembre, prima accensione | da −16,2° a −12,1° |
| Polignano, 26 settembre, seconda accensione | da −10,2° a −8,1° |
| Bari, 6 ottobre, prima accensione | da −1,0° a +0,5° |
| Bari, 6 ottobre, seconda accensione | da −22,1° a −19,3° |
Il quadro è compatibile con un riferimento fissato all'accensione e poi relativamente stabile, ma resta appunto una compatibilità: ExifTool chiama quel campo TimeStamp e nulla garantisce che la sua origine coincida con l'accensione del velivolo, motivo per cui ho preparato una prova dedicata.
Mola di Bari: stessa inquadratura, numeri diversi
Il 17 ottobre, sul molo di Mola di Bari, ho girato una serie di brevi riprese a quota zero, sempre sullo stesso camminamento e con la camera principale a 28 mm, intervallate da riaccensioni del drone. Dai contatori risultano quattro accensioni distinte (A, B, C, D), con una dispersione interna inferiore a 3 millisecondi.
| Video | Accensione | Mediana Δ | Min / max |
|---|---|---|---|
| 0430 | A | +1,5° | +1,5° / +1,5° |
| 0431 | B | −16,0° | −16,0° / −15,9° |
| 0432 | B | −15,9° | −16,1° / −15,9° |
| 0433 – 0436 | C | −17,3° | −17,4° / −17,2° |
Il passaggio fra 0430 e 0431 è il più chiaro: lo yaw del velivolo cambia di poco, da 169,5° a 167,7°, mentre il valore attribuito al gimbal passa da 171,0° a 151,7°, pur senza una variazione altrettanto evidente dell'inquadratura. L'immagine mostra infatti lo stesso camminamento con la stessa prospettiva, mentre una rotazione di quasi venti gradi della camera sarebbe ben visibile anche senza misure.
Nel gruppo C, poi, quattro riprese distribuite su oltre tre minuti presentano tutte una mediana di −17,3°, segno che lo scarto non si riassorbe con l'attesa. È questo il dato più solido di tutta l'analisi: lo scarto cambia dopo la riaccensione e resta stabile finché il drone è fermo. Per trasformarlo in una misura dell'errore assoluto servirebbe però un bersaglio georiferito, che in quella prova non avevo.
In volo lo scarto non è un numero fisso
Dopo le riprese statiche ho fatto alcuni voli nella stessa accensione C. Rispetto al valore delle riprese statiche, lo scarto aumenta in valore assoluto, con mediane di −18,3°, −20,2° e −19,2°, mentre nel video 0504 i valori istantanei vanno da −31,7° a −7,7°. La distribuzione nel tempo degli estremi, però, non fa pensare a un cambio di riferimento: il minimo arriva durante una rotazione in senso orario a circa 66°/s, il massimo durante una rotazione antioraria a circa 59°/s. In tutti e due i casi lo scarto si allontana di 11–12° per pochi decimi di secondo, in versi opposti, e poi torna a −19,2° appena la rotazione si ferma.
Questo andamento è compatibile con un piccolo sfasamento temporale fra le due serie: spostando quella del gimbal di 67–150 millisecondi, la dispersione nelle due finestre scende da 3,7° a circa 1,5°. Non si tratta di una misura della latenza, ma il risultato suggerisce una componente dinamica o temporale sovrapposta allo scarto persistente. Resta però il fatto che il valore stabile in volo (−19,2°) è diverso dal −17,3° delle riprese da fermo della stessa accensione: lo scarto non è un numero rigorosamente costante per tutta la sessione.
In tutto, 11 dei 12 nuovi video superano la soglia, compreso uno girato a 120 metri con il teleobiettivo a 168 mm (−18,0°). Sommati ai primi 49, fanno 52 video su 61. Sono frequenze nel mio materiale, non la probabilità che un Mavic 4 Pro abbia questo problema.
Il precedente Pix4D sui metadati fotografici
Pix4D, uno dei software di fotogrammetria più usati, documenta ricostruzioni orientate male a partire da foto DJI con valori incoerenti nel tag GimbalYawDegree dell'XMP. Fra i modelli elencati c'è anche il Mavic 4 Pro, con scarti spesso di 40–55° (Pix4D, Incorrectly Oriented Reconstructions).
Si tratta di un precedente utile ma da usare con cautela, perché la pagina Pix4D riguarda le foto e il loro XMP, non la telemetria dei video, e non è una dichiarazione di DJI. Le note di rilascio del firmware del 13 gennaio 2026 parlano di miglioramenti generici senza citare questo problema (DJI, Release Notes). Non ho trovato una spiegazione ufficiale della causa.
Quanto alla causa, le ipotesi sul tavolo sono diverse: un riferimento inizializzato con un offset, un disallineamento fra sistemi di coordinate, un'elaborazione del firmware, un errore nella mia decodifica. Il manuale DJI avverte che strutture metalliche e interferenze possono disturbare la bussola (manuale Mavic 4 Pro v1.2, §2.2), e un molo non è certo un luogo privo di metallo; un'avvertenza generica, tuttavia, non basta a dimostrare il meccanismo, e allo stato attuale so che cosa succede, ma non perché succede.
Perché conta: venti gradi a cinquecento metri
Un errore di direzione produce un errore di posizione che cresce con la distanza. In una costruzione semplificata, a una distanza R lo spostamento laterale vale:
e = R · tan(ε)
Con un errore di 20° si ottengono circa 36 metri a 100 metri e 182 metri a 500 metri, abbastanza da collocare sulla mappa un'altra strada o un altro edificio rispetto a quelli effettivamente inquadrati.
In ambito forense ne deriva un punto fondamentale: un elaborato può essere perfettamente coerente con il metadato e, allo stesso tempo, descrivere male la scena, senza che ciò costituisca un indizio di manipolazione del video, perché il drone può aver registrato davvero quel valore senza che rappresenti la grandezza fisica che gli attribuiamo. Integrità del file e accuratezza della misura sono due proprietà diverse, e vanno valutate separatamente.
Allo stesso modo, lo yaw da solo non basta per ricostruire la visibilità, che richiede anche posizione, assetto completo, ottica, ostacoli e terreno. Con la camera rivolta quasi verso il basso la direzione orizzontale perde significato, e con un rollio importante bisogna ragionare in tre dimensioni. Quando ci sono punti 3D noti e una camera calibrata, la strada più robusta è stimare la posa direttamente dall'immagine, per esempio con solvePnP di OpenCV (documentazione OpenCV).
Come scrivere correttamente una direzione
Una frase come «la camera era orientata a 116,9°» dà per scontato che il campo del gimbal sia un azimut geografico accurato. Una formulazione più onesta è questa:
La telemetria del video riporta, al fotogramma 137, uno yaw del velivolo di 136,2° e uno yaw del gimbal di 116,9°. Il confronto con la torre del Palazzo della Provincia indica una direzione dell'asse ottico di circa 133,7°, molto più vicina al primo valore che al secondo, con un'incertezza non ancora quantificata.
Valgono le stesse tre categorie che uso per le quote: dato registrato (il valore nel file), dato derivato (il risultato di un calcolo) e dato verificato (confrontato con un riferimento indipendente, con un'incertezza dichiarata). E non bisogna mai sottrarre automaticamente la mediana per «allineare» il gimbal: si cancellerebbe anche un eventuale orientamento reale della camera.
Una lista di controllo prima di fidarsi dello yaw
- Conservare MP4, SRT e log originali, calcolarne l'impronta hash e lavorare su copie. Annotare modello, firmware, modalità e camera attiva.
- Stabilire da dove viene ogni campo: XMP delle foto, traccia
djmddel video, SRT, log del radiocomando. Non sono intercambiabili. - Sincronizzare la telemetria con i fotogrammi usando i tempi di presentazione del video; l'orario nel nome del file non è un riferimento temporale certificato.
- Calcolare lo scarto fra gimbal e velivolo come serie temporale, separando stazionamento, traslazioni e virate.
- Cercare almeno un riferimento esterno: un edificio, una torre, l'asse di una strada con coordinate verificabili. Usare la focale effettiva di quel fotogramma.
- Se si applica una correzione, conservare accanto il dato originale e dichiarare trasformazione, motivo e periodo di validità.
Se lavori con la fotogrammetria, Pix4D suggerisce, a seconda del caso, la calibrazione Standard, la rimozione degli orientamenti iniziali o l'uso delle sole immagini nadirali. Sono tentativi da valutare sul risultato, e in un contesto forense vanno applicati a copie di lavoro, con controlli esterni anche quando il modello finale sembra orientato bene.
Cosa so e cosa non so
Come nell'articolo sulle quote, chiudo raccogliendo i limiti già incontrati lungo il percorso: i video provengono da un solo drone, la mappatura dello yaw del gimbal è una mia ricostruzione verificata solo internamente, il riscontro geometrico forte è uno solo e le accensioni sono ricostruite dal contatore, senza confronto con i log di volo. Per questo i risultati descrivono il mio materiale e non la diffusione del fenomeno sugli altri Mavic 4 Pro.
Per l'estrazione dei fotogrammi e la lettura della telemetria ho usato Probatio, che mostra entrambe le direzioni e segnala lo scarto senza correggerlo. Le bande in fondo ai fotogrammi sono copie annotate: organizzano dati già presenti nel file, non li rendono più affidabili. Nessuna immagine di questo articolo è stata generata per simulare una ripresa.
Riassumendo, nel mio drone la direzione registrata per il gimbal si discosta spesso, e in modo stabile, da quella del velivolo, con uno scarto che cambia insieme alle riaccensioni; nel caso in cui il confronto con la scena ha fornito l'indicazione più netta, inoltre, il valore attribuito al gimbal risultava molto più distante dalla direzione ricavata dall'immagine. Come per le quote, i decimali descrivono il formato del dato, mentre la fiducia nella direzione può venire soltanto dai controlli sull'immagine.
Se devi ricostruire da un video di drone cosa era visibile, da dove e in che direzione, per una perizia, una contestazione o un incidente, puoi aprire un ticket e ne parliamo.