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

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

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

Сообщение Nick »

Ухты скомпилировалось и даже запустилось!Но пока какая-то ерунда получается :freak:

Будем искать баги :).
Да, кстати, код вот тут: https://github.com/cnc-club/linuxcnc
Вложения
Screenshot from 2013-01-08.png (2803 просмотра) <a class='original' href='./download/file.php?id=10683&sid=a330f75c6b239db5765b41f040d7c451&mode=view' target=_blank>Загрузить оригинал (162.08 КБ)</a>
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

Плюнул на Си и решил сначала функцию написать на питоне, обкатать и отдебагить и потом перевести в си.
Вроде работает, но появляется небольшая погрешность. Которая выливается в скачек ускорения в самом конце.

Я уже и так искал ошибки и эдак. В итоге решил, что погрешность может появиться из-за ограниченной точности вычислений.

По идее, дистанция за время t равна
d = v0t + a0t2 + jt3/6
Если взять и разбить t на n частей, то общая дистанция будет суммой
d = vntn + antn2 + jtn3/6
причем все должно быть точно.

Но вот такой простенький код на питоне почему-то выдает погрешность:
за 10 000 итераций набегает 0.04мм, за 100 000 итераций - около 4мм.

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

v = 10.
a = -10.
j = 1.
t = 10.
d1 = v*t + a*t*t/2+j*t*t*t/6
d2 = 0.
ct = 0.001
i = 0
print v+a*t+j*t*t/2, a+j*t, "computed v and a" 
for i in range(int(t/ct)) :
	i+=1
	d2 += v*ct + a*ct*ct/2+j*ct*ct*ct/6
	a += j*ct
	v += a*ct +j*ct*ct/2
print v,a, "descreete v and a"
print d1,d2,d1-d2, "computed dist, descreete dist, and subdivision"
print i
Этот я уже где-то глючу, или действительно погрешность должна быть около того?
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

А не, это я тупил, не правильно ускорение применил. :freak:
+ нашел еще один баг в своем коде и вроде начало сходиться до 1e-7 :cheesy:!
Аватара пользователя
Lexxa
Мастер
Сообщения: 2703
Зарегистрирован: 16 дек 2011, 16:48
Репутация: 319
Настоящее имя: Алексей
Откуда: ryazan
Контактная информация:

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

Сообщение Lexxa »

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

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

Сообщение aftaev »

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

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

Сообщение Nick »

Основная штука - скорость и точность.
На меня больше всего повлияло то, без этих кривых ускорение скачет, т.е. в конце траектории ускорение падает с максимального в 0 => сила действующая на ось также моментально изчезает. Если станок люфтит/изгибается, получим недорез, или наоборот перерез. В общем проблема точностью. Да и вообще с s-кривой станок должен гораздо плавнее ходить.
Аватара пользователя
wldev
Мастер
Сообщения: 1641
Зарегистрирован: 24 янв 2012, 16:04
Репутация: 510
Настоящее имя: Сергей Бочаров
Откуда: Новосибирск
Контактная информация:

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

Сообщение wldev »

Я когда делал S кривые для своей программы - генератора (DOS), то я взял кривую разгона и торможения как синус и косинус... Там всё просто считалось...

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

float CDrive::AccelLenght() //длина разгона
{
return (v_accel_ch*t_st+(v_fi-v_accel_ch)*t_st/2);  
//v_accel_ch - скорость с которой начали разгон
//t_st - время разгона 
//v_fi - максимальная скорость
}

float CDrive::DecelLenght()
{
if(!flag(dr_decel))  //проверка флага, тормозим ли мы сейчас
  return (v_now*t_fi+(v_en-v_now)*t_fi/2);
  else
  return (v_decel_ch*t_fi+(v_en-v_decel_ch)*t_fi/2);

//v_decel_ch - скорость с которой начали разгон
//t_fi - время торможения
//v_en - конечная скорость
}

float CDrive::Velocity()
{
float ch_delta; //Это время которое прошло от точки начала ускорения/торможения
float ret;
if(flag(dr_accel)) //если ускоряемся
  {
  ch_delta=CheckMoving-CheckAccel; //находим сколько прошло времени
  if(t_st<=0) t_st=0.001;                   //если ускорение слишком мало 
  ret=v_accel_ch+(v_fi-v_accel_ch)*(1+cos(pi+(pi*ch_delta/t_st)))/2; //расчёт производится именно в это строке всегда!!!,иначе гуляет частота 
  if(!flag(dr_luft_ch)) return v_luft;                    //если отрабатываем люфт то возвращаем скорость люфта
  if(ch_delta>t_st)  return v_fi;                          //если время вышло то макс. скорость
  if(ch_delta<=0)    return v_accel_ch;                //если времени прошло оч. мало
  if(ret>v_fi) {cerr<<"Error V="<<ret;getch();}
  return ret;
  }

if(flag(dr_decel))
  {
  ch_delta=CheckMoving-CheckDecel;
  if(t_fi<=0) t_fi=0.001;
  ret=v_en+(v_decel_ch-v_en)*(1+cos((pi*ch_delta)/t_fi))/2;
  if(ch_delta>t_fi)  return v_en;
  if(ch_delta<=0)    return v_decel_ch;
  return ret;
  }
return -1;
}

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

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

Сообщение Nick »

