Gunakan Generic Sensor API untuk mendapatkan akses ke sensor di perangkat seperti akselerometer, giroskop, dan magnetometer.
Saat ini, data sensor digunakan di banyak aplikasi khusus platform untuk kasus penggunaan seperti game yang imersif, pelacakan kebugaran, dan augmented reality atau virtual reality. Bukankah akan keren untuk menjembatani kesenjangan antara aplikasi khusus platform dan aplikasi web? Masukkan Generic Sensor API, untuk web.
Apa itu Generic Sensor API?
Generic Sensor API adalah serangkaian antarmuka yang mengekspos
perangkat sensor ke platform web. API ini terdiri dari antarmuka
Sensor
dasar dan kumpulan class
sensor konkret yang dibuat di atasnya. Memiliki antarmuka dasar akan menyederhanakan proses implementasi dan spesifikasi
untuk class sensor konkret. Misalnya, lihat
Class Gyroscope
. Ukurannya amat sangat kecil! Tujuan
fungsi inti ditetapkan oleh antarmuka dasar, dan Gyroscope
hanya memperluasnya dengan tiga
yang mewakili kecepatan sudut.
Beberapa class sensor berinteraksi dengan sensor hardware yang sebenarnya seperti, misalnya, class akselerometer atau
giroskop. Sensor ini disebut sebagai sensor tingkat rendah. Sensor lain, yang disebut sebagai
sensor fusi, menggabungkan data dari beberapa sensor
tingkat rendah untuk mengekspos informasi yang perlu dihitung oleh skrip. Misalnya,
Sensor AbsoluteOrientation
menyediakan matriks rotasi empat kali empat yang siap digunakan berdasarkan data yang diperoleh dari
akselerometer, giroskop, dan magnetometer.
Anda mungkin berpikir bahwa platform web sudah menyediakan data sensor dan Anda benar! Misalnya,
peristiwa DeviceMotion
dan
DeviceOrientation
mengekspos data sensor gerakan. Jadi, mengapa kita memerlukan API baru?
Dibandingkan dengan antarmuka yang ada, Generic Sensor API memberikan banyak keuntungan:
- Generic Sensor API adalah framework sensor yang dapat diperluas dengan mudah dengan class sensor baru dan setiap class ini akan mempertahankan antarmuka generik. Kode klien yang ditulis untuk satu jenis sensor dapat digunakan kembali untuk yang lain dengan sedikit modifikasi!
- Anda dapat mengonfigurasi sensor. Misalnya, Anda dapat menetapkan frekuensi sampling yang sesuai dengan kebutuhan aplikasi Anda.
- Anda dapat mendeteksi apakah sensor tersedia di platform.
- Pembacaan sensor memiliki stempel waktu presisi tinggi, memungkinkan sinkronisasi yang lebih baik dengan aktivitas dalam aplikasi Anda.
- Model data sensor dan sistem koordinat ditentukan dengan jelas, sehingga vendor browser dapat menerapkan solusi yang interoperabilitas.
- Antarmuka berbasis Sensor Generik tidak terikat ke DOM (artinya bukan
navigator
atau objekwindow
), dan hal ini membuka peluang penggunaan API dalam layanan di masa mendatang pekerja atau menerapkannya dalam runtime JavaScript headless, seperti yang disematkan perangkat. - Aspek keamanan dan privasi adalah prioritas utama untuk Generic Sensor API dan memberikan keamanan yang jauh lebih baik dibandingkan dengan API sensor lama. Terdapat integrasi dengan Permissions API.
- Sinkronisasi otomatis dengan koordinat layar
tersedia untuk
Accelerometer
,Gyroscope
,LinearAccelerationSensor
,AbsoluteOrientationSensor
,RelativeOrientationSensor
, danMagnetometer
.
API sensor generik yang tersedia
Pada saat menulis, ada beberapa sensor yang dapat Anda gunakan untuk bereksperimen.
Sensor gerakan:
Accelerometer
Gyroscope
LinearAccelerationSensor
AbsoluteOrientationSensor
RelativeOrientationSensor
GravitySensor
Sensor lingkungan:
AmbientLightSensor
(Di belakang flag#enable-generic-sensor-extra-classes
di Chromium.)Magnetometer
(Di balik tanda#enable-generic-sensor-extra-classes
di Chromium.)
Deteksi fitur
Deteksi fitur API hardware cukup rumit, karena Anda perlu mendeteksi apakah browser
mendukung antarmuka yang dimaksud, dan apakah perangkat memiliki sensor yang sesuai. Diperiksa
apakah browser mendukung
antarmuka secara langsung. (Ganti Accelerometer
dengan salah satu
antarmuka lain yang disebutkan di atas.)
if ('Accelerometer' in window) {
// The `Accelerometer` interface is supported by the browser.
// Does the device have an accelerometer, though?
}
Untuk mendapatkan hasil deteksi fitur yang benar-benar bermakna, Anda juga harus mencoba menghubungkannya ke sensor. Contoh ini menggambarkan cara melakukannya.
let accelerometer = null;
try {
accelerometer = new Accelerometer({ frequency: 10 });
accelerometer.onerror = (event) => {
// Handle runtime errors.
if (event.error.name === 'NotAllowedError') {
console.log('Permission to access sensor was denied.');
} else if (event.error.name === 'NotReadableError') {
console.log('Cannot connect to the sensor.');
}
};
accelerometer.onreading = (e) => {
console.log(e);
};
accelerometer.start();
} catch (error) {
// Handle construction errors.
if (error.name === 'SecurityError') {
console.log('Sensor construction was blocked by the Permissions Policy.');
} else if (error.name === 'ReferenceError') {
console.log('Sensor is not supported by the User Agent.');
} else {
throw error;
}
}
Polyfill
Untuk browser yang tidak mendukung Generic Sensor API, polyfill tersedia. Polyfill memungkinkan Anda untuk memuat sensor yang relevan saja' implementasi yang tepat.
// Import the objects you need.
import { Gyroscope, AbsoluteOrientationSensor } from './src/motion-sensors.js';
// And they're ready for use!
const gyroscope = new Gyroscope({ frequency: 15 });
const orientation = new AbsoluteOrientationSensor({ frequency: 60 });
Apa saja sensor ini? Bagaimana cara menggunakannya?
Sensor adalah area yang mungkin memerlukan pengantar singkat. Jika terbiasa dengan sensor, Anda dapat langsung buka bagian praktik coding. Jika tidak, mari kita lihat setiap daftar yang didukung sensor secara detail.
Akselerometer dan sensor akselerasi linear
Sensor Accelerometer
mengukur akselerasi perangkat yang menghosting sensor pada tiga sumbu (X, Y, dan Z). Sensor ini adalah
sensor inersia, yang berarti bahwa saat perangkat dalam keadaan jatuh bebas linear, total akselerasi
yang diukur adalah 0 m/s2, dan saat perangkat tergeletak rata di atas meja, akselerasi
ke arah atas (sumbu Z) akan sama dengan gravitasi Bumi, yaitu g ≈ +9,8 m/s2 karena
mengukur gaya meja yang mendorong perangkat ke atas. Jika Anda mendorong perangkat ke
kanan, akselerasi pada sumbu X akan positif, atau negatif jika perangkat dipercepat dari
kanan ke kiri.
Akselerometer dapat digunakan untuk hal-hal seperti: penghitungan langkah, deteksi gerakan, atau perangkat sederhana orientasi. Sering kali, pengukuran akselerometer digabungkan dengan data dari sumber lain untuk membuat sensor fusi, seperti sensor orientasi.
Tujuan
LinearAccelerationSensor
mengukur akselerasi yang diterapkan pada perangkat yang menghosting sensor, tidak termasuk kontribusi
gravitasi. Ketika perangkat sedang tidak digunakan, misalnya tergeletak di atas meja, sensor akan mengukur
≈ 0 m/s2 akselerasi pada tiga sumbu.
Sensor gravitasi
Pengguna sudah dapat memperoleh pembacaan secara manual yang mendekati pembacaan sensor gravitasi dengan
memeriksa pembacaan Accelerometer
dan LinearAccelerometer
secara manual, tetapi hal ini dapat merepotkan
dan bergantung pada akurasi nilai yang diberikan oleh sensor tersebut. Platform seperti Android dapat
memberikan pembacaan gravitasi sebagai bagian dari sistem operasi, yang seharusnya lebih murah dalam hal
komputasi, memberikan nilai yang lebih akurat bergantung pada hardware pengguna, dan lebih mudah digunakan dalam
hal ergonomi API. GravitySensor
menampilkan efek
akselerasi di sepanjang sumbu X, Y, dan Z perangkat karena gravitasi.
Giroskop
Sensor Gyroscope
mengukur
kecepatan sudut dalam radian per detik di sekitar sumbu X, Y, dan Z lokal perangkat. Sebagian besar konsumen
perangkat memiliki mekanis (MEMS)
giroskop, yaitu sensor inersia yang
mengukur laju rotasi berdasarkan
gaya Coriolis inertial. Giroskop MEMS rentan
penyimpangan yang disebabkan oleh sensitivitas gravitasi sensor yang merusak fungsi sensor
sistem mekanis internal. Giroskop berosilasi pada frekuensi tinggi relatif, misalnya, 10 kHz, sehingga
mungkin menggunakan lebih banyak daya dibandingkan sensor lainnya.
Sensor orientasi
AbsoluteOrientationSensor
adalah sensor fusi yang mengukur rotasi perangkat sehubungan dengan sistem koordinat Bumi,
sedangkan
RelativeOrientationSensor
menyediakan data yang mewakili rotasi perangkat yang menghosting sensor gerakan sehubungan dengan sistem koordinat
referensi stasioner.
Semua framework JavaScript 3D modern mendukung kuarternion
dan matriks rotasi untuk mewakili rotasi;
Namun, jika Anda menggunakan WebGL secara langsung, OrientationSensor
dengan mudah memiliki
Properti quaternion
dan
populateMatrix()
metode.
Berikut beberapa cuplikan:
let torusGeometry = new THREE.TorusGeometry(7, 1.6, 4, 3, 6.3);
let material = new THREE.MeshBasicMaterial({ color: 0x0071c5 });
let torus = new THREE.Mesh(torusGeometry, material);
scene.add(torus);
// Update mesh rotation using quaternion.
const sensorAbs = new AbsoluteOrientationSensor();
sensorAbs.onreading = () => torus.quaternion.fromArray(sensorAbs.quaternion);
sensorAbs.start();
// Update mesh rotation using rotation matrix.
const sensorRel = new RelativeOrientationSensor();
let rotationMatrix = new Float32Array(16);
sensor_rel.onreading = () => {
sensorRel.populateMatrix(rotationMatrix);
torus.matrix.fromArray(rotationMatrix);
};
sensorRel.start();
const mesh = new BABYLON.Mesh.CreateCylinder('mesh', 0.9, 0.3, 0.6, 9, 1, scene);
const sensorRel = new RelativeOrientationSensor({ frequency: 30 });
sensorRel.onreading = () => mesh.rotationQuaternion.FromArray(sensorRel.quaternion);
sensorRel.start();
// Initialize sensor and update model matrix when new reading is available.
let modMatrix = new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
const sensorAbs = new AbsoluteOrientationSensor({ frequency: 60 });
sensorAbs.onreading = () => sensorAbs.populateMatrix(modMatrix);
sensorAbs.start();
// Somewhere in rendering code, update vertex shader attribute for the model
gl.uniformMatrix4fv(modMatrixAttr, false, modMatrix);
Sensor orientasi memungkinkan berbagai kasus penggunaan, seperti game imersif, tambahan, dan virtual yang sebenarnya.
Untuk mengetahui informasi selengkapnya tentang sensor gerakan, kasus penggunaan lanjutan, dan persyaratan, lihat dokumen penjelasan sensor gerakan.
Sinkronisasi dengan koordinat layar
Secara default, pembacaan sensor spasial diselesaikan dalam sistem koordinat lokal yang terikat ke perangkat dan tidak mengambil orientasi layar menggunakan akun layanan.
Namun, banyak kasus penggunaan seperti game atau augmented reality dan virtual reality memerlukan pembacaan sensor diselesaikan dalam sistem koordinat yang terikat dengan orientasi layar.
Sebelumnya, pemetaan ulang pembacaan sensor ke koordinat layar harus diterapkan dalam JavaScript. Pendekatan ini tidak efisien dan juga meningkatkan kompleksitas web secara signifikan kode aplikasi; aplikasi web harus memperhatikan perubahan orientasi layar dan melakukan koordinat untuk pembacaan sensor, yang bukan hal mudah dilakukan untuk sudut Euler atau kuaternion.
Generic Sensor API memberikan solusi yang jauh lebih sederhana dan andal. Sistem koordinat lokal dapat
dikonfigurasi untuk semua class sensor spasial yang ditentukan: Accelerometer
, Gyroscope
,
LinearAccelerationSensor
, AbsoluteOrientationSensor
, RelativeOrientationSensor
, dan
Magnetometer
. Dengan meneruskan opsi referenceFrame
ke konstruktor objek sensor, pengguna akan
menentukan apakah pembacaan yang dikembalikan akan diselesaikan dengan
device atau
koordinat layar.
// Sensor readings are resolved in the Device coordinate system by default.
// Alternatively, could be RelativeOrientationSensor({referenceFrame: "device"}).
const sensorRelDevice = new RelativeOrientationSensor();
// Sensor readings are resolved in the Screen coordinate system. No manual remapping is required!
const sensorRelScreen = new RelativeOrientationSensor({ referenceFrame: 'screen' });
Mari kita buat kodenya.
Generic Sensor API sangat sederhana dan mudah digunakan. Antarmuka Sensor memiliki
start()
dan
Metode stop()
untuk mengontrol status sensor dan beberapa
pengendali peristiwa untuk menerima notifikasi tentang aktivasi sensor, error, dan status baru
sebelumnya. Class sensor konkret biasanya menambahkan atribut pembacaan spesifiknya ke class
dasar.
Lingkungan pengembangan
Selama pengembangan, Anda dapat menggunakan sensor melalui localhost
. Jika Anda mengembangkan untuk
perangkat seluler, siapkan
penerusan port
untuk server lokal Anda, dan Anda siap untuk memulai.
Jika kode Anda sudah siap, deploy di server yang mendukung HTTPS. Halaman GitHub ditayangkan melalui HTTPS, menjadikannya tempat yang tepat untuk berbagi demo Anda.
Rotasi model 3D
Dalam contoh sederhana ini, kita menggunakan data dari sensor orientasi absolut untuk memodifikasi rotasi
kuaternion model 3D. model
adalah tiga.js
Instance class Object3D
yang memiliki
quaternion
. Cuplikan kode berikut dari demo orientation phone, mengilustrasikan cara sensor orientasi absolut dapat digunakan untuk memutar model 3D.
function initSensor() {
sensor = new AbsoluteOrientationSensor({ frequency: 60 });
sensor.onreading = () => model.quaternion.fromArray(sensor.quaternion);
sensor.onerror = (event) => {
if (event.error.name == 'NotReadableError') {
console.log('Sensor is not available.');
}
};
sensor.start();
}
Orientasi perangkat akan tercermin dalam rotasi model
3D dalam tampilan WebGL.
Pengukur Pemotong
Cuplikan kode berikut diekstrak dari demo punchmeter, yang menggambarkan cara sensor akselerasi linear dapat digunakan untuk menghitung kecepatan maksimum perangkat dengan asumsi bahwa perangkat awalnya diam.
this.maxSpeed = 0;
this.vx = 0;
this.ax = 0;
this.t = 0;
/* … */
this.accel.onreading = () => {
let dt = (this.accel.timestamp - this.t) * 0.001; // In seconds.
this.vx += ((this.accel.x + this.ax) / 2) * dt;
let speed = Math.abs(this.vx);
if (this.maxSpeed < speed) {
this.maxSpeed = speed;
}
this.t = this.accel.timestamp;
this.ax = this.accel.x;
};
Kecepatan saat ini dihitung sebagai perkiraan terhadap integral dari fungsi akselerasi.
Proses debug dan penggantian sensor dengan Chrome DevTools
Dalam beberapa kasus, Anda tidak memerlukan perangkat fisik untuk bermain-main dengan Generic Sensor API. Chrome DevTools memiliki dukungan yang sangat baik untuk menyimulasikan orientasi perangkat.
Privasi dan keamanan
Pengukuran sensor adalah data sensitif yang dapat mengalami berbagai serangan dari halaman web berbahaya. Implementasi Generic Sensor API menerapkan beberapa batasan untuk memitigasi kemungkinan risiko keamanan dan privasi. Batasan ini harus dipertimbangkan oleh developer yang ingin menggunakan API, jadi mari kita tampilkan secara singkat.
Khusus HTTPS
Karena Generic Sensor API adalah fitur yang canggih, browser hanya mengizinkannya pada konteks yang aman. Di beberapa praktiknya, ini berarti untuk menggunakan Generic Sensor API, Anda harus mengakses halaman melalui HTTPS. Selama pengembangan, Anda dapat melakukannya melalui http://localhost, tetapi untuk produksi, Anda harus memiliki HTTPS di server. Lihat koleksi Aman dan terlindungi untuk mengetahui praktik terbaik pedoman yang relevan.
Integrasi Kebijakan Izin
Integrasi Kebijakan Izin di Generic Sensor API mengontrol akses ke data sensor untuk frame.
Secara default, objek Sensor
hanya dapat dibuat dalam frame utama atau subframe origin yang sama,
sehingga mencegah iframe lintas origin membaca data sensor tanpa izin. Perilaku default ini
dapat diubah dengan mengaktifkan atau menonaktifkan secara eksplisit
fitur yang dikontrol kebijakan yang sesuai.
Cuplikan di bawah ini menggambarkan pemberian akses data akselerometer ke iframe lintas origin, yang berarti
objek Accelerometer
atau LinearAccelerationSensor
kini dapat dibuat di sana.
<iframe src="https://third-party.com" allow="accelerometer" />
Pengiriman pembacaan sensor dapat ditangguhkan
Pembacaan sensor hanya dapat diakses oleh halaman web yang terlihat, yaitu ketika pengguna sebenarnya berinteraksi dengannya. Selain itu, data sensor tidak akan diberikan ke {i>frame<i} induk jika pengguna memfokuskan perubahan ke subframe lintas origin. Hal ini mencegah frame induk menyimpulkan input pengguna.
Apa langkah selanjutnya?
Ada sekumpulan kelas sensor yang sudah ditentukan untuk diimplementasikan dalam waktu dekat seperti Sensor Lampu Ruangan atau Sensor Kedekatan; namun, berkat ekstensibilitas yang besar Framework Sensor generik, kita dapat mengantisipasi tampilan lebih banyak class baru yang mewakili berbagai jenis sensor.
Area penting lainnya untuk pekerjaan mendatang adalah meningkatkan Generic Sensor API itu sendiri, spesifikasi Generic Sensor saat ini adalah Rekomendasi Calon, yang berarti masih ada waktu untuk melakukan perbaikan dan menghadirkan fungsi baru yang diperlukan developer.
Anda bisa membantu!
Spesifikasi sensor mencapai tingkat kematangan Rekomendasi Calon, sehingga masukan dari developer web dan browser sangat kami hargai. Izinkan tahu fitur apa yang bagus untuk ditambahkan atau jika ada sesuatu yang ingin Anda modifikasi di API saat ini.
Silakan ajukan masalah spesifikasi serta bug untuk penerapan Chrome.
Resource
- Project demo: https://intel.github.io/generic-sensor-demos/
- Spesifikasi Sensor API generik: https://w3c.github.io/sensors/
- Masalah spesifikasi: https://github.com/w3c/sensors/issues
- Milis grup kerja W3C: public-device-apis@w3.org
- Status Fitur Chrome: https://www.chromestatus.com/feature/5698781827825664
- Bug implementasi: http://crbug.com?q=component:Blink>Sensor
Ucapan terima kasih
Artikel ini ditinjau oleh Joe Medley dan Kayce Basques. Gambar hero oleh Misko melalui Wikimedia Commons.