最近、私は加速度計とジャイロスコープの両方を使用して、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メジャーのピッチを取得します。それが私の問題の原因かもしれませんか?
ありがとうございました !