Bender писал(а):  ret=v_accel_ch+(v_fi-v_accel_ch)*(1+cos(pi+(pi*ch_delta/t_st)))/2;
Это я правильно понимаю, что расчет дистанции до полной становки идет в этой строчке?
Аватара пользователя
wldev
Мастер
Сообщения: 1641
Зарегистрирован: 24 янв 2012, 16:04
Репутация: 510
Настоящее имя: Сергей Бочаров
Откуда: Новосибирск
Контактная информация:

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

Сообщение wldev »

Nick писал(а):Это я правильно понимаю, что расчет дистанции до полной становки идет в этой строчке?
Нет,Это расчёт скорости в конкретной точки.

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

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

Сообщение Nick »

Bender писал(а):(v_now*t_fi+(v_en-v_now)*t_fi/2)
Это вроде как не совсем правильно...
если мы тормозим не линейно, то растояние не равно
v0*t + at2/2
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

Блин что-то такое поменял и все опять перестало работать, а что именно поменял уже третий час найти не могу :pssdoff:
Блин, пора домой ехать... как раз пробок наверное уже нет :)
Аватара пользователя
wldev
Мастер
Сообщения: 1641
Зарегистрирован: 24 янв 2012, 16:04
Репутация: 510
Настоящее имя: Сергей Бочаров
Откуда: Новосибирск
Контактная информация:

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

Сообщение wldev »

Nick писал(а):Это вроде как не совсем правильно...
если мы тормозим не линейно, то растояние не равно
v0*t + at2/2
где вы такое увидели???

Я же написал разгон/торможение по синусу/косинусу.
Возьми интеграл и всё увидешь! Расстояние это есть площадь!

Или по подробней надо?

площадь нижнего прямоугольника

v_en*t_fi

площадь под кривой это половина от (v_now-v_en)*t_fi

тогда v_en*t_fi+(v_now-v_en)*t_fi

или из всей площади вычитаем криволинейную часть.

v_now*t_fi-(v_now-v_en)*t_fi -> v_now*t_fi+(v_en-v_now)*t_fi
Вложения
Поянснение.jpg (2737 просмотров) <a class='original' href='./download/file.php?id=10819&sid=a330f75c6b239db5765b41f040d7c451&mode=view' target=_blank>Загрузить оригинал (40.48 КБ)</a>
Новости: https://t.me/wldevruch
Обсуждения: https://t.me/wldevgr
vmarkiv
Мастер
Сообщения: 516
Зарегистрирован: 21 янв 2012, 00:23
Репутация: 32
Откуда: Ивано-Франковск
Контактная информация:

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

Сообщение vmarkiv »

В проэкте http://reprap.org/wiki/Elegant_multispl ... controller что-то есть об S разгоне , также в http://www.synthetos.com/wiki/index.php ... onfiguring ($MS Minimum Segment time in microseconds - Refers to S-curve interpolation segments )
vmarkiv
Мастер
Сообщения: 516
Зарегистрирован: 21 янв 2012, 00:23
Репутация: 32
Откуда: Ивано-Франковск
Контактная информация:

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

Сообщение vmarkiv »

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

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

Сообщение Nick »

Bender писал(а):где вы такое увидели???
(v_now*t_fi+(v_en-v_now)*t_fi/2)
просто v_now*t_fi = v0*t,
а (v_en-v_now)*t_fi/2 = (v1-v0)*t/2 = (v1-v0)/t *t2/2 = a*t2/2
В принципе все правильно :). Проблема будет, когда мы начнем высчитывать все это с ограниченными ускорениями, ну и в том случае, если начинаем движение с не нулевой скоростью или ускорением. Тогда придется считать честные интегралы.
Аватара пользователя
wldev
Мастер
Сообщения: 1641
Зарегистрирован: 24 янв 2012, 16:04
Репутация: 510
Настоящее имя: Сергей Бочаров
Откуда: Новосибирск
Контактная информация:

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

Сообщение wldev »

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

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

Сообщение Nick »

На сколько я понял, LinuxCNC от функции нужна следующая точка траектории + максимальная скорость на данном отрезке.
А так на самом деле не важно, что это будет, время торможения, расстояние торможение или что-то еще, главное, чтобы оно однозначно определяло дальнейшие действия.
Аватара пользователя
wldev
Мастер
Сообщения: 1641
Зарегистрирован: 24 янв 2012, 16:04
Репутация: 510
Настоящее имя: Сергей Бочаров
Откуда: Новосибирск
Контактная информация:

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

Сообщение wldev »

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

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

Сообщение Nick »

В смысле которая сейчас в LinuxCNC?
http://git.linuxcnc.org/gitweb?p=linuxc ... 9eebb#l577
Аватара пользователя
wldev
Мастер
Сообщения: 1641
Зарегистрирован: 24 янв 2012, 16:04
Репутация: 510
Настоящее имя: Сергей Бочаров
Откуда: Новосибирск
Контактная информация:

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

Сообщение wldev »

Nick писал(а):В смысле которая сейчас в LinuxCNC?
http://git.linuxcnc.org/gitweb?p=linuxc ... 9eebb#l577
Да, если не трудно напиши пожалуйста комментарии, если можешь....
Новости: https://t.me/wldevruch
Обсуждения: https://t.me/wldevgr
Ответить

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