Types de capteurs

Cette section décrit les axes des capteurs, les capteurs de base et les capteurs composites (activité, attitude, non calibré et interaction).

Axes du capteur

Les valeurs d'événement de capteur provenant de nombreux capteurs sont exprimées dans un cadre spécifique qui est statique par rapport à l'appareil.

Axes des appareils mobiles

L'API Sensor est relative uniquement à l'orientation naturelle de l'écran (les axes ne sont pas inversés lorsque l'orientation de l'écran de l'appareil change.

Système de coordonnées de l'API du capteur pour les appareils mobiles

Figure 1. Système de coordonnées (par rapport à un appareil mobile) utilisé par l'API Sensor

Axes automobiles

Dans les implémentations Android Automotive, les axes sont définis par rapport au châssis du véhicule. L'origine du référentiel du véhicule est le centre du train arrière. Le référentiel véhicule est orienté de telle sorte que :

  • L'axe X pointe vers la droite et se trouve sur un plan horizontal, perpendiculaire au plan de symétrie du véhicule.
  • L’axe Y pointe vers l’avant et se trouve sur un plan horizontal.
Système de coordonnées API de capteur pour les appareils automobiles

Figure 2. Système de coordonnées (par rapport à un appareil automobile) utilisé par l'API Sensor

Le référentiel du véhicule est un système de coordonnées droitier. Par conséquent, l’axe Z pointe vers le haut.

L'axe Z du cadre de référence est aligné sur la gravité, ce qui signifie que les axes X et Y sont tous deux horizontaux. Par conséquent, l’axe Y ne passe pas toujours par l’essieu avant.

Capteurs de base

