LinuxCNC S-разгон и торможение

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6194
Откуда: Казахстан.
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение aftaev »

aystarik писал(а):А разве не видно _удивительной_ плавности и легкости перемещений? Прямо ж как лебедь белая плывет...
на вид могу и в Маче сделать, ускорение убавить и будет почти ка лебедь. Ток плазме нужна постоянная скорость.
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
Starik
Опытный
Сообщения: 136
Зарегистрирован: 13 май 2012, 21:22
Репутация: 17
Откуда: Долгопрудный

Re: LinuxCNC S-разгон и торможение

Сообщение Starik »

PKM писал(а):А для рабочих при невысоких скоростях не особо и нужны.
В том-то все и дело, что хочется высоких скоростей и высоких ускорений рабочего хода... Типа ВСО и все остальные рекламные лозунги... :)
Аватара пользователя
Starik
Опытный
Сообщения: 136
Зарегистрирован: 13 май 2012, 21:22
Репутация: 17
Откуда: Долгопрудный

Re: LinuxCNC S-разгон и торможение

Сообщение Starik »

aftaev писал(а):ускорение убавить
Тогда скорость постоянной перестанет быть :)
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6194
Откуда: Казахстан.
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение aftaev »

Пока станок доделаю как раз они S разгоны прикрутят к ЕМС. Можно будет опробовать и так и так.
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
PKM
Почётный участник
Почётный участник
Сообщения: 4263
Зарегистрирован: 31 мар 2011, 18:11
Репутация: 705
Настоящее имя: Андрей
Откуда: Украина
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение PKM »

aftaev писал(а):Пока станок доделаю как раз они S разгоны прикрутят к ЕМС
ты станок раньше сделаешь ;)
aystarik писал(а):Типа ВСО и все остальные рекламные лозунги
Да, хотелось бы и мне. Для этого S-кривые не помешают.

Кстати, с ускорениями в ЕМС намутили. Обычно используется только половина максимального ускорения оси, ради случаев реверса при включенном блендинге траектории...
Очень нехорошо это для ВСО.

Надеюсь, в S-кривых этот недостаток уже устранили
Аватара пользователя
scout
Опытный
Сообщения: 114
Зарегистрирован: 11 янв 2010, 00:52
Репутация: 11
Откуда: Протвино
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение scout »

PKM писал(а):блендинге траектории
наверное смучинг имеется ввиду )) или все-таки именно термин блендинг используется? если да, то что это?
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение Nick »

они его называют именно blend. по сути примерно тоже самое, что и smoothing, только на сколько я понимаю он не будет изменять плавные траектории, а только "острые" углы.
il_nurbs_blend_surf.jpg (2922 просмотра) <a class='original' href='./download/file.php?id=10141&mode=view' target=_blank>Загрузить оригинал (15.75 КБ)</a>
PKM писал(а):Кстати, с ускорениями в ЕМС намутили. Обычно используется только половина максимального ускорения оси, ради случаев реверса при включенном блендинге траектории..
Где все это делается?
Аватара пользователя
Starik
Опытный
Сообщения: 136
Зарегистрирован: 13 май 2012, 21:22
Репутация: 17
Откуда: Долгопрудный

Re: LinuxCNC S-разгон и торможение

Сообщение Starik »

PKM писал(а):Кстати, с ускорениями в ЕМС намутили. Обычно используется только половина максимального ускорения оси, ради случаев реверса при включенном блендинге траектории...
Очень нехорошо это для ВСО.

Надеюсь, в S-кривых этот недостаток уже устранили
scout писал(а):если да, то что это?
вы попроще бы сказали, а то в двойных отрицаниях смысл совсем теряется...
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение Nick »

Хотелось бы понять порядок применения действий в LinuxCNC:

1. расчет точек траектории
2. расчет скруглений
3. расчет скоростей
4. преобразование кинематики

В каком порядке все это применяется?
Аватара пользователя
scout
Опытный
Сообщения: 114
Зарегистрирован: 11 янв 2010, 00:52
Репутация: 11
Откуда: Протвино
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение scout »

