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

rual
oleg70:

не одной доходчивой (для таких как я) “научно-популярной” статьи на тему применения ФК не наблюдается…

типа вот habrahabr.ru/post/166693/

SergDoc

Чёт мне подсказывает, что там описан как бэ альфа-бета, ну только вместо показаний какого-то другого датчика подсунуто предположительное предсказание - не?

oleg70
rual:

типа вот

Это чисто математика,… а вот по поводу эффективности применения касательно БПЛА - ничего, дело в том, что каждый метод фильтрования (а равно и его эффективность) напрямую зависит от характера входных данных…
Т.е. - можно наворотить сложнейший мат. алгоритм, а эффективность его, в конкретном исполнении, будет меньше либо равна, чем у примитивных методов…
Кто делал такие оценки ?

Drinker
oleg70:

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

+1
если кто-то думает что “калман” волшебным образом превращает железки в идеально висяще-летающие девайсы, ох как заблуждается. Предыдущий оратор врде по рабоче-крестьянски оъяснил (или попытался), от себя добавлю, что да, в системе гира-аксель особых преимуществ нет. А вот когда гпс, баро и компас сюда, то при грамотном мат описании системы - то тут да. Но, пока только одного чела знаю, который на хоббийном уровне приблизился к этому.

Кстати на видео от товарища, который “калман” внедряет в ардукоптер, ирис болтается как г…о в проруби.

rual
Drinker:

то при грамотном мат описании системы - то тут да.

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

Drinker:

Но, пока только одного чела знаю, который на хоббийном уровне приблизился к этому.

Это ты про Снега? 😉

Drinker
rual:

Это ты про Снега?

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

rual:

пока только одного чела знаю

У него как раз открытые исходники, но! Так просто содрать не получится, нет в явном виде оформленной процедуры так любимой копипастерами. А разбираться мало кто захочет.

mahowik

вот млять, настросчил пост на страницу и закрыл не ту вкладку 😃
потому коротко:
Научный мир пользует калмана почти всегда в подобных задачах, т.к. оперируя им можно наиболее точно описать модель, а наша “злость” это всего лишь не понимание его 😃
примеры:
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/

SergDoc

Тсс, я догнал это так (можете меня пинать и т.д.) ничего практически и делать то ненадо… суть - есть у нас комплиментарник(алфа-бета да пофиг как), он прекрасно работает, но тут беда заключается в доверии к датчикам (веса то у них постоянные), а как показывает практика и уважаемый 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]);
	}
}
rual
SergDoc:

даже этого куска кодятника не поняли - никакой это не одноосевой Калман - а блин именно расчёт веса датчика

Да нее ) это именно набор одноосевых фильтров, итого 6 (3 ДУС и 3 акселя), насколько они калманы не скажу, сужу только по названию процедур. Такие фильтры фильтруют 😃 каждую ось датчика в отдельности, исправляя коэффициенты на основе предыстории этой же оси.
Правильный фильтр должОн сводить ВСЕ датчики в себе через мат.модель, и двигать коэффициенты исходя из критериев поведения ВСЕЙ модели. Т.е. учитывая ДУС, аксель, компас, барометр, ГПС, связанные меж собой мат.зависимостями. Какта так 😃

SergDoc

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

Drinker
rual:

Правильный фильтр должОн сводить ВСЕ датчики в себе через мат.модель, и двигать коэффициенты исходя из критериев поведения ВСЕЙ модели. Т.е. учитывая ДУС, аксель, компас, барометр, ГПС, связанные меж собой мат.зависимостями. Какта так

+100500

rual
SergDoc:

Ну смотри

Это ты верно всё написал, очень обще конечно, но верно…

SergDoc:

так же если какой-то датчик сбоит - он автоматом уходит из уравнения

эт тоже верно

SergDoc

ну я это, по крестьянски 😃 - как понял так и сказал…
пойду - где-то были у меня конспекты по теории вероятности, покопаюсь - может чего вспомню 😃

oleg70
Drinker:

+100500

И еще добавлю “отсебятины”:
КФ не работает с самими данными датчиков, а как бы уровнем выше…, т.е. с уже рассчитанными положениями аппарата, а уж их и правит (предсказывает) на основе мат.модели.

Drinker

Научный диспут открылся коллеги. Пожелаем аффтору кроме железки еще и матобеспечение забубенить с использованием KF и AI, в первом посте AI был заявлен.

SergDoc

Уважаемые, Sir Alex и tusik, решайте пожалуйста как-нибудь побыстрее да -да, нет - нет, с вами или без вас мне бы хотелось побыстрее собрать девайс дабы двигаться дальше…😦
Тут свернул немного в сторону и невзначай появился (пока только в орле) модуль F4BY-Link на si4432 и F103…

Sir_Alex
SergDoc:

Уважаемые, Sir Alex и tusik, решайте пожалуйста как-нибудь побыстрее да -да, нет - нет, с вами или без вас мне бы хотелось побыстрее собрать девайс дабы двигаться дальше…

Я уже заплатил за детальки.

SergDoc:

Тут свернул немного в сторону и невзначай появился (пока только в орле) модуль F4BY-Link на si4432 и F103…

Что за линк?

SergDoc
Sir_Alex:

Я уже заплатил за детальки.

А то меня уже это, подмывает старую плату разобрать 😃

SergDoc

Товарищи на гудлаке с ума сошли 😃
PX4
Pixhawk (без MPU заметьте)
Или это мы чего-то не того делаем? - короче открытой схемы не будет, а то смотрю нажываются всякие…

Drinker
SergDoc:

Товарищи на гудлаке с ума сошли PX4 Pixhawk (без MPU заметьте)

Моя в шоке.

Таааак…Кому пиксхавк на 200 баксов дешевле?

SergDoc

Щас Drinker опять будет спрашивать: где кино:)
Ну нету, пришли с трёхой с обеда все мокрые но довольные - особенно я, всё просто супер, но иногда непонятные дёрганья в лоитере 😦
Аксель в норме - не знаю из чего у кого коптеры собраны, у меня жестко посаженная плата, аксель выдаёт вибраций в пределах ± 2-х ардушных попугаев (это в полёте), высоту держит отлично. Настораживает что пищит постоянно о позиции похоже что GPS плоховат, а так висит на месте, но вот иногда дури как даст на какой-нибудь из моторов - аж батарейка попискивать начинает - и дальше висит…
Ну, а так я впервые!!! полетал кругами 😃 ну никогда у меня не получалось - слетаю, туда-сюда, ну максимум мордой к себе прилечу, а тут врубил альтхолд - и пошел круги наяривать 😃 короче протёрлись и сохнем 😃