Страница 2 из 14
Re: LinuxCNC S-разгон и торможение
Добавлено: 13 дек 2012, 17:05
aftaev
aystarik писал(а):А разве не видно _удивительной_ плавности и легкости перемещений? Прямо ж как лебедь белая плывет...
на вид могу и в Маче сделать, ускорение убавить и будет почти ка лебедь. Ток плазме нужна постоянная скорость.
Re: LinuxCNC S-разгон и торможение
Добавлено: 13 дек 2012, 17:53
Starik
PKM писал(а):А для рабочих при невысоких скоростях не особо и нужны.
В том-то все и дело, что хочется высоких скоростей и высоких ускорений рабочего хода... Типа ВСО и все остальные рекламные лозунги...

Re: LinuxCNC S-разгон и торможение
Добавлено: 13 дек 2012, 17:54
Starik
aftaev писал(а):ускорение убавить
Тогда скорость постоянной перестанет быть

Re: LinuxCNC S-разгон и торможение
Добавлено: 13 дек 2012, 19:16
aftaev
Пока станок доделаю как раз они S разгоны прикрутят к ЕМС. Можно будет опробовать и так и так.
Re: LinuxCNC S-разгон и торможение
Добавлено: 13 дек 2012, 19:39
PKM
aftaev писал(а):Пока станок доделаю как раз они S разгоны прикрутят к ЕМС
ты станок раньше сделаешь
aystarik писал(а):Типа ВСО и все остальные рекламные лозунги
Да, хотелось бы и мне. Для этого S-кривые не помешают.
Кстати, с ускорениями в ЕМС намутили. Обычно используется только половина максимального ускорения оси, ради случаев реверса при включенном блендинге траектории...
Очень нехорошо это для ВСО.
Надеюсь, в S-кривых этот недостаток уже устранили
Re: LinuxCNC S-разгон и торможение
Добавлено: 13 дек 2012, 19:51
scout
PKM писал(а):блендинге траектории
наверное смучинг имеется ввиду )) или все-таки именно термин блендинг используется? если да, то что это?
Re: LinuxCNC S-разгон и торможение
Добавлено: 13 дек 2012, 20:08
Nick
они его называют именно blend. по сути примерно тоже самое, что и smoothing, только на сколько я понимаю он не будет изменять плавные траектории, а только "острые" углы.
PKM писал(а):Кстати, с ускорениями в ЕМС намутили. Обычно используется только половина максимального ускорения оси, ради случаев реверса при включенном блендинге траектории..
Где все это делается?
Re: LinuxCNC S-разгон и торможение
Добавлено: 13 дек 2012, 20:11
Starik
PKM писал(а):Кстати, с ускорениями в ЕМС намутили. Обычно используется только половина максимального ускорения оси, ради случаев реверса при включенном блендинге траектории...
Очень нехорошо это для ВСО.
Надеюсь, в S-кривых этот недостаток уже устранили
scout писал(а):если да, то что это?
вы попроще бы сказали, а то в двойных отрицаниях смысл совсем теряется...
Re: LinuxCNC S-разгон и торможение
Добавлено: 13 дек 2012, 20:12
Nick
Хотелось бы понять порядок применения действий в LinuxCNC:
1. расчет точек траектории
2. расчет скруглений
3. расчет скоростей
4. преобразование кинематики
В каком порядке все это применяется?
Re: LinuxCNC S-разгон и торможение
Добавлено: 13 дек 2012, 20:18
scout
aystarik писал(а):вы попроще бы сказали, а то в двойных отрицаниях смысл совсем теряется...
не я только спросил... Ник ответил. Просто blend - вроде как смешивать означает, а smooth - сглаживать, вот и вышел когнитивный диссонанс
Re: LinuxCNC S-разгон и торможение
Добавлено: 13 дек 2012, 21:30
PKM
не уверен точно, как перевести
смысл блендинга в плавном переходе между участками траектории (скругление углов) без значительного снижения скорости подачи.
фактически ускорение для следующего движения начинается еще до окончания замедления текущего, т.е. наложение движений (и ускорений) - блендинг
и вот что пишут:
The acceleration and deceleration phase each use half the ini file MAX_ACCELERATION. In a blend that is an exact reversal, this causes the total axis acceleration to equal the ini file MAX_ACCELERATION. In other cases, the actual machine acceleration is somewhat less than the ini file acceleration
таким образом до половины максимального ускорения привода может не использоваться
http://linuxcnc.org/docs/html/common/Us ... _following
Re: LinuxCNC S-разгон и торможение
Добавлено: 13 дек 2012, 21:33
aftaev
PKM писал(а):ты станок раньше сделаешь
Так вроде уже прикрутили раз на плазме показывают?
Re: LinuxCNC S-разгон и торможение
Добавлено: 13 дек 2012, 21:42
PKM
aftaev писал(а):Так вроде уже прикрутили раз на плазме показывают?
Насколько я понял - нестабильная версия, для производства лучше не использовать.
Я с год назад ставил joints_axes то это был просто кошмар, может уже допилили
Re: LinuxCNC S-разгон и торможение
Добавлено: 13 дек 2012, 23:24
Starik
таким образом до половины максимального ускорения привода может не использоваться
а если еще и люфты заданы, то вообще четверть только...
Re: LinuxCNC S-разгон и торможение
Добавлено: 04 янв 2013, 21:26
Nick
В продолжение темы + по мотивам постоянности скорости на протяжении servo-thread.
Вчитываюсь в tp.c:
есть там строчка:
tc->progress += (newvel + tc->currentvel) * 0.5 * tc->cycle_time;
Получается, что на протяжении tc->cycle_time мы едем равоноускоренно.....
(
http://git.linuxcnc.org/gitweb?p=linuxc ... =HEAD#l623 )
---------
Я так понимаю, нам надо переписать только функцию void tcRunCycle(TP_STRUCT *tp, TC_STRUCT *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;
такс, сейчас мы ее быстренько переделаем

Re: LinuxCNC S-разгон и торможение
Добавлено: 04 янв 2013, 23:08
PKM
ждем, ждем!

Re: LinuxCNC S-разгон и торможение
Добавлено: 07 янв 2013, 00:52
Starik
Re: LinuxCNC S-разгон и торможение
Добавлено: 07 янв 2013, 01:52
Nick
Фуххх как-то так.
Только в Сях я не силен. Компилить не пробовал, пока только эта функция... Что еще поменять надо, чтобы они откомпилировалось и как потом всеэто тестировать?
Алгоритм:
- находим дистанцию остановки:
она равна S2 + S4+S5+S6. S0, S1 и S3 в остановке не участвуют.
- Сначала смотрим не ускоряемся ли мы сейчас, если ускоряемся ищем S2
- Потом смотрим сколько времени нужно для остановки. Смотрим текущее ускорение, оно меньше 0. Находим скорость с которой мы начали замедляться, предполагая, что начали замедляться с максимальным jerk (т.е. находим скорость в начале S4 - v_deccel). После этого время S4 и S6 одинаковы и равны sqrt(v_deccel), если это время больше времени замедления ускорения - значит будем какое-то время замедляться на полном ускорении - S5.
- Вычитаем скорость за время полного ускорения и находим времена ускоренного и замедленного замедления S4 и S6
- В итоге имеем длины S2, S4, S5 и S6.
- Теперь нам осталось определиться, что делать дальше. Самое главное определиться с jerk - от него зависит все. Если tc->target - tc->progress лежит в S2 или S6 нам надо замедлять ускорение, во всех остальных случаях ускоряем ускорение.
- В самом конце обрезаем ускорение по максимальному ускорению. И скорость по максимальной скорости.
- Рассчитываем новое положение tc->progress, если оно больше tc->target, то еще раз ограничиваем скорость, ускорение и jerk.
Вроде все
Код: Выделить всё
void tcRunCycle(TP_STRUCT *tp, TC_STRUCT *tc)
{
double discr, maxnewvel, newvel, newaccel=0;
if(!tc->blending) tc->vel_at_blend_start = tc->currentvel;
double jerk_time = ceil(tc->maxaccel/tc->jerk);
double jerk_vel = 0.5 * tc->jerk * jerk_time * jerk_time;
double deccel_dist = 0.;
double t = 0.;
double v = tc->cur_vel;
double accel = tc->cur_accel;
double d2=0.,d4=0.,d5=0.,d6=0.;
/* Get decel_dist */
if (accel > 0.){ // we are accelerating now
t = ceil(tc->accel/tc->jerk); // max = maxaccel/jerk in any case
d2 = tc->cur_vel * t2 + 0.5 * accel * t2 * t2 - 1.0/6.0 * tc->jerk * t2 * t2 * t2;
v += accel * t - 0.5 * tc->jerk * t * t; // get velocity add after stopping acceleration
accel = 0.; // after finishing acceleration accel will be 0
}
// now get decceleration time
// accel<=0 now.
/* start cur decel stop
deccel accel at maxaccel decel
|------*----|---------|-----------| */
t_deccel = ceil( -accel / tc->jerk); // get the time, we have been deccelerated
v_deccel = v - accel*t_deccel - tc->jerk*t_deccel*t_deccel; // v_deccel before decceleration started
if (t_deccel <= 2.0*jerk_time) // no need to decel at max accel
{
t = (v_deccel/tc->jerk); // time to deccelerate to half v_deccel
d6 = 0.5*v_deccel*t - 0.5*(t*tc->jerk)*t*t + 1.0/6.0*tc->jerk*t*t*t // S6
t = t-t_deccel; // S4 time
if (t>0) {d4 = v*t - 0.5*accel*t*t + 1.0/6.0*tc->jerk*t*t*t;} //S4
}
else {
t = (tc->max_accel - (-accel))/tc->jerk; // S4 #TODO add ceil????
d4 = v*t - 0.5*accel*t*t - 1.0/6.0*tc->jerk*t*t*t; // S4
v += accel*t - 0.5*tc->jerk*t*t;
t = (v-jerk_vel)/tc->max_accel; // S5 #TODO add ceil????
d5 = v*t - 0.5*tc->max_accel*t*t;
v += - tc->max_accel*t;
t = jerk_time; // S6
d6 = deccel_vel*t - 0.5*tc->max_accel*t*t + 1.0/6.0*tc->jerk*t*t*t;
}
// now we have deccel dist d2+d4+d5+d6!!! So, only thing we need to get do we have to +jerk or to -jerk
if (tc->target-tc->progress < d6) {
jerk = -tc->jerk; // deccelerate decceleration
} else if (tc->target-tc->progress < d6+d5+d4)
{
jerk = tc->jerk; // accelerate decceleration
} else if (tc->target-tc->progress < d6+d5+d4+d2)
{
jerk = -tc->jerk; // deccelerate acceleration
} else {
jerk = tc->jerk; // accelerate acceleration!!!
}
// now let's get a
accel = tc->cur_accel + jerk;
if (accel > 0 && accel > tc->max_accel){ // clamp accel
accel = tc->max_accel;
}
if (accel < 0 && accel < tc->max_accel){ // clamp accel
accel = -tc->max_accel;
}
v = tc->cur_vel + accel;
if(v > tc->reqvel * tc->feed_override) v = tc->reqvel * tc->feed_override; // clamp vel
if(v > tc->maxvel) v = tc->maxvel; // clamp vel
// now let's get real accel and jerk
accel = tc->cur_vel-v;
jerk = tc->cur_accel-accel;
// and pos
tc->progress += v + 0.5*accel + 1.0/6.0*jerk;
// check progress
if (tc->progress > tc->target or v<0.0) {
v = tc->target - tc->progress;
accel = tc->cur_vel-v;
jerk = tc->cur_accel-accel;
tc->progress = tc->target;
}
tc->cur_vel = v;
tc->cur_accel = accel;
if(v) *v = v; // left from original
////// what is that ???
// if(on_final_decel) *on_final_decel = fabs(maxnewvel - v) < 0.001; // left from original
}
Сейчас картинку добавлю ...
Re: LinuxCNC S-разгон и торможение
Добавлено: 07 янв 2013, 02:01
Nick
Вот такая картинка, но она вроде как такая же как в статьях:
Re: LinuxCNC S-разгон и торможение
Добавлено: 07 янв 2013, 16:44
Nick
Так, а как можно по быстрому собрать LinuxCNC из исходников, желательно, чтобы runinplace? А то я что-то пока такого еще не делал

.
Я помню кто-то вывешивал инструкцию.... но вот где?
==============
нашел
Установка LinuxCNC EMC2 из исходников #1