[JAVA] L'histoire de la création d'une application Android capable d'ajuster la fréquence d'échantillonnage du capteur d'accélération

Aperçu

Personnellement, je voulais les valeurs du capteur d'accélération 3 axes dans le fichier csv. Je pense que chaque membre de Qiita a ce genre d'expérience.

J'avais donc Xperia à portée de main, alors j'ai immédiatement cherché sur Google Play et installé l'enregistreur du capteur d'accélération à une extrémité.

Alors quoi! La fréquence d'échantillonnage ne peut pas être réglée arbitrairement. .. ..

Cependant, il y avait une application qui pouvait être définie sur iOS, c'était donc une histoire que j'avais du mal à faire sur Android également.

Première enquête

(Attention) Ce chapitre sera écrit comme un journal d'étude, pas comme un journal de travail, veuillez donc le regarder comme un journal.

Comme toutes les applications (6 ou 7 échantillons), l'intervalle d'échantillonnage ne pouvait être ajusté que grossièrement.

En étudiant cela, il semble que le capteur d'accélération ne puisse pas ajuster le taux d'échantillonnage spécifique contrairement aux autres capteurs terminaux. Jetons un coup d'œil à registerListener de SensorManager Reference image.png Ensuite, donnez essentiellement les quatre variables suivantes à ce troisième argument, int d'échantillonnage PeriodUs.

image.pngimage.png Ceux-ci sont définis dans la classe SensorEvent (SensorEvent Reference)

Cependant, vous vous demandez ce qui se passe si vous entrez un entier spécifique dans ce troisième argument. Alors! Le site suivant l'a spécifiquement vérifié ← https://akira-watson.com/android/accelerometer.html

Au fait, dans la configuration réelle, je n'ai pas mené l'enquête préliminaire avec autant de soin et je me suis retrouvé coincé dans un marais que cela ne fonctionnait pas bien même si j'entrais un entier, et je suis arrivé ici (sueur)

Excusez-moi depuis longtemps, mais comme je l'ai dit plus tôt, lorsque ce fait est devenu clair, j'avais déjà commencé à le mettre en œuvre. J'ajusterai de force l'intervalle d'échantillonnage en filtrant ou quoi que ce soit, je veux bien

environnement

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

la mise en oeuvre

Comme vous pouvez le voir dans la version, installez-la et vous toucherez Android Studio pour la première fois En tant que connaissance préalable, je sais que les boutons sont faciles à faire

Fin du temps d'assurance, passez à la conception

conception

L'API a été définie sur 16 dans l'espoir qu'elle puisse être utilisée sur n'importe quel appareil. Screenshot_20200419-190507 (2).png

De la conclusion, il ressemble à ce sukusho

Méthode de réglage de la fréquence d'échantillonnage

C’est une méthode d’implémentation que j’ai proposée.

-Utilisez quelque chose comme une fonction de veille pour réduire la fréquence d'images pour chaque terminal -Utilisez le filtrage passe-bas / haut pour générer un seuil qui donne à l'utilisateur la fréquence d'échantillonnage souhaitée. -Mise en œuvre en éclaircissant le tableau à intervalles égaux et en élargissant l'intervalle d'échantillonnage ・ Ecrire dans le fichier csv chaque image

J'ai pu en parler beaucoup

Eh bien, c'est l'ordre que j'ai approché lors de la production En conséquence, le troisième était bon, donc je ne l'ai pas fait à chaque image.

Tout d'abord, visualisez l'accélération

Le premier est l'exemple de code lors de l'utilisation du capteur d'accélération

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();
        //Inscription de l'auditeur
        Sensor accSensor= sensorManager.getDefaultSensor(
                                Sensor.TYPE_ACCELEROMETER);

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

    }

    @Override
    protected void onPause() {
        super.onPause();
        //Libérer l’écouteur
        this.mManager.unregisterListener((SensorEventListener)this, this.accSensor);
    }

    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {

        mX.setText("Capteur d'accélération X:" + String.valueOf(sensorEvent.values[0]));
        mY.setText("Capteur d'accélération Y:" + String.valueOf(sensorEvent.values[1]));
        mZ.setText("Capteur d'accélération Z:" + String.valueOf(sensorEvent.values[2]));

    }

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

