Digitalni Model Reliefa Slovenije

Za narocnika smo v laboratoriju prevzeli izdelavo modela reliefa Slovenije, ki se je izdelal z rezkalnikom iz poliuretana BM5460 proizvajalca Ciba Geigy. Za model velikosti 500x700 mm je bilo potrebno izdelati program, ki generira poti orodja za rezkalnik. Klasicen pristop z uvozom vhodnih podatkov v modelirnik na delovni postaji s 512 MB fizicnega oz. 1.5 GB navideznega spomina ni bil uspesen, saj je postaji zmanjkalo graficnega spomina. Postaja bi morala imeti zmoznost vsaj 4 mio trikotnikov. Tudi manipulacija podatkov je vprasljiva, saj modelirniki pretvorijo tocke v NURBS zlepke in s tem po nepotrebnem povecajo zahtevnost problema. Za hranjenje trikotnikov v spominu je tako potrebno 3*8*4=96MB. Zarradi omenjenih tezav sem pristopil k izdelavi programa, ki bi z manjso spominsko zahtevnostjo in ustrezno hitrostjo generiral poti orodja. Slovenija

Nastavitve rezalnih parametrov

Za nastavitve rezalnih parametrov je izdelan naslednji program v jeziku JavaScript, ki generira .INI datoteko vhodnih parametrov programa.

Podatki za rezkanje s krogelnim rezkarjem

Dimenzija podatkov DMR Slovenije je 248.0 x 164.0 km. Tocke za koordinate do podane na razdalji 100m.
Spodnji levi rob (pri morju) ima koordinato 0,0. Zgornji desni pa 2479,1639. Enota je torej 100 metrov. Koordinate so cela stevila, ki gredo lahko tudi izven obsega. Za podrocja izven podatkov je visinska kota nic.
Koordinata spodnjega levega robu:
x1: y1:
Zgornji desni rob:
x2: y2:

Premer rezkarja: mm
Toleranca optimiranja poti: mm
Korak v smeri y : % premera orodja
Povecava v smeri z:
Merilo: 1mm = m
Hitrost rezanja: mm/min
Ime izhodne G datoteke:
Pomik v smeri z: mm
Kot posnetja robu: stopinj
Zgostitev mreze: krat
Optimizacija na ravne crte :
Dolzina: mm Toleranca: mm
Po odprtju okna klikni File, Save As in shrani v datoteko z imenom drmg.ini

Posnetje robu

Ker je bilo potrebno za vakuumiranje narediti rob, ki ni skokovit, se je predpisal kot posnetja 60 stopinj. Preizkuseni so bili naslednji stirje algoritmi:

Gradient v tockah (x+-1, y) in (x,y+-1)

Slika robu 1
Kot kaze slika, gradienti niso najlepsi, saj tezi padanje le v smeri x ali y.

Gradient v tockah (x+-1, y+-1) in (x,y)

Slika robu 2
Ta algoritem je bil izbran kot najboljsi.

Gradient v tockah (x+-1, y+-1) in (x+=2,y+-2)

Slika robu 3
Gradient pade zaradi izracunavanja poprecja vecjega kvadrata. Pojavijo se tudi cudne napake na zacetku robu. Verjetno so te napake numericne narave. Mogoce bi pomagal pri vecjih radijih krozni in ne kvadratni radient.

Gradient v tockah (x+-1, y+-1) in (x,y)

Slika robu 4
Testirane so bile tudi diagonalne tocke. Takrat je bil rob z gradienti pod 45 stopinj.

Generiranje poti

Za generiranje poti je bil izbran krogelni rezkar za katerega je bilo potrebno izracunati odmike orodje z upostevanjem obeh smeri.

Odmik orodja z upostevanjem ene smeri

Slika odrezavanje z upostevanjem ene smeri
Slika prikazuje osnovni relief in pot orodja z radijem 2mm. Odmik je upostevan le v eni smeri.

Odmik orodja z upostevanjem obeh smeri

Slika odrezavanje z upostevaneme obeh smeri

Optimizacija poti

Slika optimizacije
Optimizacijo je po preizkusih bilo potrebno razdeliti na dva dela:
  1. Hriboviti del z optimizacijo 0.2 mm
  2. Ravni deli z optimizacijo 0.005 mm
S tem so se odpravile vidne hrapavosti na visini 0 in ravninskih delih.

Interpolacija

Pri vecjih povecavah je potrebna zgostitev mreze. Najenostavnejsi pristop z bilinearno interpolacijo se je pokazal kot slab, saj je bilo videti mrezo v izrezkanem modelu.

Bilinearna interpolacija

Bilinearna interpolacija

Bikubicna spline interpolacija

Bikubicna interpolacija

Program

Program za generiranje poti je napisan v jeziku C++. Glavni del programa, ki vsebuje zanko za generiranje poti je naslednji:
  InitParameters param(iniFile);
  PathOptimizer path;
  int radius = int(param.diameter/2.0*param.scale);
  Image dmr(radius, param.zScale);

  if (makeCache)
        {
          dmr.edgeChamfer(60.0);
          dmr.writePGM("nvsl.pgm");
          dmr.write();            
        }

  ofstream gcode(param.gFile);

  param.print();

  int step = int(param.diameter * param.stepPercentage/100.0 
                                 * param.scale/100.0);


  clog << "Korak: " << step << " enot mreze." <<  endl;
  clog << "Radij orodja: " << radius << " metrov" << endl;

  double fastMoveZ = dmr.zSize()*param.zScale/param.scale 
			+ param.diameter;

  gcode << setiosflags(ios::fixed) << setprecision(2);
  gcode << "G90\nG20\nF" << param.speed << '\n';
  for (int y = param.y1; y <= param.y2; y += step)
        {
          path.reset();
          clog << "[" <<  y << ":" ;
          
          // pomik nad zacetno tocko
          gcode << "G00 X0" 
                        << " Y" << (y- param.y1)*100.0/param.scale
                    << " Z" << fastMoveZ << '\n';

          for (int x = param.x1; x <= param.x2 ; x++)
                {
                  // clog << dmr.zSphere(x,y) << "," ;
                  path.insert(gmVector3((x-param.x1)*100.0/param.scale,
                                (y- param.y1)*100.0/param.scale,
                                dmr.zSphere(x, y)/param.scale 
				- param.diameter/2.0));
                }

          clog << int(path.optimize(param.toolError, 8.0, 0.0045)*100)<< "%]" ;
          path.print(gcode);
          // pomik nad koncno tocko
          gcode << "G00 X" <<  (param.x2-param.x1)*100.0/param.scale 
                        << " Y" << (y- param.y1)*100.0/param.scale
                        << " Z" << fastMoveZ << '\n';
        }
  gcode << "M30" << endl;
  gcode.close();

Casovna zahtevnost

Program je za generiranje z najbolj finim rezkalnikom premera 3 mm in pomikom 0.3 mm po osi y za velikost modela 500x700 mm potreboval na
  1. Pentium 133 na Linux-u
    real    242m59.020s
    user    240m6.110s
    sys     0m3.320s
    
  2. ali 4 ure
  3. HP J282 z dvema procesorjema, od katerega je bil uporabljen za racunanje le eden
    real  1:00:28.3
    user  1:00:22.5
    sys         3.3
    
Spominska zahtevnost problema je bila 12MB. Generirana datoteka G za NC stroj je velika 7MB. Fino rezkanje je trajalo 21ur. Grobo z rezkarjem premera 10 mm pa 1 uro.
Copyright 1998 Leon Kos, Laboratorij za CAD - LECAD
April 1998