解析LSM6DSL原始值

Dev*_*nNL 7 c# imu mems

我正在尝试解析具有LSM6DSL芯片(陀螺仪和acc。)的设备给定的值,并且很难解析适当的数据以进行定位和倾斜。

从供应商处,我收到的信息是,该设备的陀螺仪分辨率为2000,配件的分辨率为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;
}
Run Code Online (Sandbox Code Playgroud)

(编辑;清理版本)

这将返回(示例)961,-16223,-1635、664,-269,-597范围内的值。

根据规格表,我应该将每个向量与其对应的值相乘。*陀螺仪为70f,acc为.448f。

从文档中我了解到,对于G力而言,这些单位是毫秒/陀螺,以毫秒/秒为单位?

// 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);
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这些看上去很低,如果以速度施加,它只会在给定的方向上运行,我知道我缺少重力校正,尽管不能完全确定如何应用。

我假设我不需要对速度矢量施加阻力,因为应该通过接收的加速度值来否定这些值?

任何有使用这种类型切屑的经验,并且实际将这些值应用于偏航/俯仰/侧倾(或四元数)并将G力用作线性加速度的人。

Ora*_*ace 2

通过查看GitHub 上的现有代码,看起来 8g 的敏感度系数是244 \xc2\xb5g/digit,而不是488 \xc2\xb5g/digit您编码的那样。

\n\n

而且看起来原始值已被移位并且位于而[-r/2,r/2]不是[0, r]. 所以你必须添加500\xc2\xb5g500\xc2\xb5dps到它。(但也许它与 uint/int 问题有关,无论如何你确定字节序吗?)

\n\n

有关 acc 数据,请参阅此处;有关陀螺仪数据,请参阅此处

\n\n

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

\n\n
// Gyro X,Y,Z (in rad/s)\ngx = Mathf.Deg2Rad * (motionData[0] * 70000f + 500) / 1000000;\ngy = Mathf.Deg2Rad * (motionData[1] * 70000f + 500) / 1000000;\ngz = Mathf.Deg2Rad * (motionData[2] * 70000f + 500) / 1000000;\n\n// Acc X,Y,Z (in g)\nax = (motionData[3] * 244f + 500) / 1000000;\nay = (motionData[4] * 244f + 500) / 1000000;\naz = (motionData[5] * 244f + 500) / 1000000;\n\nUpdate(gx, gy, gz, ax, ay, az);\n
Run Code Online (Sandbox Code Playgroud)\n