Страница 4 из 7

Re: Станок канатной резки камня с ЧПУ

Добавлено: 15 июл 2013, 21:46
nkp
Хочеться довести до логического завершения компонент тангенциального ножа.
Протестировав atan2 во всех модификациях, не нашел полностью удовлетворения требованиям такого рода инструмента.
если ножом управляет серводвигатель - то хочеться схематично говоря такого:
Выделение(034).jpg (4102 просмотра) <a class='original' href='./download/file.php?id=16365&mode=view' target=_blank>Загрузить оригинал (44.01 КБ)</a>
то есть выход atan2 в диапазоне 0-360 и желательно переходы по кратчайшему пути...
для наглядности можнт умножать выход на значение рад :

Код: Выделить всё

         a1 = atan2(x,y);
         a = a1*57,295779513;

Re: Станок канатной резки камня с ЧПУ

Добавлено: 16 июл 2013, 10:59
Nick
Не совсем понял схему... как подключить два пина к PID? и зачем там AND2?

Re: Станок канатной резки камня с ЧПУ

Добавлено: 16 июл 2013, 21:58
nkp
Nick писал(а):Не совсем понял схему..
ну схема - это второе...
первое - это получить от ATAN2 на выходе угол (все варианты в теме не работают правильно до конца)

Re: Станок канатной резки камня с ЧПУ

Добавлено: 16 июл 2013, 23:12
nkp

Код: Выделить всё

component atan2;
pin in float x;
pin in float y;
pin out float a;
function _;
license "GPL";
;;
#include <rtapi_math.h>;

FUNCTION(_) { 
   if (x==0 && y==0) {a=0;}      // sudo comp --install atan2.comp
   else {
         float a1;
         a1 = atan2(x,y);
         if (x>0 && y>0) 
            {a = a1*57,295779513;}
         else  if  (y<0 && x>0)
            {a = a1*57,295779513;}
         else  if  (x>0 && y==0)
            {a = 90;}
         else  if  (x==0 && y>0)
            {a = 0;}
         else  if  (y<0 && x==0)
            {a = 180;}
         else  if (x<0 && y<0) 
            {a = 360 + a1*57,295779513;}
         else  if  (y==0 && x<0)
            {a = 270;}
         else  if (y>0 && x<0) 
            {a = 360 + a1*57,295779513;}       
      }
}
при вот таком перевертыше:

Код: Выделить всё

net  vel_in1 <= axis.1.joint-vel-cmd 
net  vel_in  <= axis.0.joint-vel-cmd 
#===================
loadrt atan2
addf atan2.0 servo-thread
net vel_in  => atan2.0.y  
net vel_in1 => atan2.0.x 
работа устраивает
кривость присутствует и вынужденная и непринужденная :freak:
upd:
даже наверно можно убрать первое условие - чтоб при остановке нож сохранял положение:
(для просмотра содержимого нажмите на ссылку)

Код: Выделить всё

component atan2;  // sudo comp --install atan2.comp
pin in float x;
pin in float y;
pin out float a;
function _;
license "GPL";
;;
#include <rtapi_math.h>;
FUNCTION(_) { 
         float a1;
         a1 = atan2(x,y);
         if (x>0 && y>0) 
            {a = a1*57,295779513;}
         else  if  (y<0 && x>0)
            {a = a1*57,295779513;}
         else  if  (x>0 && y==0)
            {a = 90;}
         else  if  (x==0 && y>0)
            {a = 0;}
         else  if  (y<0 && x==0)
            {a = 180;}
         else  if (x<0 && y<0) 
            {a = 360 + a1*57,295779513;}
         else  if  (y==0 && x<0)
            {a = 270;}
         else  if (y>0 && x<0) 
            {a = 360 + a1*57,295779513;}      
}

Re: Станок канатной резки камня с ЧПУ

