解析 LSM6DSL 原始值

Parsing LSM6DSL raw values

我正在尝试解析从带有 LSM6DSL 芯片(陀螺仪和加速度计)的设备给出的值,但我很难正确解析定位和角度的数据。

我从供应商那里收到的信息是,该装置是 运行,陀螺仪分辨率为 2000,acc 分辨率为 8g。

我收到以字节为单位的数据,这些数据由以下转换为短裤;

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;
}

(编辑;清理版本)

此 returns 值在(示例)961、-16223、-1635、664、-269、-597 范围内。

根据规范 sheet 我应该将每个向量与其对应的值相乘.. * 陀螺仪为 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(..) 是 Madgwick 的四元数公式,尽管对于速度我使用加速度向量。

此时我计算得到的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

这些看起来非常低,如果作为速度应用,它只会在给定的方向上运行,我知道我错过了一个正确的重力,但不完全确定如何应用它。

我假设我不需要对我的速度矢量施加阻力,因为值应该被接收到的加速度值取反?

任何对此类芯片有经验并实际将值应用于 yaw/pitch/roll(或四元数)并将 G 力作为线性加速度应用的人。

通过查看 existing code on GitHub,8g 的灵敏度系数似乎是 244 µg/digit 而不是您编码的 488 µg/digit

此外,原始值看起来也发生了偏移并且位于 [-r/2,r/2] 而不是 [0, r]。所以你必须添加 500µg500µdps 到它。 (但可能与 uint/int 问题有关,无论如何你确定字节顺序吗?)

here for acc data and here for gyro data

基于此,代码应如下所示:

// 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);