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

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

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

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

Android Studio

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

Q&A

0回答

508閲覧

Androidで加速度値、速度値をCSV形式で保存したい。

Toya_Kamijo

総合スコア4

Android

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

Android Studio

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

0グッド

0クリップ

投稿2018/07/12 09:53

編集2018/07/12 10:04

前提・実現したいこと

1.加速度センサーの値,速度をCSV形式で保存したい.
2.加速度から速度を計算し出力したい.

発生している問題・エラーメッセージ

  1. 加速度の値の保存の仕方がわからない

acc[t] = a * gravity[t-1] + (1-a) * acc[t-1]
上式で加速度から重力加速度を除去したが、加速度の値が常に正になってしまう.

  1. v[t] = v[t-1] + acc[t] * Ts (Ts:サンプリング周期)

上式で加速度から速度を算出したが,速度が理想値より小さい気がする.
(閾値を定めているため、小さすぎると常に0を示すようになっている)

Android,Javaともに初心者です.
よろしくお願いします.

該当のソースコード

Java

1package com.example.toyakamijo.accelerometersample3; 2 3import android.hardware.Sensor; 4import android.hardware.SensorEvent; 5import android.hardware.SensorEventListener; 6import android.hardware.SensorManager; 7import android.os.CountDownTimer; 8import android.os.SystemClock; 9import android.os.Vibrator; 10import android.support.v7.app.AppCompatActivity; 11import android.os.Bundle; 12import android.view.View; 13import android.widget.Chronometer; 14import android.widget.TextView; 15 16import java.util.List; 17 18public class MainActivity extends AppCompatActivity { 19 20 private SensorManager accSensorManager; 21 private SensorEventListener sensorEventListener; 22 private TextView accView; 23 private TextView magAccView; 24 private TextView velView; 25 private TextView magVelView; 26 private TextView timer; 27 28 private float acc[] = new float[3]; //加速度 29 private float gra[] = {0.0f, 0.0f, 0.0f}; //重力 30 private float linearAcc[] = {0.0f, 0.0f, 0.0f}; //加速度(重力除去) 31 private final float alpha = 0.001f; //平滑化係数α 32 private final float late = 0.02f; //サンプリング周期20[ms] 33 private double A = 0.0d; //加速度の大きさ 34 private float vel[] = {0.0f, 0.0f, 0.0f}; //速度 35 private float vel2[] = {0.0f, 0.0f, 0.0f}; //(20ms前の)速度 36 private double V = 0.0d; //速度の大きさ 37 38 @Override 39 protected void onCreate(Bundle savedInstanceState) { 40 super.onCreate(savedInstanceState); 41 setContentView(R.layout.activity_main); 42 43 accView = findViewById(R.id.accView); 44 magAccView = findViewById(R.id.magAccView); 45 velView = findViewById(R.id.velView); 46 magVelView = findViewById(R.id.magVelView); 47 timer = findViewById(R.id.timer); 48 49 //Vibratorインスタンス取得 50 final Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); 51 52 accSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 53 sensorEventListener = new SensorEventListener() { 54 @Override 55 public void onSensorChanged(SensorEvent event) { 56 switch (event.sensor.getType()) { 57 case Sensor.TYPE_ACCELEROMETER: 58 acc = event.values.clone(); 59 60 for (int i = 0; i <= 2; i++) { 61 gra[i] = alpha * gra[i] + (1 - alpha) * acc[i]; //重力加速度の算出 62 linearAcc[i] = acc[i] - gra[i]; //加速度の算出(重力加速度除去) 63 vel[i] = (vel2[i] + late * linearAcc[i]); //速度の算出 64 65 if (linearAcc[i] < 0.001) { 66 linearAcc[i] = 0.0f; 67 } 68 if (vel[i] < 0.001) { 69 vel[i] = 0.0f; 70 } 71 if (vel2[i] < 0.001) { 72 vel2[i] = 0.0f; 73 } 74 } 75 76 A = Math.sqrt(Math.pow(linearAcc[0], 2) 77 + Math.pow(linearAcc[1], 2) 78 + Math.pow(linearAcc[2], 2)); 79 80 V = Math.sqrt(Math.pow(vel[0], 2) 81 + Math.pow(vel[1], 2) 82 + Math.pow(vel[2], 2)); 83 84 if (A > 0.005) { 85 vibrator.vibrate(100); 86 } else { 87 vibrator.cancel(); 88 } 89 90 String accelerometer = "加速度センサー[m/s^2]" 91 + "\nX:" + linearAcc[0] 92 + "\nY:" + linearAcc[1] 93 + "\nZ:" + linearAcc[2]; 94 95 String magAccelerometer = "加速度の大きさ[m/s^2]\n" + (float) A; 96 97 String velocity = "速度[m/s]" 98 + "\nX:" + vel[0] 99 + "\nY:" + vel[1] 100 + "\nZ:" + vel[2]; 101 102 String magVelocity = "速度の大きさ[m/s]\n" + (float) V; 103 104 accView.setText(accelerometer); 105 magAccView.setText(magAccelerometer); 106 velView.setText(velocity); 107 magVelView.setText(magVelocity); 108 109 for (int i=0; i<=2;i++){ 110 vel2[i] = vel[i]; 111 } 112 113 break; 114 } 115 } 116 117 @Override 118 public void onAccuracyChanged(Sensor sensor, int accuracy) { 119 120 } 121 }; 122 } 123 124 @Override 125 protected void onStop() { 126 super.onStop(); 127 128 //Listenerの登録解除 129 accSensorManager.unregisterListener(sensorEventListener); 130 } 131 132 @Override 133 protected void onResume() { 134 super.onResume(); 135 136 //Listenerの登録 137 List<Sensor> accSensor = accSensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER); 138 if (accSensor.size() > 0) { 139 Sensor sensor = accSensor.get(0); 140 accSensorManager.registerListener(sensorEventListener, sensor, SensorManager.SENSOR_DELAY_GAME); 141 } 142 } 143}

試したこと

補足情報(FW/ツールのバージョンなど)

Android Studio 3.1

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

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

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

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

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

coco_bauer

2018/07/12 10:22

重力加速度は下方向(地球の中心に向かう方向)にしか働きません。3次元の各方向成分で考えないといけないはずなのに、軸の指示が出てきませんから、何をしようとしているのか理解不能です。
Toya_Kamijo

2018/07/12 11:47

acc[t] = の式の部分は、ネット上にあるものを参考にして書いたので間違っているようでしたらその部分も含めて修正等のコメントお願いします。
Toya_Kamijo

2018/07/17 05:43

傾きセンサーの角度から計算して重力加速度は除去できました。
coco_bauer

2018/07/17 05:55

「acc[t] = の式の部分は、ネット上にあるものを参考にして書いた」ということでしたら、出典(参考にした記事のURL)を明らかにしてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問