Добавлено: 16 июл 2013, 23:45
nkp
теперь задумка реализации:
нож выполняется как ось на серве ,энкодер на рисунке заведен на "pos" , atan- это выход нашего компонента...
near сравнивает задание (atan) и позицию - count энкодера и при совпадении - запрещает шим через enable...
направление вращения берем через sum , abs и mux...
(для просмотра содержимого нажмите на ссылку)
Выделение(035).jpg (4042 просмотра) <a class='original' href='./download/file.php?id=16382&mode=view' target=_blank>Загрузить оригинал (105.68 КБ)</a>
где то так:
(для просмотра содержимого нажмите на ссылку)

Код: Выделить всё

#=================================================== http://cnc-club.ru/forum/viewtopic.php?t=2449&p=75810#p75808
loadrt atan2
loadrt sum2
loadrt abs
loadrt near
loadrt mux2

addf atan2.0 servo-thread
addf sum2.0  servo-thread
addf abs.0   servo-thread
addf near.0  servo-thread
addf mux2.0  servo-thread

net vel_in    axis.0.joint-vel-cmd             => atan2.0.y  
net vel_in1   axis.1.joint-vel-cmd             => atan2.0.x 

net  sum_in0  hm2_5i20.0.encoder.02.position   => sum2.0.in0  
net  sum_in1  atan2.0.a                        => sum2.0.in1  
net  sum_out  sum2.0.out                       => abs.0.in
net  abs_pos  abs.0.is-positive                => mux2.0.sel  
net  mux_out  mux2.0.out                       => hm2_5i20.0.pwmgen.02.value 
setp mux2.0.in0  -0.5 
setp mux2.0.in1   0.5

net  near_in1  hm2_5i20.0.encoder.02.position  => near2.0.in1  
net  near_in2  atan2.0.a                       => near2.0.in2  
net  near_out  near2.0.out                     => hm2_5i20.0.pwmgen.02.enable
setp near.0.difference 0

Re: Станок канатной резки камня с ЧПУ

Добавлено: 17 июл 2013, 09:54
Nick
Серва по скорости управляется?
Вообще сервой все равно надо бы через ПИД управлять...


И лучше добавь в компонент atan параметр scale... формат в радианах тоже достаточно часто используется... (надо бы эти компоненты в linuxcnc запостить...)

Первое условие нужно, по крайней мере, чтобы не высчитывать atan2, а то в манах пишут: If both arguments passed are zero, a domain error occurs.

PS а зачем у нас столько интервалов? нам [-пи,пи] не подходит?

Re: Станок канатной резки камня с ЧПУ

Добавлено: 17 июл 2013, 10:14
nkp
Nick писал(а):Серва по скорости управляется?
да
Nick писал(а):Вообще сервой все равно надо бы через ПИД управлять...
если напрямую не получится - пропустим через пид
Nick писал(а):Первое условие нужно, по крайней мере, чтобы не высчитывать atan2,
если не убрать его - то при любой паузе в движении нож уходит в ноль...
Nick писал(а):PS а зачем у нас столько интервалов? нам [-пи,пи] не подходит?
чесно сказать - накрапал эти строки "самым научным способом" :)
если кто то поправит - буду признателен
(нужен выход компонента 0 - 360 в зависимости - "куда едем")

Re: Станок канатной резки камня с ЧПУ

Добавлено: 17 июл 2013, 10:26
nkp
If both arguments passed are zero, a domain error occurs.
не знаю какая там ошибка возникает (надо посмотреть в терминале) - но программу на емс выполняет без ошибок и
при переездах по Z (x и y - ноль) выход не менялся...
а вообще прописать if (x==0 && y==0)
{a = a1}
можно ли так и нужно ли вначале a1=0
??

Re: Станок канатной резки камня с ЧПУ

Добавлено: 17 июл 2013, 10:31
Nick
nkp писал(а):если не убрать его - то при любой паузе в движении нож уходит в ноль...
Лучше всего оставить это условие, просто убрать a=0. Т.е. если x=0 && y=0 то ничего не делаем, тогда в a сохранится предыдущее значение.
nkp писал(а):(нужен выход компонента 0 - 360 в зависимости - "куда едем")
и ехать кратчайшим путем, так?

Тут появляется вечная засада с полными оборотами... надо придумать как их избежать, точнее как избежать скачков при полном обороте, скорее всего надо делать через mod - деление по модулю...

щас придумаем...

Re: Станок канатной резки камня с ЧПУ

