Создание собственной системы стабилизации
не, не так, вот мы взяли прошлые данные
Да, согласен, наверно нужно выделить некий массивчик для прошлых данных (вопрос - какого размера) по принципу “последний пришел - первый ушел” и над ним уже издеваться, ища каждую итерацию закономерности в поведении данных… каким образом искать эти закономерности - уже другой вопрос.
Вообще говоря, не разу не встречал элементарной блок-схемы процесса фильтрования этим фильтром, в основном все материалы в виде математических выкладок, а для человека не искушенного сухой математикой, понять сам принцип очень сложно, к сожалению… (Даешь блок-схему в студию! )))
каким образом искать эти закономерности - уже другой вопрос
автоматически, Data mining
сливать данные логов в базу. загрузить в сервачек, дать ему найти зависимости зависимости привести к модели
датчики оборотов двигателей могли бы быть подспорьем как сенсоры.
кстати у некоторых регулей уже есть
Блок схема - сильнА, ничего не скажешь… хотелось бы конечно версию для наипростейшего случая (тот же аксель и его шум по одной оси) о потом уже наворачивать “кубики”, если дойдет смысл…
Или всё это необходимо даже по минимуму ? , тогда я умываю руки…
P.S. мир (или его модель) не может быть так устроен… (😃)
Блок схема - сильнА, ничего не скажешь… хотелось бы конечно версию для наипростейшего случая (тот же аксель и его шум по одной оси) о потом уже наворачивать “кубики”, если дойдет смысл…
Или всё это необходимо даже по минимуму ? , тогда я умываю руки…
P.S. мир (или его модель) не может быть так устроен… (😃)
Нашел я тут одну статью с объяснением, простейший пример, “Одномерный случай”.
Но мне он не нравиться, так как не все моменты раскрывает, уж больно упрощен. Но так в общем пойдет …
он не нравиться
А мне понравился, вполне, а главное - реально работает!
(быстренько загнал питоновский код из статьи в свою OrangePI и проверил…), осталось под настроение вкурить несложные формулы и можно наверно что то своё уже родить.
Спасибо.
Блок схема - сильнА, ничего не скажешь… хотелось бы конечно версию для наипростейшего случая (тот же аксель и его шум по одной оси) о потом уже наворачивать “кубики”, если дойдет смысл… Или всё это необходимо даже по минимуму ? , тогда я умываю руки…
Олег, ты не понял, как одномерности так и многомерности в нём нет как таковой - есть нужные выводимые данные такие как углы или скорости, они рассчитываются прямо в алгоритме при этом в полном алго. есть ещё вектор управления (грубо вводится ещё и то куда ты решил повернуть) - первое действие - это приращение аргументов т.е. зная прошлое ускорение и время цикла представляем себе новую скорость и пройденный путь (рассчётное) потом получаем данные и сравниваем/смешиваем их с расчётными - смотрим кто где обшибнулся мы или датчики - из этого выводим новые коэф. влияния датчиков на алгоритм для следующей интерации, смешанные данные отдаём на пид, а так же представляем их старыми данными для нового рассчёта, естественно и новые коэф. влияния впендрюливаем и так по кругу…
Олег, ты не понял
Понимание пока только начинает приходить, постепенно… Такие вещи надо именно осознать на “атомарном” уровне, иначе никакого творчества не получится, а только копирование…
Хочу попробовать пока накропать в своей прошивке фильтрацию сырых данных акселя по выше-предоставленному примеру, там никакого управления, я так понял, нет , матриц тоже,… если ещё заменить иезуитские термины типа “апостериорный” и “априорный” (…бесит отрава…) на “предварительный” и “последующий”, то уже в голове начинает вырисовываться смысловая картина.
Короче надежда применить у в собственном коде магический фильтр забрезжила…, а уж насколько он магический покажут результаты…
неее ))) всё хуже тут идёт оперирование данными с различных устройста: для простоты (отступлю - я как-то заводил тему о данных из прошлого) 1 и основоположное имеем “старые” (по моей терминологии т.е. сняли мы угловые скорости с дус) данные с ДУС плюс старый угол (он нам вернулся из конца алгоритма в начало уже профильтрованный) - из них мы предполагаем(рассчитываем) новый угол и сверяем/смешиваем с новыми данными с акселя с определённой пропорцией (ни чего не напоминает? - да блин это же обычный комплиментарник) - всё мы полученные данные отправляем в пид и в зад, и вот тут начинается самое интересное (сама магия Калмана) - мы на основе стат. и фундаментальных данных расчитываем коэффициенты влияния датчиков на алгоритм для следующей интерации…
всё хуже тут идёт оперирование данными с различных устройста
Сергей, вариантов и схем применения сего фильтра наверно очень много, не спорю (в этом и интерес, наверно.)
Я ж пока вот тупо взял сырые данные с осей акселерометра при максимальной чувствительности (2G), при этом имеем в состоянии покоя сенсора шкалу 1024 ед./G и шум=~25-30 ед. Затем прогнал их через алгоритм, указанный в статье, и … о чудо ! шум буквально ветром сдуло… до сих пор не верю, но показания стоят как влитые, как будто это и не аксель вовсе.
Никакое усреднение не даёт такой результат, однозначно.
Как следствие, в алгоритме калибровке акселя оффсеты по осям будут теперь практически идеальные, и далее имеем возможность более точного вычисления линейных ускорений…
Короче, незнаю кому как, а для меня это вполне результат… Не уверен, но наверно и с Дусом можно провернуть тоже, не говоря уж про магнитометр.
А например после, и это можно накатить:
мы на основе стат. и фундаментальных данных расчитываем коэффициенты влияния датчиков на алгоритм для следующей интерации…
никто не запрещает…
Никакое усреднение не даёт такой результат, однозначно.
А как насчет задержек в этом случае? Усреднить в покое тоже можно так, что шум пропадет, только задержка полезного сигнала будет неприемлемой.
Интересно было бы сравнить с БИХ фильтром, там можно и несколько предыдущих значений учитывать при расчете нового. Хотя можно ли их вообще напрямую сравнивать?
А как насчет задержек в этом случае?
Задержки и точность, смотрю, как и везде, взаимосвязаны и управляются установкой “дисперсии”,
но как ни крути - результат на порядок лучше чем при усреднении.
Раньше пробовал аж в три прохода: сначала из массива данных вырезал все максимумы и минимумы (пики), а потом усреднял оставшееся, и всеравно не то…
Чтоб точнее оценить, надо мне телеметрию передавать пошустрей, а она у меня всего герц этак 10… (по радиоканалу)
Задержки и точность, смотрю, как и везде, взаимосвязаны и управляются установкой “дисперсии”,
но как ни крути - результат на порядок лучше чем при усреднении.
Раньше пробовал аж в три прохода: сначала из массива данных вырезал все максимумы и минимумы (пики), а потом усреднял оставшееся, и всеравно не то…
Чтоб точнее оценить, надо мне телеметрию передавать пошустрей, а она у меня всего герц этак 10… (по радиоканалу)
Рад что вам пригодилось. 😁
Боюсь, только, данная реализация фильтра Калмана, по сути работает без внутренней модели (Xn = Xn-1). А так как Q и R - конст, то P устанавливается на постоянном значении и дальше уже К - постоянно и по сути данный фильтр превращается в апериодический фильтр или по другому комплементарный фильтр.
Проще тогда воспользоваться уравнением:
формула расчета апериодической функции:
Y(n) = Y(n-1) + (X(n)-Y(n-1))*(t/Tф);
или в форме комплементарного фильтра:
Y(n) = Y(n-1)*(1-t/Тф)+(X(n))*(t/Tф); - , где К = t/Tф;
Y(n) - текущее выходное значение фильтра
Y(n-1) предыдущее
X(n) - вход фильтра
t - время цикла обработки
Тф - время фильтра характеристика силы фильтрации и создаваемого запаздывания время запаздывания будет равно 1/3 Тф
Если побробовать фильтр Калмана из примера и фильтры с этими формулами результат будет примерно одинаков. При одинаковой инертности и времени запаздывания примерно одинаковое качество фильтрации.
Причем апериодический фильтр можно даже немного улучшить используя звено третьего порядка, то есть, самый простой вариант просто применить друг за другом три аппериодиских фильтра выход первого на вход второго и т.д. при этом взять Тф/3 для каждого тогда качество фильтрации будет немного лучше при такой же инертности.
Но когда в фильтре Калмана реализована модель процесса то тут все может быть по другому.
Но когда в фильтре Калмана реализована модель процесса то тут все может быть по другому.
А какую модель можно применить например в случае фильтрации данных с акселерометра? В каком случае в принципе имеет смысл использовать фильтр Калмана?
(ни чего не напоминает? - да блин это же обычный комплиментарник)
и по сути данный фильтр превращается в апериодический фильтр или по другому комплементарный фильтр.
Мнения экспертов сошлись…, но я осмелюсь поспорить:
у комплементарного фильтра мы точно знаем - какое значение долна принять переменная через энное количество шагов, т.е. “целеуказание” уже известно и остается только к нему стремиться через коэфициенты… (актуально для “притягивания за уши” одного неточного датчика к более точному)
Здесь же (у калмана) наблюдается чуток другая природа, а именно: К-фильтра как бы “скользит” по зашумлённому сигналу в поисках “истины”, которая заранее не известна по определению…
по сути работает без внутренней модели
боюсь что модель присутствует неявно, а именно заложена в характере самого шума сигнала (а шум шуму - рознь), соответственно то, что на акселе это сработало, само по себе удача, и не факт что будет эффективно на другом железе…
Здесь же (у калмана) наблюдается чуток другая природа, а именно: К-фильтра как бы “скользит” по зашумлённому сигналу в поисках “истины”, которая заранее не известна по определению…
В данном примере дисперсии Q и R константы по этому реальный шум не имеет значение и P устремляется к заранее известному числу и К соответсвенно тоже.
Вот если сделать например R зависимой от реального шума, то тогда вероятно вы увидите определенные улучшения.
Например самый простой вариант:
e[k] = abs(y[k] - xest1[k]);
или
e[k] = abs(y[k] - xest1[k])+Rmin;
R[k] = e[k]*Cr;
где Cr - некий подстроечный коэффициент который при e[k] = ШумМакс даст R[k] примерно равным R константу
Идея в том что когда сигнал не меняется то P и К уменьшаются до некой минимальной величины, если же сигнал например акселерометра начинает меняться то P растет и К растет так чтобы больше учитывать показания прибора а не модели. Тем самым мы получим меньшее западздывание при изменениях сигнала. Фильтр будет подстраиваться под дисперсию ошибки.
И тут все будет зависить от того как считать дисперсию.
Можно поступить еще веселее. Попытаться учесть распределение шума по Гаусу. Самый простой вариант если величина шума меньше некой константы то 0 если больше то по формуле что выше.
Идея в том что
боюсь что модель присутствует неявно, а именно заложена в характере самого шума сигнала (а шум шуму - рознь), соответственно то, что на акселе это сработало, само по себе удача, и не факт что будет эффективно на другом железе…
Модель именно процесса здесь все же отсутсвует
X[k] = X[k-1] это постоянный сигнал
вот если ввести сюда некую формулу процесса
X[k] = X[k-1] + Vconst, то другое дело
Но это когда мы действительно знаем что процесс меняется именно так
А если нет. Например для акселерометра модели нет.
А вот для скорости рассчитываемой из показаний акселерометра есть, но уже нет измерителя скорости. 😁
А вот для скорости рассчитываемой из показаний акселерометра есть, но уже нет измерителя скорости.
тут измерителями скорости должны выступать те же датчики воздушной скорости и/или GPS, в данном случае не стоит считать что-то одно - это система и довольно большая из 14 - 16 состояний/показаний и решать её нужно в целом, а не по отдельности…
сейчас в том же ардукоптере, применено довольно интересное решение - например компас может вообще выводиться из алгоритма если его показания сильно разнятся с показаниями ДУС, при этом если датчик возвращается в “норму” - он возвращается в алгоритм…
но уже нет измерителя скорости.
Измеритель поставим, не проблема… ))
и P устремляется к заранее известному числу
А вот это не могу понять (пока)…:
“кому известному ?” самому фильтру ? - это ещё куда не шло, но тогда скорей - “рассчитанному”
Иначе говоря, если заранее знать “истинное значение” среди шума, тогда нафига вообще что то фильтровать…
(я именно о случае одного источника шума рассуждаю, а не о разных)
в данном случае не стоит считать что-то одно - это система и довольно большая
налицо два разных подхода к решению задачи: один для “одиночного” сигнала и второй для смешивания разных…, тут то наверно и непонимание…
(я именно о случае одного источника шума рассуждаю, а не о разных)
шумов много и разных, можно отфильтровать собственный шум датчика, а дальше - вибрации вызванные моторами, пропами, какими-то резонансными составляющими рамы, самой платы контроллера и их гармоник - куча неизвестных причём меняющихся во времени без всякой закономерности, и то что работает на столе или в относительно спокойном состоянии сводя коэффициенты фильтра в одну точку, на практике из белого шума сделает однобокий цветной и не дай бог ещё и в резонанс с чем-то, простой пример (не относящийся к данному примеру) был у меня контроллер на 330-м лсм-е и что, пока взлетает или носится как угорелый - всё нормально, как только в режиме висения примерно на 50% газа - ну ни в какую, а как оказалось при оборотах 4500 - 5000 - жудкий резонанс самого акселя с вибрациями от вмг, так вот сменить вмг на более оборотистые и в ховере эта штука бы уже полетела но зато на малых оборотах были бы проблемы - вот ещё одно условие (неизвестное) как с ним бороться - только собиранием имперических данных и по ним выстраивать алгоритм именно к конкретному датчику! почему я упёрся в мпу - я его знаю я могу с ним “сработаться”…
налицо два разных подхода к решению задачи: один для “одиночного” сигнала и второй для смешивания разных…, тут то наверно и непонимание…
Отсюда и был мой вопрос, который чаще всего пытаются обходить либо не затрагивать вообще в инструкциях по фильтру Калмана:
В каком случае в принципе имеет смысл использовать фильтр Калмана?