Requisiti dei dati frame di input per sorgenti frame dati esterne
Per garantire il corretto funzionamento delle sorgenti frame dati esterne, il compito più importante e al contempo più complesso è assicurare l'accuratezza dei dati. Questo documento descrive i requisiti dei dati frame di input per le sorgenti frame dati esterne.
Prima di iniziare
- Comprendere i concetti fondamentali come telecamere, frame di input.
- Comprendere i concetti base e i tipi comuni di sorgenti frame dati esterne.
Tipi di dati frame di input
In Unity, una sorgente frame dati esterna richiede tipicamente dati diversi in due momenti distinti. In base al tempo di input dei dati esterni e alle loro caratteristiche, definiamo questi due insiemi di dati come:
- Dati frame della telecamera (camera frame data)
- Dati frame di rendering (rendering frame data)
Diversi tipi di sorgenti frame dati esterne hanno requisiti differenti per questi due insiemi di dati:
- Estensioni di input per immagini e dati di movimento del dispositivo: richiedono sia dati frame della telecamera che dati frame di rendering
- Estensioni di input per immagini: richiedono solo dati frame della telecamera
Dati frame della telecamera
Requisiti dei dati:
- Timestamp (timestamp)
- Dati immagine grezzi della telecamera fisica (raw camera image data)
- Parametri intrinseci (intrinsics, includono dimensioni immagine, lunghezza focale, punto principale. Se presente distorsione, richiedono anche modello di distorsione e parametri di distorsione)
- Parametri estrinseci (extrinsics, Tcw o Twc, matrice di calibrazione che esprime l'offset fisico della telecamera fisica rispetto all'origine della pose del dispositivo/testa)
- Stato di tracciamento (tracking status)
- Posa del dispositivo (device pose)
Momento dei dati:
- Punto medio dell'esposizione della telecamera fisica
Utilizzo dei dati:
- Tempo di chiamata API: può variare in base al design del codice esterno. Un approccio comune per molti dispositivi è eseguire query durante l'aggiornamento del rendering del motore 3D, quindi determinare se procedere con l'elaborazione dei dati in base al timestamp dei dati del dispositivo
- Thread di chiamata API: game thread del motore 3D o qualsiasi altro thread (se tutte le API esterne utilizzate sono thread-safe)
Ecco l'esempio di chiamata API in Unity:
void TryInputCameraFrameData()
{
double timestamp;
if (timestamp == curTimestamp) { return; }
curTimestamp = timestamp;
PixelFormat format;
Vector2Int size;
Vector2Int pixelSize;
int bufferSize;
var bufferO = TryAcquireBuffer(bufferSize);
if (bufferO.OnNone) { return; }
var buffer = bufferO.Value;
IntPtr imageData;
buffer.tryCopyFrom(imageData, 0, 0, bufferSize);
var historicalHeadPose = new Pose();
MotionTrackingStatus trackingStatus = (MotionTrackingStatus)(-1);
using (buffer)
using (var image = Image.create(buffer, format, size.x, size.y, pixelSize.x, pixelSize.y))
{
HandleCameraFrameData(deviceCamera, timestamp, image, cameraParameters, historicalHeadPose, trackingStatus);
}
}
Dati frame di rendering
Requisiti dati:
- Timestamp
- Stato di tracking
- Posa del dispositivo
Momento dei dati:
- Istante di presentazione sullo schermo. TimeWarp non viene considerato. I dati di device pose dello stesso istante verranno utilizzati da fonti esterne (ad esempio SDK del dispositivo) per impostare la transform della telecamera virtuale per il rendering del frame corrente.
Nota
TimeWarp (a volte chiamato Reprojection o ATW/PTW) è una tecnica comunemente utilizzata nei visori VR/AR per ridurre la latenza. Dopo il completamento del rendering, distorce nuovamente l'immagine in base alla posa più recente della testa per compensare il movimento della testa durante il rendering. EasyAR richiede l'istante corrispondente alla posa utilizzata per impostare la telecamera virtuale all'inizio del rendering, non l'istante effettivo di presentazione dopo il TimeWarp.
Utilizzo dei dati:
- Tempo di chiamata API: ogni frame di rendering del motore 3D
- Thread di chiamata API: game thread del motore 3D
Esempi di chiamate api in unity
private void InputRenderFrameMotionData()
{
double timestamp = 0e-9;
var headPose = new Pose();
MotionTrackingStatus trackingStatus = (MotionTrackingStatus)(-1);
HandleRenderFrameData(timestamp, headPose, trackingStatus);
}
Dettagli dei requisiti dei dati
Dati immagine della telecamera fisica:
- Sistema di coordinate dell'immagine: i dati acquisiti con il sensore orizzontale dovrebbero essere orizzontali. I dati dovrebbero essere memorizzati con l'origine nell'angolo in alto a sinistra, per righe prioritarie. L'immagine non deve essere capovolta o invertita.
- FPS immagine: sono accettabili dati a 30 o 60 fps normali. Se gli fps elevati hanno un impatto particolare, la frequenza minima accettabile per risultati algoritmici ragionevoli è 2. Si consiglia di utilizzare fps superiori a 2, normalmente è possibile utilizzare la frequenza dei frame dei dati grezzi.
- Dimensioni immagine: per ottenere migliori risultati di calcolo, il lato più lungo dovrebbe essere 960 o superiore. Normalmente si sconsiglia di eseguire un ridimensionamento dell'immagine dispendioso nel percorso dati; si consiglia di utilizzare direttamente i dati grezzi, a meno che il tempo di copia dei dati a dimensione intera non sia inaccettabilmente lungo. La risoluzione dell'immagine non può essere inferiore a 640*480.
- Formato pixel: priorità all'effetto di tracciamento e bilanciamento delle prestazioni, normalmente l'ordine di priorità dei formati è YUV > RGB > RGBA > Gray (componente Y in YUV). Quando si utilizzano dati YUV, è necessaria una definizione completa dei dati, inclusi i dettagli di incapsulamento e riempimento. Rispetto alle immagini a canale singolo, Mega funziona meglio con immagini a colori, ma altre funzionalità sono meno influenzate.
- Accesso ai dati: puntatore ai dati o implementazione equivalente. È preferibile eliminare tutte le copie non necessarie possibili nel percorso dati. In HandleRenderFrameData, EasyAR copia i dati una volta, quindi li utilizza in modo asincrono; dopo il completamento di questa chiamata sincrona, i dati immagine non vengono più utilizzati. Attenzione alla proprietà dei dati.
Timestamp:
- Tutti i timestamp devono essere sincronizzati con l'orologio, preferibilmente hardware-sincronizzati. L'unità dei dati è in secondi, ma la precisione richiesta deve essere al nanosecondo o la più alta possibile.
Stato del tracciamento:
- Lo stato del tracciamento è definito dal dispositivo e deve includere lo stato di tracciamento perso (VIO non disponibile). Più livelli sono meglio.
Posa del dispositivo:
- Tutte le pose (inclusa la trasformazione della telecamera virtuale nel motore 3D) devono utilizzare la stessa origine.
- Tutte le pose e i parametri estrinseci devono utilizzare lo stesso sistema di assi coordinati.
- In Unity, il tipo di sistema di assi coordinati per i dati di posa deve essere il sistema di assi coordinati di Unity o quello di EasyAR. Se l'estensione di input è implementata da EasyAR e utilizza altre definizioni di sistema di assi coordinati, deve fornire una definizione chiara del sistema di assi coordinati oppure un metodo per convertirlo nel sistema di assi coordinati di Unity o EasyAR.
- In Unity, se si utilizza il framework Unity XR, è necessario essere compatibili solo con la modalità XROrigin.TrackingOriginMode.Device.
Parametri intrinseci:
- Tutti i valori devono corrispondere ai dati dell'immagine. Se necessario, i parametri intrinseci devono essere ridimensionati prima dell'input in EasyAR.
- Se l'estensione di input è implementata da EasyAR, deve essere specificato se i parametri intrinseci cambiano ad ogni fotogramma (la differenza è se l'API corrispondente deve essere chiamata una volta o ad ogni fotogramma).
Parametri estrinseci:
- Sui dispositivi head-mounted devono fornire dati reali.
- È una matrice di calibrazione che esprime l'offset fisico della fotocamera fisica rispetto all'origine della posa del dispositivo/testa. Se la posa del dispositivo e quella della fotocamera fisica sono uguali, dovrebbe essere la matrice identità.
- L'interfaccia corrispondente per Apple Vision Pro è: CameraFrame.Sample.Parameters.extrinsics, si noti che la definizione dei dati differisce da quelli richiesti dall'interfaccia. EasyAR internamente converte prima di utilizzarli.
- In Unity, il tipo di sistema di assi coordinati per i parametri estrinseci deve essere il sistema di assi coordinati di Unity o quello di EasyAR. Se l'estensione di input è implementata da EasyAR e utilizza altre definizioni di sistema di assi coordinati, deve fornire una definizione chiara del sistema di assi coordinati oppure un metodo per convertirlo nel sistema di assi coordinati di Unity o EasyAR.
- Nei dispositivi head-mounted, di solito esistono più sistemi di coordinate con definizioni diverse; queste differenze possono includere origine degli assi, orientamento, rappresentazione destrorsa/sinistrorsa, ecc. I parametri estrinseci devono essere calcolati nello stesso sistema di coordinate. Questi dati di interfaccia richiedono una trasformazione di coordinate all'interno dello stesso sistema, non una matrice di trasformazione tra due sistemi di coordinate con definizioni diverse.
Prestazioni:
- I dati devono essere forniti con la massima efficienza. Nella maggior parte delle implementazioni, le chiamate API avvengono durante il processo di rendering. Pertanto, si consiglia, anche se a livello basso sono necessarie operazioni dispendiose in termini di tempo, di non bloccare le chiamate API o di utilizzare queste API in modo ragionevole.
- Se l'estensione di input è implementata da EasyAR, tutte le chiamate API dispendiose in termini di tempo devono essere segnalate.
Multi-camera:
- Sono necessari i dati di almeno una fotocamera. Questa fotocamera può essere una fotocamera RGB, una fotocamera VST, una fotocamera di localizzazione, ecc. Sui dispositivi head-mounted, se si inseriscono i dati di una sola fotocamera, si consiglia generalmente di utilizzare una fotocamera RGB o VST centrale o vicino agli occhi.
- L'uso di più fotocamere può migliorare l'effetto dell'algoritmo EasyAR. I dati dei fotogrammi di tutte le fotocamere disponibili in un dato momento devono essere immessi contemporaneamente allo stesso istante temporale.
Il supporto multi-camera non è ancora completamente implementato. È possibile contattare EasyAR per maggiori dettagli.
Passaggi successivi
- Creare un'estensione di input per immagini e dati di movimento del dispositivo
- Creare un'estensione di input per immagini
- Creare un pacchetto di estensione per visori
Argomenti correlati
- Sistema di coordinate di EasyAR
- Esempio di estensione di input per immagini Workflow_FrameSource_ExternalImageStream