Jenis sensor

Bagian ini menjelaskan sumbu sensor, sensor dasar, dan sensor komposit (aktivitas, sikap, tidak dikalibrasi, dan interaksi).

Sumbu sensor

Nilai peristiwa sensor dari banyak sensor dinyatakan dalam bingkai tertentu yang statis relatif terhadap perangkat.

Sumbu perangkat seluler

Sensor API hanya relatif terhadap orientasi alami layar (sumbu tidak tertukar saat orientasi layar perangkat berubah.

Sistem koordinat API sensor untuk perangkat seluler

Gambar 1. Sistem koordinat (relatif terhadap perangkat seluler) yang digunakan oleh Sensor API

Sumbu otomotif

Dalam implementasi Android Automotive, sumbu ditentukan sehubungan dengan rangka bodi kendaraan. Asal dari kerangka referensi kendaraan adalah pusat dari poros belakang. Rangka referensi kendaraan diorientasikan sedemikian rupa sehingga:

  • Sumbu X menunjuk ke kanan dan berada pada bidang horizontal, tegak lurus terhadap bidang simetri kendaraan.
  • Sumbu Y mengarah ke depan dan berada pada bidang horizontal.
Sistem koordinat API sensor untuk perangkat otomotif

Gambar 2. Sistem koordinat (relatif terhadap perangkat otomotif) yang digunakan oleh Sensor API

Kerangka referensi kendaraan adalah sistem koordinat tangan kanan. Oleh karena itu, sumbu Z mengarah ke atas.

Sumbu Z dari kerangka acuan sejajar dengan gravitasi, yang berarti bahwa sumbu X dan sumbu Y keduanya horizontal. Akibatnya, sumbu Y mungkin tidak selalu melalui sumbu depan.

Sensor dasar

Jenis sensor dasar dinamai berdasarkan sensor fisik yang diwakilinya. Sensor ini menyampaikan data dari sensor fisik tunggal (berlawanan dengan sensor komposit yang menghasilkan data dari sensor lain). Contoh jenis sensor dasar meliputi:

  • SENSOR_TYPE_ACCELEROMETER
  • SENSOR_TYPE_GYROSCOPE
  • SENSOR_TYPE_MAGNETOMETER

Namun, sensor dasar tidak sama dan tidak boleh disamakan dengan sensor fisik yang mendasarinya. Data dari sensor dasar bukanlah keluaran mentah dari sensor fisik karena koreksi (seperti kompensasi bias dan kompensasi suhu) diterapkan.

Misalnya, karakteristik sensor dasar mungkin berbeda dari karakteristik sensor fisik dasarnya dalam kasus penggunaan berikut:

  • Chip giroskop yang dinilai memiliki rentang bias 1 derajat/detik.
    • Setelah kalibrasi pabrik, kompensasi suhu dan kompensasi bias diterapkan, bias sebenarnya dari sensor Android akan berkurang, mungkin ke titik di mana bias dijamin di bawah 0,01 deg/dtk.
    • Dalam situasi ini, kami mengatakan bahwa sensor Android memiliki bias di bawah 0,01 derajat/dtk, meskipun lembar data sensor yang mendasarinya mengatakan 1 derajat/dtk.
  • Barometer dengan konsumsi daya 100 uW.
    • Karena data yang dihasilkan perlu diangkut dari chip ke SoC, biaya daya sebenarnya untuk mengumpulkan data dari sensor Android barometer mungkin jauh lebih tinggi, misalnya 1000 uW.
    • Dalam situasi ini, kami mengatakan bahwa sensor Android memiliki konsumsi daya 1000 uW, meskipun konsumsi daya yang diukur pada kabel chip barometer adalah 100uW.
  • Magnetometer yang mengonsumsi 100uW saat dikalibrasi, tetapi mengonsumsi lebih banyak saat dikalibrasi.
    • Rutin kalibrasinya mungkin memerlukan pengaktifan giroskop, menggunakan 5000 uW, dan menjalankan beberapa algoritme, dengan biaya 900 uW lagi.
    • Dalam situasi ini, kami mengatakan bahwa konsumsi daya maksimum dari sensor Android (magnetometer) adalah 6000 uW.
    • Dalam hal ini, konsumsi daya rata-rata adalah ukuran yang lebih berguna, dan itulah yang dilaporkan dalam karakteristik statis sensor melalui HAL.

Akselerometer

Mode pelaporan: Berkelanjutan

getDefaultSensor(SENSOR_TYPE_ACCELEROMETER) mengembalikan sensor non-bangun

Sensor akselerometer melaporkan akselerasi perangkat di sepanjang tiga sumbu sensor. Percepatan yang diukur mencakup percepatan fisik (perubahan kecepatan) dan gravitasi. Pengukuran dilaporkan dalam bidang x, y, dan z dari sensor_event_t.acceleration.

Semua nilai dalam satuan SI (m/s^2) dan mengukur percepatan perangkat dikurangi gaya gravitasi di sepanjang tiga sumbu sensor.

Berikut adalah contoh:

  • Norma (x, y, z) harus mendekati 0 saat jatuh bebas.
  • Ketika perangkat diletakkan rata di atas meja dan didorong ke kiri ke kanan, nilai percepatan x positif.
  • Ketika perangkat diletakkan rata di atas meja, nilai percepatan sepanjang z adalah +9,81 alo, yang sesuai dengan percepatan perangkat (0 m/s^2) dikurangi gaya gravitasi (-9,81 m/s^2).
  • Ketika perangkat diletakkan rata di atas meja dan didorong ke langit, nilai percepatan lebih besar dari +9,81, yang sesuai dengan percepatan perangkat (+A m/s^2) dikurangi gaya gravitasi (-9,81 m /s^2).

Pembacaan dikalibrasi menggunakan:

  • Kompensasi suhu
  • Kalibrasi bias online
  • Kalibrasi timbangan online

Kalibrasi bias dan skala hanya boleh diperbarui saat sensor dinonaktifkan, untuk menghindari lonjakan nilai selama streaming.

Akselerometer juga melaporkan seberapa akurat pembacaan yang diharapkan melalui sensors_event_t.acceleration.status . Lihat SensorManager SENSOR_STATUS_* untuk informasi lebih lanjut tentang kemungkinan nilai untuk bidang ini.

Suhu sekitar

Mode pelaporan: Saat berubah

getDefaultSensor(SENSOR_TYPE_AMBIENT_TEMPERATURE) mengembalikan sensor non-bangun

Sensor ini memberikan suhu sekitar (ruangan) dalam derajat Celcius.

Sensor medan magnet

Mode pelaporan: Berkelanjutan

getDefaultSensor(SENSOR_TYPE_MAGNETIC_FIELD) mengembalikan sensor non-bangun

SENSOR_TYPE_GEOMAGNETIC_FIELD == SENSOR_TYPE_MAGNETIC_FIELD

Sebuah sensor medan magnet (juga dikenal sebagai magnetometer) melaporkan medan magnet sekitar, yang diukur sepanjang tiga sumbu sensor.

Pengukuran dilaporkan dalam bidang x, y, dan z dari sensors_event_t.magnetic dan semua nilai dalam mikro-Tesla (uT).

Magnetometer juga melaporkan seberapa akurat pembacaan yang diharapkan melalui sensors_event_t.magnetic.status . Lihat SensorManager SENSOR_STATUS_* untuk informasi lebih lanjut tentang kemungkinan nilai untuk bidang ini.

Pembacaan dikalibrasi menggunakan:

  • Kompensasi suhu
  • Kalibrasi besi lunak pabrik (atau online)
  • Kalibrasi besi keras online

Giroskop

Mode pelaporan: Berkelanjutan

getDefaultSensor(SENSOR_TYPE_GYROSCOPE) mengembalikan sensor non-bangun

Sebuah sensor giroskop melaporkan tingkat rotasi perangkat di sekitar tiga sumbu sensor.

Rotasi positif dalam arah berlawanan arah jarum jam (aturan tangan kanan). Artinya, seorang pengamat yang melihat dari beberapa lokasi positif pada sumbu x, y, atau z pada perangkat yang diposisikan di titik asal akan melaporkan rotasi positif jika perangkat tampak berputar berlawanan arah jarum jam. Perhatikan bahwa ini adalah definisi matematika standar dari rotasi positif dan tidak sesuai dengan definisi roll di ruang angkasa.

Pengukuran dilaporkan dalam bidang x, y, dan z dari sensors_event_t.gyro dan semua nilai dalam radian per detik (rad/s).

Pembacaan dikalibrasi menggunakan:

  • Kompensasi suhu
  • Kompensasi skala pabrik (atau online)
  • Kalibrasi bias online (untuk menghilangkan penyimpangan)

Giroskop juga melaporkan seberapa akurat pembacaan yang diharapkan melalui sensors_event_t.gyro.status . Lihat SensorManager SENSOR_STATUS_* untuk informasi lebih lanjut tentang kemungkinan nilai untuk bidang ini.

Giroskop tidak dapat ditiru berdasarkan magnetometer dan akselerometer, karena hal ini akan menyebabkan konsistensi dan daya tanggap lokal berkurang. Itu harus didasarkan pada chip giroskop biasa.

Detak Jantung

Mode pelaporan: Saat berubah

getDefaultSensor(SENSOR_TYPE_HEART_RATE) mengembalikan sensor non-bangun

Sensor detak jantung melaporkan detak jantung saat ini dari orang yang menyentuh perangkat.

Detak jantung saat ini dalam denyut per menit (BPM) dilaporkan di sensors_event_t.heart_rate.bpm dan status sensor dilaporkan di sensors_event_t.heart_rate.status . Lihat SensorManager SENSOR_STATUS_* untuk informasi lebih lanjut tentang kemungkinan nilai untuk bidang ini. Khususnya, pada aktivasi pertama, kecuali perangkat diketahui tidak berada di badan, bidang status peristiwa pertama harus disetel ke SENSOR_STATUS_UNRELIABLE . Karena sensor ini sedang berubah, peristiwa dihasilkan ketika dan hanya ketika heart_rate.bpm atau heart_rate.status telah berubah sejak peristiwa terakhir. Peristiwa dihasilkan tidak lebih cepat dari setiap sampling_period .

sensor_t.requiredPermission selalu SENSOR_PERMISSION_BODY_SENSORS .

Lampu

Mode pelaporan: Saat berubah

getDefaultSensor(SENSOR_TYPE_LIGHT) mengembalikan sensor non-bangun

Sebuah sensor cahaya melaporkan iluminasi saat ini dalam satuan SI lux.

Pengukuran ini dilaporkan dalam sensors_event_t.light .

Kedekatan

Mode pelaporan: Saat berubah

Biasanya didefinisikan sebagai sensor bangun

getDefaultSensor(SENSOR_TYPE_PROXIMITY) mengembalikan sensor bangun

Sensor jarak melaporkan jarak dari sensor ke permukaan terdekat yang terlihat.

Hingga Android 4.4, sensor jarak selalu menjadi sensor bangun, membangunkan SoC saat mendeteksi perubahan jarak. Setelah Android 4.4, kami menyarankan untuk mengimplementasikan versi bangun dari sensor ini terlebih dahulu, karena ini adalah yang digunakan untuk menghidupkan dan mematikan layar saat melakukan panggilan telepon.

Pengukuran dilaporkan dalam sentimeter di sensors_event_t.distance . Perhatikan bahwa beberapa sensor jarak hanya mendukung pengukuran biner "dekat" atau "jauh". Dalam hal ini, sensor melaporkan nilai sensor_t.maxRange dalam status "jauh" dan nilai kurang dari sensor_t.maxRange dalam status "dekat".

Tekanan

Mode pelaporan: Berkelanjutan

getDefaultSensor(SENSOR_TYPE_PRESSURE) mengembalikan sensor non-bangun

Sebuah sensor tekanan (juga dikenal sebagai barometer) melaporkan tekanan atmosfer dalam hectopascal (hPa).

Pembacaan dikalibrasi menggunakan

  • Kompensasi suhu
  • Kalibrasi bias pabrik
  • Kalibrasi skala pabrik

Barometer sering digunakan untuk memperkirakan perubahan ketinggian. Untuk memperkirakan elevasi absolut, tekanan permukaan laut (berubah tergantung cuaca) harus digunakan sebagai referensi.

Kelembaban relatif

Mode pelaporan: Saat berubah

getDefaultSensor(SENSOR_TYPE_RELATIVE_HUMIDITY) mengembalikan sensor non-bangun

Sebuah sensor kelembaban relatif mengukur kelembaban udara ambien relatif dan mengembalikan nilai dalam persen.

Jenis sensor komposit

Sensor komposit menghasilkan data dengan memproses dan/atau menggabungkan data dari satu atau beberapa sensor fisik. (Sensor apa pun yang bukan sensor dasar disebut sensor komposit.) Contoh sensor komposit meliputi:

  • Detektor langkah dan gerakan signifikan , yang biasanya didasarkan pada akselerometer, tetapi dapat juga didasarkan pada sensor lain, jika konsumsi daya dan akurasi dapat diterima.
  • Vektor rotasi permainan , berdasarkan akselerometer dan giroskop.
  • Giroskop tidak terkalibrasi , yang mirip dengan sensor dasar giroskop, tetapi dengan kalibrasi bias dilaporkan secara terpisah alih-alih dikoreksi dalam pengukuran.

Seperti sensor dasar, karakteristik sensor komposit berasal dari karakteristik data akhir mereka. Misalnya, konsumsi daya dari vektor rotasi permainan mungkin sama dengan jumlah konsumsi daya dari chip akselerometer, chip giroskop, chip yang memproses data, dan bus yang mengangkut data. Sebagai contoh lain, penyimpangan vektor rotasi permainan sangat bergantung pada kualitas algoritme kalibrasi seperti pada karakteristik sensor fisik.

Tabel berikut mencantumkan jenis sensor komposit yang tersedia. Setiap sensor komposit bergantung pada data dari satu atau beberapa sensor fisik. Hindari memilih sensor fisik dasar lainnya untuk memperkirakan hasil karena memberikan pengalaman pengguna yang buruk.

Jenis sensor Kategori Sensor fisik yang mendasari Mode pelaporan

Vektor rotasi permainan

Sikap

Akselerometer, giroskop, TIDAK HARUS MENGGUNAKAN magnetometer

Kontinu

Vektor rotasi geomagnetik Sensor daya rendah

Sikap

Akselerometer, magnetometer, TIDAK HARUS MENGGUNAKAN giroskop

Kontinu

Gerakan sekilas Sensor daya rendah

Interaksi

Tidak terdefinisi

Satu tembakan

Gravitasi

Sikap

Akselerometer, giroskop

Kontinu

Giroskop tidak dikalibrasi

Tidak terkalibrasi

Giroskop

Kontinu

Percepatan linier

Aktivitas

Akselerometer, giroskop (jika ada), atau magnetometer (jika giroskop tidak ada)

Kontinu

Medan magnet tidak dikalibrasi

Tidak terkalibrasi

magnetometer

Kontinu

Orientasi (tidak digunakan lagi)

Sikap

Akselerometer, magnetometer, giroskop (jika ada)

Kontinu

Angkat isyarat Sensor daya rendah

Interaksi

Tidak terdefinisi

Satu tembakan

vektor rotasi

Sikap

Akselerometer, magnetometer, giroskop

Kontinu

Gerakan signifikan Sensor daya rendah

Aktivitas

Accelerometer (atau lainnya selama daya sangat rendah)

Satu tembakan

Penghitung langkah Sensor daya rendah

Aktivitas

Akselerometer

Dalam perubahan

Detektor langkah Sensor daya rendah

Aktivitas

Akselerometer

Spesial

Detektor kemiringan Sensor daya rendah

Aktivitas

Akselerometer

Spesial

Gerakan bangun Sensor daya rendah

Interaksi

Tidak terdefinisi

Satu tembakan

Sensor daya rendah = Sensor daya rendah

Sensor komposit aktivitas

Percepatan linier

Sensor fisik yang mendasari: Akselerometer dan (jika ada) giroskop (atau magnetometer jika giroskop tidak ada)

Mode pelaporan: Berkelanjutan

getDefaultSensor(SENSOR_TYPE_LINEAR_ACCELERATION) mengembalikan sensor non-bangun

Sensor akselerasi linier melaporkan akselerasi linier perangkat dalam bingkai sensor, tidak termasuk gravitasi.

Keluarannya secara konseptual: keluaran akselerometer dikurangi keluaran sensor gravitasi . Ini dilaporkan dalam m/s^2 di bidang x, y, dan z dari sensors_event_t.acceleration .

Pembacaan pada semua sumbu harus mendekati 0 saat perangkat tidak bergerak.

Jika perangkat memiliki giroskop, sensor percepatan linier harus menggunakan giroskop dan akselerometer sebagai masukan.

Jika perangkat tidak memiliki giroskop, sensor percepatan linier harus menggunakan akselerometer dan magnetometer sebagai masukan.

Gerakan signifikan

Sensor fisik yang mendasari: Accelerometer (atau lainnya selama daya rendah)

Mode pelaporan: Satu tembakan

Daya rendah

Terapkan hanya versi bangun dari sensor ini.

getDefaultSensor(SENSOR_TYPE_SIGNIFICANT_MOTION) mengembalikan sensor bangun

Detektor gerakan signifikan terpicu saat mendeteksi gerakan signifikan : gerakan yang dapat menyebabkan perubahan di lokasi pengguna.

Contoh gerakan signifikan tersebut adalah:

  • Berjalan kaki atau bersepeda
  • Duduk di mobil yang bergerak, pelatih, atau kereta api

Contoh situasi yang tidak memicu gerakan signifikan:

  • Telepon di saku dan orang tidak bergerak
  • Telepon ada di atas meja dan meja sedikit bergetar karena lalu lintas atau mesin cuci terdekat

Pada tingkat tinggi, detektor gerakan signifikan digunakan untuk mengurangi konsumsi daya penentuan lokasi. Ketika algoritme pelokalan mendeteksi bahwa perangkat statis, mereka dapat beralih ke mode daya rendah, di mana mereka mengandalkan gerakan signifikan untuk membangunkan perangkat saat pengguna mengubah lokasi.

Sensor ini harus berdaya rendah. Itu membuat tradeoff untuk konsumsi daya yang dapat menghasilkan sejumlah kecil negatif palsu. Ini dilakukan karena beberapa alasan:

  • Tujuan dari sensor ini adalah untuk menghemat daya.
  • Memicu suatu peristiwa saat pengguna tidak bergerak (positif palsu) membutuhkan biaya yang mahal dalam hal daya, sehingga harus dihindari.
  • Tidak memicu peristiwa saat pengguna bergerak (negatif palsu) dapat diterima selama tidak dilakukan berulang kali. Jika pengguna telah berjalan selama 10 detik, tidak memicu peristiwa dalam 10 detik itu tidak dapat diterima.

Setiap peristiwa sensor melaporkan 1 dalam sensors_event_t.data[0] .

Detektor langkah

Sensor fisik yang mendasari: Accelerometer (+ mungkin yang lain selama daya rendah)

Mode pelaporan: Spesial (satu peristiwa per langkah yang diambil)

Daya rendah

getDefaultSensor(SENSOR_TYPE_STEP_DETECTOR) mengembalikan sensor non-bangun

Detektor langkah menghasilkan peristiwa setiap kali pengguna mengambil langkah.

Stempel waktu dari event sensors_event_t.timestamp sesuai dengan saat kaki menyentuh tanah, menghasilkan variasi akselerasi yang tinggi.

Dibandingkan dengan penghitung langkah, detektor langkah harus memiliki latensi yang lebih rendah (kurang dari dua detik). Detektor langkah dan penghitung langkah mendeteksi saat pengguna berjalan, berlari, dan menaiki tangga. Mereka tidak boleh terpicu saat pengguna bersepeda, mengemudi, atau di kendaraan lain.

Sensor ini harus berdaya rendah. Artinya, jika deteksi langkah tidak dapat dilakukan di perangkat keras, sensor ini tidak boleh ditentukan. Khususnya, ketika pendeteksi langkah diaktifkan dan akselerometer tidak, hanya langkah yang harus memicu interupsi (tidak setiap pembacaan akselerometer).

sampling_period_ns tidak berdampak pada pendeteksi langkah.

Setiap peristiwa sensor melaporkan 1 dalam sensors_event_t.data[0] .

Penghitung langkah

Sensor fisik yang mendasari: Accelerometer (+ mungkin yang lain selama daya rendah)

Mode pelaporan: Saat berubah

Daya rendah

getDefaultSensor(SENSOR_TYPE_STEP_COUNTER) mengembalikan sensor non-bangun

Penghitung langkah melaporkan jumlah langkah yang diambil oleh pengguna sejak reboot terakhir saat diaktifkan.

Pengukuran dilaporkan sebagai uint64_t di sensors_event_t.step_counter dan direset ke nol hanya pada reboot sistem.

Stempel waktu acara diatur ke waktu saat langkah terakhir untuk acara itu diambil.

Lihat jenis sensor Detektor langkah untuk mengetahui waktu langkah.

Dibandingkan dengan pendeteksi langkah, penghitung langkah dapat memiliki latensi yang lebih tinggi (hingga 10 detik). Berkat latensi ini, sensor ini memiliki akurasi tinggi; jumlah langkah setelah satu hari penuh pengukuran harus berada dalam 10% dari jumlah langkah yang sebenarnya. Detektor langkah dan penghitung langkah mendeteksi saat pengguna berjalan, berlari, dan menaiki tangga. Mereka tidak boleh terpicu saat pengguna bersepeda, mengemudi, atau di kendaraan lain.

Perangkat keras harus memastikan jumlah langkah internal tidak pernah meluap. Ukuran minimum penghitung internal perangkat keras harus 16 bit. Dalam kasus overflow yang akan segera terjadi (paling banyak setiap ~2^16 langkah), SoC dapat dibangunkan sehingga pengemudi dapat melakukan pemeliharaan counter.

Sebagaimana dinyatakan dalam Interaksi , saat sensor ini beroperasi, sensor ini tidak akan mengganggu sensor lain, khususnya, akselerometer, yang mungkin sedang digunakan.

Jika perangkat tertentu tidak dapat mendukung mode operasi ini, maka jenis sensor ini tidak boleh dilaporkan oleh HAL. Artinya, tidak dapat diterima untuk "meniru" sensor ini di HAL.

Sensor ini harus berdaya rendah. Artinya, jika deteksi langkah tidak dapat dilakukan di perangkat keras, sensor ini tidak boleh ditentukan. Khususnya, ketika penghitung langkah diaktifkan dan akselerometer tidak, hanya langkah yang harus memicu interupsi (bukan data akselerometer).

Detektor kemiringan

Sensor fisik yang mendasari: Accelerometer (+ mungkin yang lain selama daya rendah)

Mode pelaporan: Spesial

Daya rendah

Terapkan hanya versi bangun dari sensor ini.

getDefaultSensor(SENSOR_TYPE_TILT_DETECTOR) mengembalikan sensor bangun

Detektor kemiringan menghasilkan peristiwa setiap kali peristiwa kemiringan terdeteksi.

Peristiwa kemiringan ditentukan oleh arah gravitasi rata-rata jendela 2 detik yang berubah setidaknya 35 derajat sejak aktivasi atau peristiwa terakhir yang dihasilkan oleh sensor. Berikut algoritmanya:

  • reference_estimated_gravity = rata-rata pengukuran akselerometer selama detik pertama setelah aktivasi atau perkiraan gravitasi saat peristiwa kemiringan terakhir dihasilkan.
  • current_estimated_gravity = rata-rata pengukuran akselerometer selama 2 detik terakhir.
  • Pemicu saat angle(reference_estimated_gravity, current_estimated_gravity) > 35 degrees

Akselerasi besar tanpa perubahan orientasi ponsel seharusnya tidak memicu peristiwa kemiringan. Misalnya, tikungan tajam atau akselerasi kuat saat mengemudikan mobil seharusnya tidak memicu peristiwa miring, meskipun sudut akselerasi rata-rata mungkin berbeda lebih dari 35 derajat. Biasanya, sensor ini diimplementasikan hanya dengan bantuan akselerometer. Sensor lain juga dapat digunakan jika tidak meningkatkan konsumsi daya secara signifikan. Ini adalah sensor berdaya rendah yang memungkinkan SoC masuk ke mode tunda. Jangan meniru sensor ini di HAL. Setiap peristiwa sensor melaporkan 1 dalam sensors_event_t.data[0] .

Sensor komposit sikap

vektor rotasi

Sensor fisik yang mendasari: Akselerometer, magnetometer, dan giroskop

Mode pelaporan: Berkelanjutan

getDefaultSensor(SENSOR_TYPE_ROTATION_VECTOR) mengembalikan sensor non-bangun

Sensor vektor rotasi melaporkan orientasi perangkat relatif terhadap bingkai koordinat Timur-Utara-Atas. Biasanya diperoleh dengan integrasi pembacaan accelerometer, gyroscope, dan magnetometer. Sistem koordinat Timur-Utara-Up didefinisikan sebagai basis ortonormal langsung di mana:

  • X menunjuk ke timur dan bersinggungan dengan tanah.
  • Y menunjuk ke utara dan bersinggungan dengan tanah.
  • Z menunjuk ke arah langit dan tegak lurus dengan tanah.

Orientasi telepon diwakili oleh rotasi yang diperlukan untuk menyelaraskan koordinat Timur-Utara-Atas dengan koordinat telepon. Artinya, menerapkan rotasi ke bingkai dunia (X,Y,Z) akan menyelaraskannya dengan koordinat telepon (x,y,z).

Rotasi dapat dilihat sebagai memutar telepon dengan sudut teta di sekitar sumbu rot_axis untuk beralih dari orientasi perangkat referensi (Sejajar Timur-Utara-Atas) ke orientasi perangkat saat ini. Rotasi dikodekan sebagai empat komponen x, y, z, w tanpa unit dari empat unit:

  • sensors_event_t.data[0] = rot_axis.x*sin(theta/2)
  • sensors_event_t.data[1] = rot_axis.y*sin(theta/2)
  • sensors_event_t.data[2] = rot_axis.z*sin(theta/2)
  • sensors_event_t.data[3] = cos(theta/2)

Di mana:

  • Bidang x, y, dan z dari rot_axis adalah koordinat Timur-Utara-Atas dari vektor satuan panjang yang mewakili sumbu rotasi
  • theta adalah sudut rotasi

Quaternion adalah quaternion unit: Itu harus norma 1 . Kegagalan untuk memastikan ini akan menyebabkan perilaku klien yang tidak menentu.

Selain itu, sensor ini melaporkan perkiraan akurasi heading:

sensors_event_t.data[4] = estimated_accuracy (dalam radian)

Kesalahan judul harus kurang dari 95% estimated_accuracy . Sensor ini harus menggunakan giroskop sebagai input perubahan orientasi utama.

Sensor ini juga menggunakan input akselerometer dan magnetometer untuk mengimbangi penyimpangan giroskop, dan tidak dapat diimplementasikan hanya dengan akselerometer dan magnetometer.

Vektor rotasi permainan

Sensor fisik yang mendasari: Akselerometer dan giroskop (tanpa magnetometer)

Mode pelaporan: Berkelanjutan

getDefaultSensor(SENSOR_TYPE_GAME_ROTATION_VECTOR) mengembalikan sensor non-bangun

Sensor vektor rotasi game mirip dengan sensor vektor rotasi tetapi tidak menggunakan medan geomagnetik. Oleh karena itu sumbu Y tidak menunjuk ke utara melainkan ke beberapa referensi lain. Referensi itu dibiarkan melayang dengan urutan besarnya yang sama seperti giroskop melayang di sekitar sumbu Z.

Lihat sensor vektor Rotasi untuk detail tentang cara menyetel sensors_event_t.data[0-3] . Sensor ini tidak melaporkan perkiraan akurasi heading: sensors_event_t.data[4] dicadangkan dan harus disetel ke 0 .

Dalam kasus yang ideal, ponsel yang diputar dan dikembalikan ke orientasi dunia nyata yang sama harus melaporkan vektor rotasi game yang sama.

Sensor ini harus didasarkan pada giroskop dan akselerometer. Itu tidak dapat menggunakan magnetometer sebagai input, selain itu, secara tidak langsung, melalui estimasi bias giroskop.

Gravitasi

Sensor fisik yang mendasari: Akselerometer dan (jika ada) giroskop (atau magnetometer jika giroskop tidak ada)

Mode pelaporan: Berkelanjutan

getDefaultSensor(SENSOR_TYPE_GRAVITY) mengembalikan sensor non-bangun

Sensor gravitasi melaporkan arah dan besaran gravitasi dalam koordinat perangkat.

Komponen vektor gravitasi dilaporkan dalam m/s^2 di bidang x, y, dan z sensors_event_t.acceleration .

Saat perangkat dalam keadaan diam, keluaran sensor gravitasi harus sama dengan keluaran akselerometer. Di Bumi, besarnya sekitar 9,8 m/s^2.

Jika perangkat memiliki giroskop, sensor gravitasi harus menggunakan giroskop dan akselerometer sebagai masukan.

Jika perangkat tidak memiliki giroskop, sensor gravitasi harus menggunakan akselerometer dan magnetometer sebagai masukan.

Vektor rotasi geomagnetik

Sensor fisik yang mendasari: Akselerometer dan magnetometer (tanpa giroskop)

Mode pelaporan: Berkelanjutan

Daya rendah

getDefaultSensor(SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR) mengembalikan sensor non-bangun

Sebuah vektor rotasi geomagnetik mirip dengan sensor vektor rotasi tetapi menggunakan magnetometer dan tidak ada giroskop.

Sensor ini harus didasarkan pada magnetometer. Itu tidak dapat diimplementasikan menggunakan giroskop, dan input giroskop tidak dapat digunakan oleh sensor ini.

Lihat sensor vektor Rotasi untuk detail tentang cara menyetel sensors_event_t.data[0-4] .

Sama seperti untuk sensor vektor rotasi, kesalahan heading harus kurang dari akurasi yang diperkirakan ( sensors_event_t.data[4] ) 95% dari waktu.

Sensor ini harus berdaya rendah, sehingga harus diimplementasikan pada perangkat keras.

Orientasi (tidak digunakan lagi)

Sensor fisik yang mendasari: Akselerometer, magnetometer, dan (jika ada) giroskop

Mode pelaporan: Berkelanjutan

getDefaultSensor(SENSOR_TYPE_ORIENTATION) mengembalikan sensor non-bangun

Catatan: Ini adalah jenis sensor lama yang tidak digunakan lagi di Android SDK. Ini telah digantikan oleh sensor vektor rotasi, yang lebih jelas. Gunakan sensor vektor rotasi di atas sensor orientasi bila memungkinkan.

Sensor orientasi melaporkan sikap perangkat. Pengukuran dilaporkan dalam derajat di bidang x, y, dan z dari sensors_event_t.orientation :

  • sensors_event_t.orientation.x : azimuth, sudut antara arah utara magnet dan sumbu Y, di sekitar sumbu Z ( 0<=azimuth<360 ). 0=Utara, 90=Timur, 180=Selatan, 270=Barat.
  • sensors_event_t.orientation.y : pitch, rotasi di sekitar sumbu X ( -180<=pitch<=180 ), dengan nilai positif saat sumbu Z bergerak menuju sumbu Y.
  • sensors_event_t.orientation.z : roll, rotasi di sekitar sumbu Y ( -90<=roll<=90 ), dengan nilai positif ketika sumbu X bergerak menuju sumbu Z.

Harap dicatat, untuk alasan historis sudut gulungan positif searah jarum jam. (Secara matematis, itu harus positif dalam arah berlawanan arah jarum jam):

Penggambaran orientasi relatif terhadap perangkat

Gambar 3. Orientasi relatif terhadap perangkat

Definisi ini berbeda dengan yaw, pitch, dan roll yang digunakan dalam penerbangan dimana sumbu X berada di sepanjang sisi panjang pesawat (tail to nose).

Sensor orientasi juga melaporkan seberapa akurat pembacaan yang diharapkan melalui sensors_event_t.orientation.status . Lihat SensorManager SENSOR_STATUS_* untuk informasi lebih lanjut tentang kemungkinan nilai untuk bidang ini.

Sensor yang tidak dikalibrasi

Sensor yang tidak dikalibrasi memberikan hasil yang lebih mentah dan mungkin menyertakan beberapa bias tetapi juga mengandung lebih sedikit "lompatan" dari koreksi yang diterapkan melalui kalibrasi. Beberapa aplikasi mungkin lebih menyukai hasil yang tidak dikalibrasi ini karena lebih halus dan lebih andal. Misalnya, jika aplikasi mencoba melakukan fusi sensornya sendiri, memperkenalkan kalibrasi sebenarnya dapat mendistorsi hasil.

Akselerometer tidak dikalibrasi

Sensor fisik yang mendasari: Akselerometer

Mode pelaporan: Berkelanjutan

getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED) mengembalikan sensor non-bangun

