Страница 3 из 14
Re: LinuxCNC S-разгон и торможение
Добавлено: 08 янв 2013, 02:03
Nick
Ухты скомпилировалось и даже запустилось!Но пока какая-то ерунда получается
Будем искать баги

.
Да, кстати, код вот тут:
https://github.com/cnc-club/linuxcnc
Re: LinuxCNC S-разгон и торможение
Добавлено: 11 янв 2013, 19:44
Nick
Плюнул на Си и решил сначала функцию написать на питоне, обкатать и отдебагить и потом перевести в си.
Вроде работает, но появляется небольшая погрешность. Которая выливается в скачек ускорения в самом конце.
Я уже и так искал ошибки и эдак. В итоге решил, что погрешность может появиться из-за ограниченной точности вычислений.
По идее, дистанция за время t равна
d = v
0t + a
0t
2 + jt
3/6
Если взять и разбить t на n частей, то общая дистанция будет суммой
d = v
nt
n + a
nt
n2 + jt
n3/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
Этот я уже где-то глючу, или действительно погрешность должна быть около того?
Re: LinuxCNC S-разгон и торможение
Добавлено: 11 янв 2013, 20:35
Nick
А не, это я тупил, не правильно ускорение применил.
+ нашел еще один баг в своем коде и вроде начало сходиться до 1e-7

!
Re: LinuxCNC S-разгон и торможение
Добавлено: 11 янв 2013, 21:01
Lexxa
Ник, зачем это нужно все?
Re: LinuxCNC S-разгон и торможение
Добавлено: 11 янв 2013, 21:03
aftaev
Lexxa писал(а):Ник, зачем это нужно все?
потихоньку двигаемся к пром. стойкам

Re: LinuxCNC S-разгон и торможение
Добавлено: 11 янв 2013, 21:07
Nick
Основная штука - скорость и точность.
На меня больше всего повлияло то, без этих кривых ускорение скачет, т.е. в конце траектории ускорение падает с максимального в 0 => сила действующая на ось также моментально изчезает. Если станок люфтит/изгибается, получим недорез, или наоборот перерез. В общем проблема точностью. Да и вообще с s-кривой станок должен гораздо плавнее ходить.
Re: LinuxCNC S-разгон и торможение
Добавлено: 11 янв 2013, 21:22
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;
}
Re: LinuxCNC S-разгон и торможение
Добавлено: 11 янв 2013, 21:30
Nick
Bender писал(а): ret=v_accel_ch+(v_fi-v_accel_ch)*(1+cos(pi+(pi*ch_delta/t_st)))/2;
Это я правильно понимаю, что расчет дистанции до полной становки идет в этой строчке?
Re: LinuxCNC S-разгон и торможение
Добавлено: 11 янв 2013, 21:35
wldev
Nick писал(а):Это я правильно понимаю, что расчет дистанции до полной становки идет в этой строчке?
Нет,Это расчёт скорости в конкретной точки.
Дистанция до остановки DecelLenght()
Re: LinuxCNC S-разгон и торможение
Добавлено: 11 янв 2013, 23:01
Nick
Bender писал(а):(v_now*t_fi+(v_en-v_now)*t_fi/2)
Это вроде как не совсем правильно...
если мы тормозим
не линейно, то растояние не равно
v
0*t + at
2/2
Re: LinuxCNC S-разгон и торможение
Добавлено: 12 янв 2013, 00:16
Nick
Блин что-то такое поменял и все опять перестало работать, а что именно поменял уже третий час найти не могу

Блин, пора домой ехать... как раз пробок наверное уже нет

Re: LinuxCNC S-разгон и торможение
Добавлено: 12 янв 2013, 07:32
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
Re: LinuxCNC S-разгон и торможение
Добавлено: 12 янв 2013, 23:25
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 )
Re: LinuxCNC S-разгон и торможение
Добавлено: 12 янв 2013, 23:45
vmarkiv
Re: LinuxCNC S-разгон и торможение
Добавлено: 14 янв 2013, 11:29
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 *t
2/2 = a*t
2/2
В принципе все правильно

. Проблема будет, когда мы начнем высчитывать все это с ограниченными ускорениями, ну и в том случае, если начинаем движение с не нулевой скоростью или ускорением. Тогда придется считать честные интегралы.
Re: LinuxCNC S-разгон и торможение
Добавлено: 14 янв 2013, 13:00
wldev
Nick писал(а): Проблема будет, когда мы начнем высчитывать все это с ограниченными ускорениями, ну и в том случае, если начинаем движение с не нулевой скоростью или ускорением
А зачем вам вообще это ускорение? Проще задавать ч/з время разгона/торможения...
Re: LinuxCNC S-разгон и торможение
Добавлено: 14 янв 2013, 15:02
Nick
На сколько я понял, LinuxCNC от функции нужна следующая точка траектории + максимальная скорость на данном отрезке.
А так на самом деле не важно, что это будет, время торможения, расстояние торможение или что-то еще, главное, чтобы оно однозначно определяло дальнейшие действия.
Re: LinuxCNC S-разгон и торможение
Добавлено: 14 янв 2013, 19:15
wldev
Nick писал(а):На сколько я понял, LinuxCNC от функции нужна следующая точка траектории + максимальная скорость на данном отрезке.
А так на самом деле не важно, что это будет, время торможения, расстояние торможение или что-то еще, главное, чтобы оно однозначно определяло дальнейшие действия.
Покажи эту функцию для треугольного разгона....
Re: LinuxCNC S-разгон и торможение
Добавлено: 14 янв 2013, 19:16
Nick
Re: LinuxCNC S-разгон и торможение
Добавлено: 14 янв 2013, 19:28
wldev
Да, если не трудно напиши пожалуйста комментарии, если можешь....