Animez votre application avec la localisation et les capteurs

Blog des développeurs d'applications Windows 8

Indications sur la conception d'applications de style Metro pour Windows 8, par l'équipe d'ingénierie de Windows 8

Animez votre application avec la localisation et les capteurs

  • Comments 0

Si vous développez une application pour tablettes ou convertibles Windows 8, vous avez accès à des services matériels et logiciels innovants pour les capteurs et la localisation. Ces fonctionnalités matérielles vous permettent d'optimiser vos applications et de renforcer leur attractivité et leur utilité.

Imaginez une application qui charge automatiquement un environnement 3D en fonction de l'emplacement actuel de l'utilisateur, puis qui lui permet d'accéder au monde 3D (panoramique, inclinaison) en déplaçant la tablette dans l'espace 3D. Les images ci-dessous illustrent une application de type panorama Photosynth qui utilise un capteur composite pour favoriser les interactions naturelles entre l'orientation de l'appareil et le panorama Photosynth. Le capteur composite allie les résultats d'un accéléromètre, d'un gyroscope et d'un magnétomètre pour assurer de meilleures rotations que n'importe lequel de ces capteurs pris individuellement. Il est de plus exposé via le type d'exécution Windows.Devices.Sensors.OrientationSensor.

Lorsque l'utilisateur maintient l'appareil à niveau, la vue affichée est dirigée droit devant dans le panorama Photosynth :

Image de Paris dirigée droit devant, Copyright Felipe Garchet / 360 Cities

Lorsque l'utilisateur incline l'appareil vers le haut, la vue dans le panorama Photosynth est également inclinée vers le haut :

Image de Paris dirigée vers le haut, Copyright Felipe Garchet / 360 Cities

Le même type d'interactions se produit lorsque l'utilisateur déplace l'appareil vers la gauche ou la droite. C'est comme si la caméra du panorama était directement liée à l'orientation de la tablette. Vous pouvez imaginer tout ce qu'il est possible de faire avec ces fonctionnalités, y compris des jeux subjectifs, des expériences cartographiques, une navigation pédestre et bien d'autres choses. Regardons maintenant comment implémenter ce type de fonctionnalité pour Windows 8.

Pourquoi utiliser des capteurs

Lors de la conférence //Build qui s'est tenue à l'automne 2011, notre équipe a communiqué des informations sur la prise en charge matérielle de la localisation et des capteurs dans Windows 8, ainsi que des données sur les API Windows Runtime pour la localisation et les capteurs. La prise en charge des capteurs dans Windows 8 permettra aux utilisateurs de bénéficier de fonctionnalités système, telles que la rotation automatique de l'écran et le contrôle automatique de la luminosité. Même si ces fonctionnalités sont formidables, ce sont les applications qui prennent en charge la localisation et les capteurs qui suscitent véritablement l'enthousiasme. Avec Windows 8, la localisation et les capteurs permettent d'obtenir des expériences variées, notamment la navigation et le compas, des jeux simples, la réalité augmentée, le guidage des interactions pour les jeux et bien plus encore.

Tous les convertibles et tablettes certifiés Windows 8 incluront ces capteurs :

  • Capteur de luminosité ambiante
  • Système de capteur composite à neuf axes qui utilise ces capteurs :
    • Accéléromètre 3D
    • Capteur gyroscopique 3D
    • Magnétomètre 3D

