[JAVA] Die Geschichte einer Android-Anwendung, mit der die Abtastfrequenz des Beschleunigungssensors angepasst werden kann

Überblick

Persönlich wollte ich die Werte des 3-Achsen-Beschleunigungssensors in der CSV-Datei. Ich denke, jeder Qiita-Typ hat diese Art von Erfahrung.

Also hatte ich Xperia zur Hand, suchte sofort in Google Play und installierte den Beschleunigungssensor-Logger von einem Ende.

Dann was! Die Abtastfrequenz kann nicht beliebig eingestellt werden. .. ..

Es gab jedoch eine App, die auf iOS eingestellt werden konnte, so dass es eine Geschichte war, die ich auch auf Android nicht schaffen konnte.

Erste Umfrage

(Achtung) Dieses Kapitel wird wie ein Studienprotokoll geschrieben, nicht wie ein Arbeitsprotokoll. Sehen Sie es sich also wie ein Tagebuch an.

Wie bei allen Apps (6 oder 7 Samples) konnte das Sampling-Intervall nur grob angepasst werden.

Bei der Untersuchung scheint es, dass der Beschleunigungssensor im Gegensatz zu anderen Terminalsensoren die spezifische Abtastrate nicht einstellen kann. Werfen wir einen Blick auf registerListener aus SensorManager Reference. image.png Geben Sie dann im Grunde genommen die folgenden vier Variablen für dieses dritte Argument an: int sample PeriodUs.

image.pngimage.png Diese sind in der SensorEvent-Klasse [(SensorEvent-Referenz)] definiert (https://developer.android.com/reference/android/hardware/SensorEvent.html).

Sie fragen sich jedoch, was passiert, wenn Sie in dieses dritte Argument eine bestimmte Ganzzahl eingeben. Damit! Die folgende Seite hat es speziell überprüft ← https://akira-watson.com/android/accelerometer.html

Übrigens habe ich im eigentlichen Setup die Voruntersuchung nicht so sorgfältig durchgeführt und bin in einem Sumpf stecken geblieben, dass es nicht gut funktioniert hat, selbst wenn ich eine ganze Zahl eingegeben habe, und ich bin hier angekommen (Schweiß)

Entschuldigen Sie mich lange, aber wie ich bereits sagte, als diese Tatsache klar wurde, hatte ich bereits begonnen, sie umzusetzen. Ich werde das Abtastintervall durch Filtern oder was auch immer zwangsweise anpassen, ich bin bereit

Umgebung

windows 10 home Android Studio 3.6.3 Android Smartphone Xperia SO-01K API: 28 AVD :Nexus 5X API: 24

Implementierung

Wie Sie der Version entnehmen können, installieren Sie sie einfach und Sie werden Android Studio zum ersten Mal berühren Als Vorwissen weiß ich, dass Schaltflächen einfach herzustellen sind

Ende der Versicherungszeit, gehen Sie zum Design

Design

Die API wurde auf 16 gesetzt, in der Hoffnung, dass sie auf jedem Gerät verwendet werden kann. Screenshot_20200419-190507 (2).png

Aus dem Fazit sieht es aus wie dieser Sukusho

Methode zur Einstellung der Abtastfrequenz

Es ist eine Implementierungsmethode, die ich mir ausgedacht habe.

Ich konnte so viel erwähnen

Nun, das ist der Auftrag, den ich während der Produktion angesprochen habe Infolgedessen war der dritte gut, so dass ich es nicht bei jedem Frame gemacht habe.

Visualisieren Sie zunächst die Beschleunigung

Erstens ist der Beispielcode bei Verwendung des Beschleunigungssensors

MainActivity.java


    private SensorManager mManager;
    private TextView mX,mY,mZ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Get an instance of the SensorManager
        mManager = (SensorManager) getSystemService(SENSOR_SERVICE);

        mX = (TextView)this.findViewById(R.id.textViewX);
        mY = (TextView)this.findViewById(R.id.textViewY);
        mZ = (TextView)this.findViewById(R.id.textViewZ);
    }

    @Override
    protected void onResume() {
        super.onResume();
        //Hörerregistrierung
        Sensor accSensor= sensorManager.getDefaultSensor(
                                Sensor.TYPE_ACCELEROMETER);

        this.mManager.registerListener((SensorEventListener) this, this.accSensor, SensorManager.SENSOR_DELAY_FASTEST);

    }

    @Override
    protected void onPause() {
        super.onPause();
        //Listener freigeben
        this.mManager.unregisterListener((SensorEventListener)this, this.accSensor);
    }

    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {

        mX.setText("Beschleunigungssensor X.:" + String.valueOf(sensorEvent.values[0]));
        mY.setText("Beschleunigungssensor Y.:" + String.valueOf(sensorEvent.values[1]));
        mZ.setText("Beschleunigungssensor Z.:" + String.valueOf(sensorEvent.values[2]));

    }

    public void onAccuracyChanged(Sensor sensor, int n) {
    }
}

