flybrain. передатчик + приемник + автопилот. powered by stm32

Frr
serj:

Что не в два раза - это точно…

Почему? Как считать?
Было 2 оси, матрица F 2х2 =4, будет 3оси 3x3=9, время подсчетов увеличится в 9/4=2 раза.
ПРИМЕРНО, без учета усложнения модели.

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

Drinker

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

Frr:

Почему? Как считать?

дсм против калмана сравниваем

AlexSneg

TO: Flash_rahЕсли хотите, чтобы я отвечал на личные сообщения, то разрешите их у себя в профиле. Мне ваши личные настройки не позволяют отвечать вам.

Drinker:

19 мкс, а на калмана всего в 2.2

Ну и что? Кальман у меня оптимизирован, а DCM у Олега на темплейтах. Там очень много передачи параметров не по ссылкам а копированием происходит. Не факт, что это не занимает львиную долю времени в тех 18мкс.

Frr:

Для начала можно так:

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

Frr:

С маг-ом время увеличится вдвое

Ну не факт. Думаю его только как корректирующий фактор ввести в дополнение к гире. Тогда только на 1/3 должно увеличится. И я планирую магнитометр на 30Гц пускать. Уж больно эта штука внешним воздействиям подвержена, не было бы хуже.

serj:

и сильно шустрее в этом применении.

вот тут все правда. Я пробовал компилять без FPU инструкций. Скорость упала больше чем в 10 раз. Нет, уж нафиг…

serj:

Также, есть еще один способ комплексироания данных

Ну, если кто реализацию выложит готовую, я готов добавить и сравнить и доложить о результатах. Но сейчас мне бы хотелось дальше двигаться.
Еще вот думаю частоту акселя поднять до 400Hz и посмотреть что получится.

Drinker:

Верно, например на 10 предикторов 1 корректирующий шаг выполнить.

Ну оно сейчас так и получается. Или, если быть более точным, то дрейф акселя фильтруется FIR фильтром, который подстраивается акселем, но аксель работает на частоте 50Hz, соответственно имеем побочную адаптивную FIR фильтрацию дополнительно, неявно наложенную на гиру. Причем за счет отрицательной обратной связи они на самом деле друг на друга влияют

Frr:

Было 2 оси

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

Drinker:

полностью идентичные углы во все моменты времени

Тут да, согласен. Оба варианта вполне себе рабочие. Конечно калман более четкий и существенно меньше подвержен вибрациям и паразитным ускорениям. Но, опять же наша цель 3D пилотаж или полет в плоскости горизонта с минимальными кренами?

Сейчас с кальманом осталось по сути 2 технические проблемы решить.

  1. Как задавать начальное референсное значение платформы. Засада в том, что при подаче питания оно не знает где у него верх, где право, лево, вперед, назад. Поэтому, куда гиру при старте повело, туда оно ведет положительный отсчет углов. Даже вот не знаю, наверно принудительно не нули при старте в углы писать, а небольшие смещения в доли градусов, тогда оно сообразит плюс или минус изначально. Ну а для самолета как? Вот подали мы питание, как там пользователь платы разместил? Да хрен его знает. Значит надо как то дать пользователю на старте объяснить где “перед”, а где “назад” ну и лево право за одно. То есть вариант plug-and-fly как-то не очень просматривается.
  2. Отловить сингулярность, которая возникает скорее всего при переходе от матрицы к углам эйлера. Деление на ноль, или тангенс какой в 90 градусов упирается. Либо я чего-то не учел, либо оно так и должно быть. Но надо куда-то IFов на эту тему воткнуть.
Drinker
AlexSneg:

Как задавать начальное референсное значение платформы

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

AlexSneg
Drinker:

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

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

msv

Алекс, можно узнать полный формат пакета RFM-ки ( сколько байт преамбула итп.)?
Какую девиацию используете и из каких соображений?

Drinker
AlexSneg:

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

Стоп. А нахрена её криво в самолет пихать? Трудно ровно поставить типа ось x вдоль самолета, ось y - поперёк, z-вверх…
Начальные ролл и питч по акселю определяем, яв - по магнетометру.
В чем великая проблема?

vic2rus
Drinker:

Стоп. А нахрена её криво в самолет пихать?

Наверно по тому, что платка не в каждый самик влезет плашмя, но вполне себе стоймя залезает?

baychi
AlexSneg:

Как задавать начальное референсное значение платформы.

В существующих проектах предпологается неизменяемая установка платы, с возможностью ручного задания углов установки. Точное тримирование акселей делается по команде пользователя: модель должна стоять ровно. Гиры при инициализации (явной или неявной - при подаче питания) калибруют свои нули. Процедура инициализации, как и тримирования, обычно занимает секунд 15-30.

AlexSneg
baychi:

В существующих проектах предпологается неизменяемая установка платы