En outre, tous les PC Windows 8 comprennent le service de localisation Windows (service de recherche de localisation logiciel) et le GPS (pour les PC dotés d'un matériel haut débit mobile).

En d'autres termes, vous avez accès à un nombre impressionnant de fonctionnalités liées aux capteurs et à la localisation. Cela signifie également que les fonctionnalités peuvent différer selon le terminal, vous devez donc définir quels sont les terminaux que vous ciblez avec vos applications.

Utilisation de la localisation dans votre application

Prendre en charge la localisation dans une application est très simple. Vous devez commencer par ajouter la déclaration de la fonctionnalité d'emplacement dans le fichier du manifeste de l'application. Cette déclaration permet au système de savoir que l'application peut essayer d'accéder à l'emplacement actuel. Bien évidemment, l'utilisateur contrôle l'approbation finale pour savoir si l'application peut accéder à l'emplacement actuel. Vous pouvez ajouter cette déclaration via Visual Studio (double-cliquez sur package.appxmanifest dans l'Explorateur de solutions, sélectionnez l'onglet [Capabilities] (Fonctionnalités), puis cochez la case [Location](Emplacement) dans la liste).

Voici à quoi ressemble l'éditeur de manifeste après la déclaration de la fonctionnalité d'emplacement :

Interface utilisateur permettant de déclarer la fonctionnalité d'emplacement

 

Et voici à quoi ressemble l'extrait de code dans votre fichier package.appxmanifest.xml lorsque vous déclarez la fonctionnalité d'emplacement (cette opération est réalisée pour vous lorsque vous utilisez l'éditeur de manifeste dans Visual Studio) :

<Capabilities>
<DeviceCapability Name="location" />
</Capabilities>

Une fois que vous avez déclaré la fonctionnalité pour l'emplacement dans votre application, vous pouvez commencer à écrire le code permettant d'accéder aux données d'emplacement. La fonctionnalité d'emplacement est intégrée aux API Windows Runtime et est accessible via l'espace de noms Windows.Devices.Geolocation. Vous pouvez également utiliser l'API du W3C pour effectuer la localisation via JavaScript. Dans ce billet, nous allons montrer la variante propre à Windows. Pour en savoir plus sur l'utilisation de l'API du W3C pour la localisation, consultez Démarrage rapide : détection d’emplacement avec HTML5 (applications de style Metro en JavaScript et HTML).

Vous pouvez accéder aux données d'emplacement de deux manières : par une recherche ponctuelle ou par un flux d'événements qui sont déclenchés lorsque le système détecte un changement d'emplacement. Examinons rapidement chacun de ces modes d'accès afin que vous puissiez choisir celui qui convient le mieux à votre application.

Accès ponctuel à l'emplacement

Si vous souhaitez seulement accéder à l'emplacement à la demande (par exemple pour trouver des centres d'intérêt dans la zone géographique de l'utilisateur, annoter du contenu avec des informations de localisation, afficher la position de l'utilisateur sur une carte, etc.), vous pouvez le faire avec peu de lignes de code et également vous assurer que vous n'épuisez pas la précieuse autonomie de la batterie. Regardons l'extrait de code qui illustre la recherche ponctuelle.

JavaScript :

var loc = new Windows.Devices.Geolocation.Geolocator();
loc.positionAccuracy = Windows.Devices.Geolocation.PositionAccuracy.high;
loc.getGeopositionAsync().done(getPositionHandler, errorHandler);

function getPositionHandler(pos) {
var lat = pos.coordinate.latitude;
var long = pos.coordinate.longitude;
var acc = pos.coordinate.accuracy;
}

function errorHandler(err) {
// handle error
}

C# :

using Windows.Devices.Geolocation;

var loc = new Geolocator();

try
{
loc.DesiredAccuracy = PositionAccuracy.High;
Geoposition pos = await loc.GetGeopositionAsync();

var lat = pos.Coordinate.Latitude;
var long = pos.Coordinate.Longitude;
var acc = pos.Coordinate.Accuracy;
}
catch (System.UnauthorizedAccessException)
{
// handle error
}

Nous voyons ici :

  • la création d'un objet Geolocator (objet racine pour la localisation) ;
  • l'appel asynchrone à une opération de récupération de l'emplacement actuel, avec une gestion des erreurs si l'accès à l'emplacement est refusé.

Notez que vous pouvez annuler un appel en cours à GetGeopositionAsync si cela est nécessaire. Consultez l'exemple SDK de géolocalisation Windows Runtime pour obtenir un code d'exemple. Pour plus d'informations sur l'accès ponctuel à l'emplacement, consultez la méthode Geolocator.GetGeopositionAsync() | getGeopositionAsync() et l'exemple SDK de géolocalisation.

Accès continu à l'emplacement

Si votre application doit accéder en continu aux données d'emplacement (par exemple pour une navigation détaillée, pour alerter l'utilisateur lorsque des centres d'intérêt sont à proximité, pour consigner les itinéraires, etc.), vous pouvez ajouter un détecteur d'événements que l'application appelle lorsqu'un ou plusieurs fournisseurs de géolocalisation sur le système détectent un changement de position. Voici comment détecter les changements de position.

JavaScript :

var loc = new Windows.Devices.Geolocation.Geolocator();
loc.desiredAccuracy = Windows.Devices.Geolocation.PositionAccuracy.high;
loc.addEventListener("positionchanged", onPositionChanged);

function onPositionChanged(e) {
var lat = e.position.coordinate.latitude;
var long = e.position.coordinate.longitude;
var acc = e.position.accuracy;
}

C# :

using Windows.Devices.Geolocation;

private Geolocator loc = new Geolocator();

private void StartTracking(object sender, RoutedEventArgs e)
{
loc.DesiredAccuracy = PositionAccuracy.High;
loc.PositionChanged += new TypedEventHandler<Geolocator, PositionChangedEventArgs>(OnPositionChanged);
}

private void OnPositionChanged(Geolocator sender, PositionChangedEventArgs e)
{
Geoposition pos = e.Position;

var lat = pos.Coordinate.Latitude;
var long = pos.Coordinate.Longitude;
var acc = pos.Coordinate.Accuracy;
}

Nous retrouvons ici en grande partie le même code que celui correspondant à la recherche ponctuelle, mais au lieu d'effectuer une opération asynchrone, nous ajoutons un détecteur d'événements qui transmet un délégué pour gérer l'événement. Maintenant, dès qu'un changement de position est détecté, le délégué est appelé et nous pouvons utiliser les données de localisation à chaque fois que notre application en a besoin en faisant appel à cette méthode. Si vous souhaitez influer sur la sensibilité de l'événement par rapport au mouvement, vous pouvez définir la propriété MovementThreshold sur l'objet Geolocator.

La possibilité de définir la propriété DesiredAccuracy sur l'objet Geolocator est un autre aspect de l'optimisation du comportement des API de localisation. Si votre application n'a pas besoin de la précision GPS (par exemple, une application de météo), définissez cette propriété sur Default pour limiter la détermination de la position par les appareils GPS, ce qui préservera l'autonomie de la batterie.

Pour plus d'informations sur la prise en charge de l'emplacement dans votre application, consultez l'exemple de géolocalisation, l'article Recommandations pour les applications prenant en charge la localisation et le document sur l'espace de noms Windows.Devices.Geolocation sur MSDN.

Capteurs

Windows 8 offre un ensemble d'API pour les capteurs complet et simple à utiliser. Ces classes se trouvent dans l'espace de noms Windows.Devices.Sensors et représentent les capteurs sous-jacents correspondants :

Vous souvenez-vous du panorama Photosynth interactif dont j'ai parlé au début du billet ? Il se trouve que nous pouvons utiliser le capteur composite via les API Windows Runtime pour implémenter ces types d'interactions. Comme nous voulons une relation simple et réactive entre l'orientation du périphérique et la caméra ou point de vue dans notre panorama Photosynth, nous devons utiliser le capteur composite via la classe Windows.Devices.Sensors.OrientationSensor. Pour en savoir plus sur la technologie sous-jacente utilisée pour prendre en charge le capteur composite, consultez la section sur la prise en charge des capteurs dans Windows 8. La classe OrientationSensor expose deux champs de données qui représentent parfaitement l'orientation de l'appareil : le vecteur composé de 4 éléments appelé quaternion et une matrice 3x3 de valeurs appelée matrice de rotation. Ces champs de données représentent tous les deux des données équivalentes, mais les compressent dans des formats différents.

Les spécificités propres à l'implémentation de la prise en charge des panoramiques et inclinaisons via les données de type quaternion ou matrice de rotation (transformations, etc.) ne sont pas abordées dans ce billet de blog, mais je vais parler de l'accès aux données via l'API Windows Runtime.

Tous les objets de capteur dans l'API Windows Runtime pour les capteurs suivent à peu près le même modèle. Commencez par créer l'objet de capteur. Ensuite, effectuez l'initialisation et appliquez les préférences (définissez l'intervalle des rapports voulu par exemple), puis accédez aux données par un appel synchrone ou en ajoutant un détecteur d'événements.

