Калибровка гироскопа Теория калибровки очень проста – если датчик положения не вращается вообще, то по всем трем осям должно быть нулевое значение. Я рассмотрел много примеров калибровки, некоторые товарищи для этого даже делают стенды с вращающимися осями. Это слишком сложно и труднодоступно. Проще всего калибровать неподвижный датчик. Для начала я хотел поступить как с акселерометром – накопить показаний, усреднить, определить смещение и жить с ним. Трудности начались сразу с накоплением. Оказывается, нельзя просто взять и складывать числа в дополнительном коде, а потом разделить их на количество. Переполнение тут играет важную роль. Пример с двумя числами: -1 и +5. Чему равно среднее? +2. Теперь делаем это по-программистски). FFFF + 0005 = 10004. Делим на 2, получаем 8002 (-32766). В общем, я нашел метод для усреднения, здесь его не описываю, потому что это не помогло. Я получил среднее значения от датчика по трем осям за 256 отсчетов, за поправки взял эти значения с противоположным знаком – смотрю на коды с датчика, ну да, они близки к нулю. После этого я перешел к получению угла от гироскопа. Меня интересует пока только одна ось, вдоль которой робот будет «падать», вперед – скорость со знаком «плюс», назад –скорость со знаком «минус». Теперь немного теории о том, как получить угол от гироскопа. Сам по себе гироскоп выдает скорость вращения в градусах в секунду. В идеале, если нет вращения, то скорость равна нулю, ноль и выдает. Изменить угол без вращения нельзя. Чтобы получить угол от гироскопа, надо брать его значения через равные известные промежутки времени, умножать на это время, а произведения суммировать. У меня настроено на получение данных через каждые 5 мс. Если я буду показания умножать на 5, а результат накапливать, то я получу какое-то число. Как из него достать градусы? Мы знаем, что диапазон датчика в кодах (–32768 … +32767), а в скоростях ± 250°/с. Если наше накопленное число умножить на 250, а потом поделить (сдвигами) на 32768, то получим градусы, умноженные на 1000 (ну не люблю я дробные числа, а вот точность люблю!). Подробный алгоритм такой: – беру сырое данное и прибавляю к нему смещение; – беру модуль полученного числа и запоминаю знак; – умножаю модуль на 5, получаю результат; – беру накопитель (не менее трех байтов, я взял 4); – если знак положительный – результат прибавляю к накопителю; – если знак отрицательный – результат вычитаю из накопителя. Тут можно было пару раз заморочиться (например, использовать знаковое умножение, или результат перевести в дополнительный код после беззнакового умножения, а потом только складывать), но на результат это не влияет. Алгоритмов можно придумать очень много. Реализовал я этот алгоритм, поставил робота спокойно и стал смотреть на накопитель. А он и правда сидит и что-то копит, да быстро так. И тут я понял, что мой метод получения смещения – мягко говоря, не очень. Новый алгоритм получения калибровочной поправки для гироскопа – экспериментальный. Написал технологичку, чтобы менять поправку на ходу, и стал искать ее методом дихотомии. Шагов за 5 дошел до оптимальной поправки. Критерием оптимальности является минимальная скорость изменения состояния накопителя. Ну а заодно наглядно увидел, что такое «дрейф гироскопа».
|