Создание собственной системы стабилизации

SitulaAqua
oleg70:

Вот например : получили мы с акселя значение “352”, в нём “ШУМ” + “МЯСО”, однозначно понятно… , а дальше то что ? возможных комбинаций слагаемых - бесконечность…
мозг сопротивляется понять как и где искать коэфициент “К”, от балды чтоль взять, и потом “магические формулы” при некоторых итерациях приведут его к истине ??
Короче суть постоянно ускользает от понимания…

Ну да, я думаю, примерно так.
Грубо говоря, вот есть у нас тело мы его бросили с какой-то силой с какой не знаем, но знаем что оно должно двигаться по параболе, и мы мерим его положение но с шумом да еще внешние факторы ветер облака и т.п. И вот оно летит, а мы мерим и по полученным значениям прикидываем а какие параметры должны быть у параболы чтоб примерно так летело, то есть у нашей модели. И мы каждый раз считаем а какое следующее положение будет исходя из полученной модели и смотрим что нам дает датчик, и каждый раз смешиваем эти два значения исходя из того что нам кажется более верным (а точнее исходя из того насколько сильно отличаются измеренные значения от расчетных). И вообщем так каждый шаг, уточняем модель, прикидываем какое значение должно быть сейчас по модели, какое дал датчик, насколько усредненные измеряемые значения выходят за модель если сильно то наверно в модели ошибка больше берем измеренные данные и уточняем модель, если модель дает расчетные значения близкие с тем что в среднем дает датчик то считаем более точной модель. Вроде как-то так.

oleg70
SergDoc:

не, не так, вот мы взяли прошлые данные

Да, согласен, наверно нужно выделить некий массивчик для прошлых данных (вопрос - какого размера) по принципу “последний пришел - первый ушел” и над ним уже издеваться, ища каждую итерацию закономерности в поведении данных… каким образом искать эти закономерности - уже другой вопрос.
Вообще говоря, не разу не встречал элементарной блок-схемы процесса фильтрования этим фильтром, в основном все материалы в виде математических выкладок, а для человека не искушенного сухой математикой, понять сам принцип очень сложно, к сожалению… (Даешь блок-схему в студию! )))

alexeykozin
oleg70:

каким образом искать эти закономерности - уже другой вопрос

автоматически, Data mining
сливать данные логов в базу. загрузить в сервачек, дать ему найти зависимости зависимости привести к модели

alexeykozin

датчики оборотов двигателей могли бы быть подспорьем как сенсоры.
кстати у некоторых регулей уже есть

oleg70

Блок схема - сильнА, ничего не скажешь… хотелось бы конечно версию для наипростейшего случая (тот же аксель и его шум по одной оси) о потом уже наворачивать “кубики”, если дойдет смысл…
Или всё это необходимо даже по минимуму ? , тогда я умываю руки…
P.S. мир (или его модель) не может быть так устроен… (😃)

SitulaAqua
oleg70:

Блок схема - сильнА, ничего не скажешь… хотелось бы конечно версию для наипростейшего случая (тот же аксель и его шум по одной оси) о потом уже наворачивать “кубики”, если дойдет смысл…
Или всё это необходимо даже по минимуму ? , тогда я умываю руки…
P.S. мир (или его модель) не может быть так устроен… (😃)

Нашел я тут одну статью с объяснением, простейший пример, “Одномерный случай”.
Но мне он не нравиться, так как не все моменты раскрывает, уж больно упрощен. Но так в общем пойдет …

oleg70
SitulaAqua:

он не нравиться

А мне понравился, вполне, а главное - реально работает!
(быстренько загнал питоновский код из статьи в свою OrangePI и проверил…), осталось под настроение вкурить несложные формулы и можно наверно что то своё уже родить.
Спасибо.

SergDoc
oleg70:

Блок схема - сильнА, ничего не скажешь… хотелось бы конечно версию для наипростейшего случая (тот же аксель и его шум по одной оси) о потом уже наворачивать “кубики”, если дойдет смысл… Или всё это необходимо даже по минимуму ? , тогда я умываю руки…

Олег, ты не понял, как одномерности так и многомерности в нём нет как таковой - есть нужные выводимые данные такие как углы или скорости, они рассчитываются прямо в алгоритме при этом в полном алго. есть ещё вектор управления (грубо вводится ещё и то куда ты решил повернуть) - первое действие - это приращение аргументов т.е. зная прошлое ускорение и время цикла представляем себе новую скорость и пройденный путь (рассчётное) потом получаем данные и сравниваем/смешиваем их с расчётными - смотрим кто где обшибнулся мы или датчики - из этого выводим новые коэф. влияния датчиков на алгоритм для следующей интерации, смешанные данные отдаём на пид, а так же представляем их старыми данными для нового рассчёта, естественно и новые коэф. влияния впендрюливаем и так по кругу…

