SW korekce geometrie - pravouhlost os ...

fupe
Příspěvky: 638
Registrován: 27. 5. 2008, 9:10
Bydliště: Praha

28. 10. 2009, 9:11

k píše:Vzhladom na to, ze si EMC skoro stale kompilujem z najnovsich zdrojakov, je pre mna bezproblemove si akekolvek korekcie doprogramovat do vlastnej kinematiky.

Pokial ide o to prelikovanie cez HAL .. neskusal som to .. nebolo kedy.

Ak niekto nutne tuto vec potrebuje, tak radsej nacrtnem sposob ako si napise vlastnu kinematiku. Prva vec je aby ste zvladli kompilaciu EMC. Navody priamo na linuxcnc.org

Teraz ku vlastnej kinematike:

Na zaciatok si v subore definicie svojeho stroja zmente trivkins na "rotatekins" .. ale pozor .. vznikne niekolko veci ktore pri trivkins neexistuju a pri rotatekins ano .. (resp. pri akejkolvek inej kinematike ktora nie je identicka .. co je pripad len trivkins). Musite dokladne pochopit axis a jeho prepinanie (menu View -> joint mode/ World mode) aby ste vedeli kedy a preco vam jogguje len jeden motor (joint) a kedy sa jogguje s kinematikou (axe). Dalej upozornim, ze rotatekins preto aby bezala potrebuje prv ako sa prepnete do rezimu world mode nahomovat vsetky suradnice.

kedze mne uteka stol len v jednej suradnici, a rotatekins pracuje s oboma, tak potrebujeme malicku zmenu:

Teraz kusok kodu z rotatekins.c :

dopredna transformacia jae takato:
pos->tran.x = joints[0] * cos(c_rad) - joints[1] * sin(c_rad);
pos->tran.y = joints[0] * sin(c_rad) + joints[1] * cos(c_rad);
pos->tran.z = joints[2];

inverzna:
joints[0] = pos->tran.x * cos(c_rad) - pos->tran.y * sin(c_rad);
joints[1] = pos->tran.x * sin(c_rad) + pos->tran.y * cos(c_rad);
joints[2] = pos->tran.z;


V principe ak viem, ze mi stol uteka o 0.5 stupna pre os X staci zmenit, obe transformacie takto:

dopredna:
c_rad = 0.5 *M_PI/180;
pos->tran.x = joints[0] * cos(c_rad) - joints[1] * sin(c_rad);
pos->tran.y = joints[1];

inverzna:
c_rad = -0.5 *M_PI/180;
joints[0] = pos->tran.x * cos(c_rad) - pos->tran.y * sin(c_rad);
joints[1] = pos->tran.y;

Prekompilujem, spustim, nahomujem, prepnem do world suradnic a ked joggujem x, y, tak fyzicka os x (joint[0]) dostava pohyb podla x aj y suradnice. Y os ostava priamo zviazana s joint[1].

Na svojom stroji pouzivam upravenu rotatekins uz dlhsi cas, vyhodne prave pri upnuti obrobkov nie rovnobezne so suradnicovym systemom stroja.
Ahoj k,
myslim, ze nemas uplne pravdu. Transformace v rotatekins.c plati za predpokladu, ze osy jsou na sebe kolme a pootocene o nejaky uhel. Jestlize mi utika jenom jedna osa pak neplati kolmost a nemuzu pouze jednu cast transformace skrtnout. Navic ta cast se sinusem je zbytecna protoze druha osa neni pootocena. Nebo se pletu?

Cemu, ale nerozumim a rad bych si nechal od zasvecenejsich vysvetlit je inverzni funkce. Jak to ze je az na prehozeni axis a joints uplne stejna? Pochopil bych to trivkins tam se nic netransformuje, ale u rotace to prece nejde jen tak jednoduse zamenit.

Martin
k
Příspěvky: 814
Registrován: 12. 8. 2008, 12:00
Bydliště: Kosice SK

29. 10. 2009, 7:55

rotatekins ma bug (zmena world/joint view vdaka chybnemu mapovaniu koncila stale na joint [0,1] following error) ktory som uz davnejsie reportoval a ako pozeram je tam uz aj spravena oprava .. (14.10.2009 zavedena do git-u).

transformacia otocenia je rovnaka aj v inverznej aj priamej podobe meni sa len znamienko otocenia a zamenia sa suradnice jointov a suradnice os. V tom chyba nie je.

