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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Java

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

Android

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

Android Studio

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

Q&A

解決済

2回答

3698閲覧

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

Horin

総合スコア9

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2017/01/25 12:41

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

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

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

実際のコード

Java

1package com.example.g1323073.decisionapp; 2 3import android.hardware.Sensor; 4import android.hardware.SensorEvent; 5import android.hardware.SensorEventListener; 6import android.hardware.SensorManager; 7import android.os.Environment; 8import android.os.Message; 9import android.support.v7.app.AppCompatActivity; 10import android.os.Bundle; 11import android.view.View; 12import android.widget.Button; 13import android.widget.TextView; 14 15import org.w3c.dom.Text; 16 17import java.io.BufferedWriter; 18import java.io.FileNotFoundException; 19import java.io.FileOutputStream; 20import java.io.IOException; 21import java.io.OutputStreamWriter; 22import java.io.UnsupportedEncodingException; 23import java.util.Timer; 24import java.util.TimerTask; 25import java.util.logging.Handler; 26 27public class MainActivity extends AppCompatActivity implements SensorEventListener{ 28 29 private String sdPath = Environment.getExternalStorageDirectory() + "/sdcard/ans.csv"; 30 31 private SensorManager sensorManager; 32 private float[] aValues = new float[3]; 33 private float[] gValues = new float[3]; 34 public int button_flag = -1; 35 Sensor Accele; 36 Sensor Gyro; 37 TextView xdate; 38 String ydate; 39 40 @Override 41 protected void onCreate(Bundle savedInstanceState) { 42 super.onCreate(savedInstanceState); 43 setContentView(R.layout.activity_main); 44 //センサーマネージャーを取得 45 sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 46 //ボタン 47 Button Correct = (Button) findViewById(R.id.maru); 48 Button Mistake = (Button) findViewById(R.id.batu); 49 Button Answer = (Button)findViewById(R.id.answer) ; 50 //提示情報 51 xdate = (TextView)findViewById(R.id.date); 52 53 //正解 54 Correct.setOnClickListener(new View.OnClickListener(){ 55 @Override 56 public void onClick(View v){ 57 button_flag = 0; 58 59 } 60 }); 61 //不正解 62 Mistake.setOnClickListener(new View.OnClickListener() { 63 @Override 64 public void onClick(View v) { 65 button_flag = 1; 66 } 67 }); 68 //回答 69 Answer.setOnClickListener(new View.OnClickListener(){ 70 71 @Override 72 public void onClick(View v){ 73 String FILE; 74 FILE = "/sdcard/ans.csv"; 75 try { 76 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(FILE, true), "UTF-8")); 77 String write_int = String.valueOf(ydate)+","+ "answer"+","+String.valueOf(button_flag) + "/n"; 78 bw.write(write_int); 79 bw.newLine(); 80 bw.close(); 81 } catch (UnsupportedEncodingException k) { 82 k.printStackTrace(); 83 } catch (FileNotFoundException k) { 84 k.printStackTrace(); 85 } catch (IOException k) { 86 k.printStackTrace(); 87 } 88 } 89 90 }); 91 } 92 93 @Override 94 public void onSensorChanged(SensorEvent e) { 95 96 switch (e.sensor.getType()) { 97 //加速度 98 case Sensor.TYPE_ACCELEROMETER: 99 aValues[0] = (e.values[0]); 100 aValues[1] = (e.values[1]); 101 aValues[2] = (e.values[2]); 102 break; 103 //ジャイロ 104 case Sensor.TYPE_GYROSCOPE: 105 gValues[0] = (e.values[0]); 106 gValues[1] = (e.values[1]); 107 gValues[2] = (e.values[2]); 108 break; 109 } 110 111 //決定木 112 if (gValues[1] < 0.14) { 113 if (aValues[0] < 0.04) { 114 if (gValues[0] < -0.31) { 115 xdate.setText(String.valueOf("消費カロリー")); 116 ydate = String.valueOf("Calorie,1"); 117 } else if (gValues[1] < -0.014) { 118 if (aValues[1] <= 0.44) { 119 xdate.setText(String.valueOf("傾斜")); 120 ydate = String.valueOf("Inclination,2"); 121 } else { 122 xdate.setText(String.valueOf("走行時間")); 123 ydate = String.valueOf("Time,3"); 124 } 125 } else { 126 xdate.setText(String.valueOf("速度")); 127 ydate = String.valueOf("Speed,4"); 128 } 129 } else if(gValues[1] < -0.11) { 130 if (gValues[2] >= 0.18) { 131 xdate.setText(String.valueOf("傾斜")); 132 ydate = String.valueOf("Inclination,5"); 133 } else { 134 xdate.setText(String.valueOf("走行時間")); 135 ydate = String.valueOf("Time,6"); 136 } 137 } else if (gValues[0] < -0.0061) { 138 if (gValues[1] < 0.03) { 139 if (gValues[0] < -0.028) { 140 if (aValues[1] >= 2.4) { 141 xdate.setText(String.valueOf("消費カロリー")); 142 ydate = String.valueOf("Calorie,7"); 143 } else { 144 xdate.setText(String.valueOf("傾斜")); 145 ydate = String.valueOf("Inclination,8"); 146 } 147 } else { 148 xdate.setText(String.valueOf("走行時間")); 149 ydate = String.valueOf("Time,9"); 150 } 151 } else { 152 xdate.setText(String.valueOf("走行距離")); 153 ydate = String.valueOf("Distance,10"); 154 } 155 } else if (gValues[1] < 0.054) { 156 xdate.setText(String.valueOf("走行距離")); 157 ydate = String.valueOf("Distance,11"); 158 } else { 159 xdate.setText(String.valueOf("走行時間")); 160 ydate = String.valueOf("Time,12"); 161 } 162 } else if (aValues[1] >= 0.79) { 163 if (aValues[2] >= 8.2) { 164 if (gValues[0] < 0.078) { 165 if (gValues[1] >= 0.17) { 166 if (aValues[1] < 3.1) { 167 xdate.setText(String.valueOf("心拍")); 168 ydate = String.valueOf("Heart,13"); 169 } else { 170 xdate.setText(String.valueOf("傾斜")); 171 ydate = String.valueOf("Inclination,14"); 172 } 173 } else { 174 xdate.setText(String.valueOf("速度")); 175 ydate = String.valueOf("Speed,15"); 176 } 177 } else { 178 xdate.setText(String.valueOf("走行距離")); 179 ydate = String.valueOf("Distance,16"); 180 } 181 } else { 182 xdate.setText(String.valueOf("速度")); 183 ydate = String.valueOf("Speed,17"); 184 } 185 } else { 186 xdate.setText(String.valueOf("速度")); 187 ydate = String.valueOf("Speed,18"); 188 } 189 /* 190 if (aValues[1] ) 191 xdate.setText(String.valueOf("速度")); 192 ydate = String.valueOf("Speed,1"); 193 } else if (gValues[0] < -0.29) { 194 xdate.setText(String.valueOf("消費カロリー")); 195 ydate = String.valueOf("Calorie,8"); 196 } else if (gValues[1] < -0.06) { 197 if (gValues[2] >= 0.38) { 198 xdate.setText(String.valueOf("高度")); 199 ydate = String.valueOf("Altitude,7"); 200 } else { 201 xdate.setText(String.valueOf("走行時間")); 202 ydate = String.valueOf("Time,6"); 203 } 204 } else if (gValues[0] < 0.011) { 205 if (gValues[1] >= 0.077) { 206 xdate.setText(String.valueOf("心拍")); 207 ydate = String.valueOf("Heart,5"); 208 } else { 209 xdate.setText(String.valueOf("速度")); 210 ydate = String.valueOf("Speed,4"); 211 } 212 } else if (aValues[0] >= 0.16) { 213 xdate.setText(String.valueOf("走行距離")); 214 ydate = String.valueOf("Distance,3"); 215 } else { 216 xdate.setText(String.valueOf("速度")); 217 ydate = String.valueOf("Speed,2"); 218 } 219 220 try { 221 Thread.sleep(1000); 222 } catch (InterruptedException p) { 223 224 } 225 */ 226 } 227 228 229 @Override 230 protected void onResume() { 231 super.onResume(); 232 //センサーのイベントリスナーを登録 233 //加速度 234 Accele = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 235 sensorManager.registerListener(this, Accele, 100000); 236 //ジャイロ 237 Gyro = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE); 238 sensorManager.registerListener(this, Gyro, 100000); 239 } 240 241 242 public void onStop() { 243 super.onStop(); 244 sensorManager.unregisterListener(this); 245 } 246 247 @Override 248 public void onAccuracyChanged(Sensor sensor, int i) { 249 250 } 251 252 253} 254

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

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/25 15:33

aja

総合スコア3733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Horin

2017/01/25 18:09

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

2017/01/25 22: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程度になるようです ただし、あなたの場合、画面表示、決定木などがこれに遅延を発生させていないか確認することが必要かもしれません。
guest

0

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

投稿2017/01/25 14:38

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Horin

2017/01/25 18:08

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問