LinuxCNC S-разгон и торможение
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
Ухты скомпилировалось и даже запустилось!Но пока какая-то ерунда получается
Будем искать баги .
Да, кстати, код вот тут: https://github.com/cnc-club/linuxcnc
Будем искать баги .
Да, кстати, код вот тут: https://github.com/cnc-club/linuxcnc
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
Плюнул на Си и решил сначала функцию написать на питоне, обкатать и отдебагить и потом перевести в си.
Вроде работает, но появляется небольшая погрешность. Которая выливается в скачек ускорения в самом конце.
Я уже и так искал ошибки и эдак. В итоге решил, что погрешность может появиться из-за ограниченной точности вычислений.
По идее, дистанция за время t равна
d = v0t + a0t2 + jt3/6
Если взять и разбить t на n частей, то общая дистанция будет суммой
d = vntn + antn2 + jtn3/6
причем все должно быть точно.
Но вот такой простенький код на питоне почему-то выдает погрешность:
за 10 000 итераций набегает 0.04мм, за 100 000 итераций - около 4мм.
Этот я уже где-то глючу, или действительно погрешность должна быть около того?
Вроде работает, но появляется небольшая погрешность. Которая выливается в скачек ускорения в самом конце.
Я уже и так искал ошибки и эдак. В итоге решил, что погрешность может появиться из-за ограниченной точности вычислений.
По идее, дистанция за время 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-разгон и торможение
А не, это я тупил, не правильно ускорение применил.
+ нашел еще один баг в своем коде и вроде начало сходиться до 1e-7 !
+ нашел еще один баг в своем коде и вроде начало сходиться до 1e-7 !
- Lexxa
- Мастер
- Сообщения: 2703
- Зарегистрирован: 16 дек 2011, 16:48
- Репутация: 319
- Настоящее имя: Алексей
- Откуда: ryazan
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
Ник, зачем это нужно все?
-
- Зачётный участник
- Сообщения: 34042
- Зарегистрирован: 04 апр 2010, 19:22
- Репутация: 6192
- Откуда: Казахстан.
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
потихоньку двигаемся к пром. стойкамLexxa писал(а):Ник, зачем это нужно все?
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
Основная штука - скорость и точность.
На меня больше всего повлияло то, без этих кривых ускорение скачет, т.е. в конце траектории ускорение падает с максимального в 0 => сила действующая на ось также моментально изчезает. Если станок люфтит/изгибается, получим недорез, или наоборот перерез. В общем проблема точностью. Да и вообще с s-кривой станок должен гораздо плавнее ходить.
На меня больше всего повлияло то, без этих кривых ускорение скачет, т.е. в конце траектории ускорение падает с максимального в 0 => сила действующая на ось также моментально изчезает. Если станок люфтит/изгибается, получим недорез, или наоборот перерез. В общем проблема точностью. Да и вообще с s-кривой станок должен гораздо плавнее ходить.
- wldev
- Мастер
- Сообщения: 1641
- Зарегистрирован: 24 янв 2012, 16:04
- Репутация: 510
- Настоящее имя: Сергей Бочаров
- Откуда: Новосибирск
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
Я когда делал 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;
}
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
Это я правильно понимаю, что расчет дистанции до полной становки идет в этой строчке?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-разгон и торможение
Нет,Это расчёт скорости в конкретной точки.Nick писал(а):Это я правильно понимаю, что расчет дистанции до полной становки идет в этой строчке?
Дистанция до остановки DecelLenght()
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
Это вроде как не совсем правильно...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-разгон и торможение
Блин что-то такое поменял и все опять перестало работать, а что именно поменял уже третий час найти не могу
Блин, пора домой ехать... как раз пробок наверное уже нет
Блин, пора домой ехать... как раз пробок наверное уже нет
- wldev
- Мастер
- Сообщения: 1641
- Зарегистрирован: 24 янв 2012, 16:04
- Репутация: 510
- Настоящее имя: Сергей Бочаров
- Откуда: Новосибирск
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
где вы такое увидели???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
-
- Мастер
- Сообщения: 516
- Зарегистрирован: 21 янв 2012, 00:23
- Репутация: 32
- Откуда: Ивано-Франковск
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
В проэкте 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 )
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
(v_now*t_fi+(v_en-v_now)*t_fi/2)Bender писал(а):где вы такое увидели???
просто 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-разгон и торможение
А зачем вам вообще это ускорение? Проще задавать ч/з время разгона/торможения...Nick писал(а): Проблема будет, когда мы начнем высчитывать все это с ограниченными ускорениями, ну и в том случае, если начинаем движение с не нулевой скоростью или ускорением
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
На сколько я понял, LinuxCNC от функции нужна следующая точка траектории + максимальная скорость на данном отрезке.
А так на самом деле не важно, что это будет, время торможения, расстояние торможение или что-то еще, главное, чтобы оно однозначно определяло дальнейшие действия.
А так на самом деле не важно, что это будет, время торможения, расстояние торможение или что-то еще, главное, чтобы оно однозначно определяло дальнейшие действия.
- wldev
- Мастер
- Сообщения: 1641
- Зарегистрирован: 24 янв 2012, 16:04
- Репутация: 510
- Настоящее имя: Сергей Бочаров
- Откуда: Новосибирск
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
Покажи эту функцию для треугольного разгона....Nick писал(а):На сколько я понял, LinuxCNC от функции нужна следующая точка траектории + максимальная скорость на данном отрезке.
А так на самом деле не важно, что это будет, время торможения, расстояние торможение или что-то еще, главное, чтобы оно однозначно определяло дальнейшие действия.
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
В смысле которая сейчас в LinuxCNC?
http://git.linuxcnc.org/gitweb?p=linuxc ... 9eebb#l577
http://git.linuxcnc.org/gitweb?p=linuxc ... 9eebb#l577
- wldev
- Мастер
- Сообщения: 1641
- Зарегистрирован: 24 янв 2012, 16:04
- Репутация: 510
- Настоящее имя: Сергей Бочаров
- Откуда: Новосибирск
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
Да, если не трудно напиши пожалуйста комментарии, если можешь....Nick писал(а):В смысле которая сейчас в LinuxCNC?
http://git.linuxcnc.org/gitweb?p=linuxc ... 9eebb#l577