Priznam sa, ze som sa nezamyslal nad tym, ako prebehne rotacia ked pouzijem zmenu len na jednej osi .. t.j. druhu necham priamo kopirovat zo systemu os do systemu jointov. Skor som to bral ako sa to da "vseobecne" v EMC spravit upravov kinematiki .. ale pravda je ze praca chvatna malo platna ;)

Nacrtol som si to na papier . Y os nechavam neotocenu, x os je pootocena ..

Ked sa joint[0] vzdaluje od 0 tak vdaka pootoceniu ked on vykona drahu povedzme 100mm priemet na osi X sa posunie o kusok menej (podla cosinusu).

pos->tran.x = joints[0] * cos(c_rad)

Podobne ale dochadza pri posuvani jointu [0] aj ku posuvani na suradnici Y a teda realna pozicia bude takato:

pos->tran.y = joints[1] + joints[0] *sin(c_rad)


inverzna transformacia bude:
joints[0] = pos->tran.x / cos(c_rad)
joints[1] = pos->tran.y - pos->tran.x/cos(c_rad) *sin(c_rad)

V oboch pripadoch pouzijem pre vypocet c_rad rovnake znamienko.

Priznam sa, ze som len narychle natukal hore uvedene rovnice do EMC-cka a skusil to .. mapovanie inverzna - priama transformacia je zda sa ze OK. realne spravanie na stroji ale skuste sami ;) (pri prepinani joint/world mode som zhruba skontroloval suradnice .. pri 30 stupnovom natoceni oxi X .. zda sa to narychlo ze by to mohlo sediet).


Fupe: vdaka za najdenie mojej chyby, ale aj tento novy priklad berte s rezervou . budem rad ked to skontrolujete, najlepsie na realnom EMC resp. realnom stroji riadenom EMC, ktory ma os x naozaj pootocenu.
misox
Příspěvky: 196
Registrován: 18. 5. 2008, 11:41

2. 1. 2010, 7:05

Skusal to niekto ?
Mne to nejako nefungovalo, prepisal v hal-e trivkins na rotatekins a v rotatekins.c som to prepisoval podla uvedeneho prikladu ale nič sa nedialo.
Čim to može byť?
Hardmesr
Příspěvky: 423
Registrován: 12. 2. 2009, 9:05
Bydliště: Jižní Morava

2. 1. 2010, 9:45

Pánové tak toto bych chtěl někdy pochopit a umět. Na 100% to budu potřebovat.
NC soustruhy s ŘS Sinumerik 810T a 840D, YASNAC LX3. CAM KOVOPROG 2.7 až 4.13
Uživatelský avatar
Radek-B
Příspěvky: 2144
Registrován: 13. 9. 2006, 11:09
Bydliště: V:Karlovice
Kontaktovat uživatele:

2. 1. 2010, 10:18

misox píše:Skusal to niekto ?
Mne to nejako nefungovalo, prepisal v hal-e trivkins na rotatekins a v rotatekins.c som to prepisoval podla uvedeneho prikladu ale nič sa nedialo.
Čim to može byť?
Ukaz jak si to prepsal , mas tam neco spatne. Ukaz i hal.

RADEK
modernizace/repase CNC strojů a zařízení
automatizace/konstrukce
misox
Příspěvky: 196
Registrován: 18. 5. 2008, 11:41

3. 1. 2010, 8:28

Tu to je
HAL
# Generated by stepconf at Wed Dec 30 00:39:41 2009
# If you make changes to this file, they will be
# overwritten when you run stepconf again
loadrt rotatekins
loadrt [EMCMOT]EMCMOT base_period_nsec=[EMCMOT]BASE_PERIOD servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[TRAJ]AXES
loadrt probe_parport
loadrt hal_parport cfg="0x378 out "
setp parport.0.reset-time 5000
loadrt stepgen step_type=0,0,0

addf parport.0.read base-thread
addf stepgen.make-pulses base-thread
addf parport.0.write base-thread
addf parport.0.reset base-thread

addf stepgen.capture-position servo-thread
addf motion-command-handler servo-thread
addf motion-controller servo-thread
addf stepgen.update-freq servo-thread
net spindle-cmd <motion> parport.0.pin-02-out
setp parport.0.pin-02-out-reset 1
net xdir => parport.0.pin-03-out
net ystep => parport.0.pin-04-out
setp parport.0.pin-04-out-reset 1
net ydir => parport.0.pin-05-out
net zstep => parport.0.pin-06-out
setp parport.0.pin-06-out-reset 1
net zdir => parport.0.pin-07-out



