Compartir a través de


Orientación del sensor

Los datos del sensor de las clases Accelerometer, Gyrometer, Compass, Inclinometer y OrientationSensor se definen mediante sus ejes de referencia. Estos ejes se definen mediante el marco de referencia del dispositivo y giran con el dispositivo a medida que el usuario lo convierte. Si la aplicación admite la rotación automática y se vuelve a orientar para adaptarse al dispositivo a medida que el usuario lo gira, debes ajustar los datos del sensor para la rotación antes de usarlos.

API importantes

Orientación de la pantalla frente a orientación del dispositivo

Para comprender los ejes de referencia de los sensores, debe distinguir la orientación de la pantalla de la orientación del dispositivo. La orientación de la pantalla es el texto de dirección y las imágenes se muestran en la pantalla, mientras que la orientación del dispositivo es el posicionamiento físico del dispositivo.

Nota:

El eje Z positivo se extiende desde la pantalla del dispositivo, como se muestra en la siguiente imagen. Eje Z para portátil

En los diagramas siguientes, la orientación del dispositivo y de la pantalla se encuentran en Horizontal (los ejes del sensor que se muestran son específicos de la orientación horizontal).

En este diagrama se muestra la visualización y la orientación del dispositivo en Horizontal.

Orientación de la pantalla y del dispositivo en Horizontal

En este diagrama siguiente se muestra la visualización y la orientación del dispositivo en LandscapeFlipped.

Visualización y orientación del dispositivo en LandscapeFlipped

En este diagrama final se muestra la orientación de la pantalla en Horizontal mientras que la orientación del dispositivo es LandscapeFlipped.

Orientación de pantalla en Horizontal mientras que la orientación del dispositivo es LandscapeFlipped

Puede consultar los valores de orientación a través de la clase DisplayInformation mediante el método GetForCurrentView con la propiedad CurrentOrientation. A continuación, puede crear lógica comparando con la enumeración DisplayOrientations. Recuerde que para cada orientación que admita, debe admitir una conversión de los ejes de referencia a esa orientación.

Dispositivos horizontales frente a verticales

Los fabricantes producen dispositivos tanto horizontales como verticales. El marco de referencia varía entre dispositivos horizontales (como equipos de escritorio y portátiles) y dispositivos verticales (como teléfonos y algunas tabletas). En la tabla siguiente se muestran los ejes del sensor para dispositivos horizontales y verticales.

Orientación Primero en horizontal Vertical-first
Horizontal Dispositivo primero horizontal en orientación horizontal Dispositivo vertical en orientación horizontal
Vertical Dispositivo horizontal en orientación vertical Dispositivo vertical en orientación vertical
LandscapeFlipped Dispositivo horizontal primero en la orientación HorizontalFlipped Dispositivo vertical en orientación HorizontalFlipped
VerticalFlipped Dispositivo horizontal en orientación VerticalFlipped Dispositivo vertical por primera vez en orientación VerticalFlipped

Dispositivos de difusión de pantalla y dispositivos sin encabezado

Algunos dispositivos tienen la capacidad de difundir la pantalla a otro dispositivo. Por ejemplo, podría tomar una tableta y difundir la pantalla a un proyector que estará en orientación horizontal. En este escenario, es importante tener en cuenta que la orientación del dispositivo se basa en el dispositivo original, no en el que se presenta la pantalla. Por lo tanto, un acelerómetro informaría de los datos de la tableta.

Además, algunos dispositivos no tienen una pantalla. Con estos dispositivos, la orientación predeterminada para estos dispositivos es vertical.

Mostrar orientación y encabezado de brújula

El encabezado de brújula depende de los ejes de referencia y, por tanto, cambia con la orientación del dispositivo. Compensa en función de esta tabla (supongamos que el usuario está orientado al norte).

Orientación de la pantalla Eje de referencia para el encabezado de brújula Encabezado de brújula de API cuando se enfrenta al norte (primero horizontal) Encabezado de brújula de API cuando se enfrenta al norte (vertical-primero) Compensación de encabezado de brújula (primero horizontal) Compensación de encabezado de brújula (vertical-first)
Horizontal Z- 0 270 Dirección (Título + 90) % 360
Vertical Y 90 0 (Título + 270) % 360 Dirección
LandscapeFlipped Z 180 90 (Título + 180) % 360 (Título + 270) % 360
VerticalFlipped Y 270 180 (Título + 90) % 360 (Título + 180) % 360

