Posted by Geoffrey Boullanger – Senior Software program Engineer, Shandor Dektor – Sensors Algorithms Engineer, Martin Frassl and Benjamin Joseph – Technical Leads and Managers
Gadget orientation, or perspective, is used as an enter sign for a lot of use instances: digital or augmented actuality, gesture detection, or compass and navigation – any time the app wants the orientation of a tool in relation to its environment. We’ve heard from builders that orientation is difficult to get proper, with frequent consumer complaints when orientation is inaccurate. A maps app ought to present the right path to stroll in direction of when a consumer is navigating to an thrilling restaurant in a overseas metropolis!
The Fused Orientation Supplier (FOP) is a brand new API in Google Play providers that gives high quality and constant machine orientation by fusing alerts from accelerometer, gyroscope and magnetometer.
Though at present the Android Rotation Vector already supplies machine orientation (and can proceed to take action), the brand new FOP supplies extra constant conduct and excessive efficiency throughout gadgets. We designed the FOP API to be much like the Rotation Vector to make the transition as simple as doable for builders.
Specifically, the Fused Orientation Supplier
- Offers a unified implementation throughout gadgets: an API in Google Play providers implies that there isn’t any implementation variance throughout completely different producers. Algorithm updates could be rolled out shortly and impartial of Android platform updates;
- Immediately incorporates native magnetic declination, if obtainable;
- Compensates for decrease high quality sensors and OEM implementations (e.g., gyro bias, sensor timing).
In sure instances, the FOP returns values piped via from the AOSP Rotation Vector, tailored to include magnetic declination.
The best way to use the FOP API
Gadget orientation updates could be requested by creating and sending a DeviceOrientationRequest object, which defines some specifics of the request just like the replace interval.
The FOP then outputs a stream of the machine’s orientation estimates as quaternions. The orientation is referenced to geographic north. In instances the place the native magnetic declination just isn’t identified (e.g., location just isn’t obtainable), the orientation will probably be relative to magnetic north.
As well as, the FOP supplies the machine’s heading and accuracy, that are derived from the orientation estimate. This is similar heading that’s proven in Google Maps, which makes use of the FOP as effectively. We lately added modifications to raised deal with magnetic disturbances, to enhance the reliability of the cone for Google Maps and FOP shoppers.
The replace fee could be set by requesting a selected replace interval. The FOP doesn’t assure a minimal or most replace fee. For instance, the replace fee could be sooner than requested if one other app has a sooner parallel request, or it may be slower as requested if the machine doesn’t assist the excessive fee.
For full specification of the API, please seek the advice of the API documentation:
Instance utilization (Kotlin)
package deal ...
import android.content material.Context
import com.google.android.gms.location.DeviceOrientation
import com.google.android.gms.location.DeviceOrientationListener
import com.google.android.gms.location.DeviceOrientationRequest
import com.google.android.gms.location.FusedOrientationProviderClient
import com.google.android.gms.location.LocationServices
import com.google.widespread.flogger.FluentLogger
import java.util.concurrent.Executors
class Instance(context: Context) {
personal val logger: FluentLogger = FluentLogger.forEnclosingClass()
// Get the FOP API shopper
personal val fusedOrientationProviderClient: FusedOrientationProviderClient =
LocationServices.getFusedOrientationProviderClient(context)
// Create an FOP listener
personal val listener: DeviceOrientationListener =
DeviceOrientationListener { orientation: DeviceOrientation ->
// Use the orientation object returned by the FOP, e.g.
logger.atFinest().log("Gadget Orientation: %s deg", orientation.headingDegrees)
}
enjoyable begin() {
// Create an FOP request
val request =
DeviceOrientationRequest.Builder(DeviceOrientationRequest.OUTPUT_PERIOD_DEFAULT).construct()
// Create (or re-use) an Executor or Looper, e.g.
val executor = Executors.newSingleThreadExecutor()
// Register the request and listener
fusedOrientationProviderClient
.requestOrientationUpdates(request, executor, listener)
.addOnSuccessListener { logger.atInfo().log("FOP: Registration Success") }
.addOnFailureListener { e: Exception? ->
logger.atSevere().withCause(e).log("FOP: Registration Failure")
}
}
enjoyable cease() {
// Unregister the listener
fusedOrientationProviderClient.removeOrientationUpdates(listener)
}
}
Technical background
The Android ecosystem has all kinds of system implementations for sensors. Units ought to meet the factors within the Android compatibility definition doc (CDD) and should have an accelerometer, gyroscope, and magnetometer obtainable to make use of the fused orientation supplier. It’s preferable that the machine vendor implements the excessive constancy sensor portion of the CDD.
Regardless that Android gadgets adhere to the Android CDD, really useful sensor specs will not be tight sufficient to totally stop orientation inaccuracies. Examples of this embody magnetometer interference from inner sources, and delayed, inaccurate or nonuniform sensor sampling. Moreover, the atmosphere across the machine often consists of supplies that distort the geomagnetic subject, and consumer conduct can range extensively. To take care of this, the FOP performs a variety of duties as a way to present a sturdy and correct orientation:
- Synchronize sensors operating on completely different clocks and delays;
- Compensate for the arduous iron offset (magnetometer bias);
- Fuse accelerometer, gyroscope, and magnetometer measurements to find out the orientation of the machine on this planet;
- Compensate for gyro drift (gyro bias) whereas transferring;
- Produce a sensible estimate of the compass heading accuracy.
We now have validated our algorithms on complete take a look at knowledge to supply a top quality end result on all kinds of gadgets.
Availability and limitations
The Fused Orientation Supplier is out there on all gadgets operating Google Play providers on Android 5 (Lollipop) and above. Builders want so as to add the dependency play-services-location:21.2.0 (or above) to entry the brand new API.
Permissions
No permissions are required to make use of the FOP API. The output fee is restricted to 200Hz on gadgets operating API degree 31 (Android S) or larger, except the android.permissions.HIGH_SAMPLING_RATE_SENSORS permission was added to your Manifest.xml.
Energy consideration
At all times request the longest replace interval (lowest frequency) that’s ample to your use case. Whereas extra frequent FOP updates could be required for prime precision duties (for instance Augmented Actuality), it comes with an influence price. For those who have no idea which replace interval to make use of, we suggest beginning with DeviceOrientationRequest::OUTPUT_PERIOD_DEFAULT because it suits most shopper wants.
Foreground conduct
FOP updates are solely obtainable to apps operating within the foreground.
Copyright 2023 Google LLC. SPDX-License-Identifier: Apache-2.0