Весы из одной сервы

Наконец-то осилив умножению двух fixed-point чисел удалось проверить, можно ли с помощью сервы измерять вес. На численной модели я это сделал давно, а теперь я убедился на реальной серве, что это возможно.


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

Взвешивание выглядит вот так.

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

000F
0001
003E
002C
003C


А с грузом следующие.

00D4
00A8
00BF
00DB


Шум силен, но сигнал все же различим. В качестве груза был использован конденсатор, 4мкф 1000в, наверно 200-400г веса там есть.

Алгоритм адаптации самый простой, градиентный. С МНК что-то ничего хорошего пока не вышло, даже на модели. Это могло бы значительно снизить шум.

Управление релейное, на частоте 2кГц. Дрож пока ещё не поборота полностью. Серва HXT900.

Добавка

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

0000.001D
0000.0009
0000.000F
0000.0020


С грузом.

-0000.01EA
-0000.01BA
-0000.01AC
-0000.01B2


Картинка.

Измерение веса это лишь тест для системы адаптации, чтобы понять работает оно или нет, не стоит предлагать другие варианты как это сделать.
  • +1
  • 25 августа 2012, 16:52
  • amaora

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

RSS свернуть / развернуть
Чет я не понял принцип взвешивания.
Эти цифры — это измерение чего?
0
  • avatar
  • Vga
  • 25 августа 2012, 16:56
Внешней силы приложенной к качалке сервы.
0
Эээ… Ну это и есть вес, но разве обычная серва может его определиь? Или это цифровая? Или ты ток ее питания мониторишь?
0
Э… ну я вытащил то, что там было в качестве контроллера (я думал все и так уже поняли), от сервы только мотор, редуктор и резистор остались. По данным с резистора все и измеряется.
0
О_о
0
  • avatar
  • xar
  • 25 августа 2012, 17:03
в смысле может интереснее будет рассказать про метод измерения. а то как то я, например, вообще не в теме
0
Да, только поотлаживаю ещё немного.
0
Повесив гирю на плечо и прогнав алгоритм адаптации можно оценить это внешнее усилие.

Расскажите, пожалуйста, в двух словах, как работает этот алгоритм. Что используется в качестве обратной связи (сила тока, угловая скорость или что-то еще)?
0
  • avatar
  • e_mc2
  • 25 августа 2012, 18:19
Обратная связь только по положению, то есть только переменный резистор. С силой тока боюсь все усложниться настолько, что avr это сможет провернуть только после сильной оптимизации.

Скорость оценивает наблюдатель, линейный, полного порядка, по классической схеме (то же что и в ф. Калмана, но K предпросчитана/подобрана и фиксирована, а P совсем не вычисляется).

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

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

Можно было и проще оценить внешнее воздействие, но ясно же что я не весы делаю.
0
лично мне понятно только что ничего не поняятно…
+3
Что-то ничего не понял.
А чем просто ток мерить не подходит? И серву ломать не надо, только выяснить зависимость усилия от тока. Экспериментально, например. Получим табличку для каждой конкретной сервы. У китайских серв параметры скачут в полтора раза в обе стороны от экземпляра к экземпляру, так что для каждой новой сервы новая табличка.
0
  • avatar
  • Ozze
  • 25 августа 2012, 19:30
Нет задачи «простым способом измерять усилие», есть задача опробовать более общие методы оценки параметров, не обязательно именно усилия которое имеет хорошую связь с током который можно измерять. Не всегда все будет так просто.

Детальней и проще попробую написать в ближайшее время.
0
Ладно, подождем.
Математику я помню только пока учу:)
Так что к очень навороченным статьям можно приписывать Warning! Hardcore only!
0
А чем просто ток мерить не подходит?