Cela fonctionne pour le moment, si vous souhaitez prendre en charge plusieurs capteurs, dans la fonction onSensorChanged if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){} Branche conditionnelle

Comme vous pouvez le voir dans la méthode onSensorChanged, les valeurs [0] à [2] de la classe sensorEvent contiennent des accélérations de x, y, z [(voir Référence SensorEvent)](https: // developer. android.com/reference/android/hardware/SensorEvent.html#values)

Par conséquent, si vous ajoutez la date et l'heure de la mesure à cela et que vous la transmettez au format csv, vous pouvez obtenir un fichier csv avec la fréquence d'échantillonnage maximale.

Il existe deux méthodes pour détecter la fréquence d'échantillonnage (également décrites dans le dernier document de référence). https://qiita.com/taittide/items/2f6a70eae22117266a66 https://akihito104.hatenablog.com/entry/2013/07/22/013000

La sortie csv n'est pas le cœur de cette application, je vais donc l'omettre.

Éclaircir

Le flux global de cette application est

① Le bouton START est enfoncé       ↓ ② Enregistrer l'accélération x, y, z dans une nouvelle liste       ↓ ③ Le bouton STOP / SAVE est enfoncé       ↓ ④ Copiez l'accélération enregistrée en csv dans la liste de sortie       ↓ ⑤ Sortie vers csv à partir de la liste pour la sortie csv       ↓ ⑥ Supprimez toutes les données de la liste. Attendez ①

Par conséquent, la fréquence d'échantillonnage peut être ajustée en diminuant à une taille appropriée à l'étape (4).

Le premier est l'exemple de code

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;

        //Variables pour éclaircir la matrice à la fréquence d'échantillonnage souhaitée
        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));
        }
}

Description des nouvelles variables de caractères L'accélération est stockée dans accX, axxY, accZ, et elle est définie en premier pour la copier dans accX_w, axxY_w, accZ_w pour la sortie csv. timeStamp_Time_forAcc_w stocke la date et l'heure de la mesure de la trame La fréquence d'échantillonnage maximale du terminal de l'utilisateur est stockée dans input_sampling_rate, et la fréquence d'échantillonnage souhaitée par l'utilisateur est stockée dans wantConverting_sampling_rate en tant que type entier. Ajustez I et une fois que vous voyez le code

Si vous donnez un exemple concret et expliquez ce que vous faites Supposons que la fréquence d'échantillonnage maximale du terminal soit de 400 (Hz) et que la fréquence d'échantillonnage souhaitée par l'utilisateur soit de 100 (Hz). Ici, si vous le copiez purement tel quel, la taille du tableau des variables _w augmentera de 400 par seconde. Par conséquent, si la valeur de 400/100 (fréquence d'échantillonnage maximale (Hz) du terminal de l'utilisateur / fréquence d'échantillonnage (Hz) souhaitée par l'utilisateur) est multipliée par i dans l'instruction for, i est 0,1 * 400/100, 2 * 400/100, .., et la taille de la matrice par seconde est de 100, soit 1/4.

Réglage réussi de la fréquence d'échantillonnage! !! !! Quand ce n'est pas divisible? Cela ne peut pas être aidé. Les erreurs sont inhérentes

Fichier csv réel

image.png image.png image.png

Il s'agit de la sortie lorsque la fréquence d'échantillonnage de la machine réelle est de 423 (Hz) et la fréquence d'échantillonnage que vous souhaitez convertir est de 10 (Hz).

La différence par rapport à la valeur théorique de 0,1 seconde était de -0,001 et 0,000, et l'erreur maximale était de ± 0,001 dans son ensemble.

