我正在尝试解析一个带有LSM6DSL芯片的设备给出的值(陀螺仪和acc。)我很难正确地解析数据以确定位置和角度。
我从供应商那里得到的信息是,该装置的陀螺仪分辨率为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;
}(编辑;已清理版本)
这将返回范围为(例如) 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);更新(..)是Madgwick的四元数公式,尽管对于速度,我使用加速度矢量。
我在计算后得到的力值;
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力应用为线性加速度。
发布于 2019-06-26 23:00:53
通过查看existing code on GitHub,8g的敏感因素似乎是244 µg/digit,而不是您编码的488 µg/digit。
而且,它看起来像是原始值被移位了,并且是在[-r/2,r/2]中而不是[0, r]中。因此,您必须向其添加500µg或500µdps。(但它可能与uint/int问题有关,无论如何,您确定字节顺序吗?)
参见here for acc data和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);https://stackoverflow.com/questions/56687031
复制相似问题