Адаптивное управление сервомашинкой. Часть 1.

Немного отвлекся от работы над контроллером BLDC чтобы изучить ТУ на более простом примере. Можно считать это продолжением постов про синтез регуляторов. Но на это раз все будет проще.

В этой части расскажу кратко обо всем. Какие возникают проблемы и как их можно решать. Я не обладаю отличным пониманием всей ТУ и могу ошибаться в некоторых местах. Так же полезно смотреть на задачи с разных сторон, если кто хорошо знаком с ЦОС и вам будет, что сказать после прочтения, то жду комментов.



Основная особенность того, что делаю я в отличи от например OpenServo это то как оценивается скорость. Но начать надо с того зачем нужна скорость. Не переходя к моделям и их строгому анализу, интуитивно ясно, что во многих случаях оптимальное по быстродействию управление это «полный вперед» а затем «полный назад» до полной остановки. И серва именно такой случай. Так вот, проблема такого управления в том, что нужно вовремя начать тормозить чтобы остановиться в заданной точке. Для этого надо знать как минимум скорость, думаю это тоже довольно очевидно. И теперь главный вопрос где взять скорость если из датчиков имеется только переменный резистор.

Самая простая идея — дифференцировать сигнал с резистора, то есть положение. Но такое бывает только на картинках, чтобы измерения не были зашумлены. Можно сделать простой расчет. Исходные данные, частота дискретизации 1кГц, амплитуда (или rms если кому угодно, суть не меняется) шума 0.5 единиц (не важно каких), и некоторая средняя скорость передвижения 500 единиц/сек. За один такт положение будет изменяться на 500/1000 = 0.5 единиц, к этому добавляется шум 0.5 единиц. А для получения скорости из этого вычитается предыдущее измерение. В сумме имеем полезный сигнал и разности двух шумовых добавок.



Почти всегда в таких случаях шум не коррелирует с самим собой. То есть следующее значение шума никак не зависит от предыдущих. В этом случае вычитание означает почти тоже, что и сложение. Это разность двух разных случайных чисел. RMS шума возрастает в двое (если считать шум нормально распределенным). То есть шумовая составляющая сравнялась или даже превысила полезный сигнал. А на низких скоростях все ещё хуже.

Как здесь недавно писалось, можно сгладить, усреднить, отфильтровать сигнал с помощью простого цифрового фильтра.



Но такой фильтр срежет вместе с шумом всю динамику сигнала. Можно понимать это как задержку.



Хорошее управление с такими данными не получится. Вариант отбрасывается как негодный. Но стоит подумать о том в чем именно здесь проблема. Что если известна форма полезного сигнала а неизвестна только его фаза? Тогда можно применить этот фильтр к корректировке фазы а форму генерировать самостоятельно. Для примера возьмем синус. Фильтр будет дискретный так что используем вот такой способ получения синуса (можете проверить, что получается именно он).



Здесь s это значение синуса в данный момент, а v это скорость его изменения. Чтобы получился синус начальные условия должны быть не нулевыми. Этот итеративный способ можно получить из уравнения гармонической функции, получая его приближенное решение на малом отрезке времени.



Это нужно ещё и для того чтобы было проще вносить поправку фазы. При использовании простой функции от времени sin(t) надо было бы определять, увеличивать или уменьшать фазу для того чтобы ошибка стала меньше. А при таком итеративном способе получения синуса, можно просто корректировать его текущее значение, и дальше алгоритм будет использовать уже это значение.

Измеряем ошибку — отклонение входного сигнала от внутреннего и вносим поправку аналогично простому фильтру первого порядка.




Только здесь остался один коэффициент k. Если было не понятно, то вот код на octave которым я генерирую данные для графиков.

ys = ys - y * 0.01;
y = y + ys;
e = xn(i) - y;
y = y + 0.05 * e;


Здесь y — это синус, ys — его скорость, то есть v, e — ошибка, xn(i) — входной сигнал. Не обращайте внимания на 0.01, это всего лишь квадрат периода дискретизации. Вот результат в виде графиков.



Для сравнения, прежний фильтр на этом сигнале.



Расписав немного этот простой фильтр первого порядка. Видим ранее не очевидное.

y = y;
e = xn(i) - y;
y = y + 0.1 * e;


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

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



Можно попытаться увеличить k c 0.05 до 0.25 чтобы дать больший вес измерениям а не предполагаемому значению.



Но тогда и шум получает больший вес и начинает проходить через фильтр. Проблема выбора оптимального k для заданной точности модели и точности измерения решается фильтром Калмана. Но ничто не мешает задавать его вручную в простых случаях.

Использование неточной модели вынуждает использовать более робастные наблюдатели с большими значениями k. А противоположностью робастности в некотором смысле является адаптация — изменение модели или её параметров во время работы в строну большего соответствия действительным. То есть можно использовать либо робастный наблюдатель охватывающий большую область и остающийся устойчивым в ней ценой не оцень хорошего качества наблюдения. Либо снизить робастность, повысить качество, а охват всей области изменения параметров системы осуществлять за счет подстройки модели, то есть адаптации.

Адаптивными могут называть разные схемы управления, не обязательно с наблюдателем. Можно адаптировать напрямую коэффициенты регулятора на основании измеряемой ошибки, так сделано например в MRAC (Model Reference Adaptive Control). Или адаптации подвергается модель которую использует наблюдатель, это называется идентификацией — получение модели по измеряемым сигналам.

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

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

Осталось сказать про само управление, когда все сигналы и параметры определены это не должно быть сложной задачей. Однако я пока ещё не нашел подходящих способов подстройки регулятора и сам использую непонятно какие коэффициенты. Хотя можно делать offline синтез о котором я писал ранее, более интересны способы нахождения регулятора без прерывания работы системы.

Первая часть на этом похоже заканчивается.
  • +1
  • 27 августа 2012, 18:46
  • amaora

Комментарии (7)

RSS свернуть / развернуть
Я так понял, что вы реализовали этот фильтр. Или я неправильно вас понял?
0
  • avatar
  • e_mc2
  • 27 августа 2012, 19:20
Именно его нет, но у меня не сильно сложнее. Про модель сервы я ещё не успел написать, здесь были только примеры.
0
А что Вам не нравится в измерении BEMF? В опенсерво плата ж стоит прямо рядом с двигателем. Помехи там могут быть только ВЧ от МК ну или если кто-то делает электросварку очень близко ;) (ах, да, еще ж искрение коллектора, как вариант). С аппаратной точки зрения тоже всё не очень сложно. Другой вопрос, что из-за метода измерения нельзя выжать из двигателя вообще всё.
0
Наигрался уже с измерением BEMF на BLDC.
0
«Картинки не грузяццо.» Причем, почему-то, выборочно, часть есть, а часть отсутствует :(
0
  • avatar
  • evsi
  • 28 августа 2012, 11:39
Эта часть, случаем, не формулы? Они динамически запрашиваются у какого-то онлайнового ТеХ-рендера. Возможно у тебя проблемы с доступом к нему, или он лежит иногда. В адресе картинки, впрочем, формулу в теховом формате можно подсмотреть.
0
Да, уже ожило.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.