Sensor akselerometer yang tidak dikalibrasi melaporkan akselerasi perangkat di sepanjang tiga sumbu sensor tanpa koreksi bias (bias pabrik dan kompensasi suhu diterapkan pada pengukuran yang tidak dikalibrasi), bersama dengan perkiraan bias. Semua nilai dalam satuan SI (m/s^2) dan dilaporkan di bidang sensors_event_t.uncalibrated_accelerometer :

  • x_uncalib : percepatan (tanpa kompensasi bias) sepanjang sumbu X
  • y_uncalib : percepatan (tanpa kompensasi bias) sepanjang sumbu Y
  • z_uncalib : percepatan (tanpa kompensasi bias) sepanjang sumbu Z
  • x_bias : perkiraan bias sepanjang sumbu X
  • y_bias : estimasi bias sepanjang sumbu Y
  • z_bias : perkiraan bias sepanjang sumbu Z

Giroskop tidak dikalibrasi

Sensor fisik yang mendasari: Giroskop

Mode pelaporan: Berkelanjutan

getDefaultSensor(SENSOR_TYPE_GYROSCOPE_UNCALIBRATED) mengembalikan sensor non-bangun

Giroskop yang tidak dikalibrasi melaporkan laju rotasi di sekitar sumbu sensor tanpa menerapkan kompensasi bias padanya, bersama dengan perkiraan bias. Semua nilai dalam radian/detik dan dilaporkan dalam bidang sensors_event_t.uncalibrated_gyro :

  • x_uncalib : kecepatan sudut (tanpa kompensasi drift) di sekitar sumbu X
  • y_uncalib : kecepatan sudut (tanpa kompensasi drift) di sekitar sumbu Y
  • z_uncalib : kecepatan sudut (tanpa kompensasi drift) di sekitar sumbu Z
  • x_bias : perkiraan penyimpangan di sekitar sumbu X
  • y_bias : perkiraan penyimpangan di sekitar sumbu Y
  • z_bias : perkiraan penyimpangan di sekitar sumbu Z

