Главная » Статьи » Полезная информация

Фильтр Калмана

  Как известно, при измерении чего-либо возникает погрешность, влияющая на результат измерений. Будь то температура, измеренная с помощью специализированного датчика, или же напряжение измеренное аналого-цифровым преобразователем.  Ничего идеального не бывает и поэтому на выходе мы получаем прыгающие значения. В радиолюбительской практике, для избавления от подобного, чаще всего применяют простое сглаживание: берут результат нескольких измерений и находят среднее значение, на выходе получая данные без резких скачков. Этот алгоритм прост и понятен любому человеку, окончившему школьную программу по математике. Но в этом методе кроется куча недостатков, такие как необходимость делать большое количество измерений для приемлемого результата или же отсутствие связи между текущим результатом и предыдущими.

  Не так давно, открыл для себя один интересный метод фильтрации, который лишён этих недостатков. Этот метод носит имя американского математика Рудольфа Калмана и способен давать значение максимально приближенное к реальному. Такие результаты достигаются благодаря тому, что система может учитывать управляющее воздействие на систему, если известны свойства  этого воздействия.

 К примеру, двигаясь в автомобиле и получая текущие координаты по GPS, мы сможем увеличить точность определения положения, если будем учитывать скорость и направление движения автомобиля, предугадывая где будет находится автомобиль в следующий момент времени. Скорость в свою очередь зависит от степени нажатия на педаль газа. И это все можно заложить в алгоритм фильтра, в конечном итоге получая более точные координаты, нежели полученные от одного GPS приемника.

  Подробней о реализации и о возможностях этого метода, советую прочитать здесь и вот здесь. Целью же этой статьи показать, как можно реализовать в bascom-avr фильтр Калмана, в упрощенном варианте. Очень упрощенном. Здесь не будет матриц и многоэтажных уравнений, способных нанести нормальному человеку травму мозга. А будет всего одна формула, которая выводится из всей горы матриц, при условии если мы пренебрежем расчетом управляющего воздействия. Формула в конечном итоге имеет следующий вид:

 

где    -  результирующее значение текущего вычисления, 

  -  коэффициент стабилизации, 

  -  исходное значение текущего измерения, 

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

как видно, все что требуется подобрать это коэффициент стабилизации, он должен быть больше 0 и не больше 1. Чем меньше коэффициент, тем сильнее сглаживаются данные, но при этом увеличивается время стабилизации. Вот небольшой пример, показывающий поведение результирующей кривой, при разных коэффициентах:

 

Это все теория, теперь перейдем к практике. Для испытания я взял аналоговый акселерометр ADXL335 и подключил его к микроконтроллеру ATMega8, считывание данных идет через АЦП.

 

Тестовый код в Bascom-AVR

$regfile = "m8def.dat"          'микроконтроллер ATmega8
$crystal = 8000000              'частота работы 8МГц
$baud = 9600                    'скорость передачи 9600 бод
$hwstack = 32
$swstack = 32
$framesize = 32


'конфигурируем АЦП
Config Adc = Single , Prescaler = 128 , Reference = Internal

Dim R As Word                  'переменная R в которую будем записывать показания с АЦП

declare sub kalman             'объявляем подпрограмму фильтрации

'переменные для фильтра
dim Mn as single     'результирующее значение
dim An as Single     'исходное значение
dim Mn1 as Single    'результат вычисления в предыдущей интерации
dim k as single      'коэффициент стабилизации
k = 0.1              'устанавливаем коэффициент

Start Adc

Do

= Getadc(0)               'считывание данных с акселерометра

An = R
call Kalman                 'вызываем подпрограмму фильтрации

Print R ; ";" ; round (Mn)  'отправляем данные в терминал

Waitms 50

Loop

End

'подпрограмма фильтрации
sub Kalman
 Mn = k * An
 An = 1 - k
 Mn1 = Mn1 * An
 Mn = Mn + Mn1
 Mn1 = Mn
end sub

 

 Полученные данные отправляются в терминал и в экселе строятся графики.  Чтобы искусственно ввести шум в систему, плату с датчиком прикрепил к двигателю своего сверлильного станка.

 

 

 Вибрация от двигателя передалась акселерометру и вот что получилось в результате: синий - исходный сигнал, красный - после фильтрации

 Как видно, метод очень даже хорош. Конечно и здесь есть свои недостатки, но простота реализации делает его одним из самых популярных методов фильтрации.

 

