Создание собственной системы стабилизации
что то “калман” для меня уже ругательное слово
Трудно делать оценки по всяким видео (я разницы не увидел), … не одной доходчивой (для таких как я) “научно-популярной” статьи на тему применения ФК не наблюдается…
Создается впечатление - лишь бы протрубить…, нам остается только верить.
не одной доходчивой (для таких как я) “научно-популярной” статьи на тему применения ФК не наблюдается…
типа вот habrahabr.ru/post/166693/
Чёт мне подсказывает, что там описан как бэ альфа-бета, ну только вместо показаний какого-то другого датчика подсунуто предположительное предсказание - не?
типа вот
Это чисто математика,… а вот по поводу эффективности применения касательно БПЛА - ничего, дело в том, что каждый метод фильтрования (а равно и его эффективность) напрямую зависит от характера входных данных…
Т.е. - можно наворотить сложнейший мат. алгоритм, а эффективность его, в конкретном исполнении, будет меньше либо равна, чем у примитивных методов…
Кто делал такие оценки ?
Т.е. - можно наворотить сложнейший мат. алгоритм, а эффективность его, в конкретном исполнении, будет меньше либо равна, чем у примитивных методов…
+1
если кто-то думает что “калман” волшебным образом превращает железки в идеально висяще-летающие девайсы, ох как заблуждается. Предыдущий оратор врде по рабоче-крестьянски оъяснил (или попытался), от себя добавлю, что да, в системе гира-аксель особых преимуществ нет. А вот когда гпс, баро и компас сюда, то при грамотном мат описании системы - то тут да. Но, пока только одного чела знаю, который на хоббийном уровне приблизился к этому.
Кстати на видео от товарища, который “калман” внедряет в ардукоптер, ирис болтается как г…о в проруби.
то при грамотном мат описании системы - то тут да.
вот оно, нужно точно описать критерии качества в мат.виде, тадыт фильтер будет подкручивать коэффициенты для макс. приближения к идеалу.
Но, пока только одного чела знаю, который на хоббийном уровне приблизился к этому.
Это ты про Снега? 😉
Это ты про Снега?
Гы-гы. Немного полемизируя с ним, понятно, что алгоритм позаимствован (мягко сказано) как и другим небезызвестным товарисчем (тот даже ссылку дал), но блин все как всегда сами все с нуля придумали. И веть уверены что там лежал именно волшебный екф. Ну да ладно с ними.
пока только одного чела знаю
У него как раз открытые исходники, но! Так просто содрать не получится, нет в явном виде оформленной процедуры так любимой копипастерами. А разбираться мало кто захочет.
вот млять, настросчил пост на страницу и закрыл не ту вкладку 😃
потому коротко:
Научный мир пользует калмана почти всегда в подобных задачах, т.к. оперируя им можно наиболее точно описать модель, а наша “злость” это всего лишь не понимание его 😃
примеры:
www.mdpi.com/1424-8220/13/9/11280
www.mdpi.com/1424-8220/13/8/10599
www.mdpi.com/1424-8220/10/10/9424
www.mdpi.com/1424-8220/12/9/11638
www.mdpi.com/1424-8220/12/12/17372
www.mdpi.com/1424-8220/13/8/9549
Удобоваримые библиотеки есть, типа libeknav, но просто “всунуть” все равно не выйдет 😃
кстати, как потом нашел, paparazzi эту библу как раз и подхватили github.com/paparazzi/paparazzi/tree/…/libeknav
Вот еще ссылочки на русском:
коммент от Снега 😃 rcopen.com/forum/f90/topic243418/1306
robochamp.ru/…/121-kalmanfilteringfordummies
habrahabr.ru/post/166693/
habrahabr.ru/post/140274/
habrahabr.ru/post/120133/
Тсс, я догнал это так (можете меня пинать и т.д.) ничего практически и делать то ненадо… суть - есть у нас комплиментарник(алфа-бета да пофиг как), он прекрасно работает, но тут беда заключается в доверии к датчикам (веса то у них постоянные), а как показывает практика и уважаемый Mahowik(кто-то весом барометра балуется по сей причине взлёт в альтхолде намного лучша чем в арде) - это не всегда правильно, так что надо то, а вот именно то о чём пишут, а из кучи каких-то формул и словей страшных никуя непонять, надо заставить фильтр подбирать веса датчиков самостоятельно (вот по всей видимости и вся затея Калмана), но тут возникает вопрос как? А ответ давно лежал на поверхности и в открытом виде и больше я скажу - я на нём ещё и летал 😃 а прикол заключается в том что мы (я точно) даже этого куска кодятника не поняли - никакой это не одноосевой Калман - а блин именно расчёт веса датчика!!! ну вот я так понял - можете ругать 😃
может я и не прав, но приглядитесь в кодятник ещё раз:
/*
* kalman.c
*
* Created on: 25.11.2012
* Author: rob
*/
#include "stdint.h"
#include "kalman_simple.h"
typedef struct
{
float q; // process noise covariance
float r; // measurement noise covariance
float x; // value
float p; // estimation error covariance
} kalman_state;
// accelerometer
kalman_state kax;
kalman_state kay;
kalman_state kaz;
// gyro
kalman_state kgx;
kalman_state kgy;
kalman_state kgz;
void kalman_init(kalman_state* state, float q, float r, float p, float intial_value)
{
state->q = q;
state->r = r;
state->p = p;
state->x = intial_value;
}
void kalman_update(kalman_state* state, float measurement)
{
// prediction update
// omit x = x
float k; // kalman gain
state->p = state->p + state->q;
// measurement update
k = state->p / (state->p + state->r);
state->x = state->x + k * (measurement - state->x);
state->p = (1 - k) * state->p;
}
void initKalmanAccel(float ax, float ay, float az)
{
// small jakub frame
#define Q 0.0625 // process noise covariance
#define R 1.0 // measurement noise covariance
#define P 0.22 // estimation error covariance
kalman_init(&kax, Q, R, P, ax);
kalman_init(&kay, Q, R, P, ay);
kalman_init(&kaz, Q, R, P, az);
#undef Q
#undef R
#undef P
}
void initKalmanGyro(float gx, float gy, float gz)
{
// small jakub frame
#define Q 1.0 // process noise covariance
#define R 0.0625 // measurement noise covariance
#define P 0.22 // estimation error covariance
kalman_init(&kgx, Q, R, P, gx);
kalman_init(&kgy, Q, R, P, gy);
kalman_init(&kgz, Q, R, P, gz);
#undef Q
#undef R
#undef P
}
inline int kalman_filter_step(kalman_state* state, int16_t val)
{
float measurement = (float) val;
kalman_update(state, measurement);
return (state->x + 0.5f);
}
void accKalmanFilterStep(int16_t accels[3])
{
static int _init = 0;
if (!_init)
{
_init = 1;
initKalmanAccel(accels[0], accels[1], accels[2]);
}
else
{
accels[0] = kalman_filter_step(&kax, accels[0]);
accels[1] = kalman_filter_step(&kay, accels[1]);
accels[2] = kalman_filter_step(&kaz, accels[2]);
}
}
void gyroKalmanFilterStep(int16_t gyros[3])
{
static int _init = 0;
if (!_init)
{
_init = 1;
initKalmanGyro(gyros[0], gyros[1], gyros[2]);
}
else
{
gyros[0] = kalman_filter_step(&kgx, gyros[0]);
gyros[1] = kalman_filter_step(&kgy, gyros[1]);
gyros[2] = kalman_filter_step(&kgz, gyros[2]);
}
}
даже этого куска кодятника не поняли - никакой это не одноосевой Калман - а блин именно расчёт веса датчика
Да нее ) это именно набор одноосевых фильтров, итого 6 (3 ДУС и 3 акселя), насколько они калманы не скажу, сужу только по названию процедур. Такие фильтры фильтруют 😃 каждую ось датчика в отдельности, исправляя коэффициенты на основе предыстории этой же оси.
Правильный фильтр должОн сводить ВСЕ датчики в себе через мат.модель, и двигать коэффициенты исходя из критериев поведения ВСЕЙ модели. Т.е. учитывая ДУС, аксель, компас, барометр, ГПС, связанные меж собой мат.зависимостями. Какта так 😃
Ну смотри - берём угол например, смотрим на датчики в статистике - можем предположить, что показания датчиков на следующем шаге будут в какой-то области значений, опа аксель например не попал в свою область - перерасчитываем вес акселя и гиры - т.е. акселя меньше предыдущего - гиры больше (доверия больше гире) и уже в в иму работаем с этими значениями - на следующей интерации опять проверяем: попал - увеличиваем доверие. И так со всеми датчиками, ибо не получится просто предсказать угол - ну и что что мы его предскажем, а он в область предсказания не попал - кто нам соврал в таком случае - тут бабушка нашепчет? или пальцем покажет кто: аксель, гира или компас?
У Саши посмотри на альтолде по сути тот-же адаптивный фильтр, только адаптация идёт не по каким-то эфемеидам для датчиков а по высоте - чем меньше высота, тем меньше доверие баро (надеюсь ничего сверхсекретного не сказал 😃 )
так же если какой-то датчик сбоит - он автоматом уходит из уравнения 😃 - хреново конечно - но боком(без компаса) или на гирах(без акселя) долететь можно…
Правильный фильтр должОн сводить ВСЕ датчики в себе через мат.модель, и двигать коэффициенты исходя из критериев поведения ВСЕЙ модели. Т.е. учитывая ДУС, аксель, компас, барометр, ГПС, связанные меж собой мат.зависимостями. Какта так
+100500
Ну смотри
Это ты верно всё написал, очень обще конечно, но верно…
так же если какой-то датчик сбоит - он автоматом уходит из уравнения
эт тоже верно
ну я это, по крестьянски 😃 - как понял так и сказал…
пойду - где-то были у меня конспекты по теории вероятности, покопаюсь - может чего вспомню 😃
+100500
И еще добавлю “отсебятины”:
КФ не работает с самими данными датчиков, а как бы уровнем выше…, т.е. с уже рассчитанными положениями аппарата, а уж их и правит (предсказывает) на основе мат.модели.
Научный диспут открылся коллеги. Пожелаем аффтору кроме железки еще и матобеспечение забубенить с использованием KF и AI, в первом посте AI был заявлен.
Уважаемые, Sir Alex и tusik, решайте пожалуйста как-нибудь побыстрее да -да, нет - нет, с вами или без вас мне бы хотелось побыстрее собрать девайс дабы двигаться дальше…😦
Тут свернул немного в сторону и невзначай появился (пока только в орле) модуль F4BY-Link на si4432 и F103…
Уважаемые, Sir Alex и tusik, решайте пожалуйста как-нибудь побыстрее да -да, нет - нет, с вами или без вас мне бы хотелось побыстрее собрать девайс дабы двигаться дальше…
Я уже заплатил за детальки.
Тут свернул немного в сторону и невзначай появился (пока только в орле) модуль F4BY-Link на si4432 и F103…
Что за линк?
Я уже заплатил за детальки.
А то меня уже это, подмывает старую плату разобрать 😃
Товарищи на гудлаке с ума сошли PX4 Pixhawk (без MPU заметьте)
Моя в шоке.
Таааак…Кому пиксхавк на 200 баксов дешевле?