Secara konseptual, pengukuran yang tidak dikalibrasi adalah jumlah dari pengukuran yang dikalibrasi dan estimasi bias: _uncalibrated = _calibrated + _bias .

Nilai x_bias , y_bias dan z_bias diharapkan melompat segera setelah perkiraan bias berubah, dan mereka harus stabil sepanjang waktu.

Lihat definisi sensor giroskop untuk detail tentang sistem koordinat yang digunakan.

Kalibrasi pabrik dan kompensasi suhu harus diterapkan pada pengukuran. Selain itu, estimasi drift giroskop harus diterapkan sehingga estimasi yang masuk akal dapat dilaporkan dalam x_bias , y_bias dan z_bias . Jika implementasi tidak dapat memperkirakan drift, maka sensor ini tidak boleh diimplementasikan.

Jika sensor ini ada, maka sensor Giroskop yang sesuai juga harus ada dan kedua sensor harus memiliki nilai sensor_t.name dan sensor_t.vendor yang sama.

Medan magnet tidak dikalibrasi

Sensor fisik yang mendasari: Magnetometer

Mode pelaporan: Berkelanjutan

getDefaultSensor(SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED) mengembalikan sensor non-bangun

Sensor medan magnet yang tidak dikalibrasi melaporkan medan magnet sekitar bersama dengan perkiraan kalibrasi besi keras. Semua nilai dalam micro-Tesla (uT) dan dilaporkan di bidang sensors_event_t.uncalibrated_magnetic :

  • x_uncalib : medan magnet (tanpa kompensasi besi keras) di sepanjang sumbu X
  • y_uncalib : medan magnet (tanpa kompensasi besi keras) di sepanjang sumbu Y
  • z_uncalib : medan magnet (tanpa kompensasi besi keras) di sepanjang sumbu Z
  • x_bias : perkiraan bias besi keras sepanjang sumbu X
  • y_bias : perkiraan bias besi keras sepanjang sumbu Y
  • z_bias : perkiraan bias besi keras sepanjang sumbu Z