Категория: Полезная информация | Добавлено: 10.04.2016
Просмотров: 4400 | Комментарии: 23 | Теги: акселерометр, Калман, фильтр | Рейтинг: 5.0/6
Всего комментариев: 23
+1   Спам
23 sherman   (08.07.2016 13:10)
Сделал все тоже самое о чем говорит RDW. Взял код из примера, добавил номер шага перед значением после фильтра. Подал сначала максимальное значение на вход, и как только значение стало максимальным-подал 0 и посмотрел за сколько опустится до 0. Так что exersizze прав, увеличение и спад значений происходит за одинаковое число шагов. RDW, ЧЯДНТ?


график роста/спада


22 rdw   (06.06.2016 22:15)
Динамику значения я проверял просто:

- подал на вход максимальное значение (некоторое N), начал считать через сколько шагов оно его достигло;
- потом резко уменьшил до минимума, так же начал считать шаги.

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

0  
21 exersizze   (06.06.2016 07:39)
Фильтр относится к классу линейных, поэтому на уменьшение или увеличение входных данных реагирует одинаково. Увеличение в вашем случае было соизмеримо с уменьшением, т.е. на одинаковое значение менялись входные данные?
Вот здесь https://habrahabr.ru/post/166693/ есть статейка в которой выводится упрощенная формула и дается сравнение ее с классической формулой.

20 rdw   (05.06.2016 15:08)
Добрый день.

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

1. фильтр в реальности странно как-то работает, при уменьшении входного значения, данные на выходе очень медленно меняются (долго падают), но при увеличении входных данных, динамика идет в разы быстрее. К = 0.2 Непонятно, почему так, как убрать эту неравномерность?
2. в статьях куда больше переменных и формулы посложнее, вы сами корректировали вычисления? Уверенны в них?

19 KoSS_89   (04.05.2016 22:14)
Да, с этой версией работает, Спасибо!

0  
18 exersizze   (03.05.2016 20:03)
KoSS_89, попробовал повторить и задал коэффициент константой, все работает. Но у меня версия сейчас стоит 2.0.7.8 может в этом дело.



radiomag , я бы назвал этот опыт построения сверлилки не удачным, хотя неудачный опыт - тоже опыт. Но описывать неудачную конструкцию не вижу смысла, только когда доведу до ума. Хотя склоняюсь все же за ручную подачу, как и у всех нормальных станков:) Вот, если не видели есть такая конструкция, которую можно напечатать на принтере http://www.thingiverse.com/thing:766712    и ее обзор https://www.youtube.com/watch?v=PNLtDmbVrr8

17 radiomag   (01.05.2016 23:53)
Зачётная сверлилка.
Почему бы не опубликовать описание девайса в отдельном топике? Вообще то ручное управление, имхо, "рулит" (более желательно, как говорится)...

P.S.
За основной материал - тоже спасибо. Очень познавательно.

16 KoSS_89   (01.05.2016 21:50)
моя ошибка была в переводе "К" из разряда переменная в разряд константа, но какая разница, почему не работает с "Const k = 0.1" а с "Dim K as Single ; K = 0.1" все работает?

15 KoSS_89   (01.05.2016 21:38)
прошу простить, нашёл свою вину...

14 KoSS_89   (01.05.2016 21:36)
хотел с помощью этого фильтра усреднять показания напряжения при замерах ацп, но при симуляции выяснилось, что значения напряжения растут даже если значение ацп не менять, я поставил не корректную задачу для этой подпрограммы? (она нужна для динамично меняющихся значений) или есть какие то моменты которые я упустил? Хотя при рандомном значении ацп показания напряжения все равно только растут и уменьшатся не желают.

13 pchela5   (15.04.2016 09:44)
>> Да дело даже не в консоли, сам хомут получился очень жестким, проблема в шпильке и пружинистой муфте. Думал винт будет заменять вторую направляющую, но нет сильно все гуляет. Вот биения мешают.

Ну это распространенная ошибка - пробовать использовать передачу как направляющую.

0  
12 exersizze   (14.04.2016 22:57)
pchela5, гайка из кусочка фторопласта в размер паза. Да дело даже не в консоли, сам хомут получился очень жестким, проблема в шпильке и пружинистой муфте. У меня после постройки принтера остался в запасе один линейный подшипник и кусок направляющей. Думал винт будет заменять вторую направляющую, но нет сильно все гуляет. Привод шаговиком, по нажатии на кнопку запускается коллекторник и шаговик, после цикла сверления, коллекторник какое-то время работает, на случай если будет снова нажата кнопка. И второй режим, когда идет постоянное опускание и подъем сверлилки. Полуавтоматика, кароче:)успевай только пятаки под сверло подставлять. Я попробовал посверлить таким аппаратом пару плат, в принципе приноровится можно и вполне удобно. Вот биения мешают.
GSV, данные сначала приходят в терминал, затем копирую в блокнот и сохраняю в формате CSV. Окрываю экселем, а уже там и графики.

