7

最近、私は加速度計とジャイロスコープの両方を使用して、GPSの助けを借りずにそれらのセンサーを使用してスマートフォンを追跡するためのいくつかの研究を行いました(この投稿を参照) ジャイロスコープと加速度計に基づく屋内測位システム

その目的のために、私は自分の向き(角度(ピッチ、ロールなど))が必要になるので、ここで私がこれまでに行ったことは次のとおりです。

public void onSensorChanged(SensorEvent arg0) {
    if (arg0.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
    {
        accel[0] = arg0.values[0];
         accel[1] = arg0.values[1];
   accel[2] = arg0.values[2];
   pitch = Math.toDegrees(Math.atan2(accel[1], Math.sqrt(Math.pow(accel[2], 2) + Math.pow(accel[0], 2))));

  tv2.setText("Pitch: " + pitch + "\n" + "Roll: " + roll);

   } else if (arg0.sensor.getType() == Sensor.TYPE_GYROSCOPE )
{
  if (timestamp != 0) {
  final float dT = (arg0.timestamp - timestamp) * NS2S;         
  angle[0] += arg0.values[0] * dT;
  filtered_angle[0] = (0.98f) * (filtered_angle[0] + arg0.values[0] * dT) + (0.02f)* (pitch);
   }        
   timestamp = arg0.timestamp;
 }
}

ここでは、加速度計(ピッチ)から(テストのためだけに)角度を付けようとしています。これは、ジャイロスコープの統合から、補完的なフィルターでフィルタリングします。

filtered_angle [0] =(0.98f)*(filtered_angle [0] + gyro_x * dT)+(0.02f)*(ピッチ)

dTで多かれ少なかれ0.009秒を開始します

しかし、理由はわかりませんが、私の角度は実際には正確ではありません...デバイスがテーブル上で平らな位置にあるとき(画面を上に向けて)

Pitch (angle fromm accel) = 1.5 (average) 
Integrate gyro = 0 to growing (normal it's drifting) 
filtered gyro angle = 1.2

そして私が90°の電話を持ち上げるとき(スクリーンが私の前の壁に面しているのを見てください)

Pitch (angle fromm accel) = 86 (MAXIMUM) 
Integrate gyro = he is out ok its normal 
filtered gyro angle = 83 (MAXIMUM)

したがって、角度が90に達することはありません??? もう少し持ち上げようとしても…90°まで動かないのはなぜですか?私の計算は間違っていますか?またはセンサーの品質はがらくたですか?

もう1つ疑問に思っているのは、Androidの場合、センサーの値を「読み取る」ことはありませんが、センサーが変更されると通知されます。問題は、コードでわかるように、AccelとGyroが同じメソッドを共有していることです。したがって、フィルター処理された角度を計算するとき、0.009秒前にAccelメジャーのピッチを取得します。それが私の問題の原因かもしれませんか?

ありがとうございました !

4

4 に答える 4

5

私は自分自身を繰り返すことしかできません。

線形加速度を2回積分することで位置を取得しますが、エラーはひどいものです。実際には役に立たない。言い換えれば、あなたは不可能を解決しようとしています。

実際にできることは、向きだけを追跡することです。

ロール、ピッチ、ヨーは悪です。使用しないでください。私がすでにお勧めした38:25のビデオをチェックしてください。

これは、ジャイロと加速度計を使用して方向を追跡する方法に関する優れたチュートリアルです。

あなたが役立つと思うかもしれない同様の質問:

GPSを使用せずにiPhoneの小さな動きを追跡する測位
に使用した場合の電話加速度計の実際の精度はどれくらいですか?
静止状態から垂直方向への電話の動きを計算する方法は?
iOS:3D空間での移動精度
Androidアプリケーション開発のために加速度計を使用して距離を測定する方法
加速度計によって移動された
距離ジャイロスコープと加速度計で移動した距離を見つけるにはどうすればよいですか?

于 2011-09-26T10:53:29.033 に答える
3

ジャイロスコープと加速度計を使用した方向追跡のための補完フィルターの使用に関するチュートリアルを作成しました。http://www.pieter-jan.com/node/11多分それはあなたを助けることができます。

于 2013-05-15T10:59:41.140 に答える
0

コードをテストしたところ、おそらくスケール係数が一貫していないことがわかりました。ピッチを0-piに変換すると、より良い結果が得られます。私のテストでは、フィルタリングされた結果は約90度です。

pitch = (float) Math.toDegrees(Math.atan2(accel[1], Math.sqrt(Math.pow(accel[2], 2) + Math.pow(accel[0],   2))));
pitch = pitch*PI/180.f;

filtered_angle = weight * (filtered_angle + event.values[0] * dT) + (1.0f-weight)* (pitch);
于 2013-09-05T01:00:17.133 に答える
-1

私は試しました、そしてこれはあなたに角度90を与えるでしょう...

filtered_angle = (filtered_angle / 83) * 90;
于 2014-08-09T10:19:22.400 に答える