Dot.Blog

C#, XAML, Xamarin, UWP/Android/iOS

Faites frémir les sens de Windows 8 ! (ou comment taquiner les capteurs)

[new:31/12/2012]Windows 8… Sur PC ? Non, plutôt sur Windows Phone 8 ou Surface, car question “sensibilité” les PC sont légèrement “autistes” comparés à leurs petits frères et sœurs. Compas, accéléromètre, GPS et j’en passe, les unités mobiles sont bourrées de capteurs en tout genre. Savoir chatouiller les sens de ces petites machines ouvre les voies d’un plaisir certain (de programmation) et surtout celles de nouvelles applications ! 

Toucher n’est pas jouer…

On les touche, on les caresses, certes, mais les tablettes n’ont pas que leur écran de tactile ! Ce sont de petits être très sensibles à tout plein de stimulations … Les Smartphones aussi, s’ils aiment jouer à guiliguili avec vos doigts ne sont pas en reste niveau sensoriel…

Tout cela existe plus ou moins de longue date, de façon éparse d’ailleurs, mais depuis l’avènement des Smartphones, puis des tablettes, on n’avait jamais vu autant de capteurs dans un si petit volume sauf dans James Bond ou Mission Impossible.

Pire, tous ces capteurs qui existaient séparément dans des machines diverses n’étaient programmables qu’en “bas niveau”, soit au travers de drivers exotiques, quant il ne fallait pas mettre soi-même les mains dans le cambouis pour les piloter via une connexion RS232 par exemple.

Mais ça, c’était “avant”.

Avant Windows 8. Et ses API fédératrices qui permettent de prendre en charge de façon cohérence la programmation haut niveau de tout un tas de capteurs de nature différente. Du capteur photo à l’accéléromètre en passant par le compas ou le GPS.

Des tas d’exemples

Le Centre de Développement Windows 8 reprend l’excellente idée de Windows 7 avec une partie du site entièrement dédiée à des dizaines (centaines certainement) d’exemples portant sur tous les aspects de la programmation sous Windows.

Vous trouverez à l’adresse suivante une foule de choses passionnantes car chaque exemple est fourni avec son code et c’est là la clé d’une bonne compréhension : pouvoir tester, modifier, sans pour autant tout coder depuis le départ :  http://code.msdn.microsoft.com/windowsapps/Windows-8-Modern-Style-App-Samples

Mais vous dire cela est un peu court, vous renvoyer vers des exemples du site Microsoft n’est pas la vocation de Dot.Blog qui aime vous donner directement matière à réfléchir.

Du code, tout de suite !

C’est pourquoi sans entrer dans les détails, puisque cela serait vraiment une redite de la documentation, je vous propose un tour d’horizon des capteurs et de leur programmation au travers d’exemples simples.

L’accéléromètre

Conçu de façon très astucieuse ce composant "électro-mécanique” (puisqu’il associe un peu de mécanique et de l’électronique) permet de savoir avec beaucoup de précision en général dans quelle direction l’appareil se déplace. Comme son nom l’indique il ne détecte pas une position, mais une accélération sur l’un des trois axes X, Y, Z.

Comme la majorité des capteurs, l’accéléromètre est un “périphérique” à lecture seule. On ne fait donc que lire son état sans pouvoir le modifier (pouvoir déplacer une unité mobiles dans les 3 axes juste par programmation serait très fort !).

Pour lire l’accélération sur les 3 axes :

async private void ReadingChanged(object sender, AccelerometerReadingChangedEventArgs e)
{
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        AccelerometerReading reading = e.Reading;
        var X  =  reading.AccelerationX;
        var Y  =  reading.AccelerationY;
        var Z =   reading.AccelerationZ;
    });
}

Rien de bien savant donc (juste se rappeler que WinRT est essentiellement asynchrone ce qui change un peu la façon d’appeler les API par rapport à .NET ou Win32).

Le compas

Le compas permet de ne pas perdre le Nord… Oui mais lequel ?

En effet il faut savoir que les compas peuvent pointer le Nord magnétique ou le Nord “vrai”. Ce dernier est la position du pôle Nord, le premier est, comme son nom l’indique, la position du Nord magnétique de notre planète, point qui n’est pas réellement au pôle et qui se déplace dans le temps, au gré des fluctuations des mouvements du noyau au centre de la Terre. La plupart des compas sont magnétiques d’ailleurs. Le Nord “vrai” s’applique simplement en prenant en compte un facteur de correction.