11 GSV   (14.04.2016 20:47)
to exersizze
А такие приятные графики вы строите в реальном времени?То есть что приходит в терминал,то и выводится в график?

10 pchela5   (14.04.2016 09:36)
Решил набор взять - дешевле чем по частям, да и проще чем колхозить. Напечатаю детали для простенького ЧПУ на нем - платы сверлить да ПВХ фрезить. Дай мне в личку свое мыло - статейку прислать. Посмотрел фотографию - шайтан ))) Надо было, конечно, вторую направляющую ставить - так консоль получилась. Ты что, ходовую гайку внутри напечатал? Или вставил таки? А подачу как организовал? Я тоже думал над такой вещицей - контроллер для шаговика, резистор или кнопки подачу регулировать и кнопку пуск

0  
9 exersizze   (14.04.2016 07:37)
KoSS_89, ага, глянь архив. Там фотка есть

8 KoSS_89   (13.04.2016 23:01)
Держатель на принтере печатал? хороший))

0  
7 exersizze   (13.04.2016 21:16)
pchela5, да, распечатаны на принтере,  в архиве модельки из solidworks, если надо могу конвертнуть в STL http://avrproject.ru/112/mmount.rar
а что едет? тоже комплектующие для принтера собираешь или решил готовый взять? smile

6 pchela5   (13.04.2016 10:18)
Хорошая статья, но я бы использовал степени двойки в тех случаях, когда памяти маловато. И вопрос: ты вот этот хомутик напечатал на чудо станке? Файликами не поделишься, а то мне посылка с поднебесной едет - надо чтото печатать.

0  
5 exersizze   (11.04.2016 22:59)
И там и там это результат предыдущего вычисления, поправил чтобы не было путаницы, спасибо.
При первом измерении Mn-1 равен 0, при втором равен Mn, и так далее.

4 kip96   (11.04.2016 21:07)
По формуле Mn-1 - результирующее значение предыдущего измерения. По программе Mn-1 - значение предыдущего вычисления. Что правда?
Когда читал статью, первая мысль именно два раза измерять.

0  
3 exersizze   (11.04.2016 08:29)
Так вибрации двигателя, используя одну ось акселерометра. В цангу изогнутый гвоздик зажал в качестве эксцентрика, чтобы сильнее трясло. А трясется потому что конструкция сверлильного станка получилась хлипкой, на одной цилиндрической направляющей. Как нибудь сделаю описание конструкции, как доведу до ума.

2 tenevikus   (11.04.2016 00:45)
Саасибо. Добротно и просто описано. Только не понял, что акселерометр-то мерял?

1 Toddy123   (10.04.2016 23:07)
Класс!

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]






   EasyEDA:  бесплатный редактор схем

   ✓ Создание схем
   ✓ Возможность симуляции
   ✓ Быстрое создание печатных плат
   ✓ Интуитивно понятный интерфейс

   Нарисуй свою схему прямо сейчас!
   Изготовление печатных плат   https://easyeda.com/order
авторизация
Логин:
Пароль:
Комментарии
Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
08.12.2016 - exersizze:
yorx выдалось немного свободного времени, проверил в симуляторе. Проблема...
Логгер температуры 2.0
05.12.2016 - Evgeny6873:
Хотел повторить схему и долго ждал дисплей, два раза заказывал с Китая, пришел. ...
Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
01.12.2016 - yorx:
Доброго времени суток, exersizze попробовал Ваш код все равно не работает как на...
Помни об усадке!
30.11.2016 - pchela5:
Автомобильные никакие не лезут?
Помни об усадке!
29.11.2016 - AlekS:
Виктор, спасибо.
С заменой транса в зиму, перестройка не комельфо) Валяет...
Управляем микроконтроллером с ПК по UART
29.11.2016 - exersizze:
Михаил, для работы с инфракрасными датчиками и диодами есть команды RC5SE...
Управляем микроконтроллером с ПК по UART
29.11.2016 - Михаил:
Всем привет.
Подскажите как переменную S передать по инфракрасному каналу...
Помни об усадке!
29.11.2016 - pchela5:
> Если ленту светодиодную порезать и соединить последовательно
Только ...
Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
29.11.2016 - exersizze:
yorx, вывод Q7 ' первой микросхемы соединен с DS второй микросхемы? С...


Лучшие цены на 3D принтеры
успей сделать себе подарок к Новому Году! ;)


Prusa i3

Prusa i3 от 12500 р.



Rostoсk

Rostock от 15000 р.