Интегрировать показания 3-осевого гироскопа?

Поэтому я написал программу на C для печати значений 3-осевого гироскопа с очень высокой скоростью передачи данных. Значения представляют собой мгновенные значения угловой скорости, которые увеличиваются при движении и уменьшаются, если устройство неподвижно. Мне нужно, чтобы он удерживал высокие значения и возвращался к нулю при возврате в положение. Если я интегрирую значения в течение фиксированного шага расчета, достигну ли я этого? Как мне пройти интеграцию? Я новичок в программировании на C. Спасибо


person Priyank    schedule 07.07.2015    source источник


Ответы (3)


Угловая скорость:

= /t = (n n1)/(tn tn1)

Таким образом, текущий угол можно вычислить из предыдущего угла следующим образом:

n = n1 + т

И соответствующий код C

double angle = 0;  /* or any initial value */
for ( ;; ) {
    double omega = get_angular_velocity();
    angle += omega * timestep;
}

при условии, что функция get_angular_velocity регулярно возвращает значение с интервалом timestep.

person dlask    schedule 07.07.2015

Во-первых, вам нужно понять физический аспект цифрового гироскопа: он suffers from drift (он не возвращается к 0, но обычно это происходит через длительные периоды времени) и, что не менее важно, обычно biased; это проблема калибровки.

Смещение гироскопа можно наблюдать, читая значение его оси, когда оно неподвижно. Если он читает что-то отличное от 0, это ваша предвзятость. И вам нужно это компенсировать. Как ты сделал это? - калибровка

Калибровка гироскопа: считывание значений осей за заданный период времени (1000 выборок должны делать это). Усредните выборки, чтобы получить значение смещения. You have to subtract this bias value from all readings when running you code to get a valid reading. Вы будете знать, что сделали все правильно, если будете читать нули, когда гироскоп не движется.

Далее, интерпретация данных гироскопа: гироскоп дает вам angular velocity values. В необработанном виде они не очень полезны для вас; поэтому вы со временем интегрируете их, чтобы получить angle values, но прежде чем вы сможете это сделать, вам понадобится несколько вещей:

  1. усиление гироскопа; это указано в таблице данных как значение, связанное с его чувствительностью (например, GAIN = 0,07 для чувствительности 2000dps) — все это должно быть в таблице в таблице данных, и это зависит от того, как настроен гироскоп.
  2. вам нужно выбрать временной интервал, по которому вы интегрируете значения, это опять же зависит от конфигурации гироскопа (см. настройки dps), но вам должно подойти 10 или 20 мс.
  3. убедитесь, что вы читаете значения гироскопа с хорошей периодичностью (т.е. ровно одно каждые 10 мс)
  4. напишите некоторый код, чтобы собрать все это вместе, например:

    while(1)
    {
        startInt = mymillis();// this function returns the current time in ms
    
        gyroRaw = readGyro(); 
    
        //Convert Gyro raw to degrees per second
        rate_gyro = (float) gyrRaw * GYRO_GAIN;
    
        //Calculate the angles from the gyro
        gyroAangle += rate_gyro * DT;
    
        //print the gyro angle ...or anything you find useful
    
        //Each loop should be at least 20ms.
        while(mymillis() - startInt < 20)
        {
           usleep(100);
        }
    }
    

Надеюсь, это поможет вам начать с правильного пути :)

person Pandrei    schedule 08.07.2015

На самом деле это не столько о C, сколько об обработке сигналов в целом, так что это хорошая идея, чтобы прочитать об этом.

Некоторая интеграция не может быть неправильной для удаления шума. Существуют различные алгоритмы, которые вы можете использовать.

Чтобы «удерживать высокие значения», вы должны просто немного подумать, что это на самом деле означает: обнаружение и сохранение максимумов кривой. С некоторой дискретной дифференциацией вы можете обнаружить всплески, например. из-за падения стола. Это широкое поле, просто проведите несколько экспериментов.

Чтобы увидеть закономерности, лучше всего показать их в виде кривых, как на осциллографе. Если вам не нужна графическая обработка в C, вы можете передать значения в сокет и использовать язык высокого уровня, такой как Python, для рисования и некоторой обработки. Просто идея!

person too honest for this site    schedule 07.07.2015