Страница 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, только на сколько я понимаю он не будет изменять плавные траектории, а только "острые" углы.
il_nurbs_blend_surf.jpg (2933 просмотра) <a class='original' href='./download/file.php?id=10141&mode=view' target=_blank>Загрузить оригинал (15.75 КБ)</a>
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
ждем, ждем! :beer_blow:

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

Добавлено: 07 янв 2013, 00:52
Starik

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

Добавлено: 07 янв 2013, 01:52
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 		
}

Сейчас картинку добавлю ...

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

Добавлено: 07 янв 2013, 02:01
Nick
Вот такая картинка, но она вроде как такая же как в статьях:

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

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

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