Проект Мегапират на самик!

alex-ber
Syberian:

нифига не понял…

Не парься! Это я пытаюсь быть типо полезным…
Все кто с Вортексом на Мегапирате летал - проблему с переключением режимов АП уже решили (надеюсь…), поэтому эта идея не актуальна…
Тормознул…

LeonVS

Блокировку движка сразу в код заложи, а то запарился я контакты от движка каждый раз отстегивать…

LeonVS

Пока Олег строит АП с нуля, продолжаю мучать 26 прошивку 😃 Кто нибудь летал в режиме FBW-B??? У меня в этом режиме РВ работает в инверте 😃 Ручку на себя, самуль вниз движка в минимум, ручку от себя самуль вверх газ добавляет 😃 Пытаюсь понять где крутнуть, чтот мутно как то усе…

Причем в режиме FBW-А есть следующая строчка:
nav_pitch = g.channel_pitch.norm_input() * (-1) * g.pitch_limit_min;
В режиме FBW-B она вот такая:
altitude_error = g.channel_pitch.norm_input() * g.pitch_limit_min;

Полагаю в этом и есть проблема? Вставка (-1) = инверт которого почему то не хватает в FBW-B…

LeonVS

Кто подскажет где кусок кода отвечающий за выполнение условия прохождения точки? Хочу туда добавить обязательное условие “высоты полета”, сейчас АП пофиг, хоть там 500м стоит, нужные координаты пролетел, и считает что точка пройдена…

