【问题标题】:Parsing LSM6DSL raw values解析 LSM6DSL 原始值
【发布时间】:2019-11-03 08:04:26
【问题描述】:

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

我从供应商那里收到信息,该设备运行的分辨率为 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;
}

(编辑;清理版)

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

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

从文档中我了解到,对于 G 力来说,这些力的单位是毫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);

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

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

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

具有此类芯片经验并实际将这些值应用于偏航/俯仰/滚动(或四元数)并将 G 力作为线性加速度应用的任何人。

【问题讨论】:

  • BitConverter.ToInt16(new[] { buffer[offset + 0], buffer[offset + 1] }, 0); 是写BitConverter.ToInt16(buffer, offset + 0) 的一种不必要的复杂方式(除了这些结果首先是否正确)。
  • 缓冲区总共包含 320016 字节的数据,偏移量定义了从哪里开始(int offset = Constants.BufferSizeImage + Constants.CommandLength;),所以是的 - 这可以工作,但传递一个 320kb 的缓冲区一个方法(非引用)并不是真正面向性能的。
  • 是的,我的意思是,明确地newing 一个只有两个字节的数组,你总是从头开始读取在功能上是相同的(但效率较低),而不是仅仅读取这两个字节直接来自offset。 (byte[] 是引用类型,BitConverter 没有复制任何内容,所以我不确定您对性能的评论是什么。)
  • 我没有足够的预算来允许每次通过 2MB 的 GC 压力(6 倍通过 320KB 副本),创建 6 个新数组的内存使用量不到 1 KB)。跨度>
  • 我可能在这里感到困惑,但是buffer 的类型是什么?您是否使用了不安全的代码和指针,因此您不能 直接调用BitConverter.ToInt16(buffer, ...)?否则,您似乎认为将数组传递给方法会复制它——它不会。

标签: c# imu mems


【解决方案1】:

通过查看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 datahere 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);

【讨论】:

  • 我已经尝试了几乎所有的敏感性,以防供应商报告的值是错误的。到目前为止,我一无所获:x,会试试这个,谢谢!
  • 这将我推向了正确的方向,我得到了更合理的数据值,谢谢 :)
  • 感谢@DevionNL,请携带正确的最终代码。
猜你喜欢
  • 2012-10-26
  • 2011-06-08
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多