aystarik писал(а):вы попроще бы сказали, а то в двойных отрицаниях смысл совсем теряется...
не я только спросил... Ник ответил. Просто blend - вроде как смешивать означает, а smooth - сглаживать, вот и вышел когнитивный диссонанс
Аватара пользователя
PKM
Почётный участник
Почётный участник
Сообщения: 4263
Зарегистрирован: 31 мар 2011, 18:11
Репутация: 705
Настоящее имя: Андрей
Откуда: Украина
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение 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
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6194
Откуда: Казахстан.
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение aftaev »

PKM писал(а):ты станок раньше сделаешь
Так вроде уже прикрутили раз на плазме показывают?
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
PKM
Почётный участник
Почётный участник
Сообщения: 4263
Зарегистрирован: 31 мар 2011, 18:11
Репутация: 705
Настоящее имя: Андрей
Откуда: Украина
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение PKM »

aftaev писал(а):Так вроде уже прикрутили раз на плазме показывают?
Насколько я понял - нестабильная версия, для производства лучше не использовать.

Я с год назад ставил joints_axes то это был просто кошмар, может уже допилили
Аватара пользователя
Starik
Опытный
Сообщения: 136
Зарегистрирован: 13 май 2012, 21:22
Репутация: 17
Откуда: Долгопрудный

Re: LinuxCNC S-разгон и торможение

Сообщение Starik »

таким образом до половины максимального ускорения привода может не использоваться
а если еще и люфты заданы, то вообще четверть только...
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение 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;

такс, сейчас мы ее быстренько переделаем :)
Аватара пользователя
PKM
Почётный участник
Почётный участник
Сообщения: 4263
Зарегистрирован: 31 мар 2011, 18:11
Репутация: 705
Настоящее имя: Андрей
Откуда: Украина
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение PKM »

ждем, ждем! :beer_blow:
Аватара пользователя
Starik
Опытный
Сообщения: 136
Зарегистрирован: 13 май 2012, 21:22
Репутация: 17
Откуда: Долгопрудный

Re: LinuxCNC S-разгон и торможение

Сообщение Starik »

Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение Nick »

Фуххх как-то так.
Только в Сях я не силен. Компилить не пробовал, пока только эта функция... Что еще поменять надо, чтобы они откомпилировалось и как потом всеэто тестировать? :thinking:

Алгоритм:
  1. находим дистанцию остановки:
    она равна S2 + S4+S5+S6. S0, S1 и S3 в остановке не участвуют.
  2. Сначала смотрим не ускоряемся ли мы сейчас, если ускоряемся ищем S2
  3. Потом смотрим сколько времени нужно для остановки. Смотрим текущее ускорение, оно меньше 0. Находим скорость с которой мы начали замедляться, предполагая, что начали замедляться с максимальным jerk (т.е. находим скорость в начале S4 - v_deccel). После этого время S4 и S6 одинаковы и равны sqrt(v_deccel), если это время больше времени замедления ускорения - значит будем какое-то время замедляться на полном ускорении - S5.
  4. Вычитаем скорость за время полного ускорения и находим времена ускоренного и замедленного замедления S4 и S6
  5. В итоге имеем длины S2, S4, S5 и S6.
  6. Теперь нам осталось определиться, что делать дальше. Самое главное определиться с jerk - от него зависит все. Если tc->target - tc->progress лежит в S2 или S6 нам надо замедлять ускорение, во всех остальных случаях ускоряем ускорение.
  7. В самом конце обрезаем ускорение по максимальному ускорению. И скорость по максимальной скорости.
  8. Рассчитываем новое положение 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-разгон и торможение

Сообщение Nick »

Вот такая картинка, но она вроде как такая же как в статьях:
Вложения
S curve accel.png (2790 просмотров) <a class='original' href='./download/file.php?id=10656&mode=view' target=_blank>Загрузить оригинал (21.55 КБ)</a>
Scurve.svg
(15.75 КБ) 904 скачивания
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: LinuxCNC S-разгон и торможение

Сообщение Nick »

Так, а как можно по быстрому собрать LinuxCNC из исходников, желательно, чтобы runinplace? А то я что-то пока такого еще не делал :freak:.
Я помню кто-то вывешивал инструкцию.... но вот где?

==============
нашел :)
Установка LinuxCNC EMC2 из исходников #1
Ответить

Вернуться в «LinuxCNC»