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

varvar

Ребята, вы столько страшных слов наговорили - а не поясните и мне заодно, как-нибудь посермяжнее: на входе фильтра Калмана при перевороте получается разрыв - от 180 градусов до -180. Фильтр от этого просто дичает. Как “свернуть” шкалу и сделать непрерывной? Только, если можно, без страшных слов 😃 Хорошо, когда складываешь целые числа - и проблемы нет, после 0xFFFF следует 0. А как бы здесь извратится? Простите, если вопрос глупый - ну ни разу ни арихметик я.

Drinker
varvar:

Калмана при перевороте получается разрыв - от 180 градусов до -180. Фильтр от этого просто дичает. Как “свернуть” шкалу и сделать непрерывной?

Ё-ма-ё. Не буду более пугать народ пустой дискуссией. Автор подрастет, пооботрецца в этом вопросе и всё будет пучком.

AlexSneg:

Или ты будешь пытаться рулить в этом промежутке?

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

varvar
Drinker:

Ё-ма-ё. Не буду более пугать народ пустой дискуссией. Автор подрастет, пооботрецца в этом вопросе и всё будет пучком.

эээ… Что-то не понял ответа. Откровенно говоря, меня больше волнует своя железка - поскольку тут пир горой, может и мне чего с барского стола перепадет. Или ответ уже был, да я не разглядел его за забором слов? У меня-то все значительно проще - всего одну ось стабилизировать надо, глобальных задач не решаю, в космос тоже не лечу.
А если у кого что-то и пучком будет - я ж только рад за него. Хотя и свой пучок тоже бы неплохо.

Frr
varvar:

получается разрыв - от 180 градусов до -180. Фильтр от этого просто дичает. Как “свернуть” шкалу и сделать непрерывной?

Если вместо одной переменной “угол a” использовать пару (x1=cos(a), x2=sin(a)), то разрыва нет.
У (sin(a), cos(a)) обе компоненты гладко растут/убывают при переходе через 180град.
Поэтому считают в кватернионах. Вместо трех углов будет четыре переменных,
каждая из них - “замес” из синусов и косинусов.

AlexSneg
varvar:

Фильтр от этого просто дичает

Фильтр это просто набор операторов. Если у тебя фильтр дичает от углов, то ты неправильно модель построил.

Самое простой вариант, если в твоей модели критично находится именно в диапазоне +180,-180 можно после всех апдейтов открутить угол в нужную зону искусственно. Но какой-то диапазон странный, обычно удобнее оперировать 0 - 360

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

Drinker
varvar:

эээ… Что-то не понял ответа

В самом фильтре, будь то калман, дсм и прочие, никаких разрывов нет. Разрывы получаются так сказать искусственно в процессе преобразования кватерниона, взятого из фильтра в углы эйлера. В вышеописанной байде скачок ролла с 0 до 180 град при переходе через питч 90 град очень кстати, потомучто самик в этот момент на спину ложится, а стабилизатор его тутже переворачивает в нормальное положение. Но это плюс сугубо для реализации стаба. Это какбэ по-простому я постарался объяснить.

2 varvar и ещще нужно чотко понимать, что интерпретировать результаты работы фильтров можно по-разному. Переход на углы эйлера - один из вариантов.

А для полетов по камере, в коей теме мы находимся, очень важна именно система стабилизации, которая не даст самику уходить за некие предельные углы по крену и тангажу (и конечно тангаж в 90 градусов тут совсем не нужен).

Задача автопилота задавать углы относительно земли, а стаба - удерживать их. В этой задаче ±45 град по крену и тангажу за глаза хватает.

AlexSneg
serj:

Вообще откуда эта непонятная привязанность

Посмотри в любой открытый код любого автопилота. Конечный алгоритм стабилизации всегда опирается на углы Эйлера при оценке положения тела. Так что это не я придумал.