А если у меня плата встает только боком, или только с наклоном градусов 30? Все пропало?
Не ну я понимаю, текущие решения не умеют референс ресетить на старте. Но я то хочу, чтобы было максимально гибкое решение.
Сейчас в голову приходит такой вариант начальной установки:

  1. Держим кнопку, подаем питание. Плата спустя пару секунд переходит в режим каллибровки. моргает светодиодами.
  2. Ставит руль высоты на максимум вниз, типа просит самолет носом наклонить к земле и держать. дает на установку наклона 5 сек, затем собирает статистику
  3. Ставит руль высоты вверх, просит поставить самоль носом вверх
  4. Элероны влево, наклоняем самоль влево
  5. Элероны вправо, наклоняем вправо.
  6. Машет всеми рулями, просит зависнуть точно в горизонте, это будет начальным референсным положением с нулевыми рулями.
  7. Еще раз машет всеми рулями, просит наклонить самолет так, чтобы придать правильное триммерное положение рулям. в этот момент рули отслеживают наклоны и повторяют углы. Пользователь смотрит, где достаточно. Затем нажимает кнопку. Плата запоминает положение наклонных триммеров.
  8. Выход из режима каллибровки.

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

Drinker
AlexSneg:

А если у меня плата встает только боком, или только с наклоном градусов 30? Все пропало?

Ничего не пропало.
Вот например у мну, можно девайс хоть как поставить. Просто нужно использовать в качестве референсных значений для определения горизонта показания акселя и магнетометра именно в таком положении. Фишку 30-ю аналогично ставить можно как угодно, но обязательно обучив ее при этом горизонту.

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

AlexSneg
Drinker:

Вот например у мну, можно девайс хоть как поставить.

Что значит как угодно? Можно задом наперед поставить? Как она узнает, где направление вперед?

Drinker
AlexSneg:

Что значит как угодно? М

В разумных пределах по крену и тангажу

AlexSneg
Drinker:

В разумных пределах по крену и тангажу

ну вот, а я хочу в неразумных пределах. Поставить задом наперед, вверх ногами. Ну или ось YAW с Roll поменять, например.

Drinker

Рассказываю. Задаем т.н. референсный фрейм. В нормальном положении по акселю x=0g y=0g z=1g. Хотите перевернуть девайс z=-1g.
И крутитесь вокруг этого фрейма.
С магнето тоже самое.

baychi
AlexSneg:

если у меня плата встает только боком, или только с наклоном градусов 30?

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

AlexSneg
Drinker:

В нормальном положении по акселю x=0g y=0g z=1g.

кто-то из нас тормозит 😃
И что для платы, которая знает только, что z=1g будет означать y>0 в этом случае? Это будет лево или право по отношению к самолету?
Дайте мне ссылку на инструкцию к FY-XX, я прочитаю что там пишут, а то вы все тут меня совсем запутали.

Drinker
AlexSneg:

Это будет лево или право по отношению к самолету?

Вот жеж эти электронщики-теоретики…
при z=1g y>0 быть не может, увы. Это чё, там где вы находитесь g какоето другое?

serj

Т.к расположение акселерометров относительно гироскопов неизменно, можно не наклонять, а попросить один раз повернуть на 1 оборот блинчиком и один раз - сделать “петлю” ( носом от горизонта вверх), потом поставить в покое в горизонте. Этих данных должно быть достаточно для калибровки направлений осей и горизонта.

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

AlexSneg
Drinker:

Вот жеж эти электронщики-теоретики

хорошо, мы такие. А вы, практики, никак объяснить не можете.
z=1
y=-0.789E-4
x=+0.45215

Как из этого понять где у самолета левый борт, а где правый?

Я вот о чем талдычу? Сама плата конечно знает, где у нее право, а где лево. Но, плата не знает, совпадает ли направление ее осей, с осями самолета (reference body frame). Если мы договариваемся, что плата может быть внутри самоля ориентирована по любому, то нужно учить плату ориентации внутри самолета и только после этого учить самолет горизонту.

serj:

Хотя, кажется, достаточно

неа, не будет этого достаточно.
Я вот сейчас подумал. должно быть так:

  1. поставить в горизонт, зсечь вектор тяжести.
  2. Наклонить влево, пауза
  3. Наклонить вперед, пауза
  4. Поставить в горизонт

Вот теперь все. Тогда направление pitch и roll будет известно, а yaw уже векторным прозведением можно расчитать да и GPS будет, если что откорректирует на ходу

Drinker
AlexSneg:

хорошо, мы такие. А вы, практики, никак объяснить не можете. z=1 y=-0.789E-4 x=+0.45215

Этого в покое быть НЕ МОЖЕТ!
Суммарный вектор = 1, а тут уже только по z единица!
Такое может быть если z вертикально вниз смотрит, а по оси x дёрнули плату.

Ну или сдвинули по всем осям

Да, и еще такое может выть если оси у вас не перпендикулярны. Но это уже совсем сложный случай. 😃