Разбор необработанных значений LSM6DSL - PullRequest
7 голосов
/ 20 июня 2019

Я пытаюсь проанализировать значения, данные от устройства с микросхемой 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 они выражены в миллигахи гироскоп в миллиградусах в секунду?

// 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);

Обновление (..) - формула кватерниона Мэгвика, хотя для скорости я использую векторы ускорения.

Значения силы G, которые я получаю приэтот момент после расчетаion;

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 как линейного ускорения.

1 Ответ

2 голосов
/ 26 июня 2019

Если посмотреть на существующий код на GitHub , то похоже, что коэффициент чувствительности для 8g равен 244 µg/digit, а не 488 µg/digit, как вы его кодировали.

Также похоже, что необработанные значения смещены и находятся в [-r/2,r/2] вместо [0, r]. Таким образом, вы должны добавить 500µg или 500µdps к нему. (Но, может быть, это связано с проблемой uint / int, в любом случае вы уверены в порядке байтов?)

См. здесь для соответствующих данных и здесь для гироскопических данных .

Исходя из этого, код должен выглядеть примерно так:

// 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);
...