Voici comment accéder aux données de manière synchrone.

JavaScript :

var sensor = Windows.Devices.Sensors.OrientationSensor.getDefault();
if (sensor) {
// Select a report interval that works for the app and that the sensor supports.
var minimumReportInterval = sensor.minimumReportInterval;
var reportInterval = minimumReportInterval > 20 ? minimumReportInterval : 20;

// Set the report interval to enable the sensor for polling
sensor.reportInterval = reportInterval;

var reading = sensor.getCurrentReading();
if (reading) {
var quaternion = reading.quaternion;
var x = quaternion.x;
var y = quaternion.y;
var z = quaternion.z;
var w = quaternion.w;
}
}

C# :

var sensor = Windows.Devices.Sensors.OrientationSensor.getDefault();
if (sensor) {
// Select a report interval that works for the app and that the sensor supports.
var minimumReportInterval = sensor.minimumReportInterval;
var reportInterval = minimumReportInterval > 20 ? minimumReportInterval : 20;

// Set the report interval to enable the sensor for polling
sensor.reportInterval = reportInterval;

var reading = sensor.getCurrentReading();
if (reading) {
var quaternion = reading.quaternion;
var x = quaternion.x;
var y = quaternion.y;
var z = quaternion.z;
var w = quaternion.w;
}
}