static bool verify_nav_wp()
{
hold_course = -1;
update_crosstrack();
if ((wp_distance > 0) && (wp_distance <= g.waypoint_radius)) {
gcs_send_text_fmt(PSTR(“Reached Waypoint #%i”),nav_command_index);
return true;
}
// add in a more complex case
// Doug to do
if(loiter_sum > 300){
gcs_send_text_P(SEVERITY_MEDIUM,PSTR(“Missed WP”));
return true;
}
return false;
}

Оно?

AlexSneg

Сделал порт DCM алгоритма от Мегапирата в свой проект на STM32. Поисследовал результаты в графиках и цифрах. Когда плавно изменяю положения платформы, то вообщем-то вопросов нет. Однако если взять плату потрясти поделать восьмерок в воздухе с переворотами и перегрузками, а потом резко положить в горизонт, то возникает однозначно воспроизводимая жопская картина. Горизонт сбит градусов на 30 и медленно ползет к нулю, затем уходит в другую сторону градусов на 20 затем медленно идет назад но до нуля никогда не доходит. чтобы заставить встать горизонт на место нужно слегка покачать плату, тогда горизонт медленно приходит в ноль. После прохождения дебаггером и отслеживания значений переменных я вижу почему такое происходит.

Олег (или кто-то, кто близко к исходникам), скажи, ты код компиляешь для реальных полетов именно с такими коэффициентами коррекции, как в исходниках установлены ???

#define Kp_ROLLPITCH 0.05967
#define Ki_ROLLPITCH 0.00001278

Оно же с такими значениями не дает алгоритму по акселю нормально откорректироваться. А может оно для вертолетов такое выставлено? Для коптеров, когда необходимо висеть и плавно двигаться, оно как раз в тему.
Я вот поигрался всяко разно и пришел к варианту:

#define Kp_ROLLPITCH 0.85967
#define Ki_ROLLPITCH 0.01001278

Оно по крайней мере дает алгортму в течение первой секунды горизонт поставить на место с погрешностью до 15 градусов по окончании любых расколбасов платформы. Да возникает эффект Roll раскачки, но он СУЩЕСТВЕННО меньше, чем при дефолтных коэффициентах и проходит в течение второй секунды, а дальше четко в ноль встает.

Есть еще вариант интегральный коэффициент вообще отключить.

Собственно, если сможешь проясни ситуацию, а я пока Кальмана реализую для живого сравнения с DCM.

alex-ber
AlexSneg:

Однако если взять плату потрясти поделать восьмерок в воздухе с переворотами и перегрузками, а потом резко положить в горизонт, то возникает однозначно воспроизводимая жопская картина. Горизонт сбит градусов на 30 и медленно ползет к нулю, затем уходит в другую сторону градусов на 20 затем медленно идет назад но до нуля никогда не доходит. чтобы заставить встать горизонт на место нужно слегка покачать плату, тогда горизонт медленно приходит в ноль

Вот - вот!
Такой эффект я и наблюдал два раза на полетах: если летать блинчиком и без порывов ветра - све работало отлично… Но стоило “покалбасится” в борьбе за модель - горизонт уплывал безбожно !
Я тогда еще писал об этом и версия была в том, что превыщены перегрузки для акселя… оказывается что и код мог быть виной!

LeonVS

В FPV надо летать медленно и печально рассматривая сверху интересности, а не крутить 3Д 😃 Хотя на 26 прошивке при ветре почти равной скорости самолета, у меня не чего ни куда не уплывало, самуль вполне не плохо держался 😃

Syberian
AlexSneg:

но же с такими значениями не дает алгоритму по акселю нормально откорректироваться. А может оно для вертолетов такое выставлено?

Медленное выравнивание для того и задумано, чтобы не давать акселю сильно косячить на центробежных перегрузках. Помимо этого, имеется треугольная функция - корректировка “веса” акселерометра, если длина его вектора отличается от 1G.
“дикая колбасня” обязательно собъет горизонт в том случае, если он несколько раз проскочит через точки gimbal lock - сингулярность (или полюс), где один из компонентов матрицы лезет в бесконечность.
А вот уходить в другую сторону после корректировки он не должен. Возможно, интегральный в твоей реализации надо действительно отключить.

Как показывают полеты на “реальном” самике, оптимальной является конвергенция от 5 до 7 секунд с углом ошибки 90 град по любой из осей. При этом динамический вес акселя линейно сводится к нулю при изменении длины вектора на 35-40% в любую сторону.

А еще надо аксель на 16G переводить, т.к. 3G в оригинале - даже муху не отгонишь.
И еще, раз у тебя STM и тактов валом, выставь скорость обновления гиры 1 кГц.

Покажешь потом код IMU калмана? 😉

AlexSneg
Syberian:

И еще, раз у тебя STM и тактов валом, выставь скорость обновления гиры 1 кГц.

сейчас 400Hz частота итераций. Выше смысла нет, я пробовал на 800Hz ставить. Улучшений не много получил. 400 это примерно оптимально.

Syberian:

“дикая колбасня” обязательно собъет горизонт в том случае, если он несколько раз проскочит через точки gimbal lock - сингулярность (или полюс), где один из компонентов матрицы лезет в бесконечность.

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

Syberian:

Возможно, интегральный в твоей реализации надо действительно отключить.

Вот-вот. Я так понимаю 400 Гц это достаточно быстро. Поэтому такие задержки сходимости приводят как раз к отрицательному эффекту. Совсем выключать интегральную составляющую, тоже как-то не очень, там тогда другие интересные краевые эффекты наблюдаю. Ну ладно, я к этому еще вернусь. Чуть позже, когда можно будет в риалтайме сравнить DCM и EKF.

Syberian:

А еще надо аксель на 16G переводить, т.к. 3G в оригинале - даже муху не отгонишь.

Сейчас я пока на 4G поставил, а максимум у меня 8G. Ну для экстрима на столе и 4G за глаза…

Syberian:

Покажешь потом код IMU калмана?

В личной переписке, когда реально отлажу и испытаю на стенде - да, покажу, но не для того чтобы выставить на всеобщее обозрение. Я слишком много времени на разбор физики происходящего потратил и на чтение буржуйских диссертаций, чтобы так просто слить наработанное. Я прикидывал можно ли такое всандалить под Мегу твою, но скорее всего - саляви 😦. Там очень много float перемножений. Для меня это решается подключением аппаратного FPU ядра и компилятор дальше сам строит правильный код, для тебя - даже не представляю, если только умножать все на 1000 и далее все int32_t.

alex-ber:

оказывается что и код мог быть виной!

Это не код виной. Это ограничения алгоритма. Он в принципе для спокойных полетов вполне себе годится.
Я вот еще вспомнил. Если очень быстро платформу верх-вниз швырять, то при смене направления вектора тяжести, оно переворачивает все вверх тормашками в тот момент, когда модуль вектора становится точно в окрестности 1G, причем поскольку коэффициенты я другие поставил, то я этого легко добиваюсь и мне не надо для этого прилагать много усилий. И дело тут не в перегрузке акселя, а совсем наоборот. Длинное время конвергенции в принципе и призвано сгладить такую фигню.

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

LeonVS

Гы, походу поползновения в кодах ардупилота уже никому не интересны 😉))))))

