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

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

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

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

Android Studio

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

Q&A

1回答

978閲覧

〇秒以内にセンサ値が△以上変化したことを認識したい

tomy_192

総合スコア4

Java

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

Android Studio

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

0グッド

0クリップ

投稿2019/12/18 12:54

前提・実現したいこと

Android StudioでJavaによるアプリ作成をしています.

加速度センサ・地磁気センサの値を使用して
”2秒以内に方位角が±45度以上変化した”ことを検知して,道を曲がったことを知らせるようにしたいのですが
変化を検出する方法が浮かびません.

Javaは始めたばかりですが,何かアドバイスや案を頂けると嬉しいです.


・移動した距離の計算については改良中です.
・0.2秒で表示すれば10コマで2秒となって,変化を検出できるまとまりができるかなと思い,
タイマーを用いて0.2秒ごとにログに出力しています.
・今の状態でエラーは出ていなく,正しい値が出ています.

該当のソースコード

java

1 2package com.example.navi1; 3 4 5import android.content.Context; 6import android.content.pm.ActivityInfo; 7import android.hardware.Sensor; 8import android.hardware.SensorEvent; 9import android.hardware.SensorEventListener; 10import android.hardware.SensorManager; 11import android.os.Bundle; 12import android.os.Handler; 13import android.util.Log; 14import android.view.View; 15import android.widget.Button; 16import android.widget.RadioButton; 17import android.widget.TextView; 18import android.widget.Toast; 19 20import androidx.appcompat.app.AppCompatActivity; 21 22import java.util.Timer; 23import java.util.TimerTask; 24 25public class MainActivity extends AppCompatActivity 26//implements Runnable 27{ 28 private SensorManager mSensorManager = null; 29 private SensorEventListener mSensorEventListener = null; 30 31 private Timer mainTimer = null; 32 //private TimerTask timerTask; 33 //private int count = 0; 34 private Handler mHandler = new Handler(); 35 36 37 private float[] fAccell = null; 38 private float[] fMagnetic = null; 39 40 //double dt = 0.2; 41 float azimuth; 42 double acc_x, acc_y, acc_z, acc_x_bef, acc_y_bef, acc_z_bef, ax, ay, az; 43 double a, v, md; 44 double vSum = 0; 45 double mdSum = 0; 46 final float alpha = 0.9f; 47 float[] linear_accelValues = new float[3]; 48 //float FilterValues[] = new float[3]; 49 float[] fAttitude = new float[3]; 50 float[] inR = new float[16]; 51 float[] I = new float[16]; 52 float[] fPress = new float[1]; 53 long nowtime; 54 float time; 55 long oldtime = nowtime; 56 long first = 0; 57 58 59 //Button buttonStart,buttonStop,buttonReset; 60 61 String tPress; 62 63 @Override 64 public void onCreate(Bundle savedInstanceState) { 65 super.onCreate(savedInstanceState); 66 setContentView(R.layout.activity_main); 67 68 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 69 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 70 71 72 Button buttonStart = findViewById(R.id.button_start); 73 Button buttonStop = findViewById(R.id.button_stop); 74 Button buttonReset = findViewById(R.id.button_reset); 75 buttonStop.setPressed(true); //選択状態にしておく 76 77 buttonStart.setOnClickListener(new View.OnClickListener() { 78 @Override 79 public void onClick(View v) { 80 onStart(); 81 } 82 }); 83 buttonStop.setOnClickListener(new View.OnClickListener() { 84 @Override 85 public void onClick(View v) { 86 onStop(); 87 nowtime = System.currentTimeMillis(); 88 } 89 }); 90 buttonReset.setOnClickListener(new View.OnClickListener() { 91 @Override 92 public void onClick(View v) { 93 onStop(); 94 vSum = 0; 95 mdSum = 0; 96 mdSum = 0; 97 time = 0; 98 } 99 }); 100 101 //タイマーインスタンス生成 102 this.mainTimer = new Timer(); 103 mainTimer.schedule(new TimerTask() { 104 @Override 105 public void run() { 106 mHandler.post(new Runnable() { 107 @Override 108 public void run() { 109 Log.d("*DATA*", "時間" + ":" + time + ":" + ax + ":" + ay + ":" + az + ":" + mdSum); 110 111 } 112 }); 113 }; 114 //0.01秒後に0.2秒間隔 115 }, 10, 200); 116 117 mSensorEventListener = new SensorEventListener() { 118 @Override 119 public void onSensorChanged(SensorEvent event) { 120 oldtime = System.currentTimeMillis(); 121 nowtime = System.currentTimeMillis(); 122 123 switch (event.sensor.getType()) { 124 case Sensor.TYPE_ACCELEROMETER: 125 fAccell = event.values.clone(); 126 break; 127 case Sensor.TYPE_MAGNETIC_FIELD: 128 fMagnetic = event.values.clone(); 129 break; 130 case Sensor.TYPE_LINEAR_ACCELERATION: 131 linear_accelValues = event.values.clone(); 132 133 //ここからフィルタ処理(ローパスフィルタ) 134 if (first == 0) { 135 acc_x = linear_accelValues[0]; 136 acc_y = linear_accelValues[1]; 137 acc_z = linear_accelValues[2]; 138 139 first = 1; 140 } else if (first == 1) { 141 acc_x = 0.2 * acc_x_bef + 0.8 * (linear_accelValues[0]); 142 acc_y = 0.2 * acc_y_bef + 0.8 * (linear_accelValues[1]); 143 acc_z = 0.2 * acc_z_bef + 0.8 * (linear_accelValues[2]); 144 } 145 //今の加速度を一つ前の加速度として保持 146 acc_x_bef = acc_x; 147 acc_y_bef = acc_y; 148 acc_z_bef = acc_z; 149 150 break; 151 152 } 153 ax = acc_x; 154 ay = acc_y; 155 az = acc_z; 156 157 nowtime = System.currentTimeMillis(); 158 time = nowtime - oldtime; 159 160 a = (ay * Math.sin(fAttitude[1])) + (az * Math.cos(fAttitude[1])); //orientationValues[1]:傾斜角 161 v = a * (time * 0.001); //timeはミリ秒だから秒に直す 162 vSum = v + vSum; 163 md = vSum * (time * 0.001); 164 //md = 0.5 * a * (time * 0.001) * (time * 0.001) + v * (time * 0.001); 165 mdSum = md + mdSum; 166 167 168 // fAccell と fMagnetic から傾きと方位角を計算する 169 if (fAccell != null && fMagnetic != null) { 170 // 回転行列を得る 171 float[] fAttitude = new float[3]; 172 float[] inR = new float[16]; 173 float[] I = new float[16]; 174 SensorManager.getRotationMatrix( 175 inR, I, 176 fAccell, 177 fMagnetic); 178 // ワールド座標とデバイス座標のマッピングを変換する 179 float[] outR = new float[9]; 180 SensorManager.remapCoordinateSystem( 181 inR, 182 SensorManager.AXIS_X, 183 SensorManager.AXIS_Y, 184 outR); 185 // 姿勢を得る 186 SensorManager.getOrientation( 187 inR, 188 fAttitude); 189 float angle = (float) Math.floor(Math.toDegrees(fAttitude[0])); 190 191 if (angle >= 0) { 192 fAttitude[0] = angle; 193 } else if (angle < 0) { 194 fAttitude[0] = 360 + angle; 195 } 196 } 197 //Log.d("*DATA*", "時間" + ":" + time + ":" + ax + ":" + ay + ":" + az + ":" + mdSum); 198 } 199 200 @Override 201 public void onAccuracyChanged(Sensor sensor, int i) { 202 203 } 204 205 }; 206 } 207 208 public void onStart(){ // ⇔ onStop 209 super.onStart(); 210 211 mSensorManager.registerListener( 212 mSensorEventListener, 213 mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 214 SensorManager.SENSOR_DELAY_UI);// 215 mSensorManager.registerListener( 216 mSensorEventListener, 217 mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), 218 SensorManager.SENSOR_DELAY_UI); 219 /*mSensorManager.registerListener( 220 mSensorEventListener, 221 mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE), 222 SensorManager.SENSOR_DELAY_UI);*/ 223 mSensorManager.registerListener( 224 mSensorEventListener, 225 mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION), 226 SensorManager.SENSOR_DELAY_UI); 227 } 228 229 public void onStop () { // ⇔ onStart 230 super.onStop(); 231 mSensorManager.unregisterListener(mSensorEventListener); 232 } 233 }

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

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

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

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

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

guest

回答1

0

その秒数分だけのデータを保持するようにして、45度変化するのを待てばいいかと

投稿2019/12/18 13:20

y_waiwai

総合スコア87774

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

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

tomy_192

2019/12/18 13:23

回答ありがとうございます。 初心者なもので、よければ具体的に使えそうなメソッドを教えて頂けますでしょうか?
y_waiwai

2019/12/18 13:28

その秒数分の配列を用意してデータを入れていき、最小値と最大値求めるだけですんで、初心者でもコードは組めるでしょ。 がんばってみてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問