У меня персонально нет привязанности никакой. Мне просто нужны углы наклона тела ко всем трем осям + направление вперед в любой момент времени для дальнейшего программного анализа. А стандартный, общеупотребительный набор формул не дает этого сделать в любой момент времени. А то, что Дринкер считает, что наличие неопределенности положения в определенных обстоятельствах это правильно, так это его дело. Я для себя так не считаю, только и всего. Доказывать кому-то, чего-то у меня задача сейчас так не ставится. А вообще то по большому счету, у нас ведь с Дринкером разногласие не в математике или кривой реализации алгоритма вращения ( и у него и у меня все одинаково работает), у нас с ним разногласия в том как результаты интерпретировать.

serj:

Каждый следующий угол отсчитывается от предыдущего. Они так построены

Вообще-то изначально углы Эйлера это базис. Другое дело, вращение тела в этом базисе. Вероятно так и придется кватернион преобразовывать в читабельный вид, через расчет кватерниона вращения от предыдущего состояния к новому. Сейчас я эту тему отложил до праздников, надо получше все обдумать.

Drinker
AlexSneg:

А то, что Дринкер считает, что наличие неопределенности положения в определенных обстоятельствах это правильно, так это его дело

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

Большинство проектов летают при наличии этой проблемы. У Дринкера кстати тоже.

AlexSneg
Drinker:

Большинство проектов летают при наличии этой проблемы

Не вопрос, пусть летает. Просто я хочу решить задачу более широко и не только для FPV. Я хочу чтобы мой самолет умел летать как угодно под автопилотом. В том числе и под 90 градусов вверх и вниз.

Drinker

2Алекс. А вот так нормально? Чистые повороты относительно “земли”
Через 30 минут мона смотреть

Тряска, как заказано

AlexSneg
Drinker:

А вот так нормально?

ДА. Если пирамида гранями не вращает (а то уж больно симметричное тело выбрал) то это как раз то, что надо. Молоток. Расскажешь как преобразовывал кватернион в углы или секрет фирмы?

varvar

Спасибо всем ответившим. Видимо, варианта у меня два - или читать страшные слова, или оставить все как есть, тем более, что скопипасченная подпрограмма работает: не трогай технику - она не подведет. Скорее всего просто буду использовать значение -180 градусов, когда приближаюсь к этому значению. Точность “вверх ногами” мне вроде как не нужна.

Drinker
AlexSneg:

Расскажешь как преобразовывал кватернион в углы и

Да

varvar:

Видимо, варианта у меня два - или читать страшные слова, или оставить все как есть, тем более, что скопипасченная подпрограмма работает: не трогай технику - она не подведет. Скорее всего просто буду использовать значение -180 градусов, когда приближаюсь

А подробнее?

varvar
Drinker:

А подробнее?

да в общем-то и описывать особо нечего - управляю я самолетиками (летающее крыло) такой штукой - rcopen.com/forum/f8/topic222710 , к которой прикручен motion plus в качестве стабилизатора. Естественно, компенсирует только порывы ветра и всякие возмущения, т.е. стабилизатором это можно назвать чисто условно. Решил все это немного переделать - rcopen.com/forum/f8/topic263075 . Ну и заодно немного улучшить стабилизацию - чтобы видеокамеру не слишком бросало. Собственно, не потому, как надо, а потому как изготовление плат на заказ стало очень дешево.
А так как это всего лишь хобби, и причем достаточно новое для меня - предпочитаю все сделать сам. Собственно, и крылья все вырезаны из куска пенопласта. Бюджетный вариант - из куска ценой меньше 10 евриков можно вырезать 4 крыла с размахом 1.2 м 😃 В общем, каждый с ума сходит по-своему 😃

Drinker
varvar:

да в общем-то и описывать особо нечего - управляю я самолетиками (летающее крыло) такой штукой

А это причем?

varvar:

не поясните и мне заодно, как-нибудь посермяжнее: на входе фильтра Калмана при перевороте получается разрыв - от 180 градусов до -180. Фильтр от этого просто дичает. Как “свернуть” шкалу и сделать непрерывной? Т