ukkr
LeonVS:

Гы, походу поползновения в кодах ардупилота уже никому не интересны ))))))

Лёнь, а откуда ж усё “грабится”. Видишь, человек даже на STM32 перенёс ДЦМку из пилота.
Ну а по теме – сорри, пока времени нету – на работе завалец случился, надо разобрать. 😦

Syberian

Вторая превьюшка. Составлен крайне быстрый бинарный пакетный протокол базовой станции и нарисована часть ее самой.
Прошу не ржать над попыткой сделать авиагоризонт 😃 Тем более, вращение текстур еще ниасилил.
Сама плата понимает команду “level”, в ответ шлет attitude и тайминг основного цикла.
Кому интересно, шить тем же бат-ником с avrdude.

По поводу возможностей протокола скажу, что те же данныe IMU можно отправлять со скоростью 50Hz через АРС на скорости 9600 (сейчас 5Гц), и при этом останется еще столько же полосы на полудуплекс обратно, т.е. джойстиком управлять уже не проблема. Если разбавлять данными GPS и навигации, то 25 Гц. Все равно практически реалтайм.
За основу взят протокол обмена с Megapirate OSD, переделанный на переменную длину. Сами команды выложу попозже.

dl.dropbox.com/u/63786348/mpx_preview2.rar

LeonVS
ukkr:

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

Бывает 😃
Да я вроде уже сам разобрался, код внедрил, вывел в планер вместо скорости “ошибку высоты” осталось только испытать 😃

Олег, в архив выкладывай сразу и библиотеки, при запуске пишет отсутствует BORLNDMM.DLL

LeonVS

Далее хочет еще cc3250mt.dll, ну и на последок грит что нет ему счастья без файла AH_bottom.bmp 😃

LeonVS

Авиагоризонт - круть 😉
Олег, выложи еще чем ты базовую станцию компилишь, влом мне перенастраивать блютус модуль, а он на скорости 115кбит 😃 Поменял бы циферу в коде чтоб тебя не мучать 😃

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

LeonVS

Пунятна 😃 ты вроде говорил про 9600 😃?
Траблы продолжаются, при попытке залить код в мегу… нужна библиотека libusb0.dll

Олег, бяда бяда страшная!!! 😃
Нашел твою первую прошивку чтоб извлечь от туда батник, ну и запустил сразу его для проверки, усе прошилось проверилось и тд тп, НО! Новым хексомо оно больше не шьется, да и старым в общем то то же…

C:\Users\Leon\Desktop\MegaPiratePlane2.26_new\MegaPirateX>avrdude -Cavrdude.conf
-patmega2560 -cstk500v1 -P\\.\COM6 -b57600 -D -Uflash:w:MegaPirateX.hex:i
avrdude: stk500_getsync(): not in sync: resp=0x00

Чито делать однако?

За то в терминале весело бегут цифери 😃

Не хочет он со мной больше разговаривать… Решил обнулить, залил обратно 26 прошивку, но как не бился залить пиратХ так и не смог…

