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

SergDoc

гы щяс одна плата назад в Беларусь приедет 😃

rual
SergDoc:

Я смотрю у вас почта исправляется

Раз на раз не приходится, бывает быстро )

SergDoc:

Ты давай собирай быстрее а то на платку только лодырь есть, а ПО как-то без самой ну никак…

Да побыстрее не получится, кварца у меня тоже нет, и разъёма под СДшку, и ещё по мелочи… Надо заказывать…

SergDoc:

Саш, забери посылку - посмотри сколько плат…

Седня уже никак, у меня праздники всё продолжаются))) Завтра постараюсь пораньше встать, сгоняю на пошту )

SergDoc
rual:

Завтра постараюсь пораньше встать, сгоняю на пошту )

Воскресенье вроде 😃

SergDoc

Даа, там ещё с матрицей ковариаций шаманить и шаманить 😃 и не страшно ж ведь…
по звуку Арма слышно что там px4 или pixhawk, что и не мудрено это же iris 😃

rual
SergDoc:

Воскресенье вроде

дык отделения должны работать

mahowik:

уже калман мутит

что то “калман” для меня уже ругательное слово. Интересно как он его в код АПМ пристроил?

oleg70
rual:

что то “калман” для меня уже ругательное слово

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

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

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