Android では、以下のコードに示すように、加速度計と磁場センサーを使用して空間位置を計算しています。getRotationMatrix メソッドは、方位角、ピッチ、およびロールを含む実際の単位の値を生成します。方位角と回転は、0 から 180 または 0 から -180 の範囲の値を与えます。ただし、ピッチは 0 ~ 90 または 0 ~ -90 の値を示します。私のアプリでは、デバイスの向きに関係なく一意の場所を特定する必要があるため、これは私のアプリの問題です。ロールを使用すると、同じ値を持つ 2 つの場所を持つことができます。
センサー値を 0 から 360 度の範囲の値に再マップするマトリックス変換を適用する必要があります (実際には、360 は 0 と同じであり、360 に近いものは 359.99999 のような数値になるため、有効ではありません.. .)
私は数学者ではなく、Android でマトリックスを使用することは言うまでもなく、マトリックスの使用方法もわかりませんが、これが 0 度から 360 度への変換に必要であることを認識しています。マトリックスが方位角とロールも処理して、0 から 360 の値も生成するようにするとよいのですが、それが不可能な場合でも、センサー値から一意の位置を導出できるため問題ありません。このマトリックス変換を作成する方法について何か提案はありますか?
@Override
public void onSensorChanged(SensorEvent event)
{
try
{
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
accelerometerValues = event.values;
else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
magneticFieldValues = event.values;
if ((accelerometerValues != null) && (magneticFieldValues != null))
{
float[] R = new float[9];
float I[] = new float[9];
boolean success = SensorManager.getRotationMatrix(R, I, accelerometerValues, magneticFieldValues);
if (success)
{
float[] values = new float[3];
SensorManager.getOrientation(R, values);
// Convert from radians to degrees if preferred.
values[0] = (float) Math.toDegrees(values[0]); // Azimuth
values[1] = (float) Math.toDegrees(values[1]); // Pitch
values[2] = (float) Math.toDegrees(values[2]); // Roll
}
}
}
catch (Exception ex)
{
}
}
編集: ピッチの生のイベント値は、デバイスを 360 度回転させたときに一意の値を提供しないため、マトリックス変換が私が求めている結果を生成することは非常に疑わしい. 間違ったセンサーを使用している可能性があります。