Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Перемещение по декартовой СК
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Математика и Физика
_lukash_
Всем привет!

Нужно перемещать головку по декартовой СК. Траектории движений всегда должны быть прямыми отрезками при равномерном разгоне и торможении.
Т.е. знаем 4 величины - x,y,x0,y0, и по ним требуется рассчитать общее время перемещения (оно будет равное и для двигателя по Х, и для двигателя по оси У), максимальную скорость каждого двигателя после разгона/перед торможением, и соответственно величину ускорения/торможения для каждого двигателя. При этом уже есть некоторые заранее известные значения - максимальное ускорение, максимальная скорость.
Существуют ли какие-то наработки по этой теме? Вроде то как ниче сложного и нет, но вот к примеру остановить двигатель в нужном месте вроде тож не оч сложно, а используется ПИД регуляция со всякими формуламиsmile.gif

Нарисовал мой вариант решения (блок-схему) этого алгоритма, возможно не совсем правильную, хотелось бы услышать по этой теме несколько советов, возможно уже где-то есть красивая реализация алгоритма?

Нажмите для просмотра прикрепленного файла
uriy
Что-то меня смущает блок:
Определим путь ускорения/торможения
L_amax = (a_t^2)/2
Не нашел описания переменной a_t что это?
Насколько я помню из физики, растояние пройденное при равномерном ускорении определяется как L_amax = (a*t^2)/2.
Но если мы не начали движение откуда нам знать величину ускорения и время?
PS Прошу прощенья за оффтоп, но подобные картинки где мало цветов (тут их два черный и белый), тонкие линии и контрастные переходы лучше сэйвить в GIF, качество будет гораздо выше (не будет артефактов при переходе цветов), а объем меньше чем JPG.
_lukash_
Цитата(urasinov @ Nov 25 2007, 09:35) *
Что-то меня смущает блок:
Определим путь ускорения/торможения
L_amax = (a_t^2)/2
Не нашел описания переменной a_t что это?
Насколько я помню из физики, растояние пройденное при равномерном ускорении определяется как L_amax = (a*t^2)/2.
Но если мы не начали движение откуда нам знать величину ускорения и время?

Да, ошибка.
L_amax - ето перемещение за время ускорения/торможения. Получается, что мы его знаем еще до начала движения, т.к. мы знаем максимальную скорость V_max, и максимальное ускорение a_max - и это константы - они экспериментально потом находятся.

Я считал, что возможно только 2 варианта:
1- двигатель разгоняется до V_max с ускорением a_max, проходя путь L_amax, затем некоторое время движется с максимальной скоростью, и затем тормозит с тем же ускорением a_max до 0-ой скорости, также проходя путь L_amax. Торможение/ускорение будет регулироваться программно ,т.е. не сразу пытаемся крутить двигатель с 3000об/мин, а постепенно увеличивая обороны. Так и получится одинаковое ускорение при разгоне/торможении.

2- двигатель не успевает разогнаться до V_max, т.к. общее перемещение меньше, чем то, которое требуется для разгона+торможения до V_max. Поэтому в этом случае беру время на разгон такое же как и в первом случае ,но ускорение умножаю еще на koefA, чтоб не разгонятся до максимальной скорости и успеть затормозить.

Для этого я и считаю L_amax, чтоб потом сверить большую координату(ту, по которой перемещение больше) с величиной 2*L_amax. Так я узнаю какой вариант будет (успеет разогнаться до V_max или нет)

Пересчитал L_amax
t_amax=V_max/a_max
L_amax= (a_max*t_amax^2)/2

Возможно я еще чет не учел?

Цитата(urasinov @ Nov 25 2007, 09:35) *
PS Прошу прощенья за оффтоп, но подобные картинки где мало цветов (тут их два черный и белый), тонкие линии и контрастные переходы лучше сэйвить в GIF, качество будет гораздо выше (не будет артефактов при переходе цветов), а объем меньше чем JPG.

Ок, приаттачил с исправлением, только уже не картинкой, о оригинальным файлом от FCEditor. Возможно, так лучше будет (9Кб)

Нажмите для просмотра прикрепленного файла

Нажмите для просмотра прикрепленного файла
Tanya
Цитата(_lukash_ @ Nov 25 2007, 00:41) *
Всем привет!

Нужно перемещать головку по декартовой СК. Траектории движений всегда должны быть прямыми отрезками при равномерном разгоне и торможении.