setp stepgen.0.position-scale [AXIS_0]SCALE
setp stepgen.0.steplen 1
setp stepgen.0.stepspace 0
setp stepgen.0.dirhold 35000
setp stepgen.0.dirsetup 35000
setp stepgen.0.maxaccel [AXIS_0]STEPGEN_MAXACCEL
net xpos-cmd axis.0.motor-pos-cmd => stepgen.0.position-cmd
net xpos-fb stepgen.0.position-fb => axis.0.motor-pos-fb
net xstep <= stepgen.0.step
net xdir <stepgen> stepgen.0.enable

setp stepgen.1.position-scale [AXIS_1]SCALE
setp stepgen.1.steplen 1
setp stepgen.1.stepspace 0
setp stepgen.1.dirhold 35000
setp stepgen.1.dirsetup 35000
setp stepgen.1.maxaccel [AXIS_1]STEPGEN_MAXACCEL
net ypos-cmd axis.1.motor-pos-cmd => stepgen.1.position-cmd
net ypos-fb stepgen.1.position-fb => axis.1.motor-pos-fb
net ystep <= stepgen.1.step
net ydir <stepgen> stepgen.1.enable

setp stepgen.2.position-scale [AXIS_2]SCALE
setp stepgen.2.steplen 1
setp stepgen.2.stepspace 0
setp stepgen.2.dirhold 35000
setp stepgen.2.dirsetup 35000
setp stepgen.2.maxaccel [AXIS_2]STEPGEN_MAXACCEL
net zpos-cmd axis.2.motor-pos-cmd => stepgen.2.position-cmd
net zpos-fb stepgen.2.position-fb => axis.2.motor-pos-fb
net zstep <= stepgen.2.step
net zdir <stepgen> stepgen.2.enable

net estop-out <iocontrol> iocontrol.0.emc-enable-in

loadusr -W hal_manualtoolchange
net tool-change iocontrol.0.tool-change => hal_manualtoolchange.change
net tool-changed iocontrol.0.tool-changed <hal_manualtoolchange> hal_manualtoolchange.number
net tool-prepare-loopback iocontrol.0.tool-prepare => iocontrol.0.tool-prepared

Rotatekins :
/********************************************************************
* Description: rotatekins.c
* Simple example kinematics for a rotary table in software
*
* Derived from a work by Fred Proctor & Will Shackleford
*
* Author: Chris Radek
* License: GPL Version 2
* System: Linux
*
* Copyright (c) 2006 All rights reserved.
*
********************************************************************/

#include "rtapi_math.h"
#include "kinematics.h" /* these decls */

int kinematicsForward(const double *joints,
EmcPose * pos,
const KINEMATICS_FORWARD_FLAGS * fflags,
KINEMATICS_INVERSE_FLAGS * iflags)
{
double c_rad = -joints[1]*M_PI/180;
pos->tran.x = joints[0] * cos(c_rad)
pos->tran.y = joints[1] + joints[0] *sin(c_rad)
pos->tran.z = joints[2];
pos->a = joints[3];
pos->b = joints[4];
pos->c = joints[5];
pos->u = joints[6];
pos->v = joints[7];
pos->w = joints[8];

return 0;
}

int kinematicsInverse(const EmcPose * pos,
double *joints,
const KINEMATICS_INVERSE_FLAGS * iflags,
KINEMATICS_FORWARD_FLAGS * fflags)
{
double c_rad = pos->45*M_PI/180;
joints[0] = pos->tran.x / cos(c_rad)
joints[1] = pos->tran.y = joints[1] + joints[0] *sin(c_rad)
joints[2] = pos->tran.z;
joints[3] = pos->a;
joints[4] = pos->b;
joints[5] = pos->c;
joints[6] = pos->u;
joints[7] = pos->v;
joints[8] = pos->w;

return 0;
}

/* implemented for these kinematics as giving joints preference */
int kinematicsHome(EmcPose * world,
double *joint,
KINEMATICS_FORWARD_FLAGS * fflags,
KINEMATICS_INVERSE_FLAGS * iflags)
{
*fflags = 0;
*iflags = 0;

return kinematicsForward(joint, world, fflags, iflags);
}

KINEMATICS_TYPE kinematicsType()
{
return KINEMATICS_BOTH;
}

