supermerill / SuperSlicer

G-code generator for 3D printers (Prusa, Voron, Creality, etc.)
4.13k stars 519 forks source link

Retraction Calibration #411

Closed prahjister closed 4 years ago

prahjister commented 4 years ago

Jeff Jiggens suggested I share a calibration process I have been working on and might want to integrate into your slicer.

https://github.com/prahjister/Calibration-Generator

I am preferring to go web based for cross platform compatibility but the bulk of code is available on github. I have only changed some defaults and formatting. I will push these Minor changes to github in a couple days.

You can check out web version here

prahjister.duckdns.org

I'm self hosting unless I can get enough donations to pay for it.

supermerill commented 4 years ago

Thank you. Your concept is good, but I can't integrate it as-is, as I don't generate gcode but a geometry. My dev version currently doesn't care for speed, as i think it should be put to the maximum speed the extruder can safely handle, what do you think of it?

belm0 commented 4 years ago

I'm fairly interested in this topic and was intending to do some development work on it. (Currently I use PrusaSlicer.)

Observations:

My ideal calibration test would be something that can do many retraction iterations per layer (like the gcode generators) while varying any retraction-related slicer setting (including wipe options, etc.).

Options worth exploring:

belm0 commented 4 years ago

first attempt at some retraction calibration geometry

I tried to make something that would be a coherent piece and structurally sound like prahjister's calibration (as opposed to typical retraction test of isolated towers which is subject to breaking).

There is an inner perimeter for structure, and then the retraction segments are outside and adjacent to that perimeter. I needed to set the slicer to 1 perimeter wall, and "Slice gap closing radius" of 0.

Unfortunately the path planner is doing random things-- the retraction segments are not printing in the expected order.

retract_geometry_v1

retract_geometry_v1

next I'll try just the retraction segments + skirt

belm0 commented 4 years ago

Using a skirt to provide structure seems promising-- it will always be printed first-- though obviously this puts the structural perimeter on the outside of the retraction segments. Just set skirt height to a large number and distance to 0.

I found it's necessary to set "detect thin walls" to generate simple segments that detract at one end and retract at the other. Otherwise the extrusion doubles-back so that the start and end points are the same.

However the problem with the path planning remains-- it seems random. I couldn't find any setting in PrusaSlicer that would affect it. It's odd that the planner doesn't continue with the nearest segment.

retract calibration v2

Without deterministic path planning it won't be feasible to vary the retraction settings for each segment in a layer.

Perhaps SuperSlicer has better path planning?

supermerill commented 4 years ago

Perhaps SuperSlicer has better path planning?

nop. I have idea to improve it, but i don't have time to implement it.

belm0 commented 4 years ago

Rather than trying to make a general path planning enhancement to cover this case, how about adding a "simple mode" option which naively choses the nearest segment?

But even if this is done, I'm not sure how to vary the retraction settings during the layer. Perhaps it can be done by modulo retraction count, assuming that there a constant number of retractions per layer.

supermerill commented 4 years ago

how about adding a "simple mode" option which naively choses the nearest segment?

That should be the case. But the seam placement may shake it up a bit. And some restrictions in direction, again.

prusa created a more complicated algorithm that try to find the best chain, but it doesn't support no_sort and some other restrictions, so i can't use it.

belm0 commented 4 years ago

I tried all the seam placement options, it didn't affect the path planning. In this geometry the perimeter is not a loop, so I don't think seam placement is related.

belm0 commented 4 years ago

And some restrictions in direction, again.

Why is there direction restriction?

Indeed, it seems like planner tries to extrude in the same direction along the X and Y axis, even if the path is suboptimal.

Screen Shot 2020-08-23 at 2 17 59 PM

belm0 commented 4 years ago

v3 of retract geometry - simpler, single axis

However the tested move direction after retraction is limited: 180 and ~135 degrees. I would like to test 0 degrees (i.e. continue current path) but it doesn't seem possible due to the print origin and path planner's preferred extrusion direction.

retract calibration v3

retract calibration v3

maybe usage would be like this:

note: PrusaSlicer path planner seems to depend on ordering of objects in the STL. So is it really doing any optimization?

supermerill commented 4 years ago

it is to a certain point, complexity is np so you can't go full steam.

belm0 commented 4 years ago

another approach is to encode path order in the geometry somehow, and modify the planner to use it

For example, segments are drawn in oder of length. Or draw objects strictly in the order they appear in the STL.

But I tried reading the MotionPlanner code and it wasn't easy to follow-- at this point I can't judge how easy such changes would be.

supermerill commented 4 years ago

If i have to change it, i'll scrap everything and rewrite all of these.

My current approach in my dev retraction calibration is a dual tower (cylinders) with the retraction setting that increase every 2 layers.

belm0 commented 4 years ago

doing the towers and changing settings by layer is so much simpler

I don't know if it would be worth all the development, but some advantages of changing settings within the layer:

belm0 commented 4 years ago

@supermerill is a preview of your retraction calibration feature available?

supermerill commented 4 years ago

image

I'm unsure about the layer cooling time... does it is really needed? I now need to create multiple prints (one per temperature), and to fix a strange slicing bug.

belm0 commented 4 years ago

Using ridges to mark the changes is interesting.

Is this focused only on retraction distance? I'm wanting to tune retraction and un-retraction speed, extra length on restart, wipe while retracting on/off (perhaps done as a separate pair of columns), and retract amount before wipe. (Of course, only one parameter can be tuned at a time.)

For layer cooling time, I would leave it to the slicer's default cooling handling, which I understand to slow down printing if the layer time is too fast.

belm0 commented 4 years ago

This article emphasizes the high complexity of retractions, and the importance of retraction / detraction speed.

https://www.sublimelayers.com/2016/10/some-musings-on-retracts.html