Dies funktioniert vorerst, wenn Sie mehrere Sensoren in der Funktion onSensorChanged unterstützen möchten if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){} Bedingt verzweigen

Wie Sie der onSensorChanged-Methode entnehmen können, enthalten die Werte [0] bis [2] in der sensorEvent-Klasse Beschleunigungen von x, y und z [(siehe SensorEvent-Referenz)](https: // developer. android.com/reference/android/hardware/SensorEvent.html#values)

Wenn Sie also das Messdatum und die Messzeit hinzufügen und an csv ausgeben, können Sie eine csv-Datei mit der maximalen Abtastfrequenz erhalten.

Es gibt zwei Methoden zum Erfassen der Abtastfrequenz (auch im letzten Referenzmaterial beschrieben). https://qiita.com/taittide/items/2f6a70eae22117266a66 https://akihito104.hatenablog.com/entry/2013/07/22/013000

Die CSV-Ausgabe ist nicht das Herzstück dieser App, daher werde ich sie weglassen.

Ausdünnen

Der Gesamtfluss dieser App ist

① Die START-Taste wird gedrückt       ↓ ② Speichern Sie die x-, y- und z-Beschleunigung in einer neuen Liste       ↓ ③ Die STOP / SAVE-Taste wird gedrückt       ↓ ④ Kopieren Sie die gespeicherte Beschleunigung nach CSV in die Ausgabeliste       ↓ ⑤ Ausgabe an CSV aus der Liste für CSV-Ausgabe       ↓ ⑥ Verwerfen Sie alle Listendaten. Warten Sie auf ①

Daher kann die Abtastfrequenz durch Ausdünnen auf eine geeignete Größe in Schritt (4) eingestellt werden.

Erstens ist der Beispielcode

MainActivity.java



public void changeandcopy_information() {

        accX_w = new ArrayList();
        accY_w = new ArrayList();
        accZ_w = new ArrayList();
        timeStamp_Time_forAcc_w = new ArrayList(timeStamp_Time_forAcc);
        int temp_size = timeStamp_Time_forAcc_w.size();
        boolean once = false;

        //Variablen zum Ausdünnen des Arrays auf die gewünschte Abtastrate
        int AdjustI = (int)(input_sampling_rate/wantConverting_sampling_rate);

        for (int i = 0; AdjustI*i < temp_size; i++) {
            if(!once){
                timeStamp_Time_forAcc_w.clear();
                once=true;
            }
            accX_w.add(accX.get(AdjustI*i));
            accY_w.add(accY.get(AdjustI*i));
            accZ_w.add(accZ.get(AdjustI*i));
            timeStamp_Time_forAcc_w.add(timeStamp_Time_forAcc.get(AdjustI*i));
        }
}

Beschreibung neuer Zeichenvariablen Die Beschleunigung wird in accX, axxY, accZ gespeichert und zuerst definiert, um sie für die CSV-Ausgabe nach accX_w, axxY_w, accZ_w zu kopieren. timeStamp_Time_forAcc_w speichert das Messdatum und die Messzeit des Frames In input_sampling_rate wird die maximale Abtastfrequenz des Endgeräts des Benutzers gespeichert, und in wantConverting_sampling_rate wird die vom Benutzer gewünschte Abtastfrequenz als ganzzahliger Typ gespeichert. Stellen Sie I und einmal so ein, wie Sie den Code sehen

Wenn Sie ein konkretes Beispiel geben und erklären, was Sie tun Angenommen, die maximale Abtastfrequenz des Terminals beträgt 400 (Hz) und die vom Benutzer gewünschte Abtastfrequenz beträgt 100 (Hz). Wenn Sie es hier einfach so kopieren, wie es ist, erhöht sich die Arraygröße der Variablen _w um 400 pro Sekunde. Wenn daher der Wert von 400/100 (maximale Abtastfrequenz (Hz) des vom Benutzer gewünschten Endgeräts / Abtastfrequenz (Hz) des Benutzers) in der for-Anweisung mit i multipliziert wird, ist i 0,1 * 400/100, 2 * 400/100, .. und die Größe des Arrays pro Sekunde beträgt 100, was 1/4 ist.

Erfolgreiche Einstellung der Abtastfrequenz! !! !! Wann ist es nicht teilbar? Es kann nicht geholfen werden. Fehler sind inhärent

Aktuelle CSV-Datei

image.png image.png image.png

Dies ist die Ausgabe, wenn die Abtastfrequenz der tatsächlichen Maschine 423 (Hz) beträgt und die Abtastfrequenz, die Sie konvertieren möchten, 10 (Hz) beträgt.

Die Differenz zum theoretischen Wert von 0,1 Sekunden betrug -0,001 und 0,000, und der maximale Fehler betrug insgesamt ± 0,001.

Ich frage mich, warum es bisher keinen Fehler gibt, aber es ist trotzdem ein Happy End.

Quellcode

Ich habe es auf Github gepostet. Die Verwendung ist etwas kompliziert, siehe READ ME.txt. https://github.com/miwazawa/accelerator-logger Es wurde bestätigt, mit Xperia und Nexus zu arbeiten, die in der Umgebung erwähnt werden.

schließlich

Vielen Dank, dass Sie so lange bei uns geblieben sind.

Von der Implementierung an hatte ich das Gefühl, ich sollte es Github geben, und ich schrieb es, während ich das Gefühl hatte, dass es ein schlechter Satz war (lacht)

In Bezug auf den Quellcode erhalte ich eine große Warnung zu activity_main.xml, aber es funktioniert, sodass ich es wahrscheinlich nicht reparieren werde!

Das Referenzmaterial listet wahrscheinlich alle Websites auf, die ich dieses Mal verwendet habe. Ich denke, Sie können es implementieren, indem Sie es sich ansehen.

Es war fast das erste Mal, dass ich ein richtiges Programm in Java schrieb, also hoffe ich, dass Anfänger sich in Bezug auf Lernmethoden usw. darauf beziehen können.

Von der Mitte an wurde mir klar, dass es schneller von VBA aus geht, wenn man sich mit dem Arrangement anlegen möchte, was eine andere Geschichte ist

Referenzmaterial

Informationen zur Java-Syntax

Typkonvertierungsmethode https://eng-entrance.com/java-var-change https://www.sejuku.net/blog/14531 Ganzzahlige Beurteilung der Zeichenfolge https://techacademy.jp/magazine/19075 So verwenden Sie Thread.sleep https://engineer-club.jp/java-sleep Informationen zur CSV-Ausgabe https://tech.pjin.jp/blog/2017/10/17/%E3%80%90java%E3%80%91csv%E5%87%BA%E5%8A%9B%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89/ https://teratail.com/questions/25005?link=qa_related_pc_sidebar https://teratail.com/questions/49794 Liste / um das Array https://www.javadrive.jp/start/linkedlist/index2.html

Über Beschleunigungssensor

Montage des Beschleunigungssensors https://akira-watson.com/android/accelerometer.html Abtastfrequenz-Erkennungsmethode http://akihito104.hatenablog.com/entry/2013/07/22/013000 https://qiita.com/taittide/items/2f6a70eae22117266a66

Über Android Studio

Von der Installation von Android Studio bis Hello World https://akira-watson.com/android/helloworld.html layout https://qiita.com/mii-chang/items/ee965c1e8826d4e59414 Edittext Input Urteil https://qiita.com/HALU5071/items/640652de9e31d4bbdbeb Textfeld erstellen http://mitoavadn.hatenablog.com/entry/2017/03/11/224529 Tastenlayout https://teratail.com/questions/19171 SharedPreferences https://akira-watson.com/android/sharedpreferences.html Externe Speicheranforderungsmethode https://qiita.com/folivora/items/f17a125e0bc88c17a6d3

Wissensergänzung

Aktivitätslebenszyklus https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ja Verwendung des Sensor-Listeners https://techbooster.org/android/device/12524/ https://www.atmarkit.co.jp/ait/articles/1001/15/news119.html Wie man von Android Studio zu Github schiebt https://blog.codecamp.jp/programming-androidstudio-github

Recommended Posts

Die Geschichte einer Android-Anwendung, mit der die Abtastfrequenz des Beschleunigungssensors angepasst werden kann
Eine Anwendung, die den Wert des Beschleunigungssensors durch UDP-Kommunikation zwischen C # und Android erfasst
Die Geschichte eines gewöhnlichen Othello in Java
Eine Geschichte darüber, wie eine vorhandene Docker-Datei mit der GPU kompatibel gemacht werden kann
Die Geschichte der Optimierung der Android-App mit libGDX
Eine Geschichte über das Erstellen eines Builders, der den Builder erbt
Die Geschichte, einen Reverse-Proxy mit ProxyServlet zu erstellen
Die Geschichte einer illegalen staatlichen Ausnahme in Jetty.
Ich habe eine Android-App erstellt, die mit HTTP abgerufen wird
Die Geschichte, Dr. Orchid mit LINE BOT zu machen
Die Geschichte von dto, dao-like mit Java, SQLite
Die Geschichte der Erstellung einer Task-Management-Anwendung mit Swing, Java
[Docker] Eine Geschichte über einen Fehler beim Erstellen von Docker
Eine Geschichte, die mich bedauerte, als während der Entwicklung der Spring Boot-App eine "NotReadablePropertyException" auftrat.