Korzystanie z gyrometru

Dowiedz się, jak wykrywać zmiany w ruchu użytkownika za pomocą gyrometru.

Żyroskopy uzupełniają akcelerometry w kontrolerach do gier. Akcelerometr może mierzyć ruch liniowy, podczas gdy żyrometr mierzy prędkość kątową lub ruch obrotowy.

Note

Ten artykuł koncentruje się na kodzie, który pokazuje, jak używać cyrometru. Aby zapoznać się z omówieniem czujnika gyrometru, zobacz Czujniki: Gyrometer.

Prerequisites

Należy zapoznać się z czujnikiem gyrometru i jego zastosowaniami. Zobacz Czujniki: Gyrometer.

Urządzenie, którego używasz, musi obsługiwać żyroskop.

Przykładowy kod

using Microsoft.UI.Dispatching;
using Microsoft.UI.Xaml.Controls;
using Windows.Devices.Sensors;

namespace DevicesDemo.Pages
{
    public sealed partial class GyrometerPage : Page
    {
        private Gyrometer? gyrometer;

        public GyrometerPage()
        {
            InitializeComponent();

            // Get the default gyrometer sensor object.
            gyrometer = Gyrometer.GetDefault();

            if (gyrometer != null)
            {
                // Establish the report interval.
                uint minReportInterval = gyrometer.MinimumReportInterval;
                uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
                gyrometer.ReportInterval = reportInterval;

                // Assign an event handler for the reading-changed event.
                gyrometer.ReadingChanged += Gyrometer_ReadingChanged;
            }
            else
            {
                statusBar.Message = "No gyrometer was found.";
                statusBar.Severity = InfoBarSeverity.Error;
                statusBar.IsOpen = true;
            }
        }

        // This event handler writes the current gyrometer reading to
        // the three axis text blocks on the XAML page.
        private void Gyrometer_ReadingChanged(Gyrometer sender, GyrometerReadingChangedEventArgs args)
        {
            DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, () =>
            {
                GyrometerReading reading = args.Reading;
                txtXAxis.Text = String.Format("{0,5:0.00}", reading.AngularVelocityX);
                txtYAxis.Text = String.Format("{0,5:0.00}", reading.AngularVelocityY);
                txtZAxis.Text = String.Format("{0,5:0.00}", reading.AngularVelocityZ);
            });
        }
    }
}
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Grid Margin="24">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="44"/>
            <RowDefinition Height="44"/>
            <RowDefinition Height="44"/>
        </Grid.RowDefinitions>
        <TextBlock Text="X-axis:" Style="{StaticResource LabelTextBlockStyle}"/>
        <TextBlock x:Name="txtXAxis" Grid.Column="1" Text="---"/>

        <TextBlock Grid.Row="1" Text="Y-axis:" Style="{StaticResource LabelTextBlockStyle}"/>
        <TextBlock x:Name="txtYAxis" Grid.Column="1" Grid.Row="1" Text="---"/>

        <TextBlock Grid.Row="2" Text="Z-axis:" Style="{StaticResource LabelTextBlockStyle}"/>
        <TextBlock x:Name="txtZAxis" Grid.Column="1" Grid.Row="2" Text="---"/>
    </Grid>

    <InfoBar x:Name="statusBar" Grid.Row="1"/>
</Grid>

Po uruchomieniu aplikacji można zmienić wartości żyrometru, przenosząc urządzenie.

W poprzednim przykładzie pokazano niezbędny kod, który należy napisać, aby zintegrować dane wejściowe gyrometer z aplikacją.

Nawiązywanie połączenia z czujnikiem

Wywołaj metodę GetDefault, aby nawiązać połączenie z domyślnym żyroskopem.

private Gyrometer? gyrometer;
// ...
gyrometer = Gyrometer.GetDefault();

Możesz również wywołać FromIdAsync, aby utworzyć obiekt Gyrometer na podstawie wartości DeviceInformation.Id. Aby uzyskać więcej informacji, zobacz Enumerate devices (Wyliczanie urządzeń).

Jeśli nie zostanie wykryty czujnik gyrometer, komunikat o stanie zostanie zaktualizowany w celu poinformowania użytkownika.

Ustawianie interwału raportu

Aplikacja ustanawia interwał raportu w metodzie MainPage. Ten kod pobiera minimalny interwał obsługiwany przez urządzenie i porównuje go z żądanym interwałem wynoszącym 16 milisekund (w przybliżeniu szybkością odświeżania 60-Hz). Jeśli minimalny obsługiwany interwał jest większy niż żądany interwał, kod ustawia wartość na minimalną. W przeciwnym razie ustawia wartość na żądany interwał.

uint minReportInterval = gyrometer.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
gyrometer.ReportInterval = reportInterval;

Odczytywanie danych z czujnika

Nowe dane gyrometru są przechwytywane w programie obsługi zdarzeń ReadingChanged . Za każdym razem, gdy sterownik czujnika odbiera nowe dane z czujnika, przekazuje wartości do aplikacji przy użyciu tego zdarzenia. W tym przykładzie te nowe wartości są zapisywane w blokach tekstowych znajdujących się w języku XAML odpowiedniej strony.

gyrometer.ReadingChanged += Gyrometer_ReadingChanged;
// ...

private void Gyrometer_ReadingChanged(Gyrometer sender, GyrometerReadingChangedEventArgs args)
{
    DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, () =>
    {
        GyrometerReading reading = args.Reading;
        txtXAxis.Text = String.Format("{0,5:0.00}", reading.AngularVelocityX);
        txtYAxis.Text = String.Format("{0,5:0.00}", reading.AngularVelocityY);
        txtZAxis.Text = String.Format("{0,5:0.00}", reading.AngularVelocityZ);
    });
}