Вопрос -то в чем сопссно?

AlexSneg

Между делом подключил компас. Еще более интересненько стало все работать. Исчез дрейф по yaw и ошибка после тряски почти совсем пропала. Вообщем с компасом конечно лучше, что и говорить, но уж больно зависим от разных внешних воздействий. Будем в дальнейшем как-то искать функцию компромиса между вкладом компаса и гироскопа в процесс корректировки.

Пробовал подносить мотор к плате. Конечно магниты мотора воздействуют на компас, начинаются искажения, но не фатальные. похоже мотор должен находится от платы на расстоянии не менее 10( а лучше 15) см. Тогда я искажений практически не наблюдаю. Если удастся размещать мотор и плату на 20 см, то вообще все почти хорошо.

Еще пробовал плату ставить с ноутом на вращающийся стул и крутил, эмитируя развороты самолета в полете. Горизонт стоит и не дрыгается. Вообщем, все даже лучше, чем я предполагал.

Начал пробовать детектор синхры в видеосигнале. Вроде теория сходится с практикой. Прерывания пошли по синхроимпульсам. За праздники попробую забацать горизонт на экране. Сделаю видео на показать.

Drinker:

Цитата Сообщение от AlexSneg Посмотреть сообщение Расскажешь как преобразовывал кватернион в углы и? Да

Расскажи принцип, я дальше сам попробую.

varvar:

Видимо, варианта у меня два - или читать страшные слова, или оставить все как есть

Мы не можем тебе помочь до тех пор, пока ты не опишешь какие у тебя датчики, и что они измеряют. И какой процесс ты пытаешься моделировать. А умные слова придется в любом случае освоить, ибо “векторный матанализ”, сам понимаешь не есть тема средней школы. 😃

Drinker
AlexSneg:

Расскажи принцип

q.x = sin(theta/2) * axis.x
q.y = sin(theta/2) * axis.y
q.z = sin(theta/2) * axis.z
q.w = cos(theta/2)

AlexSneg:

Между делом подключил компас.

А калиброффка?
Яв стремицца к истинному направлению оси X относительно Севера Земли?

Как стартует алгоритм? Яв с 0 ползет к истинному значению, или инициализация по вычисленному значению курса из показаний магнитометра?

AlexSneg
Drinker:

q.w = cos(theta/2)

интересно, обязательно попробую на праздниках.

Drinker:

А калиброффка?

Ну вот я как сделал? Берем платку начинаем вращать по-всякому. Цель - выискать максимумы и минимумы на максимальной чувствительности (у меня +/- 1,3 гауса шкала). Тут у меня была самая главная засада в том, чтобы параметрами смещения внутреннего АЦП побаловАться. Как оказалось с нулевым смещением, у меня очень много шума лезет. Ну у меня оказалось в отрицательную сторону надо подвинуть. Оно более менее симметрично стало по осям в смысле параметра gain. Но ноль отъехал процентов на 30. Ну вот я нашел мин и макс значения по всем осям. Соответственно вычислил bias для каждой из осей. Затем взял из ДШ сколько оно гаусов на цифру дает. Умножил. Но в результате пришел к тому, чтобы нормировку вектора прямо сразу проводить. То есть реально я себе оставил только абсолютное направление вектора. Ну в EKF оно вошло гладко, как и заказывал.

Drinker:

Как стартует алгоритм?

Тут да, я себе этот вопрос тоже задал, как бы тут универсально извернуться. В конечно итоге ввел в фильтр матрицу 6Х6 с нормированным вектором гравитации и магнитного поля. И собственно проблема автоматом порешалась. Я теперь стартую алгоритм. Включаю режим установки горизонта. Держу плату горизонтально и даю команду запомнить референсное значение. Оно скидывает в матрицу два нормированных вектора. А дальше EKF подхватывает и тянет кватернион состояния платформы автоматически в референсное положение. Скидывать референс или корректировать можно даже во время полета будет. И даже наверно автоматом, когда видим, что ускорение отсутствует и тушка реально перпендикулярно вектору гравитации летит. Ну то есть, уже дело техники алгоритма стабилизации. Можно будет подумать как реализовать функцию оценивающую вес компаса и гироскопа на основании скорости GPS и бародатчика.