Заработало 😃 Видимо подвисла библиотека… после перезагрузки усе залилось 😃
А что клевый такой горизонт вышел 😃 Забавно смотреть в терминале что шлет платко, клевая лесенка выходит 😃

LeonVS

Олег а откуда беруться данные? С акселей или с гироскопов? Смотрю и ось YAW уже есть, компас или гирик?

ukkr

Я тут тоже маленько выложу линку на шоу-версию альтернативной ГУЙни настройки и управления различными(ха-ха) АП. Смотреть лучше в полном экране.

Пока только общий концепт и несколько доступных приборов-индикаторов. Приборы накиданы как попало, только для того, чтоб показать их возможности. Запущен сценарий-симулятор. В реальности планирую подсистему, которая позволит в визуальном режиме пользователю связывать различные данные от Автопилота с нужными для пользователя приборами-индикаторами.
Выкладывать смысла нет никакого, ибо доступна только реализация тестового протокола, да и нет ещё реализованной вышеупомянутой подсистемы для связи inbound данных с индикаторами.

AlexSneg

Вот, сделал логи DCM в сравнении с EKF
В логах сначала строка DCM, затем то же самое рассчитанное через EKF
r - roll, p - pitch, y - yaw , w - weight , h - health , t - время на расчет алгоритма в мкс
В самих логах по ходу дела мои комментарии, чтобы понятно было где, что происходило. Показания в градусах

ссылка на полный файл

