Hello,

I wrote a quadrangle pocketing routine in G-Code which uses nurbs 
(G5.2). The motivation for this is that I dislike the current ngcgui 
routine (qpocket) for a couple reason. When qpocket cuts from one quad 
to another, "spiraling out", it actually cuts a scaled quad, then adds 
one edge where it slowly cuts toward the next scaled quad. That cut is 
really slow and is superfluous if the cut was really following a quad 
spiral instead. Second, and most important for me, the cut fully digs in 
on each corner (depending on the angle of the corner of course, but 
generally it is pretty big).

So the width of cut goes from the overlap set for each pass, to almost 
the full endmill width. Maybe not important on a big mill, but I have a 
mini-mill and I like to try to cut at full depth if possible and with 
very small overlap, on many fast passes, it gives (I think ) better 
finish and wears the mill more evenly. (kind of like with adaptative 
clearing). So the way corners are cut is really a problem with qpocket.

Here is the fruit of my experiments using nurbs, pasted below. The nurb 
weight are scaled with an exponential as the path comes closer to the 
final pocket shape, to (un)round the corners progressively. The function 
is parametrable.

The preview looks great, however, when running it, I get a path that 
does not follow the previewed path ! And I see no reason for the massive 
divergence from the programmed path. See a screenshot here:

http://imagebin.ca/v/1OCw5gNzXQBF

http://ibin.co/1OCw5gNzXQBF

notice how the purple path has "wobbles" in some sections, which go way 
aside the previewed path.

I tested with the sim on linuxcnc 2.5.3

At first sight it really seems to be a bug as the preview looks correct. 
Could anyone test this on their setup ? Is there an explanation for this ?

Thanks !
Bruno


Here is the test program

;;;;;;;;;;;;;;;;;;;;;;
;
#<mill_number> = 5

( some init )
G21 (Unit in mm)
G90 (Absolute distance mode)
G64 P0.01 (Exact Path 0.001 tol.)
G17
G40 (Cancel diameter comp.)
G49 (Cancel length comp.)

G54

G0 X0 Y0 Z0