Secara konseptual, pengukuran yang tidak dikalibrasi adalah jumlah dari pengukuran yang dikalibrasi dan estimasi bias: _uncalibrated = _calibrated + _bias .

Magnetometer yang tidak dikalibrasi memungkinkan algoritme tingkat yang lebih tinggi untuk menangani estimasi besi keras yang buruk. Nilai x_bias , y_bias dan z_bias diharapkan melompat segera setelah perkiraan hard-iron berubah, dan mereka harus stabil sepanjang waktu.

Kalibrasi besi lunak dan kompensasi suhu harus diterapkan pada pengukuran. Selain itu, estimasi hard-iron harus diterapkan sehingga estimasi yang masuk akal dapat dilaporkan dalam x_bias , y_bias dan z_bias . Jika implementasi tidak dapat memperkirakan bias, maka sensor ini tidak boleh diimplementasikan.

Jika sensor ini ada, maka sensor medan magnet yang sesuai harus ada dan kedua sensor harus memiliki nilai sensor_t.name dan sensor_t.vendor yang sama.

Sudut engsel

Mode pelaporan: Saat berubah

getDefaultSensor(SENSOR_TYPE_HINGE_ANGLE) mengembalikan sensor bangun

Sensor sudut engsel mengukur sudut, dalam derajat, antara dua bagian integral perangkat. Pergerakan engsel yang diukur dengan jenis sensor ini diharapkan dapat mengubah cara pengguna dapat berinteraksi dengan perangkat, misalnya, dengan membuka atau membuka tampilan.