В поставленных Вами условиях каждый отрезок будет (должен) кончаться (и начинаться с) полной остановкой - скорость=0.
Тогда в чем вопрос?
_lukash_
Вопрос заключался в том, что я хотел посмотреть на похожие уже реализованные алгоритмы, т.к. был не уверен что учел все основные моменты в своем решении.
Еще поискал, почитал, вроде нормально будет.
Всем спасибо, тему можно закрывать. Извиняйте за немного странную темуsmile.gif
Tanya
Цитата(_lukash_ @ Nov 25 2007, 13:26) *
2- двигатель не успевает разогнаться до V_max, т.к. общее перемещение меньше, чем то, которое требуется для разгона+торможения до V_max. Поэтому в этом случае беру время на разгон такое же как и в первом случае ,но ускорение умножаю еще на koefA, чтоб не разгонятся до максимальной скорости и успеть затормозить.

Тут ошибка. Разгоняться нужно всегда с максимальным ускорением. Ровно на середине отрезка знак ускорения меняется....
Равно, как и в первом случае. Путь (и время) ускорения = пути (времени) замедления
_lukash_
Цитата(Tanya @ Nov 25 2007, 18:45) *
Тут ошибка. Разгоняться нужно всегда с максимальным ускорением. Ровно на середине отрезка знак ускорения меняется....
Равно, как и в первом случае. Путь (и время) ускорения = пути (времени) замедления

Я тож сначала так хотел сделать, но потом чет по времени решил вычислять все величины. А посчитать время момента переключения ускорение-торможение не получилось.
Значит нужно будет не по времени все считать, а по импульсах с датчиков Холла в двигателях, и делать так, как Вы написали. Тогда легче будет определить середину отрезка, и точнее будет, да?
Tanya
Цитата(_lukash_ @ Nov 25 2007, 20:13) *
Я тож сначала так хотел сделать, но потом чет по времени решил вычислять все величины. А посчитать время момента переключения ускорение-торможение не получилось.
Значит нужно будет не по времени все считать, а по импульсах с датчиков Холла в двигателях, и делать так, как Вы написали. Тогда легче будет определить середину отрезка, и точнее будет, да?

Реальность сложнее наших представлений о ней (формул). Кто даст гарантию, что ускорение будет по модулю точно воспроизводиться..., и их соотношение по координатам? Возможно, что будет перебег или недобег.
Более того, ошибка в ускорении будет умножаться на время в квадрате для пересчета в ошибку в координате.
Будь у Вас шаговые двигатели, проблем было бы меньше. А в Вашем случае, действительно, надежнее следить за координатой (ведь это у Вас целевая функция?) и регулировать это дело ПИД'ом.
_lukash_
Ок, спасибо.
Ща про ПИД (в моем случае, наверно, только П-составляющая потребуется) регулирование почитаю глубже, а то только оч поверхностно знаю че это такое. А то перебег/недобег я совсем не учелsmile.gif
TSerg
Цитата(_lukash_ @ Nov 25 2007, 21:19) *
Ок, спасибо.
Ща про ПИД (в моем случае, наверно, только П-составляющая потребуется) регулирование почитаю глубже, а то только оч поверхностно знаю че это такое. А то перебег/недобег я совсем не учелsmile.gif



Без обратной связи по координатам все будет очень плохо.
uriy
В качестве обратной связи наверно подойдет что-то типа ленты с рисками как в струйном принтере. На концах сделать спошную заливку прозрачной ленты, а в рабочей области риски. И считывать все это дело оптопарой.
_lukash_
А чем не устраивают датчики Холла в двигателях в качестве датчиков обратной связи?

Там ведь еще редуктор будет, и по идее по датчикам Холла можно будет достаточно точно все это позиционировать, если считать, что если вал двигателя повернулся на некоторый угол, то _обязательно_ пропорционально этому углу переместится каретка.
Именно из-за этого и были выбраны двигатели с датчиком Холла.
alexander55
Цитата(_lukash_ @ Nov 25 2007, 00:41) *

Ваша задача типовая для устройств с числовым программным управлением.
Как я решал эти задачи.
Как делается многокоординатная система.
Каждая координата имеет обратную связь по положению.
Вы имеете линейную интерполяцию, если нужно из точки А приехать в точку Б.
Подготовка.
1.Вы считываете длину пути, как корень квадратный из квадратов перемещений по координатам.
2.Высчитываете косинусы для каждой координаты.

По таймеру выполняется:
1. Расчет показаний датчиков.
2. Замыкание следящих систем.
3. Алгоритм разгона-замедления.
4. Диспетчер интерполяций.
4.1. Расчеты приращений по координатам и новые координаты.

Все.
uriy
Цитата
1.Вы считываете длину пути, как корень квадратный из квадратов перемещений по координатам.2.Высчитываете косинусы для каждой координаты.
Что нам даст знание косинусов? По-моему гораздо удобнее знать перемещение отдельно по каждой из координат Х и У.
_lukash_
А можно немного объяснить по пункту 4 - про интерполяцию и приращение по координатам? Т.е. с самой интерполяцией я разобрался, а как ее здесь применить не оч понял.

ЗЫ Нагуглил по ЧПУ инфы, разбираюсь...
TSerg
Цитата(_lukash_ @ Nov 26 2007, 21:01) *
А можно немного объяснить по пункту 4 - про интерполяцию и приращение по координатам? Т.е. с самой интерполяцией я разобрался, а как ее здесь применить не оч понял.

ЗЫ Нагуглил по ЧПУ инфы, разбираюсь...


Я бы попробовал смоделировать другой вариант, он несколько более "свободный", но и более робастный.
Предварительно вычисляется направление движения и и на рекомендуемой линии движения определяются точки переключения разгон-стационар и стационар-торможение.
В каждый момент времени определяются текущие координаты X,Y и рассчитываются:
- направление на конечную точку
- отклонение по траверзу от рекомендованной линии движения;
Для следующего шага вырабатывается новый вектор скорости, а имеющееся отклонение устраняется регулятором типа ПИ или ПИД.
В случае достижения по одной из координат максимальной скорости или ускорения разгон прекращается.
alexander55
Цитата(urasinov @ Nov 26 2007, 18:51) *
Что нам даст знание косинусов? По-моему гораздо удобнее знать перемещение отдельно по каждой из координат Х и У.

Когда известна контурная (общая) скорость. Умножив ее на на косинус получаем приращение по координате.

Цитата(TSerg @ Nov 27 2007, 09:33) *
Для следующего шага вырабатывается новый вектор скорости, а имеющееся отклонение устраняется регулятором типа ПИ или ПИД.

Для программного управления используется П-регулятор, иногда вводится скоростная компенсация с некоторой недокомпенсацией. Это необходимо для отсутствия перерегулирований.
ПИ и ПИД используются в копировально-фрезерных станках. Там это необходимо, но требования к люфтам и т.д. здесь намного жестче.
Tanya
Цитата(TSerg @ Nov 27 2007, 09:33) *
Я бы попробовал смоделировать другой вариант, он несколько более "свободный", но и более робастный.
Предварительно вычисляется направление движения и и на рекомендуемой линии движения определяются точки переключения разгон-стационар и стационар-торможение.
В каждый момент времени определяются текущие координаты X,Y и рассчитываются:
- направление на конечную точку
- отклонение по траверзу от рекомендованной линии движения;
Для следующего шага вырабатывается новый вектор скорости, а имеющееся отклонение устраняется регулятором типа ПИ или ПИД.
В случае достижения по одной из координат максимальной скорости или ускорения разгон прекращается.

Такой подход, в принципе, правильный. Для системы с ограниченной информацией. Но возможны улучшенные варианты. Автору нужно разобраться с двигателем.
Может ли (и хочет ли) он напрямую управлять (измерять по электрическим сигналам, а не с датчика положения) ускорением, скоростью и с какой точностью...
uriy
Цитата
Когда известна контурная (общая) скорость. Умножив ее на на косинус получаем приращение по координате.
Т.е. вы предлагаете расчитать гипотенузу треугольники, затем найти синусы и косинусы углов, затем умножив гипотенузу на косинус и синус получить приращение по х и по у? Зачем столько бессмысленных операций если нам известны координаты начальной точки (х0, у0) и конечной (х1, у1). Чем вам не нравится найти приращение как разность координта х1-х0 и у1-у0?
alexander55
Цитата(urasinov @ Nov 27 2007, 12:54) *
Т.е. вы предлагаете расчитать гипотенузу треугольники, затем найти синусы и косинусы углов, затем умножив гипотенузу на косинус и синус получить приращение по х и по у? Зачем столько бессмысленных операций если нам известны координаты начальной точки (х0, у0) и конечной (х1, у1). Чем вам не нравится найти приращение как разность координта х1-х0 и у1-у0?

Речь идет о линейной интерполяции, т.е. надо выдерживать контурную скорость в каждый момент времени, причем надо находиться на траектории в каждый момент времени.
Если речь идет о позиционировании (это еще один вид интерполяции) - то так и делается.
PS. Я это знаю, потому что писал ПО для УЧПУ 2C42 (Контур Томск). biggrin.gif
_lukash_
Значит делаю как TSerg написал:
Сначала рассчитываю коэффициент для меньшей координаты.
Если случай первый, рассчитываю длины отрезков ускорение/стационар/торможение.
Далее перевожу эти длины в количество импульсов от датчика Холла(будет около 30 импульсов на 1 миллиметр)
Потом возьму какую-то переменную в качестве счетчика (по переменной на каждую ось, ее перед каждым проездом обнулять буду) и в обработчике прерывания компаратора (по импульсу от датчиков Холла) буду каждый раз ее увеличивать на 1. Там же (в обработчике прерывания) и проверять ее на равность со значениями ускорение/стационар/торможение. Так я узнаю, что пора прекратить разгон, к примеру. И так же для 2-го случая, но там просто ускорение/торможение.

Немного непонятно как мне посчитать отклонение от рекомендованной линии движения. Опять по времени?
Еще объясните доступно плз, как прикрутить к этому всему П-регулятор - получается он тоже будет корректировать скорость исходя из времени, или он будет корректировать только конечную точку, в которой нужно остановиться?

И еще один момент – сами расчеты ведутся в одном контроллере, потом он (master) контроллер передает рассчитанные данные в 2 slave МК (на каждый двигатель по МК), после чего master одновременно дает команду на пуск 2 –х двигателей. Во время движения каждый из slave контроллеров НЕ будет знать сколько в данный момент прошел второй slave, т.е. связи между ними не будет. Возможно ли обойтись без привязки по времени в данном случае?
TSerg
Цитата(_lukash_ @ Nov 27 2007, 19:10) *
Значит делаю как TSerg написал:

Немного непонятно как мне посчитать отклонение от рекомендованной линии движения. Опять по времени?


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

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

Имеется двухкоординатная система с двигателями пост.тока и датчиками положения (не снижая общности). рис.1
Нажмите для просмотра прикрепленного файла

Каждая из подсистем реализована как замкнутая по скорости, т.е. обеспечивается постоянство скорости на рабочем участке.
Для демонстрации возможностей работы такой САР в условиях значительной неопределенности введены следующие усложнения жизни.
Динамические характеристики разомкнутых систем различаются по динамике и передаточному числу. рис.2
Нажмите для просмотра прикрепленного файла

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

В канал скорости по X вводится случайная составляющая, как интеграл от белого шума с катастрофической величиной дисперсии 25% от макс.скорости. рис.4
Нажмите для просмотра прикрепленного файла

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

На рис.5 приведен график отклонения от ЛРП при работе САР без канала коррекции по отклонению.
Как видно, текущую точку значительно уводит и отклонение достигает 2 мм на 100 мм, т.е. 2%
Нажмите для просмотра прикрепленного файла

На рис.6 приведен аналогичный график при включенной коррекции. Отклонение не превышает 0.05 мм, т.е. 0.05%
Нажмите для просмотра прикрепленного файла

Отключим возмущение по скорости рис.7. Дисбаланс в каналах приводит конечно же к процессу установления, но он быстротечен и невелик, те же 0.05%.
Нажмите для просмотра прикрепленного файла

Безусловно, это всего лишь демонстрация возможностей и отнюдь не идеальная.
Все регуляторы имеют П-характер, возможно введением иных законов и нелинейностей удасться получить апериодический характер пуска и выхода на ЛРП.
Пуск производился на максимальном ускорении, если же делать его плавным, с контролируемым ускорением, то переходной процесс выглядит так - рис.8.
Нажмите для просмотра прикрепленного файла

Если же каналы максимально идентичны, то - рис.9 и переходной процесс, скорее всего, будет определятся иными факторами.
Нажмите для просмотра прикрепленного файла


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





На рис.10 приведена траектория выхода на ЛРП при несовпадающих начальных точках ЛРП и каретки.
Т.е. изменили начальные условия X0=0, Y0=-5, XT=0, YT=0
_lukash_
Это понял, спасибо.

Но еще один момент - у Вас при симуляции для расчета корректирования берутся показатели датчиков обратной связи с 2-х двигателей в данный момент. А у меня так не получится – т.е. каждый контроллер знает данные только своего двигателя. Можно ли брать для каждого контроллера вместо показателей датчиков 2-го двигателя матем. посчитан "идеальный вариант" движения второго двигателя в данный момент?
Т.е. мы будем корректировать ошибку каждого двигателя, принимая, что второй движется "идеально", и также для второго двигателя соответственно?

PS А в чем это симулировалось/можно прикрепить проект симуляции чеб самому попробовать?
TSerg
Цитата(_lukash_ @ Nov 29 2007, 00:32) *
Это понял, спасибо.



>Но еще один момент - у Вас при симуляции для расчета корректирования берутся показатели датчиков >обратной связи с 2-х двигателей в данный момент. А у меня так не получится – т.е. каждый контроллер >знает данные только своего двигателя. Можно ли брать для каждого контроллера вместо показателей >датчиков 2-го двигателя матем. посчитан "идеальный вариант" движения второго двигателя в данный >момент?
>Т.е. мы будем корректировать ошибку каждого двигателя, принимая, что второй движется "идеально", и >также для второго двигателя соответственно?

Пожалуй, что - нет. Это связанная система управления. Стабилизация по скорости у каждого канала своя, но траекторные вычисления необходимо делать на основе координат X,Y каретки.
Иначе ноги врозь пойдутsmile.gif

>PS А в чем это симулировалось/можно прикрепить проект симуляции чеб самому попробовать?

Это VisSim 6.0 ( http://www.vissim.com )
На этом сайте есть также VisSim viewer 4.0 (если нужен проект для просмотра, могу проект выложить)
Есть бесплатная версия VisSim 3.0 (с данным проектом могут быть проблемы по совместимости)
http://model.exponenta.ru/download.html



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

Кстати, вышеприведеный проект реализован в аналоговой постановке, но ничто не мешает его выполнить и в цифровой, благо VisSim это позволяет.
Справедливости ради скажу, что есть неплохой отечественный симулятор - МВТУ
http://mbty.com.ru/
_lukash_
Возможно, удастся сделать так, чтоб при расчетах использовать и текущею Х, и У. Просто эти МК (которые управляют двигателями) связаны между собой через еще один МК, причем все на одной линии УАРТА. Если это все успеет обмениваться данными вовремя, то все будет хорошоsmile.gif
Там еще скорость каждого двигателя будет регулироваться ПИ-регуляторами, поэтому, возможно отклонение и не будет оч большим без коррекции.
Плохо, что еще нет этого собранного станка, и не на чем это испытать.

Скачал VisSim, посмотрел примеры, сам опробовал в нем с ПИД разобраться - понравилосьsmile.gif Если не трудно, выложите плз ваш проект, интересно посмотреть.

Значит буду пробовать делать связь между МК, и собственно коррекцию по Х и У. Интересно будет посмотреть как это заработает на реальном станкеsmile.gif

Пока с основными вопросами разобрался, спасибо!
_artem_
посмотрите linuxcnc.org там есть сурцы для интерполятора и планировшика перемешений. Вам нужно будет линейное пермешение. Кстати обратная связ от енкодера тоже поддерживается если надо
Правда обьема там много и вопрос о том что быстрее написать самому или выташить код оттуда довольно таки спорный. Придется также разбираться с профайлами мотора ускорения вроде бы есть трапезоидный s curve синус в квадрате ... Если перемешения будут делаться непрерывно и нужна плавность и безостановочное перемешение на концах одних и началах других линий придется также изучать spline интерполяцию. В emc вроде бы кубическая функция используется. Вобшем в математике покопаться придется .

...

Есть вариант попроше ) Японцы и американцы продают чип с паралельным интерфейсом который и линейное и круговое перемешение делает . Правда цена 70 - 80 баксов за асик(японский в японии) ).
alexander55
На память ЧПУшные функции:
G0 - позиционирование
G1 - линейная интерполяция
G2, G3 - круговая интерполяция по часовой и против часовой стрелки
G4 - выдержка времени
...
G90 - абсолютное задание координат
G91 - относительное задание координат
...
TSerg
Цитата(_lukash_ @ Nov 29 2007, 22:56) *
Скачал VisSim, посмотрел примеры, сам опробовал в нем с ПИД разобраться - понравилосьsmile.gif Если не трудно, выложите плз ваш проект, интересно посмотреть.

Пока с основными вопросами разобрался, спасибо!


Выкладываю демо-проект на VisSim v.5.11

P.S. Честно говоря, настолько VisSim удобный инструмент, что не представляю уже как без негоsmile.gif)
В Сети стоит поискать фамилию Клиначев - апологет VisSim-а из Южно-Уральского универа.

Кстати, VisSim имеет открытую систему плагинов на основе самописных DLL, а также может работать
с внешними устройствами в качестве собственно системы управления.

Нажмите для просмотра прикрепленного файла
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.