首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析LSM6DSL原始值

解析LSM6DSL原始值
EN

Stack Overflow用户
提问于 2019-06-20 21:26:16
回答 1查看 534关注 0票数 7

我正在尝试解析一个带有LSM6DSL芯片的设备给出的值(陀螺仪和acc。)我很难正确地解析数据以确定位置和角度。

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

我接收的数据以字节为单位,这些字节被以下代码转换为短字节;

代码语言:javascript
复制
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力,这些力的单位是毫克/秒,陀螺单位是毫度/秒?

代码语言:javascript
复制
// 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);

更新(..)是Madgwick的四元数公式,尽管对于速度,我使用加速度矢量。

我在计算后得到的力值;

代码语言:javascript
复制
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力应用为线性加速度。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-26 23:00:53

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

在此基础上,代码应如下所示:

代码语言:javascript
复制
// 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);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56687031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档