Sensor komposit interaksi

Beberapa sensor sebagian besar digunakan untuk mendeteksi interaksi dengan pengguna. We don't define how those sensors must be implemented, but they must be low power and it's the responsibility of the device manufacturer to verify their quality in terms of user experience.

Wake up gesture

Underlying physical sensors: Undefined (anything low power)

Reporting-mode: One-shot

Low-power

Implement only the wake-up version of this sensor.

getDefaultSensor(SENSOR_TYPE_WAKE_GESTURE) returns a wake-up sensor

A wake up gesture sensor enables waking up the device based on a device specific motion. When this sensor triggers, the device behaves as if the power button was pressed, turning the screen on. This behavior (turning on the screen when this sensor triggers) might be deactivated by the user in the device settings. Changes in settings don't impact the behavior of the sensor: only whether the framework turns the screen on when it triggers. The actual gesture to be detected isn't specified, and can be chosen by the manufacturer of the device.

This sensor must be low power, as it's likely to be activated 24/7.

Each sensor event reports 1 in sensors_event_t.data[0] .

Pick up gesture

Underlying physical sensors: Undefined (anything low power)

Reporting-mode: One-shot

Low-power

Implement only the wake-up version of this sensor.

getDefaultSensor(SENSOR_TYPE_PICK_UP_GESTURE) returns a wake-up sensor

A pick-up gesture sensor triggers when the device is picked up regardless of wherever it was before (desk, pocket, bag).

Each sensor event reports 1 in sensors_event_t.data[0] .

Glance gesture

Underlying physical sensors: Undefined (anything low power)

Reporting-mode: One-shot

Low-power

Implement only the wake-up version of this sensor.

getDefaultSensor(SENSOR_TYPE_GLANCE_GESTURE) returns a wake-up sensor

A glance gesture sensor enables briefly turning the screen on to enable the user to glance content on screen based on a specific motion. When this sensor triggers, the device will turn the screen on momentarily to allow the user to glance notifications or other content while the device remains locked in a non-interactive state (dozing), then the screen will turn off again. This behavior (briefly turning on the screen when this sensor triggers) might be deactivated by the user in the device settings. Changes in settings do not impact the behavior of the sensor: only whether the framework briefly turns the screen on when it triggers. The actual gesture to be detected isn't specified, and can be chosen by the manufacturer of the device.

This sensor must be low power, as it's likely to be activated 24/7. Each sensor event reports 1 in sensors_event_t.data[0] .