【发布时间】: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, ...)?否则,您似乎认为将数组传递给方法会复制它——它不会。