Modifique el encabezado de brújula como se muestra en la tabla para mostrar correctamente el encabezado. El siguiente fragmento de código muestra cómo hacerlo.

private void ReadingChanged(object sender, CompassReadingChangedEventArgs e)
{
    double heading = e.Reading.HeadingMagneticNorth;
    double displayOffset;

    // Calculate the compass heading offset based on
    // the current display orientation.
    DisplayInformation displayInfo = DisplayInformation.GetForCurrentView();

    switch (displayInfo.CurrentOrientation)
    {
        case DisplayOrientations.Landscape:
            displayOffset = 0;
            break;
        case DisplayOrientations.Portrait:
            displayOffset = 270;
            break;
        case DisplayOrientations.LandscapeFlipped:
            displayOffset = 180;
            break;
        case DisplayOrientations.PortraitFlipped:
            displayOffset = 90;
            break;
     }

    double displayCompensatedHeading = (heading + displayOffset) % 360;

    // Update the UI...
}

Orientación de la pantalla con el acelerómetro y el girómetro

En esta tabla se convierten los datos del acelerómetro y del girómetro para la orientación de la pantalla.

Ejes de referencia X Y Z
Horizontal X Y Z
Vertical Y -X Z
LandscapeFlipped -X -y Z
VerticalFlipped -y X Z

En el ejemplo de código siguiente se aplican estas conversiones al girómetro.

private void ReadingChanged(object sender, GyrometerReadingChangedEventArgs e)
{
    double x_Axis;
    double y_Axis;
    double z_Axis;

    GyrometerReading reading = e.Reading;  

    // Calculate the gyrometer axes based on
    // the current display orientation.
    DisplayInformation displayInfo = DisplayInformation.GetForCurrentView();
    switch (displayInfo.CurrentOrientation)
    {
        case DisplayOrientations.Landscape:
            x_Axis = reading.AngularVelocityX;
            y_Axis = reading.AngularVelocityY;
            z_Axis = reading.AngularVelocityZ;
            break;
        case DisplayOrientations.Portrait:
            x_Axis = reading.AngularVelocityY;
            y_Axis = -1 * reading.AngularVelocityX;
            z_Axis = reading.AngularVelocityZ;
            break;
        case DisplayOrientations.LandscapeFlipped:
            x_Axis = -1 * reading.AngularVelocityX;
            y_Axis = -1 * reading.AngularVelocityY;
            z_Axis = reading.AngularVelocityZ;
            break;
        case DisplayOrientations.PortraitFlipped:
            x_Axis = -1 * reading.AngularVelocityY;
            y_Axis = reading.AngularVelocityX;
            z_Axis = reading.AngularVelocityZ;
            break;
     }

    // Update the UI...
}

Orientación de la pantalla y orientación del dispositivo

Los datos OrientationSensor deben cambiarse de una manera diferente. Piense en estas distintas orientaciones como rotaciones en sentido contrario a las agujas del reloj hacia el eje Z, por lo que es necesario invertir la rotación para recuperar la orientación del usuario. Para los datos de cuaternión, podemos usar la fórmula de Euler para definir una rotación con un cuaternión de referencia y también podemos usar una matriz de rotación de referencia.

Fórmula de Euler

Para obtener la orientación relativa que desee, multiplique el objeto de referencia en el objeto absoluto. Tenga en cuenta que esta matemática no es conmutativa.

Multiplicar el objeto de referencia con el objeto absoluto

En la expresión anterior, los datos del sensor devuelven el objeto absoluto.

Orientación de la pantalla Rotación en sentido contrario a las agujas del reloj alrededor de Z Cuaternión de referencia (rotación inversa) Matriz de rotación de referencia (rotación inversa)
Horizontal 0 1 + 0i + 0j + 0k [1 0 0
0 1 0
0 0 1]
Vertical 90 cos(-45)* + (i + j + k)*sin(-45 ») [0 1 0
-1 0 0
0 0 1]
LandscapeFlipped 180 0 - i - j - k [1 0 0
0 1 0
0 0 1]
VerticalFlipped 270 cos(-135)* + (i + j + k)*sin(-135 Robado) [0 -1 0
1 0 0
0 0 1]

Consulte también

Integración de sensores de movimiento y orientación