Cela peut être trompeur puisque la présence d’un aimant un peu fort à côté de la machine (ou une grosse masse métallique) pourra fausser la lecture…

Les plus angoissés pourront craindre les inversions de pôles … De nombreuses sont intervenues plusieurs fois d’ailleurs dans l’histoire de notre boule de billard cosmique, cela se reproduira certainement. Toutefois ces changements, s’ils peuvent être brutaux à l’échelle géologique peuvent être considérés comme négligeables à l’échelle des étincelles que sont nos vies. Donc peu de chance que votre compas magnétique pointe le pôle Sud d’un seul coup pendant que vous êtes en train de vous promener en forêt vous égarant à l’inverse de la route que vous poursuiviez !

Lire le compas est tout aussi simple :

async private void ReadingChanged(object sender,  CompassReadingChangedEventArgs e)
{
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        CompassReading reading = e.Reading;
        MagneticNorth.Text = String.Format("{0,5:0.00}", reading.HeadingMagneticNorth);
        if (reading.HeadingTrueNorth != null)
        {
            TrueNorth.Text = String.Format("{0,5:0.00}", reading.HeadingTrueNorth);
        }
        else
        {
            TrueNorth.Text = "Données absentes.";
        }
    });
}

 

Une fois encore la documentation Microsoft sera votre amie pour en savoir plus : http://msdn.microsoft.com/en-us/library/windows/apps/windows.devices.sensors.compass.aspx

Géolocalisation (GPS)

Peut-être la plus belle invention de geek avec le smartphone : le GPS met en œuvre à la fois la pointe de la technologie (celle de l’espace, des satellites) et la pointe de physique (car pour fonctionner les GPS doivent prendre en compte le ralentissement des horloges en mouvement propre à la théorie de la Relativité).

Côté récepteur je parle de géolocalisation et non de GPS car ce dernier n’est qu’un moyen parmi d’autres de trouver la position du demandeur. Windows peut utiliser une triangulation d’après les bornes Wifi ou même par l’IP. Bien entendu ce n’est pas Windows lui-même qui effectue ce genre de choses, mais les services assurés par des serveurs Microsoft sur le Web. Android de Google fonctionne sur le même principe (c’est pourquoi les Google car s’intéressent tant aux bornes Wifi et qu’elles en ont collecté bien plus que leur simple localisation, pas forcément dans des buts inavouables d’ailleurs, au moins au départ).

L’accès au service de géolocalisation n’est donc pas à proprement parlé un accès à un capteur. C’est bien un service qui se cache derrière, et c’est dans la réponse de ce dernier qu’on peut connaître la précision de la mesure (forcément moins fiable par l’IP ou par triangulation Wifi que par le GPS embarqué).

A ce titre, et pour digresser comme j’en ai l’habitude, certains ont ronchonné sur le fait que Surface ne possède pas de GPS. Or on sait très bien qu’un GPS même dans une voiture a du mal à passer pour peu que le pare-brise soit traité “athermique”. Et en intérieur c’est carrément impossible. Et si un smartphone peut être (et est) utilisé en extérieur, une tablette de type Surface est un instrument de loisir et de travail qui s’utilise dans son salon, au bureau, chez mamy ou l’oncle Georges pour lui faire voir les photos de vacances : que des lieux clos où le GPS ne passerait pas.

Dès lors cela ne veut pas dire qu’il n’y a pas pour autant de géolocalisation ! Le service fonctionne mais se base sur les bornes Wifi, sur l’adresse IP, etc, et peut retourner une position fiable même en campagne et surtout même à l’intérieur.

Lorsqu’on a compris que géolocalisation n’était pas synonyme de GPS, on peut mieux appréhender le choix très judicieux de Microsoft dans Surface (car cela baisse le prix de revient de la machine pour un capteur qui serait rarement utilisable).

Dans le code d’une application WinRT, l’accès au service de géolocalisation est tout aussi simple que pour les autres capteurs :

Geoposition pos = await _geolocator.GetGeopositionAsync().AsTask(token);
 
Latitude.Text = pos.Coordinate.Latitude.ToString();
Longitude.Text = pos.Coordinate.Longitude.ToString();
Accuracy.Text = pos.Coordinate.Accuracy.ToString();

 

Le Gyromètre

Confondu à tort avec le Gyroscope, le Gyromètre a une finalité toute différente…

