質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.33%

  • Java

    14473questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    6750questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    3919questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

センサーを一定間隔で取得する方法

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 844

Horin

score 3

実現したいこと
センサーの値から画面に映し出す文字列を決定し、表示したいです。その文字列であっているのか○×で回答してもらうようになってます。

困っていること
センサーの値がころころ変わってしまい画面に表示された文字列が一緒になってころころ変わってしまいます。

試したこと
HandlerやTimerなどを使用したのですが使い方が間違っているのかうまくいきません。使い方等初心者でもわかるよう明記していただけると大変助かります。

実際のコード

package com.example.g1323073.decisionapp;

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Environment;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import org.w3c.dom.Text;

import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.Timer;
import java.util.TimerTask;
import java.util.logging.Handler;

public class MainActivity extends AppCompatActivity implements SensorEventListener{

    private String sdPath = Environment.getExternalStorageDirectory() + "/sdcard/ans.csv";

    private SensorManager sensorManager;
    private float[] aValues = new float[3];
    private float[] gValues = new float[3];
    public int button_flag = -1;
    Sensor Accele;
    Sensor Gyro;
    TextView xdate;
    String ydate;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //センサーマネージャーを取得
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        //ボタン
        Button Correct = (Button) findViewById(R.id.maru);
        Button Mistake = (Button) findViewById(R.id.batu);
        Button Answer = (Button)findViewById(R.id.answer) ;
        //提示情報
        xdate = (TextView)findViewById(R.id.date);

        //正解
        Correct.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                button_flag = 0;

            }
        });
        //不正解
        Mistake.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                button_flag = 1;
            }
        });
        //回答
        Answer.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v){
                String FILE;
                FILE = "/sdcard/ans.csv";
                try {
                    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(FILE, true), "UTF-8"));
                    String write_int = String.valueOf(ydate)+","+ "answer"+","+String.valueOf(button_flag) + "/n";
                    bw.write(write_int);
                    bw.newLine();
                    bw.close();
                } catch (UnsupportedEncodingException k) {
                    k.printStackTrace();
                } catch (FileNotFoundException k) {
                    k.printStackTrace();
                } catch (IOException k) {
                    k.printStackTrace();
                }
            }

        });
    }

    @Override
    public void onSensorChanged(SensorEvent e) {

        switch (e.sensor.getType()) {
            //加速度
            case Sensor.TYPE_ACCELEROMETER:
                aValues[0] = (e.values[0]);
                aValues[1] = (e.values[1]);
                aValues[2] = (e.values[2]);
                break;
            //ジャイロ
            case Sensor.TYPE_GYROSCOPE:
                gValues[0] = (e.values[0]);
                gValues[1] = (e.values[1]);
                gValues[2] = (e.values[2]);
                break;
        }

        //決定木
        if (gValues[1] < 0.14) {
            if (aValues[0] < 0.04) {
                if (gValues[0] < -0.31) {
                    xdate.setText(String.valueOf("消費カロリー"));
                    ydate = String.valueOf("Calorie,1");
                 } else if (gValues[1] < -0.014) {
                        if (aValues[1] <= 0.44) {
                        xdate.setText(String.valueOf("傾斜"));
                        ydate = String.valueOf("Inclination,2");
                        } else {
                        xdate.setText(String.valueOf("走行時間"));
                        ydate = String.valueOf("Time,3");
                        }
                    } else {
                    xdate.setText(String.valueOf("速度"));
                    ydate = String.valueOf("Speed,4");
                }
                } else if(gValues[1] < -0.11) {
                if (gValues[2] >= 0.18) {
                    xdate.setText(String.valueOf("傾斜"));
                    ydate = String.valueOf("Inclination,5");
                } else {
                    xdate.setText(String.valueOf("走行時間"));
                    ydate = String.valueOf("Time,6");
                }
            } else if (gValues[0] < -0.0061) {
                if (gValues[1] < 0.03) {
                    if (gValues[0] < -0.028) {
                        if (aValues[1] >= 2.4) {
                            xdate.setText(String.valueOf("消費カロリー"));
                            ydate = String.valueOf("Calorie,7");
                        } else {
                            xdate.setText(String.valueOf("傾斜"));
                            ydate = String.valueOf("Inclination,8");
                        }
                    } else {
                        xdate.setText(String.valueOf("走行時間"));
                        ydate = String.valueOf("Time,9");
                    }
                } else {
                    xdate.setText(String.valueOf("走行距離"));
                    ydate = String.valueOf("Distance,10");
                }
                } else if (gValues[1] < 0.054) {
                xdate.setText(String.valueOf("走行距離"));
                ydate = String.valueOf("Distance,11");
            } else {
                xdate.setText(String.valueOf("走行時間"));
                ydate = String.valueOf("Time,12");
            }
        } else if (aValues[1] >= 0.79) {
            if (aValues[2] >= 8.2) {
                if (gValues[0] < 0.078) {
                    if (gValues[1] >= 0.17) {
                        if (aValues[1] < 3.1) {
                            xdate.setText(String.valueOf("心拍"));
                            ydate = String.valueOf("Heart,13");
                        } else {
                            xdate.setText(String.valueOf("傾斜"));
                            ydate = String.valueOf("Inclination,14");
                        }
                    } else {
                        xdate.setText(String.valueOf("速度"));
                        ydate = String.valueOf("Speed,15");
                    }
                } else {
                    xdate.setText(String.valueOf("走行距離"));
                    ydate = String.valueOf("Distance,16");
                }
            } else {
                xdate.setText(String.valueOf("速度"));
                ydate = String.valueOf("Speed,17");
            }
        } else {
            xdate.setText(String.valueOf("速度"));
            ydate = String.valueOf("Speed,18");
        }
            /*
            if (aValues[1] )
            xdate.setText(String.valueOf("速度"));
            ydate = String.valueOf("Speed,1");
        } else if (gValues[0] < -0.29) {
            xdate.setText(String.valueOf("消費カロリー"));
            ydate = String.valueOf("Calorie,8");
        } else if (gValues[1] < -0.06) {
            if (gValues[2] >= 0.38) {
                xdate.setText(String.valueOf("高度"));
                ydate = String.valueOf("Altitude,7");
            } else {
                xdate.setText(String.valueOf("走行時間"));
                ydate = String.valueOf("Time,6");
            }
        } else if (gValues[0] < 0.011) {
            if (gValues[1] >= 0.077) {
                xdate.setText(String.valueOf("心拍"));
                ydate = String.valueOf("Heart,5");
            } else {
                xdate.setText(String.valueOf("速度"));
                ydate = String.valueOf("Speed,4");
            }
        } else if (aValues[0] >= 0.16) {
            xdate.setText(String.valueOf("走行距離"));
            ydate = String.valueOf("Distance,3");
        } else {
            xdate.setText(String.valueOf("速度"));
            ydate = String.valueOf("Speed,2");
        }

        try {
            Thread.sleep(1000);
        } catch (InterruptedException p) {

        }
         */
    }


    @Override
    protected void onResume() {
        super.onResume();
        //センサーのイベントリスナーを登録
        //加速度
        Accele = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorManager.registerListener(this, Accele, 100000);
        //ジャイロ
        Gyro = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
        sensorManager.registerListener(this, Gyro, 100000);
    }


    public void onStop() {
        super.onStop();
        sensorManager.unregisterListener(this);
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int i) {

    }


}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