( select endmill )
T[#<mill_number> ] M6
G43 ( enable tool length compensation )
G0 Z5

F300
;;;;;;;;;;;;;;;;;;;;;

G0 X20 Y20
G1 Y-20
G1 X-20
G1 Y20
G1 X20

G0 X40 Y40
G0 Y-40
G0 X-40
G0 Y40
G0 X40

G0 X0 Y0

;;;;;;;;;;;;;;;;;;;;;;;;;
; parameters
(coordinates of the corners are absolute)
( starting corner top right)

#<x1> = 40
#<y1> = 40
#<x2> = 40
#<y2> = -40
#<x3> = -40
#<y3> = -40
#<x4> = -40
#<y4> = 40

#<z_safe> = 2

( defines how the nurb weight vary)
#<initial_weight> = 0.1
#<weight_mult> = 8
#<weight_offset> = 2

#<hole_radius> = 4
#<pocket_depth> = 15
( z step for each turn when drilling down )
#<z_step> = 1
( z step for each layer )
#<z_stepover> = 8
#<xy_stepover> = 5
;;;;;;;;;;;;;;;;;;;;;;;

o<npocket4> call [#<x1>] [#<y1>] [#<x2>] [#<y2>] [#<x3>] [#<y3>] [#<x4>] 
[#<y4>] [#<z_safe>] [#<initial_weight>] [#<weight_mult>] 
[#<weight_offset>] [#<hole_radius>] [#<pocket_depth>] [#<z_step>] 
[#<z_stepover>] [#<xy_stepover>]

M2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


the actual subroutine:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; quadrangle pocket cutting path.
; author: Bruno    Schwander
; 30 May 2014
; This code is under the Beerware-license:
; if you use this code and find it useful, buy me a beer sometimes.
; [email protected]
;

; parameters
(coordinates of the corners are absolute)
( starting corner top right)

o<npocket4> sub

#<x1> = #1
#<y1> = #2
#<x2> = #3
#<y2> = #4
#<x3> = #5
#<y3> = #6
#<x4> = #7
#<y4> = #8

#<z_safe> = #9

( defines how the nurb weight vary)
#<initial_weight> = #10
#<weight_mult> = #11
#<weight_offset> = #12

#<hole_radius> = #13
#<pocket_depth> = #14
( z step for each turn when drilling down )
#<z_step> = #15
( z step for each layer )
#<z_stepover> = #16
#<xy_stepover> = #17
;;;;;;;;;;;;;;;;;;;;;;;

#<tool_diameter> = #5410

#<midx12> = [[#<x1> + #<x2>] / 2]
#<midy12> = [[#<y1> + #<y2>] / 2]
#<midx23> = [[#<x2> + #<x3>] / 2]
#<midy23> = [[#<y2> + #<y3>] / 2]
#<midx34> = [[#<x3> + #<x4>] / 2]
#<midy34> = [[#<y3> + #<y4>] / 2]
#<midx41> = [[#<x4> + #<x1>] / 2]
#<midy41> = [[#<y4> + #<y1>] / 2]

#<xcenter> = [[#<midx12> + #<midx34>] / 2]
#<ycenter> = [[#<midy12> + #<midy34>] / 2]

#<dim> = SQRT[ [[[#<x1> + #<x2>] / 2]**2] + [[[#<y1> + #<y2>] / 2]**2] ]
#<xy_passes> = [ #<dim> / #<xy_stepover>]
#<pocket_not_finished> = 1

G90 (absolute mode)

G0 X[#<xcenter>] Y[#<ycenter>]
;G42 (no tool diameter compensation with nurbs !!)

o100 do

     #<weight> = [#<initial_weight>]

     (given pocket depth, find the actual z_stepover to do which can 
change if z_stepover is larger than what is left to pocket)
     o101 if [#<pocket_depth> GT #<z_stepover> ]
         #<z_stepdepth> = #<z_stepover>
     o101 else
         #<z_stepdepth> = #<pocket_depth>
     o101 endif

     G91
     G0 X-[ #<hole_radius> ]
     ( drill center hole of pocket )
     o102 while [ #<z_stepdepth> GE #<z_step> ]
         G2 Z-[#<z_step>] I[#<hole_radius>]
         #<z_stepdepth> = [#<z_stepdepth> - #<z_step>]
     #<pocket_depth> = [#<pocket_depth> - #<z_step>]
     o102 endwhile


     (must handle when z_step not a multiple of z_stepdepth)
     #<last_zstep> = [#<z_stepdepth> - [FIX[#<z_stepdepth> / #<z_step>] 
* #<z_step>] ]
     o103 if [#<last_zstep> GT 0]
         G2 Z-[#<last_zstep>] I[#<hole_radius>]
     #<pocket_depth> = [#<pocket_depth> - #<last_zstep>]
     o103 endif

     G2 I[ #<hole_radius> ]  ( 1 turn flat to finish bottom of hole)

     G90
     #<offset> = #<hole_radius>
     #<scale> = [#<offset> / #<dim>]

     ; go to start
     G0 X[ [#<midx41> - #<xcenter>]* #<scale> + #<xcenter>] Y[ 
[#<midy41> - #<ycenter>] * #<scale> + #<ycenter>]

     G5.2 X[[#<x1> - #<xcenter>] * #<scale> + #<xcenter>] Y[[#<y1> - 
#<ycenter>] * #<scale> + #<ycenter>] P[#<weight>] L3
         X[[#<midx12> - #<xcenter>] * #<scale> + #<xcenter>] 
Y[[#<midy12> - #<ycenter>] * #<scale> + #<ycenter>] P[#<weight>]
     G5.3

     #<pass_number> = 0
     #<mid_index> = 1

     o104 while [ [#<offset> ] LE #<dim> ]
         #<pass_number> = [#<pass_number> + 1]
     #<weight> = [#<initial_weight> + EXP[[[#<pass_number> / 
#<xy_passes>] * #<weight_mult>] - #<weight_offset>] ]

         #<offset> = [#<offset> + [0.25 * #<xy_stepover>]]
         #<scale> = [#<offset> / #<dim>]

     o300 if [ [#<offset> ] GT #<dim> ]
          o104 continue
     o300 endif
         G5.2 X[[#<x2> - #<xcenter>] * #<scale> + #<xcenter>] Y[[#<y2> - 
#<ycenter>] * #<scale> + #<ycenter>] P[#<weight>] L3
             X[[#<midx23> - #<xcenter>] * #<scale> + #<xcenter>] 
Y[[#<midy23> - #<ycenter>] * #<scale> + #<ycenter>] P[#<weight>]
         G5.3
     #<mid_index> = 2

         #<offset> = [#<offset> + [0.25 * #<xy_stepover>]]
         #<scale> = [#<offset> / #<dim>]

     o301 if [ [#<offset> ] GT #<dim> ]
          o104 continue
     o301 endif
         G5.2 X[[#<x3> - #<xcenter>] * #<scale> + #<xcenter>] Y[[#<y3> - 
#<ycenter>] * #<scale> + #<ycenter>] P[#<weight>] L3
             X[[#<midx34> - #<xcenter>] * #<scale> + #<xcenter>] 
Y[[#<midy34> - #<ycenter>] * #<scale> + #<ycenter>] P[#<weight>]
         G5.3
     #<mid_index> = 3

         #<offset> = [#<offset> + [0.25 * #<xy_stepover>]]
         #<scale> = [#<offset> / #<dim>]
     o302 if [ [#<offset> ] GT #<dim> ]
          o104 continue
     o302 endif
         G5.2 X[[#<x4> - #<xcenter>] * #<scale> + #<xcenter>] Y[[#<y4> - 
#<ycenter>] * #<scale> + #<ycenter>] P[#<weight>] L3
             X[[#<midx41> - #<xcenter>] * #<scale> + #<xcenter>] 
Y[[#<midy41> - #<ycenter>] * #<scale> + #<ycenter>] P[#<weight>]
         G5.3
     #<mid_index> = 4

         #<offset> = [#<offset> + [0.25 * #<xy_stepover>]]
         #<scale> = [#<offset> / #<dim>]
     o303 if [ [#<offset> ] GT #<dim> ]
          o104 continue
     o303 endif
         G5.2 X[[#<x1> - #<xcenter>] * #<scale> + #<xcenter>] Y[[#<y1> - 
#<ycenter>] * #<scale> + #<ycenter>] P[#<weight>] L3
             X[[#<midx12> - #<xcenter>] * #<scale> + #<xcenter>] 
Y[[#<midy12> - #<ycenter>] * #<scale> + #<ycenter>] P[#<weight>]
         G5.3
     #<mid_index> = 1

     o104 endwhile


; finish the corners

;
; finish pass all around
;

     o400 if [#<mid_index> EQ 1]
          G1 X[#<x2>] Y[#<y2>]
      G1 X[#<x3>] Y[#<y3>]
      G1 X[#<x4>] Y[#<y4>]
      G1 X[#<x1>] Y[#<y1>]
      G1 X[#<x2>] Y[#<y2>]
     o400 elseif [#<mid_index> EQ 2]
          G1 X[#<x3>] Y[#<y3>]
      G1 X[#<x4>] Y[#<y4>]
      G1 X[#<x1>] Y[#<y1>]
      G1 X[#<x2>] Y[#<y2>]
      G1 X[#<x3>] Y[#<y3>]
     o400 elseif [#<mid_index> EQ 3]
          G1 X[#<x4>] Y[#<y4>]
      G1 X[#<x1>] Y[#<y1>]
      G1 X[#<x2>] Y[#<y2>]
      G1 X[#<x3>] Y[#<y3>]
      G1 X[#<x4>] Y[#<y4>]
     o400 else ([#<mid_index> EQ 4])
      G1 X[#<x1>] Y[#<y1>]
          G1 X[#<x2>] Y[#<y2>]
      G1 X[#<x3>] Y[#<y3>]
      G1 X[#<x4>] Y[#<y4>]
      G1 X[#<x1>] Y[#<y1>]
     o400 endif

     ( move back to center )
     (#<current_z> = #5422 ) ( not possible to get position when cutter 
comp. on!)
     (G0 Z[#<current_z> + 1])
     G91
     G0 Z[#<z_safe>]
     G90
     G0 X[#<xcenter>] Y[#<ycenter>]
     G91
     G0 Z-[#<z_safe>]
     G90
     ([ #<current_z> ])

     o105 if [#<pocket_depth> LE 0]
          #<pocket_not_finished> = 0
     o105 endif

o100 while [ #<pocket_not_finished> ]

o<npocket4> endsub




------------------------------------------------------------------------------
Time is money. Stop wasting it! Get your web API in 5 minutes.
www.restlet.com/download
http://p.sf.net/sfu/restlet
_______________________________________________
Emc-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/emc-developers

Reply via email to