Les types de capteurs de base portent le nom des capteurs physiques qu'ils représentent. Ces capteurs relaient les données d'un seul capteur physique (par opposition aux capteurs composites qui génèrent des données à partir d'autres capteurs). Voici des exemples de types de capteurs de base :

  • SENSOR_TYPE_ACCELEROMETER
  • SENSOR_TYPE_GYROSCOPE
  • SENSOR_TYPE_MAGNETOMETER

Cependant, les capteurs de base ne sont pas égaux et ne doivent pas être confondus avec leur capteur physique sous-jacent. Les données d'un capteur de base ne constituent pas la sortie brute du capteur physique car des corrections (telles que la compensation de biais et la compensation de température) sont appliquées.

Par exemple, les caractéristiques d'un capteur de base peuvent être différentes de celles de son capteur physique sous-jacent dans les cas d'utilisation suivants :

  • Une puce de gyroscope conçue pour avoir une plage de polarisation de 1 deg/sec.
    • Après l'étalonnage en usine, la compensation de température et la compensation de biais sont appliquées, le biais réel du capteur Android sera réduit, peut-être jusqu'à un point où le biais est garanti être inférieur à 0,01 deg/sec.
    • Dans cette situation, nous disons que le capteur Android a un biais inférieur à 0,01 deg/sec, même si la fiche technique du capteur sous-jacent indique 1 deg/sec.
  • Un baromètre avec une consommation électrique de 100 uW.
    • Étant donné que les données générées doivent être transportées de la puce vers le SoC, le coût énergétique réel pour collecter les données du capteur baromètre Android peut être beaucoup plus élevé, par exemple 1 000 uW.
    • Dans cette situation, nous disons que le capteur Android a une consommation électrique de 1 000 uW, même si la consommation électrique mesurée au niveau des fils de la puce du baromètre est de 100 uW.
  • Un magnétomètre qui consomme 100uW lors du calibrage, mais consomme plus lors du calibrage.
    • Sa routine d'étalonnage peut nécessiter l'activation du gyroscope, consommant 5 000 uW, et l'exécution d'un algorithme, coûtant 900 uW supplémentaires.
    • Dans cette situation, nous disons que la consommation électrique maximale du capteur Android (magnétomètre) est de 6 000 uW.
    • Dans ce cas, la consommation électrique moyenne est la mesure la plus utile, et c'est ce qui est rapporté dans les caractéristiques statiques du capteur via le HAL.

Accéléromètre

Mode de rapport : continu

getDefaultSensor(SENSOR_TYPE_ACCELEROMETER) renvoie un capteur sans réveil

Un capteur accéléromètre rapporte l'accélération de l'appareil le long des trois axes du capteur. L'accélération mesurée comprend à la fois l'accélération physique (changement de vitesse) et la gravité. La mesure est signalée dans les champs x, y et z de sensor_event_t.acceleration.

Toutes les valeurs sont en unités SI (m/s^2) et mesurent l'accélération de l'appareil moins la force de gravité le long des trois axes du capteur.

Voici des exemples :

  • La norme de (x, y, z) doit être proche de 0 en chute libre.
  • Lorsque l'appareil repose à plat sur une table et est poussé du côté gauche vers la droite, la valeur d'accélération x est positive.
  • Lorsque l'appareil repose à plat sur une table, la valeur d'accélération selon z est de +9,81 alo, ce qui correspond à l'accélération de l'appareil (0 m/s^2) moins la force de gravité (-9,81 m/s^2).
  • Lorsque l'appareil repose à plat sur une table et est poussé vers le ciel, la valeur d'accélération est supérieure à +9,81, ce qui correspond à l'accélération de l'appareil (+A m/s^2) moins la force de gravité (-9,81 m /s^2).

Les lectures sont calibrées à l'aide de :

  • Compensation de température
  • Étalonnage du biais en ligne
  • Étalonnage de balance en ligne

Le calibrage du biais et de l'échelle ne doit être mis à jour que lorsque le capteur est désactivé, afin d'éviter de provoquer des sauts de valeurs lors du streaming.

L'accéléromètre indique également la précision avec laquelle il s'attend à ce que ses lectures soient précises via sensors_event_t.acceleration.status . Voir les constantes SENSOR_STATUS_* du SensorManager pour plus d'informations sur les valeurs possibles pour ce champ.

Température ambiante

Mode de reporting : en cas de changement

getDefaultSensor(SENSOR_TYPE_AMBIENT_TEMPERATURE) renvoie un capteur sans réveil

Ce capteur fournit la température ambiante (pièce) en degrés Celsius.

Capteur de champ magnétique

Mode de rapport : continu

getDefaultSensor(SENSOR_TYPE_MAGNETIC_FIELD) renvoie un capteur sans réveil

SENSOR_TYPE_GEOMAGNETIC_FIELD == SENSOR_TYPE_MAGNETIC_FIELD

Un capteur de champ magnétique (également appelé magnétomètre) signale le champ magnétique ambiant, tel que mesuré le long des trois axes du capteur.

La mesure est rapportée dans les champs x, y et z de sensors_event_t.magnetic et toutes les valeurs sont en micro-Tesla (uT).

Le magnétomètre indique également la précision avec laquelle il s'attend à ce que ses lectures soient précises via sensors_event_t.magnetic.status . Voir les constantes SENSOR_STATUS_* du SensorManager pour plus d'informations sur les valeurs possibles pour ce champ.

Les lectures sont calibrées à l'aide de :

  • Compensation de température
  • Étalonnage du fer doux en usine (ou en ligne)
  • Étalonnage en ligne du fer dur

Gyroscope

Mode de rapport : continu

getDefaultSensor(SENSOR_TYPE_GYROSCOPE) renvoie un capteur sans réveil

Un capteur gyroscope rapporte la vitesse de rotation de l'appareil autour des trois axes du capteur.

La rotation est positive dans le sens antihoraire (règle de droite). Autrement dit, un observateur regardant depuis un emplacement positif sur l'axe x, y ou z un appareil positionné sur l'origine signalerait une rotation positive si l'appareil semblait tourner dans le sens inverse des aiguilles d'une montre. Notez qu'il s'agit de la définition mathématique standard de la rotation positive et qu'elle ne correspond pas à la définition aérospatiale du roulis.

La mesure est rapportée dans les champs x, y et z de sensors_event_t.gyro et toutes les valeurs sont en radians par seconde (rad/s).

Les lectures sont calibrées à l'aide de :

  • Compensation de température
  • Compensation de balance en usine (ou en ligne)
  • Étalonnage du biais en ligne (pour supprimer la dérive)

Le gyroscope indique également la précision avec laquelle il s'attend à ce que ses lectures soient précises via sensors_event_t.gyro.status . Voir les constantes SENSOR_STATUS_* du SensorManager pour plus d'informations sur les valeurs possibles pour ce champ.

Le gyroscope ne peut pas être émulé sur la base de magnétomètres et d'accéléromètres, car cela entraînerait une réduction de la cohérence et de la réactivité locales. Il doit être basé sur une puce gyroscopique habituelle.

Rythme cardiaque

Mode de reporting : en cas de changement

getDefaultSensor(SENSOR_TYPE_HEART_RATE) renvoie un capteur sans réveil

Un capteur de fréquence cardiaque indique la fréquence cardiaque actuelle de la personne qui touche l'appareil.

La fréquence cardiaque actuelle en battements par minute (BPM) est signalée dans sensors_event_t.heart_rate.bpm et l'état du capteur est signalé dans sensors_event_t.heart_rate.status . Voir les constantes SENSOR_STATUS_* du SensorManager pour plus d'informations sur les valeurs possibles pour ce champ. En particulier, lors de la première activation, à moins que l'on sache que l'appareil n'est pas sur le corps, le champ d'état du premier événement doit être défini sur SENSOR_STATUS_UNRELIABLE . Étant donné que ce capteur est en cours de modification, les événements sont générés quand et seulement lorsque heart_rate.bpm ou heart_rate.status ont changé depuis le dernier événement. Les événements ne sont pas générés plus rapidement que chaque sampling_period .

sensor_t.requiredPermission est toujours SENSOR_PERMISSION_BODY_SENSORS .

Lumière

Mode de reporting : en cas de changement

getDefaultSensor(SENSOR_TYPE_LIGHT) renvoie un capteur sans réveil

Un capteur de lumière signale l'éclairage actuel en unités SI lux.

La mesure est rapportée dans sensors_event_t.light .

Proximité

Mode de reporting : en cas de changement

Généralement défini comme un capteur de réveil

getDefaultSensor(SENSOR_TYPE_PROXIMITY) renvoie un capteur de réveil

Un capteur de proximité indique la distance entre le capteur et la surface visible la plus proche.

Jusqu'à Android 4.4, les capteurs de proximité étaient toujours des capteurs de réveil, réveillant le SoC lors de la détection d'un changement de proximité. Après Android 4.4, nous conseillons d'implémenter d'abord la version réveil de ce capteur, car c'est celui qui sert à allumer et éteindre l'écran lors des appels téléphoniques.

La mesure est rapportée en centimètres dans sensors_event_t.distance . Notez que certains capteurs de proximité ne prennent en charge qu'une mesure binaire « proche » ou « lointaine ». Dans ce cas, le capteur signale sa valeur sensor_t.maxRange à l'état « lointain » et une valeur inférieure à sensor_t.maxRange à l'état « proche ».

Pression

Mode de rapport : continu

getDefaultSensor(SENSOR_TYPE_PRESSURE) renvoie un capteur sans réveil

Un capteur de pression (également appelé baromètre) indique la pression atmosphérique en hectopascal (hPa).

Les lectures sont calibrées à l'aide

  • Compensation de température
  • Étalonnage du biais en usine
  • Étalonnage de l'échelle d'usine

Le baromètre est souvent utilisé pour estimer les changements d'altitude. Pour estimer l'altitude absolue, la pression du niveau de la mer (évoluant en fonction de la météo) doit être utilisée comme référence.

Humidité relative

Mode de reporting : en cas de changement

getDefaultSensor(SENSOR_TYPE_RELATIVE_HUMIDITY) renvoie un capteur de non-réveil

Un capteur d'humidité relative mesure l'humidité relative de l'air ambiant et renvoie une valeur en pourcentage.

Types de capteurs composites

Un capteur composite génère des données en traitant et/ou en fusionnant les données d'un ou plusieurs capteurs physiques. (Tout capteur qui n'est pas un capteur de base est appelé capteur composite.) Exemples de capteurs composites :

  • Détecteur de pas et de mouvement significatif , qui sont généralement basés sur un accéléromètre, mais pourraient également être basés sur d'autres capteurs, si la consommation d'énergie et la précision étaient acceptables.
  • Jeu de rotation vectoriel , basé sur un accéléromètre et un gyroscope.
  • Gyroscope non calibré , similaire au capteur de base du gyroscope, mais avec l'étalonnage du biais étant signalé séparément au lieu d'être corrigé dans la mesure.