$DCM: 00:16:15, r=-134.700 p=20.863 y=306.609 w=0.000 h=0.000 t=17
$EKF: 00:16:15, r=-1.140 p=-2.384 y=61.729 t=44
$DCM: 00:16:15, r=-139.583 p=18.483 y=305.001 w=0.835 h=0.040 t=19
$EKF: 00:16:15, r=-1.327 p=-1.529 y=61.920 t=44
$DCM: 00:16:15, r=-145.638 p=6.258 y=301.301 w=0.000 h=0.000 t=17
$EKF: 00:16:15, r=-1.627 p=8.681 y=68.464 t=43
$DCM: 00:16:15, r=-143.430 p=7.565 y=305.522 w=0.000 h=0.000 t=17
$EKF: 00:16:15, r=3.074 p=4.050 y=74.427 t=44
$DCM: 00:16:16, r=-148.464 p=11.549 y=306.300 w=0.000 h=0.000 t=17
$EKF: 00:16:16, r=5.921 p=-1.096 y=73.555 t=44
$DCM: 00:16:16, r=-148.566 p=18.351 y=301.250 w=0.385 h=0.000 t=18
$EKF: 00:16:16, r=3.962 p=-4.760 y=65.183 t=44
$DCM: 00:16:16, r=-151.547 p=17.924 y=295.212 w=0.843 h=0.053 t=19
$EKF: 00:16:16, r=1.946 p=-1.061 y=60.752 t=125
$DCM: 00:16:16, r=-145.644 p=12.759 y=290.826 w=0.000 h=0.435 t=18
$EKF: 00:16:16, r=-0.249 p=11.789 y=59.733 t=43
===== ПОЛОЖИЛ ПЛАТУ резко на стол, до этого момента был жесткий расколбас во все стороны сдвигом
====== в разные стороны и вврх-вниз ===================================
$DCM: 00:16:17, r=-128.518 p=24.700 y=294.548 w=0.959 h=1.000 t=18 <- считает, что плата вверх тормашками
$EKF: 00:16:17, r=0.540 p=9.455 y=54.864 t=44 <-- сразу в ноль ушел
$DCM: 00:16:17, r=-90.734 p=32.332 y=313.202 w=1.000 h=1.000 t=18 <-- пытается скомпенсировать угол
$EKF: 00:16:17, r=0.652 p=8.696 y=54.429 t=43
$DCM: 00:16:17, r=-37.360 p=23.213 y=339.549 w=0.967 h=1.000 t=18 <-- все равно еще большая ошибка
$EKF: 00:16:17, r=0.762 p=8.066 y=54.344 t=43
$DCM: 00:16:17, r=7.349 p=-1.158 y=348.584 w=0.887 h=1.000 t=18 <-- решило, что все таки не вверх ногами, но ошибка 7 градусов
$EKF: 00:16:17, r=0.891 p=7.441 y=54.185 t=44
$DCM: 00:16:18, r=43.012 p=-20.713 y=341.069 w=0.977 h=1.000 t=19 <-- здесь начинается раскачка
$EKF: 00:16:18, r=0.953 p=6.931 y=54.200 t=43
$DCM: 00:16:18, r=68.394 p=-28.330 y=329.851 w=0.989 h=1.000 t=19 <-- амплитуда нарастает
$EKF: 00:16:18, r=1.019 p=6.588 y=54.192 t=124
$DCM: 00:16:18, r=79.108 p=-29.538 y=323.956 w=0.957 h=1.000 t=18 <-- амплитуда нарастает, встали почти под 90 градусов
$EKF: 00:16:18, r=1.049 p=6.207 y=54.209 t=43
$DCM: 00:16:18, r=73.424 p=-27.856 y=325.846 w=0.943 h=1.000 t=18
$EKF: 00:16:18, r=1.128 p=5.873 y=54.221 t=43
$DCM: 00:16:19, r=53.870 p=-22.498 y=333.275 w=0.887 h=1.000 t=18 <-- в обратную сторону
$EKF: 00:16:19, r=1.151 p=5.487 y=54.235 t=44
$DCM: 00:16:19, r=27.598 p=-11.291 y=340.025 w=0.969 h=1.000 t=18
$EKF: 00:16:19, r=1.176 p=5.208 y=54.262 t=44
$DCM: 00:16:19, r=1.568 p=2.320 y=341.074 w=0.965 h=1.000 t=18 <-- дошли до нуля, вроде бы должны остановиться
$EKF: 00:16:19, r=1.242 p=4.871 y=54.258 t=44
$DCM: 00:16:19, r=-20.269 p=12.997 y=337.067 w=0.965 h=1.000 t=18 <-- но нет, пошла амплитуда в обратную сторону
$EKF: 00:16:19, r=1.251 p=4.645 y=54.282 t=44
$DCM: 00:16:20, r=-34.177 p=18.369 y=332.271 w=0.988 h=1.000 t=19
$EKF: 00:16:20, r=1.242 p=4.446 y=54.309 t=125
$DCM: 00:16:20, r=-38.493 p=19.620 y=329.852 w=0.969 h=1.000 t=19 <-- -40 градусов почти
$EKF: 00:16:20, r=1.183 p=4.266 y=54.328 t=44
$DCM: 00:16:20, r=-32.950 p=17.780 y=330.586 w=0.946 h=1.000 t=18 <-- опять к нулю пошло, а плата просто все это время лежит на столе
$EKF: 00:16:20, r=1.227 p=4.121 y=54.354 t=45 <-- EKF железобетонно держит ноль
$DCM: 00:16:20, r=-20.834 p=13.197 y=332.788 w=0.984 h=1.000 t=18
$EKF: 00:16:20, r=1.230 p=3.962 y=54.385 t=44
$DCM: 00:16:21, r=-6.197 p=6.993 y=334.363 w=0.968 h=1.000 t=18
$EKF: 00:16:21, r=1.247 p=3.835 y=54.384 t=43
$DCM: 00:16:21, r=7.485 p=0.778 y=334.272 w=0.984 h=1.000 t=18 <-- дошли до нуля, и опять в крен в противоположную сторону
$EKF: 00:16:21, r=1.334 p=3.739 y=54.410 t=43
$DCM: 00:16:21, r=17.601 p=-3.659 y=333.026 w=0.993 h=1.000 t=18
$EKF: 00:16:21, r=1.441 p=3.628 y=54.424 t=44
$DCM: 00:16:21, r=22.183 p=-5.648 y=331.672 w=0.983 h=1.000 t=18
$EKF: 00:16:21, r=1.401 p=3.541 y=54.437 t=125
$DCM: 00:16:22, r=21.662 p=-5.511 y=330.726 w=0.969 h=1.000 t=18
$EKF: 00:16:22, r=1.506 p=3.408 y=54.471 t=124
$DCM: 00:16:22, r=16.369 p=-3.560 y=330.171 w=0.949 h=1.000 t=18
$EKF: 00:16:22, r=1.406 p=3.359 y=54.497 t=44
$DCM: 00:16:22, r=8.684 p=-0.244 y=329.466 w=0.957 h=1.000 t=18
$EKF: 00:16:22, r=1.398 p=3.367 y=54.526 t=45
$DCM: 00:16:22, r=0.768 p=2.997 y=328.340 w=0.984 h=1.000 t=18
$EKF: 00:16:22, r=1.391 p=3.310 y=54.547 t=44
$DCM: 00:16:23, r=-5.811 p=5.522 y=326.910 w=0.973 h=1.000 t=18
$EKF: 00:16:23, r=1.338 p=3.261 y=54.568 t=43
$DCM: 00:16:23, r=-9.534 p=6.811 y=325.564 w=0.950 h=1.000 t=18
$EKF: 00:16:23, r=1.361 p=3.187 y=54.600 t=44
$DCM: 00:16:23, r=-10.205 p=6.906 y=324.541 w=0.985 h=1.000 t=18 <-- крен в отрицательную сторону, но амплитуда раскачки постепенно затухает
$EKF: 00:16:23, r=1.369 p=3.121 y=54.623 t=126
$DCM: 00:16:23, r=-8.228 p=6.139 y=323.811 w=0.973 h=1.000 t=18
$EKF: 00:16:23, r=1.294 p=3.077 y=54.647 t=126
$DCM: 00:16:24, r=-4.372 p=5.078 y=323.234 w=0.984 h=1.000 t=18
$EKF: 00:16:24, r=1.326 p=3.122 y=54.676 t=44
$DCM: 00:16:24, r=0.125 p=3.703 y=322.673 w=0.903 h=1.000 t=18
$EKF: 00:16:24, r=1.363 p=3.091 y=54.659 t=44
$DCM: 00:16:24, r=3.784 p=2.491 y=321.905 w=0.947 h=1.000 t=18
$EKF: 00:16:24, r=1.252 p=3.064 y=54.700 t=43
$DCM: 00:16:24, r=6.263 p=1.490 y=321.079 w=0.939 h=1.000 t=18
$EKF: 00:16:24, r=1.272 p=3.010 y=54.705 t=44
$DCM: 00:16:25, r=7.180 p=0.846 y=320.168 w=0.961 h=1.000 t=18
$EKF: 00:16:25, r=1.294 p=2.884 y=54.736 t=44
$DCM: 00:16:25, r=6.511 p=1.090 y=319.252 w=0.963 h=1.000 t=18
$EKF: 00:16:25, r=1.254 p=2.973 y=54.751 t=124
$DCM: 00:16:25, r=4.916 p=1.770 y=318.311 w=0.989 h=1.000 t=18
$EKF: 00:16:25, r=1.309 p=2.965 y=54.754 t=125
$DCM: 00:16:25, r=2.655 p=2.552 y=317.315 w=0.785 h=1.000 t=18
$EKF: 00:16:25, r=1.279 p=2.960 y=54.777 t=44
$DCM: 00:16:26, r=0.392 p=3.300 y=316.300 w=0.952 h=1.000 t=18
$EKF: 00:16:26, r=1.230 p=2.942 y=54.785 t=43
$DCM: 00:16:26, r=-1.432 p=3.871 y=315.273 w=0.984 h=1.000 t=20
$EKF: 00:16:26, r=1.136 p=2.964 y=54.800 t=44
$DCM: 00:16:26, r=-2.290 p=4.061 y=314.305 w=0.982 h=1.000 t=18
$EKF: 00:16:26, r=1.149 p=2.943 y=54.817 t=44
$DCM: 00:16:26, r=-2.439 p=3.989 y=313.361 w=0.977 h=1.000 t=18
$EKF: 00:16:26, r=1.046 p=2.924 y=54.858 t=44
$DCM: 00:16:27, r=-1.717 p=3.739 y=312.468 w=0.949 h=1.000 t=18 <-- вот место прекращения раскачки горизона
$EKF: 00:16:27, r=1.067 p=2.915 y=54.907 t=125
$DCM: 00:16:27, r=-0.409 p=3.359 y=311.626 w=0.952 h=1.000 t=18
$EKF: 00:16:27, r=1.072 p=2.894 y=54.928 t=125
$DCM: 00:16:27, r=0.818 p=2.895 y=310.776 w=0.978 h=1.000 t=18
$EKF: 00:16:27, r=1.029 p=2.872 y=54.952 t=44
$DCM: 00:16:27, r=1.968 p=2.567 y=309.907 w=0.967 h=1.000 t=18
$EKF: 00:16:27, r=1.049 p=2.855 y=54.983 t=44
$DCM: 00:16:28, r=2.948 p=2.431 y=309.034 w=0.938 h=1.000 t=18
$EKF: 00:16:28, r=1.135 p=2.856 y=54.997 t=43
$DCM: 00:16:28, r=3.414 p=2.512 y=308.126 w=0.969 h=1.000 t=18
$EKF: 00:16:28, r=1.165 p=2.858 y=55.028 t=45
$DCM: 00:16:28, r=3.064 p=2.736 y=307.190 w=0.952 h=1.000 t=18
$EKF: 00:16:28, r=1.115 p=2.866 y=55.051 t=43
$DCM: 00:16:28, r=2.594 p=2.941 y=306.211 w=0.972 h=1.000 t=18
$EKF: 00:16:28, r=1.175 p=2.845 y=55.099 t=44
$DCM: 00:16:29, r=2.080 p=3.156 y=305.274 w=0.951 h=1.000 t=18
$EKF: 00:16:29, r=1.253 p=2.843 y=55.110 t=125
$DCM: 00:16:29, r=1.383 p=3.324 y=304.315 w=0.983 h=1.000 t=19
$EKF: 00:16:29, r=1.229 p=2.842 y=55.130 t=43
$DCM: 00:16:29, r=0.922 p=3.317 y=303.362 w=0.973 h=1.000 t=18
$EKF: 00:16:29, r=1.258 p=2.811 y=55.150 t=45
$DCM: 00:16:29, r=0.627 p=3.148 y=302.424 w=0.889 h=1.000 t=18
$EKF: 00:16:29, r=1.242 p=2.752 y=55.171 t=44
$DCM: 00:16:30, r=0.784 p=3.028 y=301.491 w=0.794 h=1.000 t=18 <-- здесь уже совсем все успокоилось
$EKF: 00:16:30, r=1.315 p=2.770 y=55.210 t=44
$DCM: 00:16:30, r=1.125 p=2.931 y=300.591 w=0.968 h=1.000 t=18
$EKF: 00:16:30, r=1.381 p=2.778 y=55.226 t=45
$DCM: 00:16:30, r=1.454 p=2.792 y=299.653 w=0.950 h=1.000 t=18
$EKF: 00:16:30, r=1.347 p=2.770 y=55.270 t=44