センサーの値がころころ変わってしまい

通常、半導体デバイスの生のデータは加速度などに敏感に反応するので、そのままでは使いずらいでしょう
使用目的によってローパスフィルタ、ハイパスフィルター、メディアンフィルターなどを組み合わせて使います。

センサーの値から画面に映し出す文字列を決定し、表示したいです。その文字列であっているのか○×で回答してもらうようになってます。

ゲームでしょうか?よく分かりません

HandlerやTimerなどを使用したのですが使い方が間違っているのかうまくいきません

    //加速度
        Accele = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorManager.registerListener(this, Accele, 100000);
        //ジャイロ
        Gyro = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
        sensorManager.registerListener(this, Gyro, 100000);

この100000[usec]は想定通りの時間になっているか先に確認したほうがいいでしょう

決定木などは取り外して、純粋にセンサー個別の間隔がどうなるか測定してみることをお勧めします。
また、センサー情報もとりだせるので参考になります

これは端末に搭載しているデバイスによりますので端末依存です
確かにandroidとしてのある程度の枠はあるようですが

少なくとも加速度センサーはこの設定時間にはならないと思います
Gyroはあるいは他のセンサーとの計算かもしません、その場合はもう少し柔軟でしょうけれど

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/26 03:09

    100000[usec]は思うような時間にならないので他に方法はないでしょうか

    キャンセル

  • 2017/01/26 07:23

    >決定木などは取り外して、純粋にセンサー個別の間隔がどうなるか測定してみることをお勧めします。
    確認した結果でしょうか

    こちらにNexus 5Xの簡単な実験した結果があります
    https://akira-watson.com/android/accelerometer.html

    これはだいぶ古い情報ですが、ヒストグラムでのテストですので興味深いです。VennderがGoogleだと計算しているので、設定のインターバルになるのでしょう。同じメーカーのデバイスでも古いものと新しいものでは違うようです
    http://akihito104.hatenablog.com/entry/2013/07/27/144501

    SENSOR_DELAY_GAMEあたりはその名の通りゲーム用に20ms程度になるようです
    ただし、あなたの場合、画面表示、決定木などがこれに遅延を発生させていないか確認することが必要かもしれません。

    キャンセル

0

値の取得と同時に画面に表示するのではなく、値の取得時に前の表示時間からの経過時間を考慮して「一定時間」で表示を変更するのが楽ですよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/26 03:08

    その方法はどのようなものがあってどのように使えばよいでしょうか、、、

    キャンセル

同じタグがついた質問を見る

  • Java

    14473questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    6750questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    3919questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。