2015-07-07 8 views
1

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

ответ

0

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

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

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

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

1

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

ω = Δ φ/Δ т = (φ п − φ п)/(т п − т п)

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

φ п = φ п + ω & Мидот; Δ t

И соответствующий код C - & hellip;

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

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

0

Прежде всего вам нужно понять физический аспект цифрового гироскопа: он 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 для чувствительности 2000 д/с) - все должно быть в таблице в листе данных, и это зависит от того, как настроен гироскоп.
  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); 
        } 
    } 
    

Это должно получить вы начали на правильном пути, я надеюсь :)