Ce type d'accès peut être préféré si vous avez besoin des données uniquement dans certaines circonstances (par exemple pour identifier l'orientation d'un appareil sur un objet en réponse à une action utilisateur) ou si vous avez besoin d'interroger des données dans une minuterie (une boucle de rendu dans un jeu par exemple). Même lorsque vous interrogez des données, vous devez définir l'intervalle des rapports comme indiqué ici, afin que le matériel/pilote des capteurs puisse actualiser les données à la fréquence requise par votre application.

Je vais ensuite montrer comment répondre à la lecture d'événements modifiés.

JavaScript :

var sensor = Windows.Devices.Sensors.OrientationSensor.getDefault();
if (sensor) {
var minimumReportInterval = sensor.minimumReportInterval;
var reportInterval = minimumReportInterval > 20 ? minimumReportInterval : 20;
sensor.reportInterval = reportInterval;

sensor.addEventListener("readingchanged", onDataChanged);
}

function onDataChanged(e) {
var quaternion = e.reading.quaternion;
var x = quaternion.x;
var y = quaternion.y;
var z = quaternion.z;
var w = quaternion.w;
}

C# :

using Windows.Devices.Sensors;

private OrientationSensor sensor = OrientationSensor.GetDefault();

private void EnableReadings(object sender, RoutedEventArgs e)
{
if (sensor != null)
{
var minReportInterval = sensor.MinimumReportInterval;
var desiredReportInterval = minReportInterval > 20 ? minReportInterval : 20;

sensor.ReportInterval = desiredReportInterval;

sensor.ReadingChanged += new TypedEventHandler<OrientationSensor, OrientationSensorReadingChangedEventArgs>(ReadingChanged);
}
}

private void ReadingChanged(object sender, OrientationSensorReadingChangedEventArgs e)
{
SensorQuaternion quaternion = e.Reading.Quaternion;
var x = quaternion.X;
var y = quaternion.Y;
var z = quaternion.Z;
var w = quaternion.W;
}

Dans cet extrait de code, nous obtenons un objet OrientationSensor, puis nous définissons l'intervalle des rapports sur 20 ou sur la valeur minimale prise en charge (correspondant à la fréquence la plus élevée à laquelle les capteurs peuvent fournir les données), selon la valeur la plus importante. Cela nous permet d'obtenir des données à des intervalles aussi proches que possible de toutes les 20 millisecondes, par exemple, pour cette application. Utilisez un intervalle approprié à votre application (adaptez la fréquence à vos besoins en données) afin de ne pas affecter négativement la puissance et les performances.

Dans le délégué du détecteur d'événements, nous appliquons les transformations appropriées à l'aide des données quaternion [x,y,z,w] pour prendre en charge les interactions mouvement/orientation dans notre application. Les données équivalentes de type matrice de rotation sont également disponibles. Bien que ce code de transformation n'entre pas dans le cadre de ce blog, il existe plusieurs sources d'informations en ligne concernant l'utilisation des données quaternion pour les jeux, la robotique et autres. L'avantage de l'utilisation des données quaternion (ou matrice de rotation) par rapport aux données de l'inclinomètre réside dans la continuité des données de rotation, ce qui évite le « blocage de cardan » qui est inhérent aux calculs d'angle d'Euler.

Conclusion

L'ajout des fonctionnalités de capteur et d'emplacement à votre application peut donner lieu à de nouvelles expériences extraordinaires pour les utilisateurs. Avec Windows 8, vous bénéficiez d'une prise en charge matérielle et logicielle complète, de Visual Studio, d'API Windows Runtime faciles à utiliser et d'une variété de langages de programmation pour créer des applications optimisées pour les capteurs et la localisation. Tout cela vous permet d'implémenter ces fonctionnalités dans votre application de manière avantageuse et simple. Alors, quelle application allez-vous créer ?

--Gavin Gear, Chef de projet

--Dino Natucci, Chef de projet

  • Loading...
Leave a Comment
  • Please add 7 and 7 and type the answer here:
  • Post