flybrain. передатчик + приемник + автопилот. powered by stm32
вычисляю, но у меня Roll не крутится
Насколько я помню, ты ввел дополнительную логику защищающую алгоритм горизонта от неопределенностей.
Или теперь все “гораздо проще”? 😃
И у меня не крутицца, а честно ложится “на спину”
На видео вижу график pitch, про roll ничего не вижу. Можешь одновременно показания pitch + roll + yaw совместить разными цветными линиями?
Я вычисляю, но у меня Roll не крутится
Дельтами по углам работаешь, при этом постоянно изменяя референсное положение? У тебя положение тела кватернионом описывается?
На видео вижу график pitch
Это ролл. Специально только его выводил, чтобы мешанины не было. В примере ролл прыгает от 0 до 180 град при переходе питча через 90 град.
Можешь одновременно показания pitch + roll + yaw совместить разными цветными линиями?
Щя сделаю.
Яв гад, мешает на графике - затирает линии ролла и питча. Оставил тока их. Ролл красный, питч синий. Все отлично видно.
Ролл красный, питч синий
Ну, ролл то почему у тебя поплыл? Он не должен плыть. Ты же ось ролл не вращаешь. С какого бодуна он вдруг на 180 развернулся?
Еще раз. Если ты берешь плату, ставишь ее горизонтально и начинаешь вращать pitch, то изменяться по кругу должен только один угол - pitch.
У тебя же мы наблюдаем как раз обсуждаемый эффект. Поначалу roll = 0, а pitch растет. Начиная с какого-то момента pitch ~80 градусов, roll резко начинает расти. И растет до тех пор, пока pitch не выйдет с другой стороны. Сделай масштаб мельче по временной оси для первого подъема графиков, ты увидишь сразу.
С какого бодуна он вдруг на 180 развернулся?
Да потому что тело НА СПИНУ ложится и после 90 градусов питча летит в противоположную сторону.
Самолет переворачивается, понимаешь? Хотя вращения вдоль оси Х нет. Но нас интересует ролл и питч относительно ЗЕМЛИ.
pitch ~80 градусов, roll резко начинает расти.
Ничего подобного.
Я понял, мы о разных вещах говорим. Ты очевидно говоришь об углах поворота платы как таковых. А я говорю о положении платы относительно земли. В твоей нотации, да ролл не должен прыгать. Но это несколько другая задача.
Вот в фишке 30-й например, есть режим удержания горизонта - положение платы по отношению к земле. И есть режим удержания углов по трем осям - это отслеживаются повороты платы по её собственным осям.
Но если опираться только на собственное вращение платы, то через некоторое время мы окажемся несколько в ином положении относительно земли, чем думает алгоритм. Погрешности, дрейфы никто не отменял.
Всё, я тебя понял.
Ничего подобного
Смотри внимательно на свои графики. Есть точка пересечения pitch = roll = 90
И это не абстрактные углы, а вполне конкретные, вычисленные твоим алгоритмом в момент времени t
Но нас интересует ролл и питч относительно ЗЕМЛИ.
В этой точке имеем самолет развернутый на 90 градусов по roll относительно земли по твоим графикам.
И на самом деле по барабану, кто как хочет это назвать. Главное факт в цифрах и графиках. Попробуй визуализировать свой график и ты увидишь в точке pitch=90 не просто линию, как ты видишь на графике, а увидишь винтообразное вращение тела. Особенно если еще yaw подключишь.
то через некоторое время мы окажемся несколько в ином положении относительно земли, чем думает алгоритм
Нет, не окажемся, так как есть начальное референсное положение и есть коррекции по акселю и компасу, а это абсолютные измерения. Да с дрейфом вокруг нуля, но абсолютные.
Смотри внимательно на свои графики. Есть точка пересечения pitch = roll = 90
Да не, такие графики из-за того, что цыфры в ком порт идут с большим интервалом, по-этому четкие вертикали не получаются. Это проверено однозначно. Я в коде вставку делал, которая запоминает ролл и питч в районе 90 град. с частотой работы фильтра, затем выводил эти циферки. Все чотко - ролл встает или на примерно 180 или на -180 в момент перехода питча через 90 град.
Почему примерно 180 или -180? Потому что невозможно ручками перемещать ось Х строго в вертикальной плоскости, а ролл при задранном питче больше зависит от наклона платки уже по оси Z.
Короче надо делать стенд лабораторный и по уровням - отвесам выставлять.
А оно надо?
Кстати и яв перекладывается на противоположное направление. Всё правильно.
Да не, такие графики из-за того, что цыфры в ком порт идут с большим интервалом, по-этому четкие вертикали не получаются. Это проверено однозначно.
Ну не может такого быть чисто математически. Не может функция арктангенса внезапно перепрыгнуть 0 -> 180. К тому же я вижу четкие закругления roll, когда оно от нуля вверх ползти начинает, значит есть промежуточные положения, иначе была бы прямая линия без закругления. А в середине, когда ты pitch раскачиваешь, вообще четко дуги видно и в ноль не перекидывается. Покажи формулы для расчета roll-pitch-yaw из кватерниона. Или у тебя не кватернион состояния?
Или у тебя не кватернион состояния?
ЕКФ, кватернион.
К тому же я вижу четкие закругления roll,
Я же говорил, трудно мне держа пальцами чотко двигать платку. В том опыте паразитные вращения присутствуют.
Покажи формулы для расчета roll-pitch-yaw из кватерниона.
Стандартные формулы:
Roll = atan2(2*(q0*q1+q2*q3), q3*q3-q2*q2-q1*q1+q0*q0); //рад
Pitch = -asin(2*(q1*q3-q0*q2));
Yaw = atan2(2*(q0*q3+q1*q2), q1*q1+q0*q0-q3*q3-q2*q2);
Да, и линии, проходящие через пики питча как раз прямые.
Держи цифири:
первая - питч, вторая - ролл, третья яв
Дрожжание около 88-89 градусов питча - дрожжание рук.
0.83,71.17,18.78,-0.58 0.88,71.45,18.98,-0.58
0.65,71.68,18.77,-0.58
0.91,71.92,18.75,-0.59
0.08,72.11,18.03,-0.59
0.06,72.48,18.03,-0.59
0.04,72.95,18.01,-0.60
0.24,73.16,17.88,-0.60
-0.15,73.48,17.74,-0.60
-0.26,73.60,17.91,-0.59
0.07,73.74,17.68,-0.59
-0.15,73.97,17.78,-0.59
-0.06,74.22,18.19,-0.58
0.32,74.58,18.02,-0.58
0.24,74.85,18.28,-0.58
0.30,74.88,18.09,-0.57
0.43,75.08,18.24,-0.57
0.41,75.39,18.05,-0.57
0.63,75.55,18.50,-0.56
0.54,75.76,18.27,-0.56
0.50,75.92,18.22,-0.56
0.61,76.03,18.37,-0.56
0.79,76.41,18.45,-0.56
0.70,76.71,18.52,-0.56
0.87,76.75,18.40,-0.56
0.51,77.01,18.10,-0.56
0.53,77.25,18.08,-0.56
0.65,77.22,18.45,-0.57
0.56,77.36,18.10,-0.57
0.36,77.56,17.91,-0.57
0.58,77.70,18.40,-0.57
0.80,77.74,18.27,-0.58
0.56,78.10,18.13,-0.58
0.57,78.32,18.11,-0.58
0.56,78.60,18.43,-0.57
1.00,78.70,18.56,-0.57
0.91,78.98,18.39,-0.57
0.56,79.14,18.24,-0.57
0.67,79.34,17.91,-0.57
0.23,79.55,17.89,-0.57
0.42,79.80,18.03,-0.57
0.38,79.86,17.90,-0.57
0.44,79.97,17.77,-0.56
-0.09,80.10,17.07,-0.56
-0.83,80.19,16.53,-0.56
-0.78,80.13,17.31,-0.56
-0.46,80.18,16.88,-0.56
-0.73,80.39,16.84,-0.56
-0.83,80.48,16.73,-0.56
-0.80,80.48,16.82,-0.56
-0.62,80.60,16.83,-0.56
-0.90,80.79,16.74,-0.56
-0.53,80.84,17.14,-0.56
-0.22,80.90,17.26,-0.56
-0.41,80.99,17.14,-0.56
-0.48,81.23,16.53,-0.56
-0.99,81.36,17.16,-0.56
0.20,81.52,17.64,-0.56
0.22,81.69,17.70,-0.56
0.09,81.84,17.47,-0.56
-0.14,81.89,17.30,-0.56
-0.08,81.87,17.40,-0.56
0.14,82.08,17.74,-0.57
0.23,82.17,17.38,-0.57
-0.21,82.22,17.31,-0.57
-0.10,82.23,17.31,-0.57
-0.06,82.35,17.39,-0.57
-0.02,82.43,17.29,-0.58
-0.16,82.62,17.38,-0.58
0.25,82.65,17.52,-0.58
-0.26,82.74,17.03,-0.58
0.12,82.97,17.65,-0.59
0.01,83.28,17.10,-0.59
0.37,83.39,18.10,-0.59
1.16,83.40,18.18,-0.59
0.39,83.56,17.70,-0.58
0.08,83.64,17.02,-0.58
-0.38,83.61,17.15,-0.58
-0.29,83.59,16.83,-0.58
-0.77,83.79,16.33,-0.58
-1.02,83.86,16.28,-0.58
-1.24,83.85,16.04,-0.58
-1.02,83.86,16.33,-0.58
-1.62,84.01,15.66,-0.58
-1.29,84.04,15.73,-0.59
-1.99,84.05,15.40,-0.59
-1.92,84.06,15.30,-0.59
-1.69,84.14,15.96,-0.59
-0.89,84.19,16.86,-0.61
-0.09,84.21,16.82,-0.61
-0.77,84.24,16.87,-0.61
0.55,84.35,17.49,-0.61
-0.57,84.29,15.98,-0.62
-1.61,84.28,15.62,-0.62
-1.17,84.34,16.31,-0.62
-1.20,84.48,15.72,-0.62
-1.85,84.47,15.47,-0.63
-2.18,84.40,14.54,-0.63
-3.39,84.35,14.13,-0.63
-2.40,84.47,14.93,-0.63
-2.89,84.55,14.21,-0.66
-3.22,84.55,14.01,-0.66
-3.32,84.82,13.63,-0.66
-3.08,85.12,15.47,-0.66
0.04,85.47,17.44,-0.66
0.13,85.56,17.17,-0.66
-0.07,85.76,17.22,-0.66
-0.24,85.87,17.08,-0.66
0.28,85.87,17.19,-0.66
-0.31,85.90,16.67,-0.68
-1.25,86.02,15.56,-0.68
-1.23,86.03,16.87,-0.68
0.61,86.06,17.40,-0.68
-0.75,86.11,16.24,-0.68
0.39,86.15,18.80,-0.68
1.69,86.28,18.43,-0.68
1.00,86.34,18.56,-0.68
2.08,86.51,19.42,-0.71
3.34,86.82,21.45,-0.71
4.48,87.15,21.89,-0.71
5.98,87.32,24.25,-0.71
8.99,87.37,26.93,-0.71
9.73,87.51,26.79,-0.71
9.12,87.46,26.31,-0.71
10.02,87.52,27.53,-0.71
10.86,87.57,28.56,-0.71
11.34,87.64,27.98,-0.73
10.52,87.66,27.33,-0.73
9.36,87.67,25.79,-0.73
8.38,87.67,25.90,-0.73
9.24,87.84,25.88,-0.75
6.32,88.01,22.37,-0.75
4.79,88.06,21.26,-0.75
2.12,88.07,18.17,-0.75
-0.45,88.16,14.04,-0.75
-5.60,88.20,11.74,-0.75
-2.58,88.20,15.57,-0.75
-0.73,88.18,16.69,-0.75
-0.13,88.21,16.11,-0.75
-1.58,88.33,16.08,-0.75
1.43,88.51,18.98,-0.75
2.90,88.56,21.39,-0.75
5.14,88.60,20.26,-0.75
1.42,88.52,18.62,-0.75
1.56,88.60,18.21,-0.75
-0.61,88.70,14.65,-0.75
-2.87,88.84,14.06,-0.75
-6.45,88.91,8.01,-0.75
-8.87,88.91,11.46,-0.76
-8.36,88.91,6.14,-0.76
-12.50,88.95,3.00,-0.76
-15.75,89.11,-0.23,-0.76
-18.38,89.14,-0.23,-0.77
-17.10,89.17,-2.18,-0.77
-25.29,89.30,-14.01,-0.77
-35.72,89.51,-14.56,-0.77
-30.35,89.58,-16.71,-0.78
-35.37,89.68,-16.60,-0.78
-50.48,89.93,-128.19,-0.78
-158.21,89.64,-146.95,-0.78
Кстати, четвертая цыфра - высота по bmp085
У тебя в этом логе только приближение к pitch 90
вот у тебя конец лога. Ты почти приблизился и пошел эфект плавного переворота.
-0.61,88.70,14.65,-0.75 -2.87,88.84,14.06,-0.75 -6.45,88.91,8.01,-0.75 -8.87,88.91,11.46,-0.76 -8.36,88.91,6.14,-0.76 -12.50,88.95,3.00,-0.76 -15.75,89.11,-0.23,-0.76 -18.38,89.14,-0.23,-0.77 -17.10,89.17,-2.18,-0.77 -25.29,89.30,-14.01,-0.77 -35.72,89.51,-14.56,-0.77 -30.35,89.58,-16.71,-0.78 -35.37,89.68,-16.60,-0.78 -50.48,89.93,-128.19,-0.78 -158.21,89.64,-146.95,-0.78
Давай так. Сделай файл подлиннее, только двигайся по pitch медленно и несколько раз, стараясь держать плату горизонтально пройдешь питч несколько раз от 45 <-> -45 с переходом через 90. Давай мне свой текстовый файл, я его тебе визуализирую на экране и дам видео посмотреть. вот тогда ты сам убедишься. А можешь еще чего накрутить, чтобы мы красивую картинку посмотрели. Потряси там платку всяко разно.
Формулами ты пользуешься теми же, что и я 😃 Значит эффект есть, не может не быть. Давай длинный лог мне в личку зашли или тут ссылку дай на закачку.
эфект плавного переворота.
-0.61,88.70,14.65,-0.75
-2.87,88.84,14.06,-0.75
-6.45,88.91,8.01,-0.75
-8.87,88.91,11.46,-0.76
-8.36,88.91,6.14,-0.76
-12.50,88.95,3.00,-0.76
-15.75,89.11,-0.23,-0.76
-18.38,89.14,-0.23,-0.77
-17.10,89.17,-2.18,-0.77
-25.29,89.30,-14.01,-0.77
-35.72,89.51,-14.56,-0.77
-30.35,89.58,-16.71,-0.78
-35.37,89.68,-16.60,-0.78
-50.48,89.93,-128.19,-0.78
-158.21,89.64,-146.95,-0.78
Ага, щяс. Афигенно плавно, учитывая частоту 250герц. Целых 0.056 секунды длился процесс.
Ты что, хотел чтобы мгновенно?
Формулами ты пользуешься теми же
Вообще-то других и быть не может.
Ставим самоль на бок под 90 градусов, чем точнее, те лучше. А теперь пробуем вращать его медленно вокруг pitch оси.
А этот опыт зачем? Если так делать, то только яв будет меняться.
Ты что, хотел чтобы мгновенно?
я бы хотел, чтобы вообще никак. И дело не во времени, сколько он длится, а в том, что даже по твоим цифрам, если самолет попадает в -25.29,89.30, и там зависает, то ты не знаешь какой у тебя roll. И реально твои цифры говорят о том, что в промежутке от 85…95 ты будешь иметь зону неопределенности. Много ли это 10 градусов? По моим понятиям это дофига. Или ты будешь пытаться рулить в этом промежутке?
А этот опыт зачем? Если так делать, то только яв будет меняться.
Проделай на своей платформе, только с визуализацией вращающегося тела, а то не поймешь. В свои собственные цифры ты не веришь.
Короче, Алекс похоже не может “пощупать”, что такое углы Эйлера 😃
Каждый следующий угол отсчитывается от предыдущего. Они так построены. Обычно все используют последовательность YPR, ( Yaw Pitch Roll ) но можно делать и RPY, никто не запрещает.
тогда ничего крутится при 90 градусном тангаже не будет…
Вообще откуда эта непонятная привязанность - что надо управлять по углам эйлера, которые в принципе не могут описать вращение полностью, как широта и долгота- земной шар?
Ребята, вы столько страшных слов наговорили - а не поясните и мне заодно, как-нибудь посермяжнее: на входе фильтра Калмана при перевороте получается разрыв - от 180 градусов до -180. Фильтр от этого просто дичает. Как “свернуть” шкалу и сделать непрерывной? Только, если можно, без страшных слов 😃 Хорошо, когда складываешь целые числа - и проблемы нет, после 0xFFFF следует 0. А как бы здесь извратится? Простите, если вопрос глупый - ну ни разу ни арихметик я.
Калмана при перевороте получается разрыв - от 180 градусов до -180. Фильтр от этого просто дичает. Как “свернуть” шкалу и сделать непрерывной?
Ё-ма-ё. Не буду более пугать народ пустой дискуссией. Автор подрастет, пооботрецца в этом вопросе и всё будет пучком.
Или ты будешь пытаться рулить в этом промежутке?
Вам бы полетать реально, батенька. Или начать двигаться к реализации стаба. Там эти вопросы и отпадут.
Ё-ма-ё. Не буду более пугать народ пустой дискуссией. Автор подрастет, пооботрецца в этом вопросе и всё будет пучком.
эээ… Что-то не понял ответа. Откровенно говоря, меня больше волнует своя железка - поскольку тут пир горой, может и мне чего с барского стола перепадет. Или ответ уже был, да я не разглядел его за забором слов? У меня-то все значительно проще - всего одну ось стабилизировать надо, глобальных задач не решаю, в космос тоже не лечу.
А если у кого что-то и пучком будет - я ж только рад за него. Хотя и свой пучок тоже бы неплохо.
получается разрыв - от 180 градусов до -180. Фильтр от этого просто дичает. Как “свернуть” шкалу и сделать непрерывной?
Если вместо одной переменной “угол a” использовать пару (x1=cos(a), x2=sin(a)), то разрыва нет.
У (sin(a), cos(a)) обе компоненты гладко растут/убывают при переходе через 180град.
Поэтому считают в кватернионах. Вместо трех углов будет четыре переменных,
каждая из них - “замес” из синусов и косинусов.
Фильтр от этого просто дичает
Фильтр это просто набор операторов. Если у тебя фильтр дичает от углов, то ты неправильно модель построил.
Самое простой вариант, если в твоей модели критично находится именно в диапазоне +180,-180 можно после всех апдейтов открутить угол в нужную зону искусственно. Но какой-то диапазон странный, обычно удобнее оперировать 0 - 360
Если у тебя одна ось, то непонятно откуда ты там сингулярности надыбил, у тебя чисто синусы и косинусы в худшем случае должны быть, если это процесс вращения.
эээ… Что-то не понял ответа
В самом фильтре, будь то калман, дсм и прочие, никаких разрывов нет. Разрывы получаются так сказать искусственно в процессе преобразования кватерниона, взятого из фильтра в углы эйлера. В вышеописанной байде скачок ролла с 0 до 180 град при переходе через питч 90 град очень кстати, потомучто самик в этот момент на спину ложится, а стабилизатор его тутже переворачивает в нормальное положение. Но это плюс сугубо для реализации стаба. Это какбэ по-простому я постарался объяснить.
2 varvar и ещще нужно чотко понимать, что интерпретировать результаты работы фильтров можно по-разному. Переход на углы эйлера - один из вариантов.
А для полетов по камере, в коей теме мы находимся, очень важна именно система стабилизации, которая не даст самику уходить за некие предельные углы по крену и тангажу (и конечно тангаж в 90 градусов тут совсем не нужен).
Задача автопилота задавать углы относительно земли, а стаба - удерживать их. В этой задаче ±45 град по крену и тангажу за глаза хватает.
Вообще откуда эта непонятная привязанность
Посмотри в любой открытый код любого автопилота. Конечный алгоритм стабилизации всегда опирается на углы Эйлера при оценке положения тела. Так что это не я придумал.
У меня персонально нет привязанности никакой. Мне просто нужны углы наклона тела ко всем трем осям + направление вперед в любой момент времени для дальнейшего программного анализа. А стандартный, общеупотребительный набор формул не дает этого сделать в любой момент времени. А то, что Дринкер считает, что наличие неопределенности положения в определенных обстоятельствах это правильно, так это его дело. Я для себя так не считаю, только и всего. Доказывать кому-то, чего-то у меня задача сейчас так не ставится. А вообще то по большому счету, у нас ведь с Дринкером разногласие не в математике или кривой реализации алгоритма вращения ( и у него и у меня все одинаково работает), у нас с ним разногласия в том как результаты интерпретировать.
Каждый следующий угол отсчитывается от предыдущего. Они так построены
Вообще-то изначально углы Эйлера это базис. Другое дело, вращение тела в этом базисе. Вероятно так и придется кватернион преобразовывать в читабельный вид, через расчет кватерниона вращения от предыдущего состояния к новому. Сейчас я эту тему отложил до праздников, надо получше все обдумать.
А то, что Дринкер считает, что наличие неопределенности положения в определенных обстоятельствах это правильно, так это его дело
Дринкер считает, что неоправдано заморачиваться с проблемой исходя из соотношения гимор / актуальность.
Большинство проектов летают при наличии этой проблемы. У Дринкера кстати тоже.