Разбор необработанных значений LSM6DSL

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

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 ответ

Решение

Глядя на существующий код на 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);
Другие вопросы по тегам