Comme pour les capteurs de base, les caractéristiques des capteurs composites proviennent des caractéristiques de leurs données finales. Par exemple, la consommation électrique d'un vecteur de rotation de jeu est probablement égale à la somme des consommations électriques de la puce accéléromètre, de la puce gyroscope, de la puce traitant les données et des bus transportant les données. Autre exemple, la dérive d'un vecteur de rotation de jeu dépend autant de la qualité de l'algorithme de calibration que des caractéristiques physiques du capteur.

Le tableau suivant répertorie les types de capteurs composites disponibles. Chaque capteur composite s'appuie sur les données d'un ou plusieurs capteurs physiques. Évitez de choisir d'autres capteurs physiques sous-jacents pour approximer les résultats, car ils offrent une mauvaise expérience utilisateur.

Type de capteur Catégorie Capteurs physiques sous-jacents Mode de rapport

Vecteur de rotation du jeu

Attitude

Accéléromètre, gyroscope, NE DOIT PAS UTILISER de magnétomètre

Continu

Vecteur de rotation géomagnétique Capteur basse consommation

Attitude

Accéléromètre, magnétomètre, NE DOIT PAS UTILISER de gyroscope

Continu

Geste de regard Capteur basse consommation

Interaction

Indéfini

Un tir

La gravité

Attitude

Accéléromètre, gyroscope

Continu

Gyroscope non calibré

Non calibré

Gyroscope

Continu

Accélération linéaire

Activité

Accéléromètre, gyroscope (si présent) ou magnétomètre (si gyroscope non présent)

Continu

Champ magnétique non calibré

Non calibré

Magnétomètre

Continu

Orientation (obsolète)

Attitude

Accéléromètre, magnétomètre, gyroscope (si présent)

Continu

Geste de prise Capteur basse consommation

Interaction

Indéfini

Un tir

Vecteur de rotation

Attitude

Accéléromètre, magnétomètre, gyroscope

Continu

Mouvement important Capteur basse consommation

Activité

Accéléromètre (ou autre à condition de très faible consommation)

Un tir

Compteur de pas Capteur basse consommation

Activité

Accéléromètre

Sur le changement

Détecteur de pas Capteur basse consommation

Activité

Accéléromètre

Spécial

Détecteur d'inclinaison Capteur basse consommation

Activité

Accéléromètre

Spécial

Geste de réveil Capteur basse consommation

Interaction

Indéfini

Un tir

Capteur basse consommation = Capteur faible puissance

Capteurs composites d'activité

Accélération linéaire

