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

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

ただいまの
回答率

90.61%

  • Android

    6423questions

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

  • Android Studio

    3625questions

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

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

受付中

回答 0

投稿 編集

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

Toya_Kamijo

score 0

 前提・実現したいこと

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

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

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

  2. v[t] = v[t-1] + acc[t] * Ts (Ts:サンプリング周期)
    上式で加速度から速度を算出したが,速度が理想値より小さい気がする.
    (閾値を定めているため、小さすぎると常に0を示すようになっている)

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

 該当のソースコード

package com.example.toyakamijo.accelerometersample3;

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.CountDownTimer;
import android.os.SystemClock;
import android.os.Vibrator;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Chronometer;
import android.widget.TextView;

import java.util.List;

public class MainActivity extends AppCompatActivity {

    private SensorManager accSensorManager;
    private SensorEventListener sensorEventListener;
    private TextView accView;
    private TextView magAccView;
    private TextView velView;
    private TextView magVelView;
    private TextView timer;

    private float acc[] = new float[3];             //加速度
    private float gra[] = {0.0f, 0.0f, 0.0f};       //重力
    private float linearAcc[] = {0.0f, 0.0f, 0.0f}; //加速度(重力除去)
    private final float alpha = 0.001f;             //平滑化係数α
    private final float late = 0.02f;               //サンプリング周期20[ms]
    private double A = 0.0d;                        //加速度の大きさ
    private float vel[] = {0.0f, 0.0f, 0.0f};       //速度
    private float vel2[] = {0.0f, 0.0f, 0.0f};      //(20ms前の)速度
    private double V = 0.0d;                        //速度の大きさ

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        accView = findViewById(R.id.accView);
        magAccView = findViewById(R.id.magAccView);
        velView = findViewById(R.id.velView);
        magVelView = findViewById(R.id.magVelView);
        timer = findViewById(R.id.timer);

        //Vibratorインスタンス取得
        final Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);

        accSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        sensorEventListener = new SensorEventListener() {
            @Override
            public void onSensorChanged(SensorEvent event) {
                switch (event.sensor.getType()) {
                    case Sensor.TYPE_ACCELEROMETER:
                        acc = event.values.clone();

                        for (int i = 0; i <= 2; i++) {
                            gra[i] = alpha * gra[i] + (1 - alpha) * acc[i]; //重力加速度の算出
                            linearAcc[i] = acc[i] - gra[i];                 //加速度の算出(重力加速度除去)
                            vel[i] = (vel2[i] + late * linearAcc[i]);       //速度の算出

                            if (linearAcc[i] < 0.001) {
                                linearAcc[i] = 0.0f;
                            }
                            if (vel[i] < 0.001) {
                                vel[i] = 0.0f;
                            }
                            if (vel2[i] < 0.001) {
                                vel2[i] = 0.0f;
                            }
                        }

                        A = Math.sqrt(Math.pow(linearAcc[0], 2)
                                + Math.pow(linearAcc[1], 2)
                                + Math.pow(linearAcc[2], 2));

                        V = Math.sqrt(Math.pow(vel[0], 2)
                                + Math.pow(vel[1], 2)
                                + Math.pow(vel[2], 2));

                        if (A > 0.005) {
                            vibrator.vibrate(100);
                        } else {
                            vibrator.cancel();
                        }

                        String accelerometer = "加速度センサー[m/s^2]"
                                + "\nX:" + linearAcc[0]
                                + "\nY:" + linearAcc[1]
                                + "\nZ:" + linearAcc[2];

                        String magAccelerometer = "加速度の大きさ[m/s^2]\n" + (float) A;

                        String velocity = "速度[m/s]"
                                + "\nX:" + vel[0]
                                + "\nY:" + vel[1]
                                + "\nZ:" + vel[2];

                        String magVelocity = "速度の大きさ[m/s]\n" + (float) V;

                        accView.setText(accelerometer);
                        magAccView.setText(magAccelerometer);
                        velView.setText(velocity);
                        magVelView.setText(magVelocity);

                        for (int i=0; i<=2;i++){
                            vel2[i] = vel[i];
                        }

                        break;
                }
            }

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

            }
        };
    }

    @Override
    protected void onStop() {
        super.onStop();

        //Listenerの登録解除
        accSensorManager.unregisterListener(sensorEventListener);
    }

    @Override
    protected void onResume() {
        super.onResume();

        //Listenerの登録
        List<Sensor> accSensor = accSensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);
        if (accSensor.size() > 0) {
            Sensor sensor = accSensor.get(0);
            accSensorManager.registerListener(sensorEventListener, sensor, SensorManager.SENSOR_DELAY_GAME);
        }
    }
}

 試したこと

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

Android Studio 3.1

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正の依頼

  • coco_bauer

    2018/07/12 19:22

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

    キャンセル

  • Toya_Kamijo

    2018/07/12 20:47

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

    キャンセル

  • Toya_Kamijo

    2018/07/17 14:43

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

    キャンセル

  • coco_bauer

    2018/07/17 14:55

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

    キャンセル

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

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • Android

    6423questions

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

  • Android Studio

    3625questions

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