на вид могу и в Маче сделать, ускорение убавить и будет почти ка лебедь. Ток плазме нужна постоянная скорость.aystarik писал(а):А разве не видно _удивительной_ плавности и легкости перемещений? Прямо ж как лебедь белая плывет...
LinuxCNC S-разгон и торможение
-
aftaev
- Зачётный участник

- Сообщения: 34042
- Зарегистрирован: 04 апр 2010, 19:22
- Репутация: 6194
- Откуда: Казахстан.
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
- Starik
- Опытный
- Сообщения: 136
- Зарегистрирован: 13 май 2012, 21:22
- Репутация: 17
- Откуда: Долгопрудный
Re: LinuxCNC S-разгон и торможение
В том-то все и дело, что хочется высоких скоростей и высоких ускорений рабочего хода... Типа ВСО и все остальные рекламные лозунги...PKM писал(а):А для рабочих при невысоких скоростях не особо и нужны.
- Starik
- Опытный
- Сообщения: 136
- Зарегистрирован: 13 май 2012, 21:22
- Репутация: 17
- Откуда: Долгопрудный
Re: LinuxCNC S-разгон и торможение
Тогда скорость постоянной перестанет бытьaftaev писал(а):ускорение убавить
-
aftaev
- Зачётный участник

- Сообщения: 34042
- Зарегистрирован: 04 апр 2010, 19:22
- Репутация: 6194
- Откуда: Казахстан.
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
Пока станок доделаю как раз они S разгоны прикрутят к ЕМС. Можно будет опробовать и так и так.
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
- PKM
- Почётный участник

- Сообщения: 4263
- Зарегистрирован: 31 мар 2011, 18:11
- Репутация: 705
- Настоящее имя: Андрей
- Откуда: Украина
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
ты станок раньше сделаешьaftaev писал(а):Пока станок доделаю как раз они S разгоны прикрутят к ЕМС
Да, хотелось бы и мне. Для этого S-кривые не помешают.aystarik писал(а):Типа ВСО и все остальные рекламные лозунги
Кстати, с ускорениями в ЕМС намутили. Обычно используется только половина максимального ускорения оси, ради случаев реверса при включенном блендинге траектории...
Очень нехорошо это для ВСО.
Надеюсь, в S-кривых этот недостаток уже устранили
- scout
- Опытный
- Сообщения: 114
- Зарегистрирован: 11 янв 2010, 00:52
- Репутация: 11
- Откуда: Протвино
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
наверное смучинг имеется ввиду )) или все-таки именно термин блендинг используется? если да, то что это?PKM писал(а):блендинге траектории
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
они его называют именно blend. по сути примерно тоже самое, что и smoothing, только на сколько я понимаю он не будет изменять плавные траектории, а только "острые" углы.
Где все это делается?PKM писал(а):Кстати, с ускорениями в ЕМС намутили. Обычно используется только половина максимального ускорения оси, ради случаев реверса при включенном блендинге траектории..
- Starik
- Опытный
- Сообщения: 136
- Зарегистрирован: 13 май 2012, 21:22
- Репутация: 17
- Откуда: Долгопрудный
Re: LinuxCNC S-разгон и торможение
PKM писал(а):Кстати, с ускорениями в ЕМС намутили. Обычно используется только половина максимального ускорения оси, ради случаев реверса при включенном блендинге траектории...
Очень нехорошо это для ВСО.
Надеюсь, в S-кривых этот недостаток уже устранили
вы попроще бы сказали, а то в двойных отрицаниях смысл совсем теряется...scout писал(а):если да, то что это?
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
Хотелось бы понять порядок применения действий в LinuxCNC:
1. расчет точек траектории
2. расчет скруглений
3. расчет скоростей
4. преобразование кинематики
В каком порядке все это применяется?
1. расчет точек траектории
2. расчет скруглений
3. расчет скоростей
4. преобразование кинематики
В каком порядке все это применяется?
- scout
- Опытный
- Сообщения: 114
- Зарегистрирован: 11 янв 2010, 00:52
- Репутация: 11
- Откуда: Протвино
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
не я только спросил... Ник ответил. Просто blend - вроде как смешивать означает, а smooth - сглаживать, вот и вышел когнитивный диссонансaystarik писал(а):вы попроще бы сказали, а то в двойных отрицаниях смысл совсем теряется...
- PKM
- Почётный участник

- Сообщения: 4263
- Зарегистрирован: 31 мар 2011, 18:11
- Репутация: 705
- Настоящее имя: Андрей
- Откуда: Украина
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
не уверен точно, как перевести
смысл блендинга в плавном переходе между участками траектории (скругление углов) без значительного снижения скорости подачи.
фактически ускорение для следующего движения начинается еще до окончания замедления текущего, т.е. наложение движений (и ускорений) - блендинг
и вот что пишут: 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
смысл блендинга в плавном переходе между участками траектории (скругление углов) без значительного снижения скорости подачи.
фактически ускорение для следующего движения начинается еще до окончания замедления текущего, т.е. наложение движений (и ускорений) - блендинг
и вот что пишут: 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
-
aftaev
- Зачётный участник

- Сообщения: 34042
- Зарегистрирован: 04 апр 2010, 19:22
- Репутация: 6194
- Откуда: Казахстан.
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
Так вроде уже прикрутили раз на плазме показывают?PKM писал(а):ты станок раньше сделаешь
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
- PKM
- Почётный участник

- Сообщения: 4263
- Зарегистрирован: 31 мар 2011, 18:11
- Репутация: 705
- Настоящее имя: Андрей
- Откуда: Украина
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
Насколько я понял - нестабильная версия, для производства лучше не использовать.aftaev писал(а):Так вроде уже прикрутили раз на плазме показывают?
Я с год назад ставил joints_axes то это был просто кошмар, может уже допилили
- Starik
- Опытный
- Сообщения: 136
- Зарегистрирован: 13 май 2012, 21:22
- Репутация: 17
- Откуда: Долгопрудный
Re: LinuxCNC S-разгон и торможение
а если еще и люфты заданы, то вообще четверть только...таким образом до половины максимального ускорения привода может не использоваться
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
В продолжение темы + по мотивам постоянности скорости на протяжении 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;
такс, сейчас мы ее быстренько переделаем
Вчитываюсь в 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;
такс, сейчас мы ее быстренько переделаем
- PKM
- Почётный участник

- Сообщения: 4263
- Зарегистрирован: 31 мар 2011, 18:11
- Репутация: 705
- Настоящее имя: Андрей
- Откуда: Украина
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
ждем, ждем! 
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
Фуххх как-то так.
Только в Сях я не силен. Компилить не пробовал, пока только эта функция... Что еще поменять надо, чтобы они откомпилировалось и как потом всеэто тестировать?
Алгоритм:
Сейчас картинку добавлю ...
Только в Сях я не силен. Компилить не пробовал, пока только эта функция... Что еще поменять надо, чтобы они откомпилировалось и как потом всеэто тестировать?
Алгоритм:
- находим дистанцию остановки:
она равна 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
}
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
Вот такая картинка, но она вроде как такая же как в статьях:
- Вложения
-
- Scurve.svg
- (15.75 КБ) 904 скачивания
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: LinuxCNC S-разгон и торможение
Так, а как можно по быстрому собрать LinuxCNC из исходников, желательно, чтобы runinplace? А то я что-то пока такого еще не делал
.
Я помню кто-то вывешивал инструкцию.... но вот где?
==============
нашел
Установка LinuxCNC EMC2 из исходников #1
Я помню кто-то вывешивал инструкцию.... но вот где?
==============
нашел
Установка LinuxCNC EMC2 из исходников #1
