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

SergDoc
oleg70:

повышать разрядность шумов не вижу смысла…

ну как бы так:

const double T1 = 15.0 + 273.15;    /* temperature at base height in Kelvin */
const double a  = -6.5 / 1000;    /* temperature gradient in degrees per metre */
const double g  = 9.80665;    /* gravity constant in m/s/s */
 const double R  = 287.05;    /* ideal gas constant in J/kg/K */

github.com/SergDoc/Firmware/blob/…/ms5611.cpp#L705

AlexSneg
djdron:

Оптимизация включена, без оптимизации что-то лишнее добавляется, а так с = а * b выполняется за 6 тактов

a,b внутри цикла не меняются, с - нигде не используется. Оптимизатор это вообще из цикла выкинуть может. Не очевидный какой-то тест.

djdron
AlexSneg:

a,b внутри цикла не меняются, с - нигде не используется. Оптимизатор это вообще из цикла выкинуть может. Не очевидный какой-то тест.

ну это я как пример привел, конечно я смотрел чтобы компилятор не выкинул код. Я смотрю асемблерный код в отладчике как выполняется. Если тест не очевидный то какой очевидный?

без оптимизации будет 90мс, компилятор какието лишние инструкции добавляет.

rual
djdron:

без оптимизации будет 90мс, компилятор какието лишние инструкции добавляет.

Снег дело говорит:

AlexSneg:

a,b внутри цикла не меняются, с - нигде не используется.

при компиляции вся операция выкинется, так как результат её дальше не используется, нада так:

for(int i=0;…){ c += a* (double)i; }
printf(“%f”,(float)c) ;

djdron

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

volatile double a;
volatile double b;
volatile double c;

вот асемблер какой получается

c = a * b;
LDR.N R0, [PC, #0x20]
VLDR D0,[R0, #0]
VLDR D1,[R0, #+8]
VMUL.F64 D0,D0,D1
VSTR D0,[R0, #+16]

Это при максимальной оптимизации. Оптимизация убирает лишнии копирования из памяти в регистры процессора и обратно. Фишка в том что VMUL.F64 D0,D0,D1 выполняется за один такт.

так выглядет без оптимизации:
LDR.N R0,[PC, #0x2С]
VLDR D0,[R0, #0]
LDR.N R0,[PC, #0x2С]
VLDR D1,[R0, #0]
VMUL.F64 D0,D0,D1
LDR.N R0,[PC, #0x24]
VSTR D0,[R0, #0]

даже если посчитать такты нужные для выполнения инструкций то примерно похоже на правду.

oleg70
SergDoc:

ну как бы так:

Забавно… Типа - температурная поправка воздух/высота требует большего числа знаков… Не уверен что сенсор измеряет реальную температуру воздуха … Надо проверять.

omegapraim

Если кому интересно, сегодня возникла надобность раздербанить назу)))) Походу закис шлейф и выдавало по одной из осей ошибку, но я раздербанил все и посмотрел как там все устроено.
Фото увы не делал да и не на что там особо смотреть.

Собственно как устроена виброразвязка: От металического кубика с датчиком идет шлейфик и соответственно все это держется на оч мягкой пенорезине, вот только есть один нюанс (как в анекдоте) кубик этот полый и датчик залит внутри при помощи эпоксидки (увидеть это не сняв кубик невозможно). Так что по сути кубик это монолит в центре которого датчик.

И кстати что заметил не знаю баг это или фича, но кубик был теплый (перед этим включал назу мин на 5-10) так что возможно он еще и изнутри подогревается, но насчет этого я не уверен.

Да наза починилась)))) так что дербанил не зря)))

SergDoc

подогревается модулем Пельтье - это мы уже выяснили давно, да и что за датчики тоже (теоретически и по рассказам таймкопа) скажу так на датчиках которые мы используем - это не надо, ну разве что в 40 градусный мороз…
я тут для gps фильтрик посчитал маленький на 5 листов А4 теперь репу чешу как его в мегакод превратить )))))

oleg70
SergDoc:

репу чешу как его в мегакод превратить

Чё,помочь ?

rual
SergDoc:

скажу так на датчиках которые мы используем - это не надо, ну разве что в 40 градусный мороз

в 35 градусный точно не надо, проверено )

SergDoc
oleg70:

Чё,помочь ?

не, в проц упёрся ))) на каждой интерации извращение одно делать надо так что проц только с fpu…

oleg70
rual:

в 35 градусный точно не надо, проверено

А мне кажется что этот подогрев не спроста… Встроенная в сенсоры температурная компенсация всегда у меня вызывала много вопросов, а тут ребята похоже сделали “по взрослому” как в настоящих ЛА, наверно этот подогрев контролируется программно, отсюда и выдающиеся характеристики по стабильности получили 😃.

SergDoc
oleg70:

а тут ребята похоже сделали “по взрослому” как в настоящих ЛА, наверно этот подогрев контролируется программно, отсюда и выдающиеся характеристики по стабильности получили

