7

LSM6DSL チップ (ジャイロスコープおよび acc.) を搭載したデバイスから与えられた値を解析しようとしていますが、位置と角度についてデータを適切に解析するのに苦労しています。

ベンダーから、ユニットがジャイロの解像度 2000、ACC の解像度 8g で動作しているという情報を受け取りました。

次の方法で short に変換されたバイト単位のデータを受け取ります。

public int[] BufferToMotionData(byte[] buffer, int segments = 2)
{
    int[] motionDataArray = new int[segments * 3];
    int offset = Constants.BufferSizeImage + Constants.CommandLength;

    for (int i = 0; i < 6; i++)
    {
        motionDataArray[i] = BitConverter.ToInt16(buffer, offset + (i * 2));
        if (motionDataArray[i] >= Int16.MaxValue)
            motionDataArray[i] -= 65535;
    }

    return motionDataArray;
}

(編集;クリーンアップ版)

これは、(例) 961、-16223、-1635、664、-269、-597 の範囲の値を返します。

スペック シートによると、各ベクトルに対応する値を乗算することになっています.. * ジャイロの場合は 70f、ACC の場合は .448f。

ドキュメンテーションから、G フォースの場合、これらは milliG であり、ジャイロはミリ度/秒であることを理解していますか?

// Gyro X,Y,Z
gx = Mathf.Deg2Rad * (motionData[0] * 70f / 1000f);
gy = Mathf.Deg2Rad * (motionData[1] * 70f / 1000f);
gz = Mathf.Deg2Rad * (motionData[2] * 70f / 1000f);

// Acc X,Y,Z
ax = motionData[3] * 0.488f / 1000f;
ay = motionData[4] * 0.488f / 1000f;
az = motionData[5] * 0.488f / 1000f;

Update(gx, gy, gz, ax, ay, az);

Update(..) はマドウィックの四元数式ですが、速度については加速度ベクトルを使用します。

計算後の現時点での G 値。

X 0.047824 Y -0.320128 Z  0.006344
X 0.07076  Y -0.2562   Z  0.020008
X 0.099552 Y -0.063928 Z -0.13664

これらは非常に低く見えます。速度として適用すると、特定の方向に逃げるだけです。これを適用する方法は完全にはわかりませんが、重力が正しくないことはわかっています。

受信した加速度値によって値が打ち消される必要があるため、速度ベクトルにドラッグを適用する必要はないと仮定していますか?

このタイプのチップの経験があり、実際に値をヨー/ピッチ/ロール (またはクォータニオン) に適用し、G 力を線形加速度として適用した経験のある人。

4

1 に答える 1

2

GitHub の既存のコードを見ると、8g の感度係数はコード化されたものでは244 µg/digitない488 µg/digitようです。

また、生の値がシフトされ、[-r/2,r/2]代わりに入っているように見えます[0, r]。したがって、500µgまたは500µdpsそれに追加する必要があります。(しかし、それは uint/int の問題に関連している可能性があります。とにかく、エンディアンについて確信がありますか?)

ACCデータはこちら、ジャイロデータはこちらをご覧ください。

それに基づいて、コードは次のようになります。

// Gyro X,Y,Z (in rad/s)
gx = Mathf.Deg2Rad * (motionData[0] * 70000f + 500) / 1000000;
gy = Mathf.Deg2Rad * (motionData[1] * 70000f + 500) / 1000000;
gz = Mathf.Deg2Rad * (motionData[2] * 70000f + 500) / 1000000;

// Acc X,Y,Z (in g)
ax = (motionData[3] * 244f + 500) / 1000000;
ay = (motionData[4] * 244f + 500) / 1000000;
az = (motionData[5] * 244f + 500) / 1000000;

Update(gx, gy, gz, ax, ay, az);
于 2019-06-26T15:00:53.447 に答える