Capteurs physiques sous-jacents : accéléromètre et (si présent) gyroscope (ou magnétomètre si le gyroscope n'est pas présent)

Mode de rapport : continu

getDefaultSensor(SENSOR_TYPE_LINEAR_ACCELERATION) renvoie un capteur sans réveil

Un capteur d'accélération linéaire signale l'accélération linéaire de l'appareil dans le cadre du capteur, sans compter la gravité.

La sortie est conceptuellement : la sortie de l' accéléromètre moins la sortie du capteur de gravité . Il est rapporté en m/s^2 dans les champs x, y et z de sensors_event_t.acceleration .

Les lectures sur tous les axes doivent être proches de 0 lorsque l'appareil est immobile.

Si l'appareil possède un gyroscope, le capteur d'accélération linéaire doit utiliser le gyroscope et l'accéléromètre comme entrée.

Si l'appareil ne possède pas de gyroscope, le capteur d'accélération linéaire doit utiliser l'accéléromètre et le magnétomètre comme entrée.

Mouvement important

Capteur physique sous-jacent : Accéléromètre (ou autre à condition de faible consommation)

Mode de rapport : One-shot

Batterie faible

Implémentez uniquement la version de réveil de ce capteur.

getDefaultSensor(SENSOR_TYPE_SIGNIFICANT_MOTION) renvoie un capteur de réveil

Un détecteur de mouvement significatif se déclenche lors de la détection d'un mouvement significatif : un mouvement pouvant entraîner un changement de localisation de l'utilisateur.

Des exemples de mouvements aussi importants sont :

  • Marcher ou faire du vélo
  • Assis dans une voiture, un autocar ou un train en mouvement

Exemples de situations qui ne déclenchent pas de mouvement significatif :

  • Téléphone dans la poche et la personne ne bouge pas
  • Le téléphone est sur une table et la table tremble un peu à cause de la circulation à proximité ou d'une machine à laver

Au niveau élevé, le détecteur de mouvement significatif est utilisé pour réduire la consommation électrique de la détermination de localisation. Lorsque les algorithmes de localisation détectent que l'appareil est statique, ils peuvent passer en mode basse consommation, où ils s'appuient sur un mouvement important pour réveiller l'appareil lorsque l'utilisateur change d'emplacement.

Ce capteur doit être de faible puissance. Cela représente un compromis en termes de consommation d'énergie qui peut entraîner une petite quantité de faux négatifs. Ceci est fait pour plusieurs raisons :

  • Le but de ce capteur est d'économiser de l'énergie.
  • Déclencher un événement lorsque l'utilisateur ne bouge pas (faux positif) est coûteux en énergie, il est donc à éviter.
  • Ne pas déclencher d'événement lorsque l'utilisateur bouge (faux négatif) est acceptable à condition que cela ne soit pas répété. Si l'utilisateur marche depuis 10 secondes, ne pas déclencher d'événement pendant ces 10 secondes n'est pas acceptable.

Chaque événement de capteur signale 1 dans sensors_event_t.data[0] .

Détecteur de pas

Capteur physique sous-jacent : Accéléromètre (+ éventuellement d'autres tant que faible consommation)

Mode de reporting : Spécial (un événement par étape effectuée)

Batterie faible

getDefaultSensor(SENSOR_TYPE_STEP_DETECTOR) renvoie un capteur sans réveil

Un détecteur de pas génère un événement à chaque fois qu'un pas est effectué par l'utilisateur.

L'horodatage de l'événement sensors_event_t.timestamp correspond au moment où le pied touche le sol, générant une forte variation d'accélération.

Par rapport au compteur de pas, le détecteur de pas doit avoir une latence inférieure (moins de deux secondes). Le détecteur de pas et le compteur de pas détectent lorsque l'utilisateur marche, court et monte les escaliers. Ils ne doivent pas se déclencher lorsque l'utilisateur fait du vélo, conduit ou dans d'autres véhicules.

Ce capteur doit être de faible puissance. Autrement dit, si la détection des pas ne peut pas être effectuée matériellement, ce capteur ne doit pas être défini. En particulier, lorsque le détecteur de pas est activé et que l'accéléromètre ne l'est pas, seuls les pas devraient déclencher des interruptions (pas toutes les lectures de l'accéléromètre).

sampling_period_ns n'a aucun impact sur les détecteurs de pas.

Chaque événement de capteur signale 1 dans sensors_event_t.data[0] .

Compteur de pas

Capteur physique sous-jacent : Accéléromètre (+ éventuellement d'autres tant que faible consommation)

Mode de reporting : en cas de changement

Batterie faible

getDefaultSensor(SENSOR_TYPE_STEP_COUNTER) renvoie un capteur sans réveil

Un compteur de pas indique le nombre de pas effectués par l'utilisateur depuis le dernier redémarrage alors qu'il est activé.

La mesure est signalée sous la forme uint64_t dans sensors_event_t.step_counter et est réinitialisée à zéro uniquement lors d'un redémarrage du système.

L'horodatage de l'événement est défini sur l'heure à laquelle la dernière étape de cet événement a été effectuée.

Voir le type de capteur Détecteur de pas pour la signification du temps d'un pas.

Par rapport au détecteur de pas, le compteur de pas peut avoir une latence plus élevée (jusqu'à 10 secondes). Grâce à cette latence, ce capteur présente une grande précision ; le nombre de pas après une journée complète de mesures doit être inférieur à 10 % du nombre de pas réel. Le détecteur de pas et le compteur de pas détectent lorsque l'utilisateur marche, court et monte les escaliers. Ils ne doivent pas se déclencher lorsque l'utilisateur fait du vélo, conduit ou dans d'autres véhicules.

Le matériel doit garantir que le nombre de pas internes ne dépasse jamais. La taille minimale du compteur interne du matériel doit être de 16 bits. En cas de débordement imminent (au maximum toutes les ~2^16 étapes), le SoC peut être réveillé afin que le conducteur puisse effectuer la contre-maintenance.

Comme indiqué dans Interaction , pendant que ce capteur fonctionne, il ne doit perturber aucun autre capteur, en particulier l'accéléromètre, qui pourrait très bien être utilisé.

Si un appareil particulier ne peut pas prendre en charge ces modes de fonctionnement, ce type de capteur ne doit pas être signalé par le HAL. Autrement dit, il n'est pas acceptable d'"émuler" ce capteur dans le HAL.

Ce capteur doit être de faible puissance. Autrement dit, si la détection des pas ne peut pas être effectuée matériellement, ce capteur ne doit pas être défini. En particulier, lorsque le compteur de pas est activé et que l'accéléromètre ne l'est pas, seuls les pas doivent déclencher des interruptions (et non les données de l'accéléromètre).

Détecteur d'inclinaison

Capteur physique sous-jacent : Accéléromètre (+ éventuellement d'autres tant que faible consommation)

Mode de rapport : Spécial

Batterie faible

Implémentez uniquement la version de réveil de ce capteur.

getDefaultSensor(SENSOR_TYPE_TILT_DETECTOR) renvoie un capteur de réveil

Un détecteur d'inclinaison génère un événement chaque fois qu'un événement d'inclinaison est détecté.

Un événement d'inclinaison est défini par la direction de la gravité moyenne de la fenêtre de 2 secondes changeant d'au moins 35 degrés depuis l'activation ou le dernier événement généré par le capteur. Voici l'algorithme :

  • reference_estimated_gravity = moyenne des mesures de l'accéléromètre sur la première seconde après l'activation ou la gravité estimée lorsque le dernier événement d'inclinaison a été généré.
  • current_estimated_gravity = moyenne des mesures de l'accéléromètre sur les 2 dernières secondes.
  • Déclencher lorsque angle(reference_estimated_gravity, current_estimated_gravity) > 35 degrees

De grandes accélérations sans changement d'orientation du téléphone ne devraient pas déclencher un événement d'inclinaison. Par exemple, un virage serré ou une forte accélération en conduisant une voiture ne devrait pas déclencher d'événement d'inclinaison, même si l'angle de l'accélération moyenne peut varier de plus de 35 degrés. Généralement, ce capteur est mis en œuvre à l’aide uniquement d’un accéléromètre. D’autres capteurs peuvent également être utilisés s’ils n’augmentent pas significativement la consommation électrique. Il s'agit d'un capteur basse consommation qui devrait permettre au SoC de passer en mode suspension. N'émulez pas ce capteur dans le HAL. Chaque événement de capteur signale 1 dans sensors_event_t.data[0] .

Capteurs composites d'attitude

Vecteur de rotation

Capteurs physiques sous-jacents : accéléromètre, magnétomètre et gyroscope

Mode de rapport : continu

getDefaultSensor(SENSOR_TYPE_ROTATION_VECTOR) renvoie un capteur sans réveil

Un capteur vectoriel de rotation signale l'orientation de l'appareil par rapport au cadre de coordonnées Est-Nord-Haut. Il est généralement obtenu par intégration des lectures de l'accéléromètre, du gyroscope et du magnétomètre. Le système de coordonnées Est-Nord-Haut est défini comme une base orthonormée directe où :

  • X pointe vers l’est et est tangent au sol.
  • Y pointe vers le nord et est tangent au sol.
  • Z pointe vers le ciel et est perpendiculaire au sol.

L'orientation du téléphone est représentée par la rotation nécessaire pour aligner les coordonnées Est-Nord-Haut avec les coordonnées du téléphone. Autrement dit, appliquer la rotation au cadre mondial (X, Y, Z) les alignerait avec les coordonnées du téléphone (x, y, z).

La rotation peut être considérée comme une rotation du téléphone d'un angle thêta autour d'un axe rot_axis pour passer de l'orientation de référence (alignée Est-Nord-Haut) de l'appareil à l'orientation actuelle de l'appareil. La rotation est codée comme les quatre composantes x, y, z, w sans unité d'un quaternion 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)

Où:

  • Les champs x, y et z de rot_axis sont les coordonnées Est-Nord-Up d'un vecteur unitaire de longueur représentant l'axe de rotation.
  • theta est l'angle de rotation

Le quaternion est un quaternion unitaire : Il doit être de norme 1 . Ne pas garantir cela entraînera un comportement erratique du client.

De plus, ce capteur signale une précision de cap estimée :

sensors_event_t.data[4] = estimated_accuracy (en radians)

L'erreur de cap doit être inférieure à estimated_accuracy 95 % des cas. Ce capteur doit utiliser un gyroscope comme entrée principale de changement d'orientation.

Ce capteur utilise également l'entrée de l'accéléromètre et du magnétomètre pour compenser la dérive du gyroscope, et il ne peut pas être mis en œuvre en utilisant uniquement l'accéléromètre et le magnétomètre.

Vecteur de rotation du jeu

Capteurs physiques sous-jacents : accéléromètre et gyroscope (pas de magnétomètre)

Mode de rapport : continu

getDefaultSensor(SENSOR_TYPE_GAME_ROTATION_VECTOR) renvoie un capteur de non-réveil

Un capteur vectoriel de rotation de jeu est similaire à un capteur vectoriel de rotation mais n'utilise pas le champ géomagnétique. Par conséquent, l’axe Y ne pointe pas vers le nord mais vers une autre référence. Cette référence peut dériver du même ordre de grandeur que le gyroscope dérive autour de l’axe Z.

Voir le capteur vectoriel de rotation pour plus de détails sur la façon de définir sensors_event_t.data[0-3] . Ce capteur ne signale pas de précision de cap estimée : sensors_event_t.data[4] est réservé et doit être défini sur 0 .

Dans un cas idéal, un téléphone pivoté et revenu à la même orientation du monde réel devrait signaler le même vecteur de rotation de jeu.

Ce capteur doit être basé sur un gyroscope et un accéléromètre. Il ne peut pas utiliser le magnétomètre comme entrée, d'ailleurs indirectement, via l'estimation du biais du gyroscope.

La gravité

Capteurs physiques sous-jacents : accéléromètre et (si présent) gyroscope (ou magnétomètre si le gyroscope n'est pas présent)

Mode de rapport : continu

getDefaultSensor(SENSOR_TYPE_GRAVITY) renvoie un capteur sans réveil

Un capteur de gravité indique la direction et l'ampleur de la gravité dans les coordonnées de l'appareil.

Les composantes du vecteur gravité sont indiquées en m/s^2 dans les champs x, y et z de sensors_event_t.acceleration .

Lorsque l'appareil est au repos, la sortie du capteur de gravité doit être identique à celle de l'accéléromètre. Sur Terre, la magnitude est d'environ 9,8 m/s^2.

Si l'appareil possède un gyroscope, le capteur de gravité doit utiliser le gyroscope et l'accéléromètre comme entrée.

Si l'appareil ne possède pas de gyroscope, le capteur de gravité doit utiliser l'accéléromètre et le magnétomètre comme entrée.

Vecteur de rotation géomagnétique

Capteurs physiques sous-jacents : accéléromètre et magnétomètre (pas de gyroscope)

Mode de rapport : continu

Batterie faible

getDefaultSensor(SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR) renvoie un capteur sans réveil

Un vecteur de rotation géomagnétique est similaire à un capteur de vecteur de rotation mais utilisant un magnétomètre et aucun gyroscope.

Ce capteur doit être basé sur un magnétomètre. Il ne peut pas être mis en œuvre à l'aide d'un gyroscope et l'entrée du gyroscope ne peut pas être utilisée par ce capteur.

Voir le capteur vectoriel de rotation pour plus de détails sur la façon de définir sensors_event_t.data[0-4] .

Tout comme pour le capteur vectoriel de rotation, l'erreur de cap doit être inférieure à la précision estimée ( sensors_event_t.data[4] ) 95 % du temps.

Ce capteur doit être de faible consommation, il doit donc être implémenté matériellement.

Orientation (obsolète)

Capteurs physiques sous-jacents : accéléromètre, magnétomètre et (le cas échéant) gyroscope

Mode de rapport : continu

getDefaultSensor(SENSOR_TYPE_ORIENTATION) renvoie un capteur sans réveil

Remarque : Il s'agit d'un type de capteur plus ancien qui est obsolète dans le SDK Android. Il a été remplacé par le capteur vectoriel de rotation, plus clairement défini. Utilisez le capteur vectoriel de rotation sur le capteur d'orientation autant que possible.

Un capteur d'orientation signale l'attitude de l'appareil. Les mesures sont rapportées en degrés dans les champs x, y et z de sensors_event_t.orientation :

  • sensors_event_t.orientation.x : azimut, l'angle entre la direction du nord magnétique et l'axe Y, autour de l'axe Z ( 0<=azimuth<360 ). 0=Nord, 90=Est, 180=Sud, 270=Ouest.
  • sensors_event_t.orientation.y : pitch, rotation autour de l'axe X ( -180<=pitch<=180 ), avec des valeurs positives lorsque l'axe Z se déplace vers l'axe Y.
  • sensors_event_t.orientation.z : roll, rotation autour de l'axe Y ( -90<=roll<=90 ), avec des valeurs positives lorsque l'axe X se déplace vers l'axe Z.

Attention, pour des raisons historiques, l'angle de roulis est positif dans le sens des aiguilles d'une montre. (Mathématiquement parlant, il devrait être positif dans le sens inverse des aiguilles d'une montre) :

Représentation de l'orientation par rapport à un appareil

Figure 3. Orientation par rapport à un appareil

Cette définition est différente du lacet, du tangage et du roulis utilisés dans l'aviation où l'axe X se trouve le long du côté long de l'avion (de la queue au nez).

Le capteur d'orientation indique également la précision avec laquelle il s'attend à ce que ses lectures soient précises via sensors_event_t.orientation.status . Voir les constantes SENSOR_STATUS_* du SensorManager pour plus d'informations sur les valeurs possibles pour ce champ.

Capteurs non calibrés

Les capteurs non calibrés fournissent davantage de résultats bruts et peuvent inclure certains biais, mais contiennent également moins de « sauts » dus aux corrections appliquées lors de l'étalonnage. Certaines applications peuvent préférer ces résultats non calibrés, car ils sont plus fluides et plus fiables. Par exemple, si une application tente d’effectuer sa propre fusion de capteurs, l’introduction d’étalonnages peut en réalité fausser les résultats.

Accéléromètre non calibré

Capteur physique sous-jacent : accéléromètre

Mode de rapport : continu

getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED) renvoie un capteur de non-réveil

Un capteur accéléromètre non calibré signale l'accélération de l'appareil le long des trois axes du capteur sans aucune correction de biais (le biais d'usine et la compensation de température sont appliqués aux mesures non étalonnées), ainsi qu'une estimation du biais. Toutes les valeurs sont en unités SI (m/s^2) et sont rapportées dans les champs de sensors_event_t.uncalibrated_accelerometer :

  • x_uncalib : accélération (sans compensation de biais) le long de l'axe X
  • y_uncalib : accélération (sans compensation de biais) le long de l'axe Y
  • z_uncalib : accélération (sans compensation de biais) le long de l'axe Z
  • x_bias : biais estimé le long de l'axe X
  • y_bias : biais estimé le long de l'axe Y
  • z_bias : biais estimé le long de l'axe Z

Gyroscope non calibré

Capteur physique sous-jacent : Gyroscope

Mode de rapport : continu

getDefaultSensor(SENSOR_TYPE_GYROSCOPE_UNCALIBRATED) renvoie un capteur sans réveil

Un gyroscope non calibré indique le taux de rotation autour des axes du capteur sans leur appliquer de compensation de biais, ainsi qu'une estimation du biais. Toutes les valeurs sont en radians/seconde et sont rapportées dans les champs de sensors_event_t.uncalibrated_gyro :

  • x_uncalib : vitesse angulaire (sans compensation de dérive) autour de l'axe X
  • y_uncalib : vitesse angulaire (sans compensation de dérive) autour de l'axe Y
  • z_uncalib : vitesse angulaire (sans compensation de dérive) autour de l'axe Z
  • x_bias : dérive estimée autour de l'axe X
  • y_bias : dérive estimée autour de l'axe Y
  • z_bias : dérive estimée autour de l'axe Z

Conceptuellement, la mesure non calibrée est la somme de la mesure calibrée et de l'estimation du biais : _uncalibrated = _calibrated + _bias .

Les valeurs x_bias , y_bias et z_bias devraient augmenter dès que l'estimation du biais change, et elles devraient être stables le reste du temps.

Voir la définition du capteur gyroscope pour plus de détails sur le système de coordonnées utilisé.

L'étalonnage en usine et la compensation de température doivent être appliqués aux mesures. De plus, l'estimation de la dérive du gyroscope doit être mise en œuvre afin que des estimations raisonnables puissent être rapportées dans x_bias , y_bias et z_bias . Si l'implémentation n'est pas capable d'estimer la dérive, alors ce capteur ne doit pas être implémenté.

Si ce capteur est présent, alors le capteur du gyroscope correspondant doit également être présent et les deux capteurs doivent partager les mêmes valeurs sensor_t.name et sensor_t.vendor .

Champ magnétique non calibré

Capteur physique sous-jacent : Magnétomètre

Mode de rapport : continu

getDefaultSensor(SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED) renvoie un capteur sans réveil

Un capteur de champ magnétique non calibré signale le champ magnétique ambiant ainsi qu'une estimation d'étalonnage du fer dur. Toutes les valeurs sont en micro-Tesla (uT) et sont rapportées dans les champs de sensors_event_t.uncalibrated_magnetic :

  • x_uncalib : champ magnétique (sans compensation fer dur) le long de l'axe X
  • y_uncalib : champ magnétique (sans compensation fer dur) le long de l'axe Y
  • z_uncalib : champ magnétique (sans compensation fer dur) le long de l'axe Z
  • x_bias : biais estimé du fer dur le long de l'axe X
  • y_bias : biais estimé du fer dur le long de l'axe Y
  • z_bias : biais estimé du fer dur le long de l'axe Z

Conceptuellement, la mesure non calibrée est la somme de la mesure calibrée et de l'estimation du biais : _uncalibrated = _calibrated + _bias .

Le magnétomètre non calibré permet à des algorithmes de niveau supérieur de gérer une mauvaise estimation du fer dur. Les valeurs x_bias , y_bias et z_bias devraient augmenter dès que l'estimation du fer dur change, et elles devraient être stables le reste du temps.

Un étalonnage au fer doux et une compensation de température doivent être appliqués aux mesures. En outre, une estimation dure doit être mise en œuvre afin que des estimations raisonnables puissent être rapportées dans x_bias , y_bias et z_bias . Si l'implémentation n'est pas en mesure d'estimer le biais, alors ce capteur ne doit pas être implémenté.

Si ce capteur est présent, alors le capteur de champ magnétique correspondant doit être présent et les deux capteurs doivent partager les mêmes valeurs sensor_t.name et sensor_t.vendor .

Angle de charnière

Mode de reporting : en cas de changement

getDefaultSensor(SENSOR_TYPE_HINGE_ANGLE) renvoie un capteur de réveil

Un capteur d'angle de charnière mesure l'angle, en degrés, entre deux parties intégrantes de l'appareil. Le mouvement d'une charnière mesuré par ce type de capteur devrait modifier la manière dont l'utilisateur peut interagir avec l'appareil, par exemple en dépliant ou en révélant un écran.

Capteurs composites d'interaction

Certains capteurs sont principalement utilisés pour détecter les interactions avec l’utilisateur. Nous ne définissons pas comment ces capteurs doivent être implémentés, mais ils doivent être de faible consommation et il est de la responsabilité du fabricant de l'appareil de vérifier leur qualité en termes d'expérience utilisateur.

Geste de réveil

Capteurs physiques sous-jacents : non défini (tout ce qui a une faible consommation)

Mode de rapport : One-shot

Batterie faible

Implémentez uniquement la version de réveil de ce capteur.

getDefaultSensor(SENSOR_TYPE_WAKE_GESTURE) renvoie un capteur de réveil

Un capteur de gestes de réveil permet de réveiller l'appareil en fonction d'un mouvement spécifique à l'appareil. Lorsque ce capteur se déclenche, l'appareil se comporte comme si le bouton d'alimentation était enfoncé, allumant ainsi l'écran. Ce comportement (allumer l'écran lorsque ce capteur se déclenche) peut être désactivé par l'utilisateur dans les paramètres de l'appareil. Les modifications des paramètres n'ont pas d'impact sur le comportement du capteur: seulement si le cadre allume l'écran lorsqu'il se déclenche. Le geste réel à détecter n'est pas spécifié et peut être choisi par le fabricant de l'appareil.

Ce capteur doit être une faible puissance, car il est susceptible d'être activé 24/7.

Chaque événement de capteur rapporte 1 dans sensors_event_t.data[0] .

Ramasser le geste

Capteurs physiques sous-jacents: non définis (quoi que ce soit de faible puissance)

Mode de rapport: One-Shot

Batterie faible

Implémentez uniquement la version de réveil de ce capteur.

getDefaultSensor(SENSOR_TYPE_PICK_UP_GESTURE) renvoie un capteur de réveil

Un capteur de geste de ramassage se déclenche lorsque l'appareil est ramassé, quel que soit où il se trouvait (bureau, poche, sac).

Chaque événement de capteur rapporte 1 dans sensors_event_t.data[0] .

Geste de regard

Capteurs physiques sous-jacents: non définis (quoi que ce soit de faible puissance)

Mode de rapport: One-Shot

Batterie faible

Implémentez uniquement la version de réveil de ce capteur.

getDefaultSensor(SENSOR_TYPE_GLANCE_GESTURE) renvoie un capteur de réveil

Un capteur de geste de regard permet d'activer brièvement l'écran pour permettre à l'utilisateur de jeter un coup d'œil à l'écran en fonction d'un mouvement spécifique. Lorsque ce capteur se déclenche, l'appareil allumera l'écran momentanément pour permettre à l'utilisateur de jeter un coup d'œil ou un autre contenu tandis que l'appareil reste verrouillé dans un état non interactif (douzaine), puis l'écran s'éteindra à nouveau. Ce comportement (allumant brièvement l'écran lorsque ce capteur se déclenche) peut être désactivé par l'utilisateur dans les paramètres de l'appareil. Les modifications des paramètres n'ont pas d'impact sur le comportement du capteur: seulement si le cadre allume brièvement l'écran lorsqu'il se déclenche. Le geste réel à détecter n'est pas spécifié et peut être choisi par le fabricant de l'appareil.

Ce capteur doit être une faible puissance, car il est susceptible d'être activé 24/7. Chaque événement de capteur rapporte 1 dans sensors_event_t.data[0] .

Capteurs IMU à axes limités

Disponibles sur Android 13, les capteurs IMU à axes limités sont des capteurs qui prennent en charge les cas d'utilisation où les trois axes (x, y, z) ne sont pas disponibles. Les types IMU standard dans Android (comme SENSOR_TYPE_ACCELEROMETER et SENSOR_TYPE_GYROSCOPE ) supposent que les trois axes sont pris en charge. Cependant, tous les facteurs de forme et les dispositifs ne prennent pas en charge les accéléromètres à 3 axes et les gyroscopes à 3 axes.

Accéléromètre limité axes

Capteurs physiques sous-jacents: accéléromètre

Mode de rapport: continu

getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES) renvoie un capteur non wake-up

Un capteur d'axes limité à l'accéléromètre est équivalent à TYPE_ACCELEROMETER mais prend en charge les cas où un ou deux axes ne sont pas pris en charge.

Les trois dernières valeurs d'événements de capteur rapportées par le capteur représentent si la valeur d'accélération pour les axes x, y et z est prise en charge. Une valeur de 1.0 indique que l'axe est pris en charge et une valeur de 0 indique qu'elle n'est pas prise en charge. Les fabricants d'appareils identifient les axes pris en charge au moment de la construction et les valeurs ne changent pas pendant l'exécution.

Les fabricants d'appareils doivent définir les valeurs d'accélération des axes inutilisés sur 0 , au lieu d'avoir des valeurs non définies.

Axes limités au gyroscope

Capteurs physiques sous-jacents: gyroscope

Mode de rapport: continu

getDefaultSensor(SENSOR_TYPE_GYROSCOPE_LIMITED_AXES) renvoie un capteur non wake-up

Un capteur d'axes limité au gyroscope équivaut à TYPE_GYROSCOPE mais prend en charge les cas où un ou deux axes ne sont pas pris en charge.

Les trois dernières valeurs d'événements de capteur rapportées par le capteur représentent si la valeur de vitesse angulaire pour les axes x, y et z est prise en charge. Une valeur de 1.0 indique que l'axe est pris en charge et une valeur de 0 indique qu'elle n'est pas prise en charge. Les fabricants d'appareils identifient les axes pris en charge au moment de la construction et les valeurs ne changent pas pendant l'exécution.

Les fabricants d'appareils doivent régler les valeurs de vitesse angulaire pour les axes inutilisés sur 0 .

Accéléromètre limité axes non calibrés

Capteurs physiques sous-jacents: accéléromètre

Mode de rapport: continu

getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED) renvoie un capteur non wake-up

Un capteur non calibré des axes limités à l'accéléromètre est équivalent à TYPE_ACCELEROMETER_UNCALIBRATED mais prend en charge les cas où un ou deux axes ne sont pas pris en charge.

Les trois dernières valeurs d'événements de capteur rapportées par le capteur représentent si les valeurs d'accélération et de biais pour les axes x, y et z sont prises en charge. Une valeur de 1.0 indique que l'axe est pris en charge et une valeur de 0 indique qu'elle n'est pas prise en charge. Les fabricants d'appareils identifient les axes pris en charge au moment de la construction et les valeurs ne changent pas pendant l'exécution.

Les fabricants d'appareils doivent régler les valeurs d'accélération et de biais pour les axes inutilisés sur 0 .

Axes limités au gyroscope non calibrés

Capteurs physiques sous-jacents: gyroscope

Mode de rapport: continu

getDefaultSensor(SENSOR_TYPE_GYROSCOPE_LIMITED_AXES_UNCALIBRATED) renvoie un capteur non wake-up

Un capteur non calibré des axes limités au gyroscope équivaut à TYPE_GYROSCOPE_UNCALIBRATED mais prend en charge les cas où un ou deux axes ne sont pas pris en charge.

Les trois dernières valeurs d'événements de capteur rapportées par le capteur représentent si la vitesse angulaire et les valeurs de dérive pour les axes x, y et z sont supportées. Une valeur de 1.0 indique que l'axe est pris en charge et une valeur de 0 indique qu'elle n'est pas prise en charge. Les fabricants d'appareils identifient les axes pris en charge au moment de la construction et les valeurs ne changent pas pendant l'exécution.

Les fabricants d'appareils doivent régler les valeurs de vitesse et de dérive angulaires pour les axes inutilisés sur 0 .

Axes limités composites IMU

Capteurs physiques sous-jacents: Toute combinaison d'accéléromètre à 3 axes, gyroscope à 3 axes, accéléromètre à 3 axes non calibrés et capteurs de gyroscope à 3 axes.

Mode de rapport: continu

Un capteur IMU à axes limité composite équivaut à un capteur IMU à axes limités, mais au lieu d'être pris en charge au HAL, il convertit les données du capteur à 3 axes en variantes d'axes limitées équivalentes. Ces capteurs composites ne sont activés que pour les appareils automobiles.

Le tableau suivant montre un exemple de conversion d'un accéléromètre standard à 3 axes en un accéléromètre à axes limité composite.

Valeurs sensorévent pour capteur_type_acceleromètre Exemple Sensor_Type_Acceleromment Sensorevent Composite Sensor_Type_Acceleromment_limited_axes Sensorevent
valeurs [0]

-0,065

-0,065

valeurs [1]

0,078

0,078

valeurs [2]

9.808

9.808

valeurs [3]

N / A

1.0

valeurs [4]

N / A

1.0

valeurs [5]

N / A

1.0

Capteurs automobiles

Capteurs pour prendre en charge les cas d'utilisation automobile.

Titre

Capteurs physiques sous-jacents: toute combinaison de GPS, magnétomètre, accéléromètre et gyroscope.

Mode de rapport: continu

getDefaultSensor(SENSOR_TYPE_HEADING) renvoie un capteur non wake-up

Disponible sur Android 13, un capteur d'en-tête mesure la direction dans laquelle l'appareil pointe par rapport au vrai nord en degrés. Le capteur d'en-tête comprend deux valeurs SensorEvent . Un pour l'en-tête de dispositif mesuré et un pour la précision de la valeur d'en-tête fournie.

Les valeurs d'en-tête rapportées par ce capteur doivent être comprises entre 0.0 (inclusive) et 360.0 (exclusive), avec 0 indiquant le nord, 90 est, 180 sud et 270 ouest.

La précision de ce capteur est définie à 68% de confiance. Dans le cas où la distribution sous-jacente est normale gaussienne, la précision est un écart-type. Par exemple, si le capteur d'en-tête renvoie une valeur de cap de 60 degrés et une valeur de précision de 10 degrés, il y a une probabilité de 68% que le véritable cap est comprise entre 50 degrés et 70 degrés.