Persyaratan data frame input untuk sumber data frame eksternal
Agar sumber data frame eksternal dapat bekerja dengan benar, tugas terpenting sekaligus bagian tersulit adalah memastikan data sudah benar. Artikel ini menjelaskan persyaratan data frame input untuk sumber data frame eksternal.
Sebelum memulai
- Pahami konsep dasar seperti kamera dan 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 yang berbeda pada dua waktu yang berbeda. Berdasarkan waktu input data eksternal dan karakteristik datanya, dua kelompok data ini disebut:
- data frame kamera (camera frame data)
- data frame rendering (rendering frame data)
Tipe sumber data frame eksternal yang berbeda memiliki kebutuhan yang berbeda terhadap dua kelompok data ini:
- Ekstensi input data gambar dan gerakan 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, panjang fokus, dan titik utama. Jika ada distorsi, model distorsi dan parameter distorsi juga diperlukan)
- ekstrinsik (extrinsics, Tcw atau Twc, matriks kalibrasi yang menyatakan offset fisik kamera fisik relatif terhadap origin pose perangkat/kepala)
- status pelacakan (tracking status)
- pose perangkat (device pose)
Waktu data:
- Titik tengah eksposur kamera fisik
Penggunaan data:
- Waktu pemanggilan API: dapat berubah sesuai desain kode eksternal. Metode umum yang digunakan sebagian besar perangkat adalah melakukan query dalam pembaruan rendering 3D engine, lalu menentukan apakah data perlu diproses lebih lanjut berdasarkan timestamp data perangkat
- Thread pemanggilan API: game thread 3D engine, 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);
}
}
Merender frame data
Kebutuhan data:
- Timestamp
- Tracking status
- Device pose
Waktu data:
- Waktu frame ditampilkan di layar. TimeWarp tidak dihitung. Data device pose pada waktu yang sama akan digunakan oleh pihak eksternal, misalnya device SDK, untuk mengatur transform virtual camera guna merender frame saat ini.
Catatan
TimeWarp, yang terkadang juga disebut Reprojection atau ATW/PTW, adalah teknik umum di headset VR/AR untuk mengurangi latensi. Setelah rendering selesai, teknik ini kembali melakukan warp pada gambar berdasarkan pose kepala terbaru untuk mengompensasi gerakan kepala yang terjadi selama rendering. Yang dibutuhkan EasyAR adalah waktu yang sesuai dengan pose yang digunakan untuk mengatur virtual camera saat rendering dimulai, bukan waktu aktual frame tampil di layar setelah TimeWarp.
Penggunaan data:
- Waktu pemanggilan API: setiap frame rendering 3D engine
- Thread pemanggilan API: game thread 3D engine
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 menggunakan sudut kiri atas sebagai origin dan disimpan dalam urutan row-major. Gambar tidak boleh dibalik atau diputar terbalik.
- FPS gambar: data normal 30 atau 60 fps dapat digunakan. Jika fps tinggi memiliki dampak khusus, frame rate minimum yang dapat diterima untuk mencapai hasil algoritma yang wajar adalah 2. Disarankan menggunakan fps di atas 2, dan biasanya cukup menggunakan frame rate data asli.
- Ukuran gambar: untuk memperoleh hasil komputasi yang lebih baik, sisi terpanjang sebaiknya 960 atau lebih besar. Scaling gambar yang memakan waktu dalam rantai data biasanya tidak disarankan. Disarankan langsung menggunakan data asli kecuali waktu penyalinan data ukuran penuh sudah terlalu lama untuk diterima. Resolusi gambar tidak boleh kurang dari 640*480.
- Format piksel: dengan memprioritaskan kualitas pelacakan dan mempertimbangkan performa, urutan preferensi format umumnya adalah YUV > RGB > RGBA > Gray (komponen Y dalam YUV). Saat menggunakan data YUV, diperlukan definisi data lengkap, termasuk detail pengemasan dan padding data. Dibandingkan gambar satu kanal, penggunaan gambar berwarna memberikan hasil Mega yang lebih baik, tetapi dampaknya kecil pada fitur lain.
- Akses data: pointer data atau implementasi yang setara. Sebaiknya hilangkan semua salinan yang tidak diperlukan dalam rantai data. Dalam HandleRenderFrameData, EasyAR menyalin satu salinan data lalu menggunakannya secara asinkron. Setelah panggilan sinkron selesai, data gambar tidak lagi digunakan. Perhatikan kepemilikan data.
Timestamp:
- Semua timestamp harus tersinkronisasi jam, sebaiknya tersinkronisasi perangkat keras. Unit data adalah detik, tetapi presisi harus mencapai nanodetik atau setinggi mungkin.
Status tracking:
- Status tracking ditentukan oleh perangkat dan harus mencakup status tracking hilang, yaitu VIO tidak tersedia. Jika ada lebih banyak level, itu lebih baik.
Pose perangkat:
- Semua pose, termasuk transform kamera virtual di engine 3D, harus menggunakan origin yang sama.
- Semua pose dan extrinsics harus menggunakan sistem sumbu koordinat yang sama.
- Di Unity, tipe sistem sumbu koordinat data pose harus berupa sistem sumbu koordinat Unity atau sistem sumbu koordinat EasyAR. Jika input extension diimplementasikan oleh EasyAR dan menggunakan definisi sistem sumbu koordinat lain, berikan definisi sistem sumbu koordinat yang jelas atau metode untuk mengonversinya ke sistem sumbu koordinat Unity atau EasyAR.
- Di Unity, jika menggunakan framework Unity XR, cukup kompatibel dengan mode XROrigin.TrackingOriginMode.Device.
Intrinsics:
- Semua nilai harus sesuai dengan data gambar. Jika perlu, lakukan scaling intrinsics sebelum memasukkannya ke EasyAR.
- Jika input extension diimplementasikan oleh EasyAR, jelaskan apakah intrinsics berubah setiap frame, karena ini menentukan apakah API terkait dipanggil sekali atau setiap frame.
Extrinsics:
- Pada headset harus disediakan data nyata.
- Ini adalah matriks kalibrasi yang menyatakan offset fisik kamera fisik relatif terhadap origin pose perangkat/kepala. Jika pose perangkat dan pose kamera fisik sama, nilainya harus matriks identitas.
- Interface terkait untuk Apple Vision Pro adalah CameraFrame.Sample.Parameters.extrinsics. Perhatikan bahwa definisi datanya berbeda dari data yang dibutuhkan interface, dan EasyAR menggunakannya secara internal setelah konversi.
- Di Unity, tipe sistem sumbu koordinat extrinsics harus berupa sistem sumbu koordinat Unity atau EasyAR. Jika input extension diimplementasikan oleh EasyAR dan menggunakan definisi sistem sumbu koordinat lain, berikan definisi sistem sumbu koordinat yang jelas atau metode untuk mengonversinya ke sistem sumbu koordinat Unity atau EasyAR.
- Pada perangkat headset biasanya terdapat beberapa sistem koordinat dengan definisi berbeda, termasuk perbedaan origin sumbu koordinat, arah, serta representasi tangan kiri/kanan. Extrinsics harus dihitung dalam sistem koordinat yang sama. Data interface ini membutuhkan transformasi koordinat dalam sistem koordinat yang sama, bukan matriks transformasi antara dua sistem koordinat dengan definisi berbeda.
Performa:
- Data harus disediakan dengan efisiensi optimal. Pada sebagian besar implementasi, pemanggilan API terjadi selama proses rendering, jadi meskipun operasi yang memakan waktu diperlukan di lapisan bawah, jangan memblokir pemanggilan API, atau gunakan API ini dengan cara yang wajar.
- Jika input extension diimplementasikan oleh EasyAR, jelaskan semua pemanggilan API yang memakan waktu.
Multi-kamera:
- Data dari setidaknya satu kamera diperlukan. Kamera ini dapat berupa kamera RGB, kamera VST, kamera lokalisasi, dan sebagainya. Pada headset, jika hanya memasukkan data satu kamera, biasanya disarankan menggunakan kamera RGB atau VST yang berada di tengah atau dekat mata.
- Menggunakan multi-kamera dapat meningkatkan hasil 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. Hubungi EasyAR untuk detail lebih lanjut.
Langkah berikutnya
- Buat ekstensi input data gambar dan gerakan perangkat
- Buat ekstensi input gambar
- Buat paket ekstensi headset
Topik terkait
- Sistem koordinat EasyAR
- Contoh ekstensi input gambar Workflow_FrameSource_ExternalImageStream