oleg70
SergDoc:

Олег, ты не понял

Понимание пока только начинает приходить, постепенно… Такие вещи надо именно осознать на “атомарном” уровне, иначе никакого творчества не получится, а только копирование…
Хочу попробовать пока накропать в своей прошивке фильтрацию сырых данных акселя по выше-предоставленному примеру, там никакого управления, я так понял, нет , матриц тоже,… если ещё заменить иезуитские термины типа “апостериорный” и “априорный” (…бесит отрава…) на “предварительный” и “последующий”, то уже в голове начинает вырисовываться смысловая картина.
Короче надежда применить у в собственном коде магический фильтр забрезжила…, а уж насколько он магический покажут результаты…

SergDoc

неее ))) всё хуже тут идёт оперирование данными с различных устройста: для простоты (отступлю - я как-то заводил тему о данных из прошлого) 1 и основоположное имеем “старые” (по моей терминологии т.е. сняли мы угловые скорости с дус) данные с ДУС плюс старый угол (он нам вернулся из конца алгоритма в начало уже профильтрованный) - из них мы предполагаем(рассчитываем) новый угол и сверяем/смешиваем с новыми данными с акселя с определённой пропорцией (ни чего не напоминает? - да блин это же обычный комплиментарник) - всё мы полученные данные отправляем в пид и в зад, и вот тут начинается самое интересное (сама магия Калмана) - мы на основе стат. и фундаментальных данных расчитываем коэффициенты влияния датчиков на алгоритм для следующей интерации…

oleg70
SergDoc:

всё хуже тут идёт оперирование данными с различных устройста

Сергей, вариантов и схем применения сего фильтра наверно очень много, не спорю (в этом и интерес, наверно.)
Я ж пока вот тупо взял сырые данные с осей акселерометра при максимальной чувствительности (2G), при этом имеем в состоянии покоя сенсора шкалу 1024 ед./G и шум=~25-30 ед. Затем прогнал их через алгоритм, указанный в статье, и … о чудо ! шум буквально ветром сдуло… до сих пор не верю, но показания стоят как влитые, как будто это и не аксель вовсе.
Никакое усреднение не даёт такой результат, однозначно.
Как следствие, в алгоритме калибровке акселя оффсеты по осям будут теперь практически идеальные, и далее имеем возможность более точного вычисления линейных ускорений…
Короче, незнаю кому как, а для меня это вполне результат… Не уверен, но наверно и с Дусом можно провернуть тоже, не говоря уж про магнитометр.
А например после, и это можно накатить:

SergDoc:

мы на основе стат. и фундаментальных данных расчитываем коэффициенты влияния датчиков на алгоритм для следующей интерации…

никто не запрещает…

SergejK
oleg70:

Никакое усреднение не даёт такой результат, однозначно.

А как насчет задержек в этом случае? Усреднить в покое тоже можно так, что шум пропадет, только задержка полезного сигнала будет неприемлемой.

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

oleg70
SergejK:

А как насчет задержек в этом случае?

Задержки и точность, смотрю, как и везде, взаимосвязаны и управляются установкой “дисперсии”,
но как ни крути - результат на порядок лучше чем при усреднении.
Раньше пробовал аж в три прохода: сначала из массива данных вырезал все максимумы и минимумы (пики), а потом усреднял оставшееся, и всеравно не то…
Чтоб точнее оценить, надо мне телеметрию передавать пошустрей, а она у меня всего герц этак 10… (по радиоканалу)

SitulaAqua
oleg70:

Задержки и точность, смотрю, как и везде, взаимосвязаны и управляются установкой “дисперсии”,
но как ни крути - результат на порядок лучше чем при усреднении.
Раньше пробовал аж в три прохода: сначала из массива данных вырезал все максимумы и минимумы (пики), а потом усреднял оставшееся, и всеравно не то…
Чтоб точнее оценить, надо мне телеметрию передавать пошустрей, а она у меня всего герц этак 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 для каждого тогда качество фильтрации будет немного лучше при такой же инертности.

Но когда в фильтре Калмана реализована модель процесса то тут все может быть по другому.

SergejK
SitulaAqua:

Но когда в фильтре Калмана реализована модель процесса то тут все может быть по другому.

А какую модель можно применить например в случае фильтрации данных с акселерометра? В каком случае в принципе имеет смысл использовать фильтр Калмана?