LeonVS
ukkr:

Я тут тоже маленько выложу линку на шоу-версию альтернативной ГУЙни

Ну а что, мега супер, хорошее начало 😃 Осталось гугль мапс прицепить или что нить похожее 😃
К стати, очень бы не помешал “прибор” силуэта самолета поворачивающимися управляющими плоскостями, очень удобно для понятия что творит АП, ну и для чтения логов будет очень полезен. Даже можно два таких прибора, один то что на входе с RC управления, второй то что уже непосредственно идет на сервы с АП.

AlexSneg:

Вот, сделал логи DCM в сравнении с EKF

Время выполнения смотрю в 3 раза различается…
К стати а в чем причина что мы не используем более мощные процики? Сложней програмить? Не думаю… Больше жрет? да то же вроде не на много… В чем причина? Почему не юзаем тот же STM?

Syberian
LeonVS:

Траблы продолжаются

LeonVS:

бяда бяда

LeonVS:

весело бегут

LeonVS:

не смог…

LeonVS:

Заработало

Глядя на этот mind flow, делаю вывод, что, пока я спал, проблема решена и совет не требуется 😃

LeonVS:

Олег а откуда беруться данные? С акселей или с гироскопов? Смотрю и ось YAW уже есть, компас или гирик?

гира и аксель на 16G диапазоне

