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

oleg70
SitulaAqua:

кое в чем разобрался , а кое в чем нет

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

SergDoc

вот именно - 5 формул не решат проблемы, нужна куча имперических данных и мат. модель на их основе…

alexmos

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

SitulaAqua
oleg70:

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

Этот принцип решения задачи фильтрации был сформулирован русским ученым Стратановичем. Считается что фильтр Калмана частный случай фильтра Стратановича.
В моем понимании, суть достаточно проста: Есть некий процесс и его некий параметр, есть его модель и есть датчик. С помощью модели мы можем предсказать текущее значение параметра по предыдущим, и мы можем измерить текущее значение параметра с помощью датчика. А потом с помощью математического аппарата мы рассчитываем какой из этих двух параметров измеренный или рассчитанный нам нужно взять с большим коэффициентом, проще говоря какой из них мы считаем более точным. И далее просто комплиментарный фильтр типа X1*K + X2*(1-K) = X.
Вся сложность и весь вопрос как раз в математике и принципе расчета того какой из двух параметров(измеренный или рассчитанный) более точный.

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

oleg70
SitulaAqua:

Вся сложность и весь вопрос как раз в математике и принципе расчета

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

SergDoc
oleg70:

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

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

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 для каждого тогда качество фильтрации будет немного лучше при такой же инертности.

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