Квадрокоптер. Акселерометр и Гироскоп.
- Войдите на сайт для отправки комментариев
Доброго времени суток. Заинтересовался программной стороной квадрокоптеров и сталкнулся с вот такой проблемой: на плату управления часто ставят гироскоп и аккселерометр. Сперва при помощи комплементарного фильтра об[твердый знак]единяют показания обоих датчиков и получают более-менее точные значения углов и ускорений по всем 3-м осям. Затем используются ПИД-регуляторы. Требуемые значения углов получают от ШИМ приемника радиоуправления. А требуемые значения ускорений? Или пид для ускорений не считается, стабилизация идет только по гироскопу, а аксель используется для компенсации ухода гироскопа? (Хотя в MultiWii пиды считаются только для 3-х углов, что делают с акселем я так и не понял, код не понятный)
Не понял вашего вопроса..
ТС, вы бы не с железа начали, а с теории. что нужно для движения аппарата, что для стабилизации при отсутствии/наличии внехних возмущений.. а у ж потом бы размышляли о ПИД-регуляторах, которые выполняются между прочим программно, а не аппаратно.
Аппаратно всё как раз просто, на входы вешаются датчики (акселерометр, гироскоп, меритель заряда аккума и т.п.) приёмник или приёмопередатчик.
Я и начал с теории. И это теоретический вопрос. И я знаю, что ПИДы программно реализуемы.
Касательно вопроса: я его решил. Оказалось, что Аксели в мультивии (про других утверждать не могу - не смотрел) используются только чтобы устранить уход нуля гира. По-этому я решил следующие: в состоянии покоя (т.е. когда нет комманд от пилота) стабилизация идет по ПИДам с Аскселей и Гир. В случае движения, канал ПИД по той оси, по которой задана комманда на движения (т.е по тем осям, по которым коптеру надо двигаться) просто не учитывается. Да, неидельно, скажу больше: ГЛУПО и НЕЭФФЕКТИВНО, но все равно лучше, чем в мультивии, где аксели непосредственно в задачи стабилизации не учасвуют (см. выше). Если я ошибся, с радостью выслушаю конструктивную критику.
ну смотрите, вам нужно двигаться, допустим требуется подъём (ось z). у вас гироскоп молчит, акселерометр выдаёт значение ускорения по оси z. Параметры поступают в регулятор, и он начинает старательно выполнять свою функцию: выдаёт команду на компенсацию возмущения. В итоге вы хотите в верх, а регулятор туда не хочет. конфликт. для того чтобы движение таки произошло, нужно влиять на соответствующие коэффициенты регулятора или как вариант просто игнорировать стабилизацию по заданной оси. последнее возможно упрощает алгоритмы управления.
хотя я с вами согласен, не эффективно, правильнее задавать движение вектором. а уж регулятор пусть думает, по какой оси какой наклон держать, какое ускорение выдавать и далее на какой конкретный винт чего и сколько выдать..
На вашем месте я бы не изобретал велосипед.. Купите ardupilotmega или КК контроллер.
В итоге вы хотите в верх, а регулятор туда не хочет. конфликт. для того чтобы движение таки произошло, нужно влиять на соответствующие коэффициенты регулятора или как вариант просто игнорировать стабилизацию по заданной оси.
Именно это я и предлагал. По этому, на мой взгляд, самое лучшее решения - передовать ПИДу в качестве значения, к которому он должен стремиться (Az0 и аналогично для других осей) текущее значения ускорения.
Вот примерно так. Так же надо учесть, что если коптер без угловых скоростей, но под действием, к примеру ветра, движется, то ПИД по ускорению захочет
откланить коптер, чтобы остановить движение, а ПИД по углу этому воспративется. В таком случае надо отключать пид
по углу.
На вашем месте я бы не изобретал велосипед.. Купите ardupilotmega или КК контроллер.
Или залить в контроллер MultiWii (как я и хочу поступить для начала). Но просто - не интересно, хочется поковырятся. Плюс есть пара идей, которые отсутсвуют в других проектах, и которые я надеюсь реализовать.
считайте всё сразу в виде векторов.
состояние покоя это -1g по z и x, y=0, соответственно двигатели создают +1g вверх равномерно.
дунул ветер скажем по x=+0.1g, соответственно новый вектор равновесия +1g вверх и -0.1g. для того что бы его обеспечить, что бы его обеспечить правый винт тормозим, левый разгоняем. коптер при этом наклоняется, горизонталь по x отслеживаем по гироскопу. т.к. акселерометр наклонился, по z станет не -1g, а несколько меньше, а по x появится ускорение которое вычтется от ветра, хотя фактически мы ещё по ветру плывём. чтобы не путаться, вектора акселерометра нужно пересчитать относительно неподвижной земли (углы наклона знаем, векторы сил относительно коптера знаем - считаем). итого новое состояние равновесия: коптер борется с ветром и наклонён, векторы по осям какие получились, но с точки зрения стороннего наблюдателя висит на месте.
для начала решите проблему такого счёта, а уж потом можно будет думать, как должна изменяться, нарастать и спадать скорость винтов для обеспечения заданных векторов.
векторная форма по идее должна быть универсальна, и пригодна не только для данного аппарата, но и даже для наземных устройств (например контроль скольжения машинки)
чуть погодя хочу попробовать собрать измеритель ускорений, а это по сути практически тоже самое, только без винтов (типа едешь на чём нибуль, а оно показывает вектор ускорения пусть даже хотя бы в У.Е.)
В принципе, под Ax, Ay и Az я подразумевал (ну да, надо было ясно это сказать!) не показания акселя, которые зависят, как вы сказали, еще от наклона акселя, а ускорения коптера относительно земли (в системе отсчета, связанной с землей), в системе координат у которой Z вертикальна, X, Y соотв. горизонтальны. Т.е то, что вы и предлагаете. Эти ускорения получаются проецированием вектора ускорения от акселя на вышеупомянутые оси. Мы ведь знаем угол поворота коптера по всем осям (гироскоп в помощь). И ПИДы оперируют ускорениями и углами именно в этой системе координат, а не в системе координат, связанной с коптером.
В целом общий план работы програмы стабилизации мне видится такой:
два вопроса
1. как компенсировать плавный дрейф аппарата в состоянии равновесия вызванного неточностью датчиков и ошибками регулирования? (например коптеры для видеосъёмки как то это решают, висят по несколько минут в одной точке на улице)
2. как борятся с вращением вокруг центральной оси коптера, которое неизбежно должно возникать? (или как его намеренно повернуть)
Начну со второго вопроса: для определения угла поворота по вертикальной оси используется гироскоп и электронный компас.
Вопрос номер 1: пока определенных мыслей нет. Но есть неопределенные соображния:
1) У гироскопа уходит нуль, но его можно уточнять при помощи акселя, который в состояни покоя (или равномерног прямолинейного движения, что в реальности почти невозможно) "знает" где земля (значение -1g по Z оси), который будет в моменты неподвижности возвращать нуль гироскопа
2)Акселерометр шумит на более-менее высоких (по сравнению с возможной скоростью реакции коптера) частотах. Поэтому для определения скорости и положения он подходит плохо - накапливается ошибка, но для задачи сиюсекундной стабилизации по ускорениям - я думаю его шум не скажится на стабилизации. Достаточно отфильтровать сигнал, с частотой выше нескольких герц.
Что касается ошибок управления- тут сложнее, но, возможно, в следствии инерции коптера они будут погашены (точнее, только мелкие)
Не стал создавать отдельную тему, тем более что по сути вопрос к месту..
Итак, изучаю комплементарный фильтр, его работу. Одна из его составляющих - фильтр нижних частот для данных с акселерометра.
Но вот в чем дело - на вики (раздел Discrete-time realization) формула звучит как y[i] = a*x[i] + (1-a)*y[i-1]
в то время как пракически на всех других ресурсах, посвященным фильтру, эта формула выглядит иначе: y[i] = a*y[i-1] + (1-a)*x[i]
источники:
web.cecs.pdx.edu/~ece2xx/ECE223/Slides/DTFilters.pdf
www.instructables.com/id/Segstick/step10/A-very-flattering-filter/
sites.google.com/site/myimuestimationexperience/filters/complementary-filter
web.mit.edu/scolton/www/filter.pdf
в википедии ошибка? или я чего-то не уловил...
Но вот в чем дело - на вики (раздел Discrete-time realization) формула звучит как y[i] = a*x[i] + (1-a)*y[i-1]
в то время как пракически на всех других ресурсах, посвященным фильтру, эта формула выглядит иначе: y[i] = a*y[i-1] + (1-a)*x[i]
Поменяйте в последней формуле слагаемые местами, т.е. перепишите y[i] = a*y[i-1] + (1-a)*x[i] в виде y[i] = (1-a)*x[i] + a*y[i-1]
Введите коэффициент b=1-a и впишите его в получившуюся формулу.
Получите следующее:
y[i] = b*x[i] + (1-b)*y[i-1]
Теперь ищите различия с формулой из Вики.
Согласен. Но с чего вдруг вводится некий b = 1-a
a = dt/RC+dt, а не 1-(dt/RC+dt)
1. как компенсировать плавный дрейф аппарата в состоянии равновесия вызванного неточностью датчиков и ошибками регулирования? (например коптеры для видеосъёмки как то это решают, висят по несколько минут в одной точке на улице)
У parrot at.drone для этого используется камера, которая смотрит вниз
Но с чего вдруг вводится некий b = 1-a
a = dt/RC+dt, а не 1-(dt/RC+dt)
Ну а с чего вдруг - при наличии такой единицы измерения, как Ом - вводится еще и Сименс? Рискну предположить, что для удобства представления того или иного физического явления в математических формулах.
The following pseudocode algorithm will simulate the effect of a low-pass filter on a series of digital samples:
в каком месте тут произошел переход от (a) к (1-а)?
тем не менее, (а) рассчитывается во всех случаях одинаково, но уравнения фильтра почему-то различаются
Ну еще один пример вам для понимания проблемы (вполне можно назвать ее проблемой "выеденного яйца"):
Производная функции f(x) определяется как отношение изменение значения функции к изменению аргумента:
f(x)'=df/dx
При численном определении производной имеем либо
f(x)=(f[i+1]-f[i])/(x[i+1]-x[i]), либо
f(x)=(f[i]-f[i-1])/(x[i]-x[i-1])
формулы "разные", а результат - один.