Насколько я понимаю, не все так просто. В серве стоит редуктор с большим коэффициентом передачи. При этом сила трения в редукторе «нелинейная» («сдвинуть редуктор с места» тяжелее чем поддерживать вращение). Да и просто двигатель (ДПТ) потребляет ток неравномерно («пусковой» ток и т. д.). То есть сила тока должна коррелироваться с нагрузкой, но это не простая линейная зависимость.
0
А зачем его сдвигать? Удерживать строго в одном положении. Скажем, держать рычаг сервы перпендикулярно силе тяжести. Груз вешать всегда в одну и ту же точку.
А далее забыть что внутри происходит. Есть система X с весом на входе и током на выходе. Вешать разные грузы и замерять ток. Получим некую кривую I=f(m), где каждому значению массы соответствует значение тока.
Смотря, какая точность требуется.
Помню, в курсе статистики была тема про исследование зависимостей одних данных от других, не известно каким законом связанных. Получалась некая кривая. К ней иногда можно даже примерно уравнение подобрать.
0
Возможно таким способом и получится выявить и аппроксимировать зависимость.

Но, ИМХО, не все так просто. Возьмем, опять же силу трения в редукторе. Если наш груз достаточно мал, то сева будет удерживаться в одном положении только за счет силы трения. Сила тяжести грузика не сможет преодолеть силу трения покоя в редукторе. А если мы немного провернем вал – то мы поможет силе тяжести преодолеть силу трения покоя и двигатель «почувствует» вес грузика. То есть, при одинаковой массе грузика, результат измерений будет разный, в зависимости от начальных условий.
Плюс, не стоит забывать, что серва это не просто ДПТ с нагрузкой на валу, а динамическая система с регуляторам и обратной связью по положению. При регулировании (удержании сервы в одном положении) постоянно происходят «переходные процессы».

Хотя, возможно, я слишком все усложняю, и на практике все действительно намного проще :) Подождем очередную статью от коллеги amaora, думаю она прояснит ситуацию.
0
А как вариант проворачивать сервопривод от нулевой точки на 90 градусов вверх на какой нибудь малой скорости? По кривой потребляемого тока анализировать нагрузку на валу. Сила трения в данном случае роли играть не будет, так как привод сам ее преодолеет.
0
Ну остается только еще придумать хитровыебанную систему пересчета тока в массу, подключить арм11 и понаставить гироскопов, читай комент снизу
0
Гироскопы то зачем? Положение вала из ОС по потенциометру. Раскачки не будет ввиду малой скорости. А система пересчета m=f(I), пусть даже будет квадратичная зависимость, параметры функции которой находятся по трем точкам на пути хода вала. Если не прав, поправьте.
0
Что за кодер видео?
0
ffmpeg
0
хрень какая-то.
0
Автор скорее всего имел ввиду то, что кондер, он же масса, влияет на характеристику ускорения всей системы. Для начала измеряется скорость хода системы без нагрузки(и ускорение в том числе) после чего измеряется уже с нагрузкой, в итоге по разнице ускорений высчитывается масса нагрузки.
Только тут есть 2 глобальных косяка — переменная длинна рычага и отсутствие гашения на раскачивание.
Проще наверное было-бы взять шаговик, повесить на вал линейный привод вертикального подвеса и собирать данные по ускорению и времени. Система уравнений тогда выглядела бы примерно так:


g1=ΔV1/t1, без нагрузки, F=g1*m1, ΔV - изменение шагов в секунду\минуту\час\етц, 
пересчитывается на имеющуюся систему, желательно с большИм передаточным числом для точности измерения.
g2=ΔV2/t2, с эталонным весом для вычисления Силы
\это с учетом, что она постоянна,иначе придется считать градиент\
(F) - F=g2*(m2+m1)=g2*(m2+F*g1), F=g2*m2+g2*F/g1, g1, g2, m2 знаем, дело за малым, 
вычислить силу, повторить расчет для измеряемой массы =)



0
Насколько я знаю, при градиентном поиске требуется частные производные по входным значениям считать. Не накладно ли в МК заниматься такой математикой? Есть методы наискорейшего спуска, подбора, где дифуров нет. И почему МНК не сработал? Плюс, существуют же разные реализации МНК, какие пробовали?
0
  • avatar
  • Amk
  • 26 августа 2012, 06:19
Здесь надо было взять производные от линейной функции, это делается мысленно, так де как диффиренцирование y=C*x, даже бумажка не понадобится. А контроллер только использует коэффициенты C. Производит умножения и сложения, не очень много.

МНК не сходится при появлении шумов (что странно, видимо где-то ошибка у меня). Но я его забросил ещё и потому, что слишком много вычислений для МК.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.