Korzystanie z inklinometru

Dowiedz się, jak używać inklinometru do określania pochylenia, przechylenia i odchylenia.

W tym przykładzie utworzono prostą aplikację, która opiera się na inklinometrze jako urządzeniu wejściowym. Niektóre gry 3-W wymagają inklinometru jako urządzenia wejściowego. Jednym z typowych przykładów jest symulator lotu, który może mapować trzy osie inklinometru (X, Y i Z) do windy, aileronu i steru wejściowego samolotu.

Note

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

Prerequisites

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

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

Przykładowy kod

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

namespace DevicesDemo.Pages
{
    public sealed partial class InclinometerPage : Page
    {
        private Inclinometer? inclinometer;

        public InclinometerPage()
        {
            InitializeComponent();

            // Get the default inclinometer sensor object.
            inclinometer = Inclinometer.GetDefault();

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

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

        // This event handler writes the current inclinometer
        // reading to the text blocks on the XAML page.
        private void Inclinometer_ReadingChanged(Inclinometer sender, InclinometerReadingChangedEventArgs args)
        {
            DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, () =>
            {
                InclinometerReading reading = args.Reading;
                txtPitch.Text = String.Format("{0,5:0.00}", reading.PitchDegrees);
                txtRoll.Text = String.Format("{0,5:0.00}", reading.RollDegrees);
                txtYaw.Text = String.Format("{0,5:0.00}", reading.YawDegrees);
            });
        }
    }
}
<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="Pitch:" Style="{StaticResource LabelTextBlockStyle}"/>
        <TextBlock x:Name="txtPitch" Grid.Column="1" Text="---"/>

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

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

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

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

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

Nawiązywanie połączenia z czujnikiem

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

private Inclinometer? inclinometer;
// ...
inclinometer = Inclinometer.GetDefault();

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

Jeśli nie zostanie wykryty czujnik przechyłu, komunikat o statusie zostanie zaktualizowany, aby poinformować użytkownika.

Ustawianie interwału raportu

Interwał raportu jest ustawiany w konstruktorze strony. 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 = inclinometer.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
inclinometer.ReportInterval = reportInterval;

Odczytywanie danych z czujnika

Nowe dane inklinometru są przechwytywane w procedurze 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.

inclinometer.ReadingChanged += Inclinometer_ReadingChanged;
// ...

private void Inclinometer_ReadingChanged(Inclinometer sender, InclinometerReadingChangedEventArgs args)
{
    DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, () =>
    {
        InclinometerReading reading = args.Reading;
        txtPitch.Text = String.Format("{0,5:0.00}", reading.PitchDegrees);
        txtRoll.Text = String.Format("{0,5:0.00}", reading.RollDegrees);
        txtYaw.Text = String.Format("{0,5:0.00}", reading.YawDegrees);
    });
}