Persyaratan data frame input untuk sumber data frame eksternal
Agar sumber data frame eksternal berfungsi dengan baik, bagian terpenting sekaligus paling rumit adalah memastikan kebenaran data. Artikel ini menjelaskan persyaratan data frame input untuk sumber data frame eksternal.
Sebelum memulai
- Pahami konsep dasar seperti kamera, frame input.
- Pahami konsep dasar dan tipe umum sumber data frame eksternal.
Tipe data frame input
Di Unity, sumber data frame eksternal biasanya perlu menerima data berbeda pada dua waktu berbeda. Berdasarkan waktu input data eksternal dan karakteristik data, kami menyebut dua set data ini sebagai:
- Data frame kamera (camera frame data)
- Data frame rendering (rendering frame data)
Tipe sumber data frame eksternal yang berbeda memiliki kebutuhan berbeda untuk kedua set data ini:
- Ekstensi input gambar dan data gerak perangkat: memerlukan data frame kamera dan data frame rendering
- Ekstensi input gambar: hanya memerlukan data frame kamera
Data frame kamera
Persyaratan data:
- Timestamp
- Data gambar kamera fisik mentah (raw camera image data)
- Intrinsik (intrinsics, termasuk ukuran gambar, focal length, principal point. Jika ada distorsi, diperlukan model distorsi dan parameter distorsi)
- Ekstrinsik (extrinsics, Tcw atau Twc, matriks kalibrasi yang menyatakan pergeseran fisik kamera fisik relatif terhadap asal pose perangkat/kepala)
- Status pelacakan (tracking status)
- Posisi perangkat (device pose)
Waktu data:
- Titik tengah eksposur kamera fisik
Penggunaan data:
- Waktu panggilan API: dapat bervariasi tergantung desain kode eksternal. Metode umum yang digunakan sebagian besar perangkat adalah melakukan kueri dalam pembaruan rendering mesin 3D, lalu menentukan apakah akan melakukan pemrosesan data lebih lanjut berdasarkan timestamp data perangkat
- Thread panggilan API: game thread mesin 3D atau thread lain apa pun (jika semua API eksternal yang digunakan bersifat thread-safe)
Contoh pemanggilan API di Unity adalah sebagai berikut:
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);
}
}
Data frame rendering
Kebutuhan data:
- Timestamp (timestamp)
- Status pelacakan (tracking status)
- Posisi perangkat (device pose)
Waktu data:
- Saat tampilan di layar. TimeWarp tidak diperhitungkan. Data device pose pada waktu yang sama akan digunakan oleh eksternal (misalnya SDK perangkat) untuk mengatur transform virtual camera guna merender frame saat ini.
Catatan
TimeWarp (kadang disebut Reprojection atau ATW/PTW) adalah teknik umum di headset VR/AR untuk mengurangi latensi. Teknik ini akan mengubah distorsi gambar lagi berdasarkan pose kepala terbaru setelah rendering selesai, untuk mengkompensasi pergerakan kepala selama rendering. EasyAR memerlukan waktu yang sesuai dengan pose untuk mengatur virtual camera di awal rendering, bukan saat tampilan di layar setelah TimeWarp.
Penggunaan data:
- Waktu panggilan API: setiap frame rendering mesin 3D
- Thread panggilan API: game thread mesin 3D
Contoh pemanggilan API di Unity adalah sebagai berikut:
private void InputRenderFrameMotionData()
{
double timestamp = 0e-9;
var headPose = new Pose();
MotionTrackingStatus trackingStatus = (MotionTrackingStatus)(-1);
HandleRenderFrameData(timestamp, headPose, trackingStatus);
}
Detail persyaratan data
Data gambar kamera fisik:
- Sistem koordinat gambar: data yang diperoleh saat sensor horizontal juga harus horizontal. Data harus disimpan dengan titik asal di pojok kiri atas, secara row-major. Gambar tidak boleh dibalik atau terbalik.
- FPS gambar: data 30 atau 60 fps normal dapat diterima. Jika fps tinggi memiliki dampak khusus, untuk mencapai efek algoritma yang wajar, frame rate minimum yang dapat diterima adalah 2. Disarankan menggunakan fps di atas 2, biasanya menggunakan frame rate data mentah sudah cukup.
- Ukuran gambar: untuk mendapatkan hasil perhitungan yang lebih baik, sisi terpanjang harus 960 atau lebih besar. Secara normal tidak disarankan melakukan penskalaan gambar yang memakan waktu di jalur data, disarankan menggunakan data mentah langsung, kecuali waktu penyalinan data ukuran penuh sudah terlalu lama. Resolusi gambar tidak boleh kurang dari 640*480.
- Format piksel: memprioritaskan efek pelacakan dan mempertimbangkan kinerja secara komprehensif, urutan prioritas format biasanya YUV > RGB > RGBA > Gray (komponen Y dalam YUV). Saat menggunakan data YUV, diperlukan definisi data lengkap termasuk detail enkapsulasi dan padding data. Dibandingkan gambar single-channel, efek Mega akan lebih baik dengan gambar berwarna, tetapi fungsi lain tidak terlalu terpengaruh.
- Akses data: pointer data atau implementasi setara. Sebaiknya hilangkan semua salinan yang tidak perlu di jalur data. Di HandleRenderFrameData, EasyAR menyalin data sekali, lalu menggunakannya secara asinkron, setelah panggilan sinkron ini selesai, data gambar tidak lagi digunakan. Perhatikan kepemilikan data.
Timestamp:
- Semua timestamp harus disinkronkan dengan jam, sebaiknya hardware-sinkron. Unit data adalah detik, tetapi presisi harus mencapai nanodetik atau setinggi mungkin.
Status pelacakan:
- Status pelacakan didefinisikan oleh perangkat, perlu mencakup status kehilangan pelacakan (VIO tidak tersedia). Lebih baik jika ada lebih banyak tingkatan.
Pose perangkat:
- Semua pose (termasuk transform kamera virtual di mesin 3D) harus menggunakan titik asal yang sama.
- Semua pose serta parameter ekstrinsik harus menggunakan sistem sumbu koordinat yang sama.
- Di Unity, tipe sistem sumbu koordinat untuk data pose harus berupa sistem sumbu koordinat Unity atau sistem sumbu koordinat EasyAR. Jika ekstensi input diimplementasikan oleh EasyAR dan menggunakan definisi sistem sumbu koordinat lain, harus disediakan definisi sistem sumbu koordinat yang jelas atau cara untuk mengonversinya ke sistem sumbu koordinat Unity atau EasyAR.
- Di Unity, jika menggunakan framework XR Unity, hanya perlu kompatibel dengan mode XROrigin.TrackingOriginMode.Device.
Parameter intrinsik:
- Semua nilai harus sesuai dengan data gambar. Jika perlu, parameter intrinsik harus diskalakan sebelum dimasukkan ke EasyAR.
- Jika ekstensi input diimplementasikan oleh EasyAR, harus dijelaskan apakah parameter intrinsik akan berubah setiap frame (perbedaannya adalah apakah API yang sesuai harus dipanggil sekali atau setiap frame).
Parameter ekstrinsik:
- Pada headset, data nyata harus disediakan.
- Ini adalah matriks kalibrasi yang menyatakan pergeseran fisik kamera fisik relatif terhadap titik asal pose perangkat/kepala. Jika pose perangkat dan pose kamera fisik sama, itu harus berupa matriks identitas.
- Antarmuka yang sesuai untuk Apple Vision Pro adalah: CameraFrame.Sample.Parameters.extrinsics, perlu diperhatikan bahwa definisi datanya berbeda dengan data yang dibutuhkan oleh antarmuka, EasyAR secara internal melakukan konversi sebelum menggunakannya.
- Di Unity, tipe sistem sumbu koordinat untuk parameter ekstrinsik harus berupa sistem sumbu koordinat Unity atau sistem sumbu koordinat EasyAR. Jika ekstensi input diimplementasikan oleh EasyAR dan menggunakan definisi sistem sumbu koordinat lain, harus disediakan definisi sistem sumbu koordinat yang jelas atau cara untuk mengonversinya ke sistem sumbu koordinat Unity atau sistem sumbu koordinat EasyAR.
- Pada perangkat headset, biasanya terdapat beberapa sistem koordinat dengan definisi berbeda, perbedaan ini dapat mencakup titik asal sumbu, orientasi, ekspresi tangan kanan/kiri, dll. Parameter ekstrinsik harus dihitung dalam sistem koordinat yang sama, data antarmuka ini memerlukan transformasi koordinat dalam sistem koordinat yang sama, bukan matriks transformasi antara dua sistem koordinat dengan definisi berbeda.
Kinerja:
- Data harus disediakan dengan efisiensi optimal. Dalam sebagian besar implementasi, panggilan API akan terjadi selama proses rendering, oleh karena itu disarankan untuk tidak memblokir panggilan API bahkan jika operasi yang memakan waktu perlu dilakukan di lapisan bawah, atau untuk menggunakan API ini dengan cara yang masuk akal.
- Jika ekstensi input diimplementasikan oleh EasyAR, semua panggilan API yang memakan waktu perlu dijelaskan.
Multi-kamera:
- Data dari setidaknya satu kamera diperlukan. Kamera ini dapat berupa kamera RGB, kamera VST, kamera pelacakan, atau lainnya. Pada headset, jika hanya data satu kamera yang dimasukkan, biasanya disarankan menggunakan kamera RGB atau VST yang berada di tengah atau dekat mata.
- Menggunakan multi-kamera dapat meningkatkan efek algoritma EasyAR. Data frame kamera dari semua kamera yang tersedia pada suatu saat harus dimasukkan secara bersamaan pada titik waktu yang sama.
Multi-kamera saat ini belum sepenuhnya didukung, dapat menghubungi EasyAR untuk detail lebih lanjut.
Langkah selanjutnya
- Buat ekstensi input gambar dan data gerak perangkat
- Buat ekstensi input gambar
- Buat paket ekstensi headset
Topik terkait
- Sistem koordinat EasyAR
- Contoh ekstensi input gambar Workflow_FrameSource_ExternalImageStream