Будем искать баги
Да, кстати, код вот тут: https://github.com/cnc-club/linuxcnc
Код: Выделить всё
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
потихоньку двигаемся к пром. стойкамLexxa писал(а):Ник, зачем это нужно все?
Код: Выделить всё
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;
}
Это я правильно понимаю, что расчет дистанции до полной становки идет в этой строчке?Bender писал(а): ret=v_accel_ch+(v_fi-v_accel_ch)*(1+cos(pi+(pi*ch_delta/t_st)))/2;
Нет,Это расчёт скорости в конкретной точки.Nick писал(а):Это я правильно понимаю, что расчет дистанции до полной становки идет в этой строчке?
Это вроде как не совсем правильно...Bender писал(а):(v_now*t_fi+(v_en-v_now)*t_fi/2)
где вы такое увидели???Nick писал(а):Это вроде как не совсем правильно...
если мы тормозим не линейно, то растояние не равно
v0*t + at2/2
(v_now*t_fi+(v_en-v_now)*t_fi/2)Bender писал(а):где вы такое увидели???
А зачем вам вообще это ускорение? Проще задавать ч/з время разгона/торможения...Nick писал(а): Проблема будет, когда мы начнем высчитывать все это с ограниченными ускорениями, ну и в том случае, если начинаем движение с не нулевой скоростью или ускорением
Покажи эту функцию для треугольного разгона....Nick писал(а):На сколько я понял, LinuxCNC от функции нужна следующая точка траектории + максимальная скорость на данном отрезке.
А так на самом деле не важно, что это будет, время торможения, расстояние торможение или что-то еще, главное, чтобы оно однозначно определяло дальнейшие действия.
Да, если не трудно напиши пожалуйста комментарии, если можешь....Nick писал(а):В смысле которая сейчас в LinuxCNC?
http://git.linuxcnc.org/gitweb?p=linuxc ... 9eebb#l577