Добавлено: 17 июл 2013, 10:35
nkp
Nick писал(а):и ехать кратчайшим путем, так?
нет - это все будет работать без пересечения нулевой метки энкодера - то есть по длинному пути
тут бы так запустить - потом можно и с коротким путем подумать(с первого взгляда показалось это сложным)))
Nick писал(а):Т.е. если x=0 && y=0 то ничего не делаем
а как pass в си пишеться?

Re: Станок канатной резки камня с ЧПУ

Добавлено: 17 июл 2013, 10:37
Nick
nkp писал(а):нет - это все будет работать без пересечения нулевой метки энкодера - то есть по длинному пути
Тогда в чем вообще проблема? atan->pid->pwm и все....
Зачем тебе mux, abs, near и прочее?

Или ты таким путем хочешь избежать использования PID? :)

Re: Станок канатной резки камня с ЧПУ

Добавлено: 17 июл 2013, 10:48
nkp
Nick писал(а):Тогда в чем вообще проблема? atan->pid->pwm и все.... Зачем тебе mux, abs, near и прочее?
ну нету у меня таланта коротко написать :)
я мыслил так - near будет сравнивать задание с позицией и выдавать да или нет на шимгенератор
а знак шим будет вычислять abs
(приветствуются другие идеи :) )

Re: Станок канатной резки камня с ЧПУ

Добавлено: 17 июл 2013, 10:54
Nick
А чем тебе pid не подходит для этих целей? :)
там и deadband есть если что.

т.е. просто настраиваешь как обычную ось и все, а команду берем с atan.

Re: Станок канатной резки камня с ЧПУ

Добавлено: 17 июл 2013, 10:57
nkp
я ж так и хотел (см. первый кривой риунок :) )....
там или пид или sum планировался...
железо покажет - что и как ...
зы
а как pass в си пишеться?

Re: Станок канатной резки камня с ЧПУ

Добавлено: 17 июл 2013, 11:00
Nick
никак - просто {} и все :)
в питоне pass нужен для того, чтобы синтаксис не портился, в питоне после ":" по любому должен быть отступ иначе будет sintax error или invalid indent вот для этого pass и нужен.

Re: Станок канатной резки камня с ЧПУ

Добавлено: 17 июл 2013, 11:01
Nick
nkp писал(а):я ж так и хотел (см. первый кривой риунок )....
Там у тебя еще какой-то and2 закрался... :)

Re: Станок канатной резки камня с ЧПУ

Добавлено: 17 июл 2013, 11:07
nkp
Nick писал(а):Там у тебя еще какой-то and2 закрался...
поздно наверно было :oops: (на что бы пореалистичней сослаться :thinking: :hehehe: )

Re: Станок канатной резки камня с ЧПУ

Добавлено: 17 июл 2013, 19:40
nkp
а вот как теперь с home быть??
у нас же наверняка задание в момент нахождения нуля подается через тот же axis.2.motor-pos-cmd
и что будет если выйти в ноль с axis.2.motor-pos-cmd и "переключиться" на atan2.0.a

Re: Станок канатной резки камня с ЧПУ

Добавлено: 17 июл 2013, 20:52
Nick
В принципе, можешь сам попробовать обнулить ось. У тебя как все это подключено (через месу)?
Надо сделать encoder.index-enable 1 и G02 X0 I1 - так проедем круг, на котором переберем все значения и обнулим энкодер. Главное, чтобы ось сильно не скаканула после обнуления, хотя быстрее чем pid позволит все равно не получится...

хотя, можно и motor-pos перекидывать, через mux кинуть atan и motorpos, a в качестве условия:
halui.joint.N.is-homed bit out
status pin telling that joint N is homed

Re: Станок канатной резки камня с ЧПУ

Добавлено: 17 июл 2013, 20:58
nkp
пока написал с homed - завтра попробую...

Код: Выделить всё

net  z_homed  axis.2.homed  mux2.0.sel
net  mux2in0  mux2.0.in0    axis.2.motor-pos-cmd
net  mux2in1  mux2.0.in1    atan2.0.a 
net  mux_out  mux2.0.out    pid.z.command