короче, я очень доволен результатом. И даже то, что график магнитометра все-таки не линейный по осям, но решающего значения это не имеет, так как я все равно тяну платформу в нулевое положение относительно референса. Вот оно лежит уже на столе 2 часа, но абсолютный дрейф по всем осям (самое главное по Yaw)нулевой на 100%. Чуть позже сегодня видео запишу как оно в конечном итоге работает.

Drinker
AlexSneg:

И даже то, что график магнитометра все-таки не линейный по осям, но решающего значения это не имеет

Имеет.
Дело в том, что для акселя g всегда строго в центр земли, а вот значения по магнитометру когда он в горизонте присутствуют по всем трём осям, причем для разной местности они разные. В америке по одной из осей вообще минус.

AlexSneg:

Вот оно лежит уже на столе 2 часа, но абсолютный дрейф по всем осям

Яв может и не плывет, но угол показывает наверняка не соответствующий действительности. Найди 0 и крутись вокруг оси Z. 90 градусов будет показывать при реальном повороте где-то в 60

AlexSneg
Drinker:

q.x = sin(theta/2) * axis.x

Ой, слушай ка, Это ж формулы преобразования вектора в q. Так ты в качестве состояния тела в математической модели системы используешь x,y,z или кватернион?
У меня ни x,y,z ни phi, psy, theta вообще не существует. Я из кватерниона не смогу никак xyz достать.

А ну въехал, ты типа имея гладкую theta из кватерниона обратно арксинус и арккосинус берешь. Так?
Что-то торможу сегодня, уже праздновать начали…😃

Drinker
AlexSneg:

используешь x,y,z или кватернион

Кватернион

AlexSneg:

А ну въехал, ты типа имея гладкую theta из кватерниона обратно арксинус и арккосинус берешь. Так?

Ну да, в обратку.

Только арксинус не нужен. Фету из W доставай, считай sin(Фета), ищи x, y, z

Вот вектор и угол.
Про нормализацию не забывай.

AlexSneg
Drinker:

Про нормализацию не забывай

Да, все. Я въехал в теорию. Спасибо. В принципе решение достаточно очевидно, надо было мне самому догадаться.

Drinker:

градусов будет показывать при реальном повороте где-то в 60

да, оно так и есть, и фиг с ним. Оно же в референсе помнит, что угол=60, видит ошибку по Z составляющей от этих 60, соответственно и тянет горизонт к этому углу. Я отключу гиру, аксель и оставлю только компас для теста. Сделаю видео как оно отслеживает положение по трем осям только на компасе.

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

Drinker
AlexSneg:

Ты имеешь ввиду именно реальное направление на север относительно платформы?

Положение платформы относительно севера. Без этого навигацию для медленных и зависающих тел (коптер) не сделать. Мозг должен точно знать как расположено тело (курс) для того, чтобы вычислить в какую сторону пилить например домой или к очередной точке маршрута.
Для самиков это менее актуально, т.к. курс можно по гпс узнать.

AlexSneg
Drinker:

Без этого навигацию для медленных и зависающих тел (коптер) не сделать.

Ну вот, а если так:
_ _ _
A = M*G;
_
где M - текущий мгновенный вектор на север
_
G - направление гравитации, текущее
* - векторное произведение
Затем:
_ _ _
N = A*G;

N - должно указывать на север уже относительно текущего, мгновенного горизонта платформы

Drinker
AlexSneg:

екущий мгновенный вектор на север

Откуда он?

Только из компаса