Orientación consistente del dispositivo para todos

Publicado por Geoffrey Boullanger – Ingeniero de software senior, Shandor Dektor – Ingeniero de algoritmos de sensores, Martin Frassl y Benjamin Joseph – Gerentes y líderes técnicos

La orientación o actitud del dispositivo se utiliza como señal de entrada para muchos casos de uso: realidad virtual o aumentada, detección de gestos, brújula y navegación, siempre que la aplicación necesite la orientación de un dispositivo en relación con el entorno. Hemos escuchado de los desarrolladores que es difícil lograr la orientación correcta, con frecuentes quejas de los usuarios cuando la orientación no es correcta. ¡Una aplicación de mapas debería mostrar la dirección correcta a seguir cuando un usuario se dirige a un restaurante interesante en una ciudad extranjera!

Fused Orientation Provider (FOP) es una nueva API en los servicios de Google Play que proporciona orientación consistente y de calidad al dispositivo fusionando señales de acelerómetro, giroscopio y magnetómetro.

Si bien Android Rotation Vector ya proporciona orientación del dispositivo (y seguirá haciéndolo), el nuevo FOP ofrece un comportamiento más consistente y un alto rendimiento en todos los dispositivos. Diseñamos la API FOP para que sea similar al vector de rotación para que la transición sea lo más fácil posible para los desarrolladores.

En particular, el proveedor de orientación fusionada

    • Proporciona una implementación unificada en todos los dispositivos: una API en los servicios de Google Play significa que no hay variaciones de implementación entre diferentes fabricantes. Las actualizaciones de algoritmos se pueden implementar de forma rápida e independiente de las actualizaciones de la plataforma Android;
    • Incorpora directamente la declinación magnética local, si está disponible;
    • Compensa los sensores de menor calidad y las implementaciones OEM (por ejemplo, polarización giroscópica, sincronización del sensor).

En algunos casos, el FOP devuelve valores transmitidos por el vector de rotación AOSP, ajustados para incorporar la declinación magnética.

Cómo utilizar la API FOP

Las actualizaciones de la orientación del dispositivo se pueden solicitar creando y enviando un objeto DeviceOrientationRequest, que define algunos detalles de la solicitud, como el período de actualización.

Luego, el FOP genera un flujo de estimaciones de orientación del dispositivo como cuaterniones. Se hace referencia a la orientación. geográfico norte. En los casos en los que no se conoce la declinación magnética local (por ejemplo, la ubicación no está disponible), la orientación será relativa a magnético norte.

Además, el FOP proporciona el rumbo y la precisión del dispositivo, que se derivan de la estimación de la orientación. Este es el mismo encabezado que se muestra en Google Maps, que también usa FOP. Recientemente agregamos cambios para manejar mejor las perturbaciones magnéticas y mejorar la confiabilidad del cono para los clientes de Google Maps y FOP.

La frecuencia de actualización se puede configurar solicitando un período de actualización específico. FOP no garantiza una frecuencia de actualización mínima o máxima. Por ejemplo, la frecuencia de actualización puede ser más rápida de lo requerido si otra aplicación tiene una solicitud paralela más rápida, o puede ser más lenta de lo requerido si el dispositivo no admite la alta velocidad.

Para obtener las especificaciones API completas, consulte la documentación de la API:

Ejemplo de uso (Kotlin)