Le Gyromètre set à mesure une vitesse angulaire, c’est à dire l’accélération d’un mouvement circulaire, souvent une rotation sur un axe donc. Le Gyroscope, de base, permet de maintenir une position de référence pour maintenir une assiette de vol (avion, fusée) ou la stabilité d’un navire de guerre de type porte-avion par exemple. Un Gyroscope permet certes de connaître les mêmes informations qu’un Gyromètre mais c’est un instrument couteux, lourd et encombrant car il réclame de faire tourner une masse équilibrée sur un système à trois degrés de liberté. La pièce tournante reste dans sa position de départ quoi qu’il arrive… C’est une référence “absolue” par rapport au moment de son démarrage. Le Gyromètre fournit la même information d’accélération sur les vitesses angulaires, de façon plus directe d’ailleurs et plus simple, mais en revanche il ne saurait jouer le rôle d’un référentiel fiable et fixe.

Bref, les unités mobiles embarquent un Gyromètre et non un Gyroscope, ce qui serait génial mais qui demanderait une brouette pour porter son smartphone et un charrette pour porter les batteries…

Les besoins ne sont pas non plus les mêmes, pour un smartphone ou une tablette il s’agit de reconnaitre une accélération non pas linéaire (comme l’accéléromètre peut le faire) mais une accélération “rotative” : faire pencher son téléphone de droite à gauche, le renverser, etc. On se fiche de la position qu’il occupait exactement au moment de son allumage, on travaille plutôt sur un mouvement relatif. Et ça tombe bien des puces Gyromètres peuvent tenir sans presque rien consommer ni prendre trop de place dans un smartphone ! Alors qu'un porte-avion dispose de toute la place pour embarquer un Gyroscope qui lui permettra de régler son assiette et facilité l’envol et l’atterrissage des avions même par grosse mer…

La société Safran a investi dernièrement 50 millions d’Euros dans une unité de production de Gyroscopes notamment qui équipent le Charles De Gaulle ou nos sous-marins de dissuasion nucléaire… Gyromètre de smartphone et Gyroscope de porte-avion ne concourent définitivement pas dans la même catégorie :-)

Après cet éclairage de pure “culture G” nous voici au code :

async private void ReadingChanged(object sender, GyrometerReadingChangedEventArgs e)
{
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
        () =>
    {
        GyrometerReading reading = e.Reading;
        var X = reading.AngularVelocityX;
        var Y = reading.AngularVelocityY;
        var Z = reading.AngularVelocityZ;
    });
}

 

Je doute que le porte-avion C.d.Gaulle ou que nos sous-marins nucléaires soient programmés de façon aussi triviale !

(plus d’info : http://msdn.microsoft.com/en-us/library/windows/apps/windows.devices.sensors.gyrometer.aspx)

Inclinomètre

Du mouvement, toujours du mouvement…

L’inclinomètre fourni des informations de mouvement assez semblable aux autres capteurs de ce type que nous venons de voir, mais c’est la nature de l’information retournée qui est différente et mieux adaptée à certaines utilisation.

L’inclinomètre retourne les informations de tangage, roulis et de lacet de l’appareil. Cela permet de déterminer l’orientation de l’appareil par rapport au sol (ou plus exactement par rapport à la direction dans laquelle la gravité agit).

C’est une information importante pour savoir si l’unité mobile est inclinée ou tordu par rapport à la verticale du lieu.

La NASA fournit des explication plus précises sur ces notions très utilisées en aviation : http://www.grc.nasa.gov/WWW/K-12/airplane/rotations.html

Vous commencez à vous en douter, lire les informations de l’inclinomètre s’effectue aussi simplement que pour les autres capteurs :

async private void ReadingChanged(object sender, InclinometerReadingChangedEventArgs e)
{
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
        () =>
    {
        InclinometerReading reading = e.Reading;
        var X = reading.PitchDegrees;
        var Y = reading.RollDegrees;
        var Z = reading.YawDegrees;
    });
}

 

Moins spatiale que la NASA, la doc de Microsoft vous sera peut-être utile aussi : http://msdn.microsoft.com/en-us/library/windows/apps/windows.devices.sensors.inclinometer.aspx

Détecteur de luminosité

C’est un capteur très important pour le confort de l’utilisateur … et la consommation de l'unité mobile. En effet ce capteur mesure la quantité et la qualité de la lumière ambiante. Ce qui permet en retour de régler automatiquement l’éclairage de l’écran qui, on le sait, est un ogre pour la batterie de ces machines.

La lecture est tout aussi directe :

async private void ReadingChanged(object sender,  LightSensorReadingChangedEventArgs e)
{
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
        () =>
    {
        LightSensorReading reading = e.Reading;
        var Lux =  reading.IlluminanceInLux;
    });
}

 

La encore la doc Microsoft sera un allié pour entrer dans les détails : http://msdn.microsoft.com/en-us/library/windows/apps/windows.devices.sensors.lightsensor.aspx

Le capteur d’orientation

Encore un capteur de mouvement ? Oui et non…

Le capteur d’orientation retourne une matrice qui représente la rotation et un quaternion qui peut être utilisé directement pour ajuster la perspective de l’utilisateur dans l’application… A la différence des autres capteurs, plus simples, le capteur d’orientation est principalement utilisé dans les jeux en 3D pour ajuster le rendu graphique selon l’angle sous lequel le joueur voit l’écran pour un réalisme et une réactivité accrus.

Le quaternion est une notation particulière permettant de retourner à la fois les orientations et les rotations.

Lire ce capteur est guère plus difficile que les autres, interpréter ses valeurs et s’en servir réclame juste un goût plus prononcé pour la géométrie dans l’espace !

async private void ReadingChanged(object sender, OrientationSensorReadingChangedEventArgs e)
{
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
        () =>
    {
        OrientationSensorReading reading = e.Reading;
        // Quaternion values
        SensorQuaternion quaternion = reading.Quaternion;   
        ScenarioOutput_X.Text = String.Format("{0,8:0.00000}", 
            quaternion.X);
        ScenarioOutput_Y.Text = String.Format("{0,8:0.00000}", 
            quaternion.Y);
        ScenarioOutput_Z.Text = String.Format("{0,8:0.00000}", 
            quaternion.Z);
        ScenarioOutput_W.Text = String.Format("{0,8:0.00000}", 
            quaternion.W);
        // Rotation Matrix values
        SensorRotationMatrix rotationMatrix = reading.RotationMatrix;
        ScenarioOutput_M11.Text = String.Format("{0,8:0.00000}", 
            rotationMatrix.M11);
        ScenarioOutput_M12.Text = String.Format("{0,8:0.00000}", 
            rotationMatrix.M12);
        ScenarioOutput_M13.Text = String.Format("{0,8:0.00000}", 
            rotationMatrix.M13);
        ScenarioOutput_M21.Text = String.Format("{0,8:0.00000}", 
            rotationMatrix.M21);
        ScenarioOutput_M22.Text = String.Format("{0,8:0.00000}", 
            rotationMatrix.M22);
        ScenarioOutput_M23.Text = String.Format("{0,8:0.00000}", 
            rotationMatrix.M23);
        ScenarioOutput_M31.Text = String.Format("{0,8:0.00000}", 
            rotationMatrix.M31);
        ScenarioOutput_M32.Text = String.Format("{0,8:0.00000}", 
            rotationMatrix.M32);
        ScenarioOutput_M33.Text = String.Format("{0,8:0.00000}", 
            rotationMatrix.M33);
    });
}

 

La doc Microsoft discute plus en profondeur de la classe OrientationSensor : http://msdn.microsoft.com/en-us/library/windows/apps/windows.devices.sensors.orientationsensor.aspx

Conclusion

Nos petites machines sont bourrées de technologie à faire pâlir d’envie M. Spock… Pourtant tout cela est “in the box” et peut être utilisé de façon simple et transparente par tous les développeurs grâce à Windows 8.

Si tourner les pages d’un livre sur un mouvement rapide de rotation, si inverser l’image présentée lorsque le téléphone est placé bas en haut, ou toutes ces autres utilisations des capteurs sont désormais des classiques. Je suis convaincu que les développeurs les plus rusés sauront trouver des applications utiles ou divertissantes bien loin de ce que pensaient les ingénieurs ayant conçu les puces  !

Sky is the limit… N’est ce pas.

Réalité augmentée, retracer un parcours exact sur une carte précise, détecter le vol de votre mobile et pister le voleur dans les rues; déduire des accélérations s’il est à pied, en mobylette ou un Ferrari, créer un code de déblocage du mobile totalement gestuel, se servir d’un smartphone pour créer sa propre fusée et satelliser à moindre frais les cendres de son chien ou un message d’amour à sa chérie, vérifier la qualité et les progrès d’un entrainement physique sans présence d’un coach, toutes les applications des plus sérieuses aux plus loufoques peuvent être envisagées.

Ce ne sont pas les plus sérieuses qui se vendent le mieux nous ont appris les différents market places… Alors… Faites marcher vos neurones !

Et Stay tuned !

blog comments powered by Disqus