解析 LSM6DSL 原始值
Parsing LSM6DSL raw values
我正在尝试解析从带有 LSM6DSL 芯片(陀螺仪和加速度计)的设备给出的值,但我很难正确解析定位和角度的数据。
我从供应商那里收到的信息是,该装置是 运行,陀螺仪分辨率为 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;
}
(编辑;清理版本)
此 returns 值在(示例)961、-16223、-1635、664、-269、-597 范围内。
根据规范 sheet 我应该将每个向量与其对应的值相乘.. * 陀螺仪为 70f,acc 为 .448f。
从文档中我了解到 G 力的单位是 milliG,而陀螺仪的单位是毫度每秒?
// 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
这些看起来非常低,如果作为速度应用,它只会在给定的方向上运行,我知道我错过了一个正确的重力,但不完全确定如何应用它。
我假设我不需要对我的速度矢量施加阻力,因为值应该被接收到的加速度值取反?
任何对此类芯片有经验并实际将值应用于 yaw/pitch/roll(或四元数)并将 G 力作为线性加速度应用的人。
通过查看 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 and 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);
我正在尝试解析从带有 LSM6DSL 芯片(陀螺仪和加速度计)的设备给出的值,但我很难正确解析定位和角度的数据。
我从供应商那里收到的信息是,该装置是 运行,陀螺仪分辨率为 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;
}
(编辑;清理版本)
此 returns 值在(示例)961、-16223、-1635、664、-269、-597 范围内。
根据规范 sheet 我应该将每个向量与其对应的值相乘.. * 陀螺仪为 70f,acc 为 .448f。
从文档中我了解到 G 力的单位是 milliG,而陀螺仪的单位是毫度每秒?
// 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
这些看起来非常低,如果作为速度应用,它只会在给定的方向上运行,我知道我错过了一个正确的重力,但不完全确定如何应用它。
我假设我不需要对我的速度矢量施加阻力,因为值应该被接收到的加速度值取反?
任何对此类芯片有经验并实际将值应用于 yaw/pitch/roll(或四元数)并将 G 力作为线性加速度应用的人。
通过查看 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 and 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);