ukkr:

Пока только общий концепт

Вот это красота!!!
Я буквально вчера пытался нарисовать гуйню на жаве, весь день протр**ся, пытаясь запустить javax.comm и gnu.io, плюнул и написал на С++ builder.

LeonVS:

а в чем причина что мы не используем более мощные процики?

потомушта аффтар порта в них не разбирается и не хочет, вот и весь сказ. Могу писать на TI DSP 6700-й серии, но это такая огромная “лепешка” с потреблением под 1А…

AlexSneg:

сделал логи DCM в сравнении с EKF

из этой ряби цифр я понял только t - время выполнения. Графиками было бы нагляднее.
Вы можете на пальцах показать место фильтра калмана в AHRS? Это типа “черный ящик”, в который кладется гира и аксель и на выходе имеется roll-pitch-yaw, или это всего лишь фильтр с предсказанием, стоящий между гироскопом и обычным инерциальным алгоритмом?
Только без формул, у меня по матану в универе было 3 с минусом 😁

Пытался в матлабе асилить калман, позапускал примеры, даже С - код получил, но ясности не добавилось.

AlexSneg
Syberian:

из этой ряби цифр я понял только t - время выполнения. Графиками было бы нагляднее.

Ну r - roll смотри, это просто отклонение от плоскости влево-вправо. Влево с минусом угол, вправо с плюсом. Смотри разницу при тех же входных усорвиях: строчка DCM это алгоритм с направляющими косинусами, EKF - это Extended Khalman.
На днях сделаю визуализацию, покажу в картинках как все выглядит.