Je me demande pourquoi il n'y a pas d'erreur jusqu'à présent, mais c'est quand même une fin heureuse.

Code source

Je l'ai posté sur github. L'utilisation est un peu compliquée, veuillez donc vous référer à READ ME.txt. https://github.com/miwazawa/accelerator-logger Il a été confirmé qu'il fonctionne avec Xperia et Nexus mentionnés dans l'environnement.

à la fin

Merci d'être resté avec nous pendant si longtemps.

À partir de l'implémentation, j'ai senti que je devais le donner à github, et je l'ai écrit en sentant que c'était une mauvaise phrase (rires)

En ce qui concerne le code source, je reçois un excellent avertissement concernant activity_main.xml, mais cela fonctionne donc je ne vais probablement pas le réparer!

Le matériel de référence répertorie probablement tous les sites que j'ai utilisés cette fois, donc je pense que vous pouvez l'implémenter simplement en le regardant.

C'était presque la première fois pour moi d'écrire un programme approprié en java, donc j'espère que les débutants pourront s'y référer comme une façon d'étudier.

Du milieu, j'ai réalisé qu'il est plus rapide de le faire depuis VBA si vous voulez jouer avec l'arrangement, ce qui est une autre histoire

Matériel de référence

À propos de la syntaxe Java

Méthode de conversion de type https://eng-entrance.com/java-var-change https://www.sejuku.net/blog/14531 Jugement entier de la chaîne https://techacademy.jp/magazine/19075 Comment utiliser Thread.sleep https://engineer-club.jp/java-sleep À propos de la sortie CSV 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 list / autour du tableau https://www.javadrive.jp/start/linkedlist/index2.html

À propos du capteur d'accélération

Montage du capteur d'accélération https://akira-watson.com/android/accelerometer.html Méthode de détection de la fréquence d'échantillonnage http://akihito104.hatenablog.com/entry/2013/07/22/013000 https://qiita.com/taittide/items/2f6a70eae22117266a66

À propos d'Android Studio

De l'installation d'Android Studio à Hello World https://akira-watson.com/android/helloworld.html layout https://qiita.com/mii-chang/items/ee965c1e8826d4e59414 jugement d'entrée edittext https://qiita.com/HALU5071/items/640652de9e31d4bbdbeb Créer une zone de texte http://mitoavadn.hatenablog.com/entry/2017/03/11/224529 Disposition des boutons https://teratail.com/questions/19171 SharedPreferences https://akira-watson.com/android/sharedpreferences.html Méthode de demande de stockage externe https://qiita.com/folivora/items/f17a125e0bc88c17a6d3

Supplément de connaissances

Cycle de vie de l'activité https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ja Comment utiliser l'écouteur de capteur https://techbooster.org/android/device/12524/ https://www.atmarkit.co.jp/ait/articles/1001/15/news119.html Comment passer d'Android Studio à Github https://blog.codecamp.jp/programming-androidstudio-github

Recommended Posts

L'histoire de la création d'une application Android capable d'ajuster la fréquence d'échantillonnage du capteur d'accélération
Une application qui acquiert la valeur du capteur d'accélération par communication UDP entre C # et Android
L'histoire de la fabrication d'un Othello ordinaire à Java
Une histoire sur la compatibilité d'un Dockerfile existant avec le GPU
L'histoire du réglage de l'application Android avec libGDX
Une histoire sur la création d'un Builder qui hérite du Builder
L'histoire de la création d'un proxy inverse avec ProxyServlet
L'histoire d'une exception d'état illégale dans Jetty.
J'ai créé une application Android qui GET avec HTTP
L'histoire de la création de Dr.Orchid avec LINE BOT
L'histoire de la création de DTO, semblable à Dao avec Java, SQLite
Histoire de créer une application de gestion de tâches avec Swing, Java
[Docker] Une histoire sur une erreur dans la composition de docker
Une histoire qui m'a fait regretter quand une "NotReadablePropertyException" s'est produite pendant le développement de l'application Spring Boot.