Страница 4 из 7
Re: Станок канатной резки камня с ЧПУ
Добавлено: 15 июл 2013, 21:46
nkp
Хочеться довести до логического завершения компонент тангенциального ножа.
Протестировав atan2 во всех модификациях, не нашел полностью удовлетворения требованиям такого рода инструмента.
если ножом управляет серводвигатель - то хочеться схематично говоря такого:
то есть выход atan2 в диапазоне 0-360 и желательно переходы по кратчайшему пути...
для наглядности можнт умножать выход на значение рад :
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
работа устраивает
кривость присутствует и вынужденная и непринужденная

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...
где то так:
(для просмотра содержимого нажмите на ссылку)Код: Выделить всё
#=================================================== 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 закрался...
поздно наверно было

(на что бы пореалистичней сослаться

)
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