Syberian:

Вы можете на пальцах показать место фильтра калмана в AHRS?

Кальман это по сути фильтр с предсказанием. Только не все так просто. Он как бы самообучаемый в процессе. Он учится корректировать ошибку на основании истории поведения. А на сколько хорошо он обучаем зависит от математической модели предсказания, которая в свою очередь может так же на ходу корректироваться и подстраиваться. Вот в этом месте наступает основная проблема - подбор коэффициентов модели поведения. Каждый из коэффициентов этой модели может в свою очередь быть достаточно сложными функциями. Как раз обычно на этом месте энтузиазм начинающих заканчивается. Так как любые С классы заготовки хотят чтобы их как раз снабдили такими математическими моделями. В этом месте начинаются диссертации на тему… К счастью есть полно открытых проектов по определению attitude тела в пространстве откуда можно брать и сопоставлять, анализировать. Амеры и япы написали полно работ и диссертаций. Я не считаю себя тормознутым, вариант фильтра кальмана для одномерных линейных моделей типа расстояние = скорость * время + error понял довольно быстро (спустя пару недель), так как математическая модель проста. Однако для трех и четырех мерных пространств нужно иметь ну очень много энтузиазма. Я реально этим полгода занимался и то, я вот понимаю как работает моя конкретная реализация, которую я фактически скомпоновал из найденного, готового полу-материала, который бродит в буржуйской сети и которую я отдебажил и посмотрел в графиках разные оси в разных контрольных точках кода, подавая заранее сформированные тестовые воздействия. Попроси меня рассказать, как другой Кальман устроен, то я вряд ли смогу это сделать.