аналоговые датчики без компенсации и дабы не плодить танцы с холодильником как в AutoQad - подогрели )))

rual
oleg70:

А мне кажется что этот подогрев не спроста…

При более-менее постоянной низкой температуре проблем не замечал, а вот если из теплой машины вытащить на мороз и сразу лететь, то немного сносит поначалу, но не сильно критично.

SergDoc

Чёй-та тема заглохла…
Я вот с Калманом подружился))) кстати 90% примеров в нете неправильные)))
могу дать подсказку - регулятор (Kalman Gain) практически все рассчитывают неправильно, из-за лени или непонимания рассчёта обратной матрицы, её, точнее 2 формулы рассчёта превращают в одну, чем вызывают проблемы регулировки в реальных случаях, в теоретических (идеальных) условиях работает - практически нет - несколько статей на хабре с той же ошибкой и люди писаются от счастья, что прозрели прочитав)))
так вот скажу - там неправильно…
p.s. кто-то может сказать, что я изучил его ещё на курсах edx, разочарую - курс не дал ничего кроме представления о нём о чём-то как реальном, потом несколько попыток тупо посчитать, но так как я пока не представлю все происходящие процессы в голове (ну уж видно так мозг у меня устроен) формулы остаются для меня просто формулами не имеющими реального смысла… картинка сложилась )))

mahowik

Да примеры в тырнете скорее правильные, но большинство из них приведены для линейных процессов, чего к сожалению практически нет в жизни. А вот с нелинейными уже сложнее, где нужно проводить линеаризацию модели через частные производные, джакобины (jacobians) или как их там…
Из курса тогда так и не понял мат. сути как получается главный рег. коэф. т.е. kalman gain. Мне тоже нужно что бы на пальцах было понятно, либо в крайнем случае кубиками мозайки могут быть четкие ясные абстракции ))) А разобрался, раскажи всем 😉

P.s. раньше копался с этим примерчиком, так в нем реально поддельный калман с ошибками, т.е. подогнали на результат, а по сути не рабочий)))
www.cs.utexas.edu/~teammco/misc/kalman_filter/

SergDoc

Привет! Давно тебя не видно!!!
Самый прикол в том что оно вроде всё не так и сложно, но на пальцах рассказать как-то пока не могу )))
Короче на реальном железе попробую - тогда может что и расскажу)))
на данный момент просчитываю 3 координаты, 3 скорости, без матрицы поворота и без вектора и матрицы управления…
да и 5 листов в “аналоговом” виде как то в “цифру” переводить влом…
Я расписывал матрицы и смотрел, что в них получается и к чему это приводит считал их по одной тут matrixcalc.org
самая проблема - это ковариации (шум) самого фильтра - тут без бубна никак…
а вот регулятор берётся разный в зависимости, что собрался делать: прогнозировать, фильтровать или сглаживать…

oleg70
mahowik:

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

Давно были подозрения, что толком мало кто разбирается в этом (поэтому и объяснить не могут), а набуробить “супер пупер” кода всегда можно, а наглядных результатов практически нет…

mahowik
SergDoc:

Привет! Давно тебя не видно!!!

здаров!

oleg70:

Давно были подозрения, что толком мало кто разбирается в этом (поэтому и объяснить не могут), а набуробить “супер пупер” кода всегда можно, а наглядных результатов практически нет…

это даже не фильтр, а скорее вычислитель и суть фильтра как раз понятна была, когда разбирался… помню понравилось обьяснение с форума avrfreaks.net/…/tut-theory-what-kalman-filter?name… (4й пункт)…

oleg70
mahowik:

это даже не фильтр, а скорее вычислитель

Вот вот… Как я понял, это скорей некоторый “предсказатель поведения” работающий на основе анализа поведения на предыдущих итерациях (?), ну и как следствие - как бы “фильтрует” неправильные реакции… (во загнул… 😃)

SergDoc

Это не гадатель )))
Вот по данному примеру:
x = (A * x) + (B * c) - это тупо интегрирование скорости по времени - получаем путь (Координату)
P = (A * P * AT) + Q - рассчитываем ошибку интегрирования - понятно что при первой интерации будет равна Q - якобы ковариации самого фильтра, но мы прекрасно видим что матрицу Q задали и забыли…

дальше

S = (H * P * HT) + R - вспомогательная матрица - из неё потом найти надо обратную
K = P * HT * S-1 - рассчёт коэффициента усиления так вот тут и выше матрица H - Jacobian matrix, а нифига не нарисованная от руки…
дальше

y = m - (H * x) - вспомогательный вектор для уточнения выходного вектора из показаний датчика но тут не H*x, а отдельная функция h(x) (считается отдельно)

x = x + (K * y) - кстати опять интегрирование только с уточнёнными данными т.е, новый x - вектор на выходе
P = (I - (K * H)) * P - уточнение ошибки
т.е. получается задачка в 2-х местах за уши притянута к ответу 😦