#include "rtapi.h" /* RTAPI realtime OS API */
#include "rtapi_app.h" /* RTAPI realtime module decls */
#include "hal.h"

EXPORT_SYMBOL(kinematicsType);
EXPORT_SYMBOL(kinematicsForward);
EXPORT_SYMBOL(kinematicsInverse);
MODULE_LICENSE("GPL");

int comp_id;
int rtapi_app_main(void) {
comp_id = hal_init("rotatekins");
if(comp_id > 0) {
hal_ready(comp_id);
return 0;
}
return comp_id;
}

void rtapi_app_exit(void) { hal_exit(comp_id); }
k
Příspěvky: 814
Registrován: 12. 8. 2008, 12:00
Bydliště: Kosice SK

11. 1. 2010, 11:30

Ok radsej sem hodim cely upraveny subor rotatekins.c (v prilohe).

Pre stroj si dodefinujte aj os a,b,c (nemusi byt linknuta na parport .. proste bude cisto "softwarova").. Os "c" ovlada natacanie.

ak to niekomu prekaza, resp. nexce si dodefinovat dalsie osi a,b,c, a staci mu len "fixne" nastavene otocenie, moze to zadat priamo v subore . proste premennu c_rad priamo nahradite cislom, ktore reprezentuje uhol natocenia osi voci sebe v radianoch.

Samozrejme je nutne EMC skompilovat po zmene rotatekins.c .. pozrite sa aj do polozky View v axis interface ci tam mate moznost prepinat Joint a World mode. Stroj najprv nahomujte v joint mode (inac to ani nejde :) a potom vo world mode uz bude uplatnovat rotaciu podla toho co je nastavene pre os "c"
Přílohy
rotatekins.c
upravena kinematika rotatekins.c aby sa podla osi &quot;c&quot; dal menit uhol osi &quot;x&quot; a &quot;y&quot;
(2.27 KiB) Staženo 369 x
Uživatelský avatar
slezak77
Příspěvky: 1152
Registrován: 1. 6. 2012, 6:45

13. 11. 2013, 7:55

Zdravím
Našl jsem na wiki.linux... toto: http://wiki.linuxcnc.org/cgi-bin/wiki.p ... Kinematics" onclick="window.open(this.href);return false;
Na mojem malém strojku řeším právě problém pravoůhlosti os. Osa Y se mi rozvírá.
Chci se zeptat zdali musím kompilovat celé EMC nebo stačí dodržet návod jak je psaný:
Stáhnout soubor millkins.c
Nakompilovat jej, a teď jestli to bude správně...
" sudo comp --install millkins.c " pochopitelně z adresáře kde jej stáhnu, např /sly/download/

a potom upravit soubor hall, také podle návodu. přepstat " loadrt trivkins na loadrt millkins " a přidat řádek
setp millkins.skew #.### kde číslo vypočítám, a to tak že např na 100mm bude rozteč 1.6mm, podle návodu bych to tipoval na
1.6/100=0.016

Ještě jestli musím někde dokopírovat ten soubor millkins.c, nebo ne. Mslím že ano, ale ani nevím kde, emc mám v na stroji 2.5.3 z live cd a nechci do něj rypat bo šlape jak hodinky.

zkoušel jsem to na notesu a prošlo to, ale zase nemám jak vyzkoušet, jestli se dostavil kýžený výsledek, na notesu jsem millkins.c kopíroval do emc2-dev/src/emc/kinematics, ale na pc u strojku nic takového nemám a ani tu složku kinematics
jsem nenašel.

Předem díky za rady.
Uživatelský avatar
slezak77
Příspěvky: 1152
Registrován: 1. 6. 2012, 6:45

14. 11. 2013, 6:35

Tak jsem to dal, ale byla to fuška.
Mlátil jsem se stím řádkem v.hal " setp millkins.skew *.*** " já to číslo pořád cpal pod řádek loadrt millkins, a ono jsem ho měl narvat do osy. Teď to jede. Zarazila mne ale ještě jedna věc. ono to jede při spuštěném programu, při ručním jogování ne, ale myslím že to je to nejmenší a asi je to tak i myšleno.
Teď už jen přesně změřit o kolik to letí, budu muset si někde půjčit hodinky, bo stolař to tak jaksi nepotřebuje.
Tak jen tak kdyby to někomu pomohlo, osobně si myslím že je to v Hobby docela užitečná funkce.
Odpovědět

Zpět na „LinuxCNC - drive pod nazvem EMC2“