前提・実現したいこと
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 }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/18 13:23
2019/12/18 13:28