oleg70
SergDoc:

(ни чего не напоминает? - да блин это же обычный комплиментарник)

SitulaAqua:

и по сути данный фильтр превращается в апериодический фильтр или по другому комплементарный фильтр.

Мнения экспертов сошлись…, но я осмелюсь поспорить:
у комплементарного фильтра мы точно знаем - какое значение долна принять переменная через энное количество шагов, т.е. “целеуказание” уже известно и остается только к нему стремиться через коэфициенты… (актуально для “притягивания за уши” одного неточного датчика к более точному)
Здесь же (у калмана) наблюдается чуток другая природа, а именно: К-фильтра как бы “скользит” по зашумлённому сигналу в поисках “истины”, которая заранее не известна по определению…

SitulaAqua:

по сути работает без внутренней модели

боюсь что модель присутствует неявно, а именно заложена в характере самого шума сигнала (а шум шуму - рознь), соответственно то, что на акселе это сработало, само по себе удача, и не факт что будет эффективно на другом железе…

SitulaAqua
oleg70:

Здесь же (у калмана) наблюдается чуток другая природа, а именно: К-фильтра как бы “скользит” по зашумлённому сигналу в поисках “истины”, которая заранее не известна по определению…

В данном примере дисперсии 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 если больше то по формуле что выше.
Идея в том что

oleg70:

боюсь что модель присутствует неявно, а именно заложена в характере самого шума сигнала (а шум шуму - рознь), соответственно то, что на акселе это сработало, само по себе удача, и не факт что будет эффективно на другом железе…

Модель именно процесса здесь все же отсутсвует
X[k] = X[k-1] это постоянный сигнал
вот если ввести сюда некую формулу процесса
X[k] = X[k-1] + Vconst, то другое дело
Но это когда мы действительно знаем что процесс меняется именно так
А если нет. Например для акселерометра модели нет.
А вот для скорости рассчитываемой из показаний акселерометра есть, но уже нет измерителя скорости. 😁

SergDoc
SitulaAqua:

А вот для скорости рассчитываемой из показаний акселерометра есть, но уже нет измерителя скорости.

тут измерителями скорости должны выступать те же датчики воздушной скорости и/или GPS, в данном случае не стоит считать что-то одно - это система и довольно большая из 14 - 16 состояний/показаний и решать её нужно в целом, а не по отдельности…
сейчас в том же ардукоптере, применено довольно интересное решение - например компас может вообще выводиться из алгоритма если его показания сильно разнятся с показаниями ДУС, при этом если датчик возвращается в “норму” - он возвращается в алгоритм…

oleg70
SitulaAqua:

но уже нет измерителя скорости.

Измеритель поставим, не проблема… ))

SitulaAqua:

и P устремляется к заранее известному числу

А вот это не могу понять (пока)…:
“кому известному ?” самому фильтру ? - это ещё куда не шло, но тогда скорей - “рассчитанному”
Иначе говоря, если заранее знать “истинное значение” среди шума, тогда нафига вообще что то фильтровать…
(я именно о случае одного источника шума рассуждаю, а не о разных)

SergDoc:

в данном случае не стоит считать что-то одно - это система и довольно большая

налицо два разных подхода к решению задачи: один для “одиночного” сигнала и второй для смешивания разных…, тут то наверно и непонимание…

SergDoc
oleg70:

(я именно о случае одного источника шума рассуждаю, а не о разных)

шумов много и разных, можно отфильтровать собственный шум датчика, а дальше - вибрации вызванные моторами, пропами, какими-то резонансными составляющими рамы, самой платы контроллера и их гармоник - куча неизвестных причём меняющихся во времени без всякой закономерности, и то что работает на столе или в относительно спокойном состоянии сводя коэффициенты фильтра в одну точку, на практике из белого шума сделает однобокий цветной и не дай бог ещё и в резонанс с чем-то, простой пример (не относящийся к данному примеру) был у меня контроллер на 330-м лсм-е и что, пока взлетает или носится как угорелый - всё нормально, как только в режиме висения примерно на 50% газа - ну ни в какую, а как оказалось при оборотах 4500 - 5000 - жудкий резонанс самого акселя с вибрациями от вмг, так вот сменить вмг на более оборотистые и в ховере эта штука бы уже полетела но зато на малых оборотах были бы проблемы - вот ещё одно условие (неизвестное) как с ним бороться - только собиранием имперических данных и по ним выстраивать алгоритм именно к конкретному датчику! почему я упёрся в мпу - я его знаю я могу с ним “сработаться”…