paquete… importar android.content.Context importar com.google.android.gms.location.DeviceOrientation importar com.google.android.gms.location.DeviceOrientationListener importar com.google.android.gms.location.DeviceOrientationRequest importar com.google .android.gms.location.FusedOrientationProviderClient import com.google.android.gms.location.LocationServices import com.google.common.flogger.FluentLogger import java.util.concurrent.Executors clase Ejemplo (contexto: contexto) { registrador de valor privado: FluentLogger = FluentLogger.forEnclosingClass() // Obtener el valor privado del cliente API FOP fusionadoOrientationProviderClient: FusedOrientationProviderClient = LocationServices.getFusedOrientationProviderClient(context) // Crear un oyente FOP valor privado oyente: DeviceOrientationListener = DeviceOrientationListener { orientación: DeviceOrientation -> // Usar el objeto orientación devuelta por FOP, por ejemplo logger.atFinest().log(“Device Orientation: %s deg”, orientación.headingDegrees) } fun start() { // Crea una solicitud FOP val request = DeviceOrientationRequest.Builder(DeviceOrientationRequest. OUTPUT_PERIOD_DEFAULT ).build() // Crea (o reutiliza) un Ejecutor o Looper, por ejemplo val executor = Executors.newSingleThreadExecutor() // Registra la solicitud y el oyente fusedOrientationProviderClient .requestOrientationUpdates(request, executor, oyente) .addOnSuccessListener { registrador . atInfo().log(“FOP: Registro exitoso”) } .addOnFailureListener { e: ¿Excepción? -> logger.atSevere().withCause(e).log(“FOP: Error de registro”) } } fun stop() { // Anular el registro del oyente fusedOrientationProviderClient.removeOrientationUpdates(listener) } }

Experiencia técnica

El ecosistema de Android tiene una amplia variedad de implementaciones de sistemas para sensores. Los dispositivos deben cumplir los criterios en Documento de definición de compatibilidad de Android (CDD) y debe tener un acelerómetro, giroscopio y magnetómetro para utilizar el proveedor de orientación fusionado. Es preferible que el proveedor del dispositivo implemente la parte del sensor de alta fidelidad del CDD.

Aunque los dispositivos Android cumplen con el CDD de Android, las especificaciones de sensor recomendadas no son lo suficientemente estrictas como para evitar por completo imprecisiones en la orientación. Ejemplos de esto incluyen interferencias del magnetómetro provenientes de fuentes internas y muestreo de sensores retrasado, inexacto o no uniforme. Además, el entorno que rodea al dispositivo suele incluir materiales que distorsionan el campo geomagnético y el comportamiento del usuario puede variar mucho. Para abordar esto, la FOP lleva a cabo una serie de tareas con el fin de proporcionar una orientación sólida y precisa:

    • Sincronizar sensores que funcionan con diferentes relojes y retrasos;
    • Compensar el desplazamiento del hierro duro (sesgo del magnetómetro);
    • Mediciones de acelerómetro, giroscopio y magnetómetro para determinar la orientación del dispositivo en el mundo;
    • Compensa la deriva del giroscopio (sesgo del giroscopio) durante el movimiento;
    • Produzca una estimación realista de la precisión del rumbo de la brújula.

    Hemos validado nuestros algoritmos con datos de pruebas completos para proporcionar un resultado de alta calidad en una amplia variedad de dispositivos.

    Disponibilidad y limitaciones

    El proveedor de orientación fusionada está disponible en todos los dispositivos que ejecutan los servicios de Google Play en Android 5 (Lollipop) y versiones posteriores. Los desarrolladores deben agregar la dependencia play-services-location:21.2.0 (o posterior) para acceder a la nueva API.

    Permisos

    No se requieren permisos para utilizar la API FOP. La velocidad de salida está limitada a 200 Hz en dispositivos que ejecutan el nivel API 31 (Android S) o superior, a menos que se haya agregado el permiso android.permissions.HIGH_SAMPLING_RATE_SENSORS a su Manifest.xml.

    Consideración de poder

    Solicite siempre el período de actualización más largo (frecuencia más baja) suficiente para su caso de uso. Si bien es posible que se requieran actualizaciones FOP más frecuentes para tareas de alta precisión (por ejemplo, realidad aumentada), esto tiene un costo en términos de energía. Si no sabe qué período de actualización usar, le recomendamos comenzar con DeviceOrientationRequest::OUTPUT_PERIOD_DEFAULT, ya que se adapta a la mayoría de las necesidades de los clientes.

    Comportamiento en foco

    Las actualizaciones de FOP solo están disponibles para aplicaciones que se ejecutan en primer plano.

    Copyright 2023 Google LLC. Identificador de licencia SPDX: Apache-2.0

Compruebe también

en vivo desde Droidcon, incluida la mayor actualización de Gemini en Android Studio y más lanzamientos del SDK de Android.

Acabamos de lanzar nuestro episodio de otoño de #TheAndroidShow en YouTube etcétera desarrollador.android.comy esta vez …

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *