LinuxCNC S-разгон и торможение

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение Nick »

как-то так:
только что-то сейчас не догоняю по какой формуле они скорость считают - надо спать :)

Код: Выделить всё

 

void tcRunCycle(TP_STRUCT *tp, TC_STRUCT *tc, double *v, int *on_final_decel) {
    double discr, maxnewvel, newvel, newaccel=0;
    if(!tc->blending) tc->vel_at_blend_start = tc->currentvel;
	// tc - содержит данные о предыдущем шаге, прогрессе, задании и максимальных скоростях / ускорениях
    
    // считаем дискриминант. точнее пока не его, смотрим, не проедем ли мы за необходимую точку за этот период 
    discr = 0.5 * tc->cycle_time * tc->currentvel - (tc->target - tc->progress);
    if(discr > 0.0) {
    	// вроде как такого быть не должно :)
        // should never happen: means we've overshot the target
        newvel = maxnewvel = 0.0;
    } else {
    	// а вот теперь дискриминант от d(t) =  v0*t + a*t*t/2
        discr = 0.25 * pmSq(tc->cycle_time) - 2.0 / tc->maxaccel * discr;
        // считаем новую скорость
        newvel = maxnewvel = -0.5 * tc->maxaccel * tc->cycle_time + 
            tc->maxaccel * pmSqrt(discr);
    }1
    if(newvel <= 0.0) {
    	// если новая скорость меньше 0, такого опять же недолжно быть
        // also should never happen - if we already finished this tc, it was
        // caught above
        newvel = newaccel = 0.0;
        tc->progress = tc->target;
    } else {
    	// иначе смотрим ограничения скорости и ускорения
        // constrain velocity
        if(newvel > tc->reqvel * tc->feed_override) 
            newvel = tc->reqvel * tc->feed_override;
        if(newvel > tc->maxvel) newvel = tc->maxvel;

        // if the motion is not purely rotary axes (and therefore in angular units) ...
        if(!(tc->motion_type == TC_LINEAR && tc->coords.line.xyz.tmag_zero && tc->coords.line.uvw.tmag_zero)) {
            // ... clamp motion's velocity at TRAJ MAX_VELOCITY (tooltip maxvel)
            // except when it's synced to spindle position.
            if((!tc->synchronized || tc->velocity_mode) && newvel > tp->vLimit) {
                newvel = tp->vLimit;
            }
        }
		// ускорение
        // get resulting acceleration
        newaccel = (newvel - tc->currentvel) / tc->cycle_time;
        
        // constrain acceleration and get resulting velocity
        if(newaccel > 0.0 && newaccel > tc->maxaccel) {
            newaccel = tc->maxaccel;
            newvel = tc->currentvel + newaccel * tc->cycle_time;
        }
        if(newaccel < 0.0 && newaccel < -tc->maxaccel) {
            newaccel = -tc->maxaccel;
            newvel = tc->currentvel + newaccel * tc->cycle_time;
        }
        // Обновляем текущееположение и скорость  
        // update position in this tc
        tc->progress += (newvel + tc->currentvel) * 0.5 * tc->cycle_time;
    }
    tc->currentvel = newvel;
    if(v) *v = newvel;
    /// если скорость равна максимально возможной скорости на участке - значит замедляемся перед остановкой.
    if(on_final_decel) *on_final_decel = fabs(maxnewvel - newvel) < 0.001; 
}

Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение Nick »

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

Исходные данные:
длинна периода 0.001
на протяжении всего периода jerk - т.е. ускорение ускорения на протяжении всего периода постоянно.

теперь результаты:
начальная скорость 0
начальное ускорение 0
конечная скорость 0
конечное ускорение 0

[рабочая длинна, начальное положение, макс. ускорение, макс. скорость, макс. jerk... ]
[[5.,0.,2.,1.,0.5,0.,0.],[2.,0.,200.,1000.,1200.521,0.,0.],[200.,0.,200.,1000.,1200.521,0.,0.] ]
(три теста)
финальные данные:
последняя ошибка позиционирования p -1.37866619543e-06
последняя скорость 0.00462399999988 последнее ускорение -0.068


последняя ошибка позиционирования p 0.00285488246135
последняя скорость -0.00240104200006 последнее ускорение-26.411462

последняя ошибка позиционирования p 0.0525116768057
последняя скорость -0.0240816159007 последнее ускорение -45.3952029943


Для наглядности пара графиков:
test1.png (3122 просмотра) <a class='original' href='./download/file.php?id=11035&sid=9231ae522c9124fcb2867607fb9d0812&mode=view' target=_blank>Загрузить оригинал (50.69 КБ)</a>
test2.png (3122 просмотра) <a class='original' href='./download/file.php?id=11034&sid=9231ae522c9124fcb2867607fb9d0812&mode=view' target=_blank>Загрузить оригинал (26.23 КБ)</a>
test3.png (3122 просмотра) <a class='original' href='./download/file.php?id=11033&sid=9231ae522c9124fcb2867607fb9d0812&mode=view' target=_blank>Загрузить оригинал (18.45 КБ)</a>
Третий график подглючивает... или код подглючивает... главный вопрос первого теста, реально ли при max_v=2 max_a=1 max_j=0.5 при дистанции 5 и периоде 0.001 добиться лучшего результата?
Это нормально, или я где-то туплю??? Если уменьшить период - то все сходится гораздо лучше...
Исходник тут: https://github.com/cnc-club/linuxcnc/bl ... s-curve.py (пока все тестируется на питоне, запускать просто python s-curve.py)
для запуска нужен cairoplot: http://cairoplot.sourceforge.net/
Аватара пользователя
Lexxa
Мастер
Сообщения: 2703
Зарегистрирован: 16 дек 2011, 16:48
Репутация: 319
Настоящее имя: Алексей
Откуда: ryazan
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение Lexxa »

Ник, подпиши графики, а то чет нихрена не понятно
:bender:
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение Nick »

Я так и думал.
подписать не просто - они генеряться отдельным модулем.
Самый главный вопроспо первому графику.
Зеленая линия в виде обратной сигмы - положение от времени (1/1000с).
Синяя в виде выпуклой функции - скорость.
Синяя в виде треугольной функции - ускорение.
Красная ступенчатая - jerk.

Как jerk правильно по русски назвать?


Основной вопрос - конечное ускорение последнее ускорение -0.068 и скорость 0.00462399999988
На графике видно, что они не совсем равны 0, нормально ли это?
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6192
Откуда: Казахстан.
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение aftaev »

Nick писал(а):подписать не просто - они генеряться отдельным модулем.
ручками в граф. редакторе :)
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение Nick »

щассс... что нибудь придумаем...
больше всего смущает то, что ускорение в самом конце не равно 0, т.е. будет скачек ускорения и jerk превысит свой предел... Есть у меня и другой рассчет, но он гораздо длиннее, вместо 6.5с около 7.3 с и там плавно приезжаем к нулевой скорости.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение Nick »

Вот примерно так:
Вложения
rect4497.png (3110 просмотров) <a class='original' href='./download/file.php?id=11036&sid=9231ae522c9124fcb2867607fb9d0812&mode=view' target=_blank>Загрузить оригинал (81.12 КБ)</a>
vmarkiv
Мастер
Сообщения: 516
Зарегистрирован: 21 янв 2012, 00:23
Репутация: 32
Откуда: Ивано-Франковск
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение vmarkiv »

А если изломов ускорения ( скорости ) сделать несколько ? с линейным кусочком при смене направления скорости
Аватара пользователя
Lexxa
Мастер
Сообщения: 2703
Зарегистрирован: 16 дек 2011, 16:48
Репутация: 319
Настоящее имя: Алексей
Откуда: ryazan
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение Lexxa »

сэмитировать катание туда сюда
:bender:
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2857
Откуда: Тюмень
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение Сергей Саныч »

Nick писал(а):главный вопрос первого теста, реально ли при max_v=2 max_a=1 max_j=0.5 при дистанции 5 и периоде 0.001 добиться лучшего результата?
Сдается мне, что при дискретном времени добиться точного подхода ускорения к нулю невозможно. Наверно, нужно уйти от постоянства max_j - подбирать его для каждого участка траектории. То есть, что будет, если попробовать, скажем, значения max_j=0.49 или 0.51?

PS: по переводу, думаю, jerk - "рывок"
Чудес не бывает. Бывают фокусы.
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6192
Откуда: Казахстан.
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение aftaev »

Serg-tmn писал(а):PS: по переводу, думаю, jerk - "рывок"
jerk - толчек нужен для сдергивания оси когда стоит чтобы преодолеть силу трения.
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Impartial
Мастер
Сообщения: 953
Зарегистрирован: 23 фев 2011, 01:50
Репутация: 36
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение Impartial »

Nick писал(а):Вот примерно так:
Nick фиолетовая кривая это что?
А почему S кривая получается у пути а не скорости? При обрыве кривой пути первая производная (скорость) не должна быть нулевой и ускорение тоже.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение Nick »

Фиолетовая - дистанция до остановки. Скачек наверное потому, что там 1 шаг сделан с +jerk... надо будет более подробный график сделать.

у положения в любом случае будет s-кривая. Она такая даже при постоянном ускорении.
Аватара пользователя
solo
Мастер
Сообщения: 1374
Зарегистрирован: 20 окт 2011, 18:39
Репутация: 272
Настоящее имя: Юрий Соловьев
Откуда: Украина Харьков
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение solo »

