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

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 плоховат, а так висит на месте, но вот иногда дури как даст на какой-нибудь из моторов - аж батарейка попискивать начинает - и дальше висит…
Ну, а так я впервые!!! полетал кругами 😃 ну никогда у меня не получалось - слетаю, туда-сюда, ну максимум мордой к себе прилечу, а тут врубил альтхолд - и пошел круги наяривать 😃 короче протёрлись и сохнем 😃

Drinker

Да не, рад за положительные эмоции. Как летает ардукоптер это все знают. В чем достижение ? Ну завтра я могу полетать на ардукоптере в виде ириса например. Он ничем не отличается по качеству полета от другого железа с тойже прошивкой. Ну и?

А понял, извини. Научился летать не только от себя. Альтхольд причем тут? Я думал дело в мастерстве от себя - к себе непутать лево - право

Кстати я не обновил в ирисе пиксхавк он и без мпу радует. Но щя водружаю на раму как у руала. В связи с чем вопрос к нутексоводам - как понять че используецца лсм или мпу?

SergDoc

посмотреть через усарт - вот толко не помню какой в pixhawke(восьмой!!) - лог по запуску натикса и стартового скрипта арды,
на SD вот чё пишет:

Starting APM sensors
No l3gd20
Trying PX4IO board
Failed to start rgbled driver
Starting ArduPilot /dev/ttyACM0 /dev/ttyS2 /dev/null
rc.APM finished

но это моё, понятно что нету ни одного ни второго ни третьего, и как писал usart 2 в нулл спустил…

Drinker:

В чем достижение ?

как бы не о достижениях речь 😃 просто настроение хорошее, снег пошел и у меня время свободное 😃

вот с gps что-то не то, надо разбираться… значит уже не зря летал 😃

Даа, количество спутников скачет какие-то выбросы два есть странные до 140 и 80😵 - а так пропадание спутников полностью раза 3-4 в минуту 😦
либо связь с самим модулем хреновая либо я ему мозги набекрень свернул, когда рогами с землю зафундулил, тогда мозгокоробка разлетелась, а gps зарылся в землю…
но блин в снегопад 7 спутников, может мне просто место полётов сменить?

SergDoc

Разобрался с АЦП и глюком GPS (я оказывается на один усарт с мавлинком зафигачил) - это по арде…
призывы о собственном ПО звучат всё чяще, по сей причине засел за изучение маткад, так что ссылки на доходчивое описание приветствуются 😃

SergDoc

Надо поискать книженцию: Е.Г. Харин. “Комплексная обработка информации навигационных систем летательных аппаратов”
к сожалению я её не видел, но пишут, что в ней можно найти всё что нужно…