Вопрос от чайника
есть компонент
Nick писал(а):Исходник тут: https://github.com/cnc-club/linuxcnc/bl ... s-curve.py (пока все тестируется на питоне, запускать просто python s-curve.py)
надо его поместить в папку с конфигурациее в хел добавить строки читать и поместить в сервоцикл, а чего какие пины с чем соединять ???? обьясните пж. Или ече очень рано задаю эти вопросы кассательно использования :monkey:
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение Nick »

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

На сях я плохо пишу, да и дебаггить на них не удобно, поэтому сначала начал писать на питоне, чтобы потом отработанный алгоритм на си перенести.

---

Да пока рано :)
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение Nick »

На выходных опять открыл эти s-кривые... Даже Petka на помощь позвал :).

К какому выводу мы пришли:
1. Вроде как вычисления верные.
2. Скорее всего неточности появляются из-за: во-первых, квантования процесса в сумму ряда, во-вторых, в вычислениях мы вводим предположения, что например, ускорение в конце траектории равно 0, но т.к. у нас уже были заранее заданы допуски, это предположение становится не верным...
мда... как обычно написал что-то не понятное :freak:

Исходя из всего этого задумались, а как обстоят дела с этим в других системах? Можно ли где-нибудь замерить реальные параметры скорсти, ускорения и jerk во время выполнения программы? Не будет ли там каких-нибудь хитрых скачков? Каким образом обходят такую хрень?

Кстати, несколько раз получали вот такую картинку:
Т.е. сначала нормально разгоняемся, а потом jerk начинает ШИМить, чтобы попасть в нужную точку.
Вложения
test1.png (2896 просмотров) <a class='original' href='./download/file.php?id=14381&sid=9231ae522c9124fcb2867607fb9d0812&mode=view' target=_blank>Загрузить оригинал (119.64 КБ)</a>
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2857
Откуда: Тюмень
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение Сергей Саныч »

Nick писал(а):Скорее всего неточности появляются из-за: во-первых, квантования процесса в сумму ряда, во-вторых, в вычислениях мы вводим предположения, что например, ускорение в конце траектории равно 0, но т.к. у нас уже были заранее заданы допуски, это предположение становится не верным...
мда... как обычно написал что-то не понятное :freak:
Отчего же? я еще зимой писал:
Serg-tmn писал(а):Сдается мне, что при дискретном времени добиться точного подхода ускорения к нулю невозможно.
Большое количество производных только затуманивает картину. А между тем, все просто: представь, что у нас просто движение на постоянной скорости. Даже в таком случае становится невозможным при дискретном времени точно достичь конечной точки. Допустим, у нас квант времени = 1, скорость задана 1, а нам нужно попасть в точку 9,5. Как туда попасть? Да никак! Либо будет 9, либо 10.
Вот такая "квантовая механика" :hehehe:
(Планк в гробу вертится, ага :lol: )
Чудес не бывает. Бывают фокусы.
dpss
Мастер
Сообщения: 265
Зарегистрирован: 23 фев 2012, 13:40
Репутация: 27
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение dpss »

Nick писал(а): Можно ли где-нибудь замерить реальные параметры скорости, ускорения и jerk во время выполнения программы?
Самый универсальный вариант, который подходит к любому приводу - поставить внешний логгер на энкодер.Частота записи в два раза больше частоты с которой работает регулятор положения в приводе. В качестве логгера подойдет любая демо плата, где стоит какой нибудь ARM с большой внешней памятью и счетчиком с квадратурным декодером на входе. У STM, TI много таких. По записанным координатам получаем все интересующие производные. Но можно еще проще. Обычно в приводах есть контроль на ошибку по положению, т.е. смотрят разницу между текущим и командным регистром положения. Если она больше некого заданного порога, включается программа аварийной реакции, например экстренный останов. Можно пробовать разные варианты генератора скорости и смотреть будет ли происходить превышение ошибки по каждой из осей.
Аватара пользователя
Starik
Опытный
Сообщения: 136
Зарегистрирован: 13 май 2012, 21:22
Репутация: 17
Откуда: Долгопрудный

Re: LinuxCNC S-разгон и торможение

Сообщение Starik »

http://www.synthetos.com/wiki/index.php ... yG-Planner Ник, вот на это не смотрел? Ребята вроде как жерк на 6 осях на ордюне считают... И статейка даже есть какая-то...
Аватара пользователя
Lexxa
Мастер
Сообщения: 2703
Зарегистрирован: 16 дек 2011, 16:48
Репутация: 319
Настоящее имя: Алексей
Откуда: ryazan
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение Lexxa »

Serg-tmn, Либо будет 9, либо 10.
Значит ехать нужно в точку не 9.5, а в точку 95, как и делалось на всех советских чпу. И по моему на фануках до сих пор все в микрометрах меряется
:bender:
Ответить

Вернуться в «LinuxCNC»