Formware3D for Moai - what is the best print logic / speeds?


I think this is a question for @peopoly
I know basically what i get as an user
So due to nature of galvo system, as far from the center you go in the X/Y plane you go bigger error ocures , that is very different in X an Y axis.
So the approach is just like lead screw areal wear correction on the CNC machines.
You print something 10 mm long and you compare if it is 10.5 , then you correct coordinates in this range
same for 20, 30,40,50,60, etc
Again I am just an user



Thanks for the input. I read the docs and checked the formlabs code as well.

It seems Formlabs uses a 2D grid and interpolates (bi)lineair in XY. So they have datapoints on a XY grid.
This seems to me as most accurate; probably they get these grid values when leaving the factory?

The calibration STL in Moai is just on 2 axis. (with a smart STL that you can measure quickly btw)
So this introduces a small error in the interpolated area’s in each quadrant. However it’s a quick and flexible calibration so i think for most this would be OK. Making a more extensive calibration STL would be difficult to measure accurately

First thing i don’t understand is what Asura does with the measured values in the example:
- calculate the adjustment value. In this case, it is 61 + (62-61)/2 = 61.5
On the row Xval 61 60.6. Change it to Xval 61 61.5
If you measure 62 and it should be 61 then your position is off by 1mm. So the correction would be -1? Or am i missing it completely? Or is it because the origin in the GCode is on the lower left corner? Hence division by 2?

Second thing i’m not sure of (@Peopoly) what would be the best way to interpolate between the quadrants?

Third thing that comes to mind would be a smarter way to generate a correction table.
Wouldn’t it be possible somehow to overlay a ‘sensitive’ sheet/paper with printed rectangles of known dimension.
Then have the laser make some rectangles on this sheet/paper.
Take a photo of the sheet.
Because you know the pre-printed rectangles (and their size) and you know the GCodes for the burned in rectangles you could theoretically perform an image analysis and get a very accurate grid compensation…
Would be an ‘semi’ automated way to perform an instant calibration…

1 Like


For me it do not matter how it is done as far it is giving results correct enough .
Can you do the same in gcode generation. I do not ask for the same table or STL.
Just a way to make this grid compensation on X and Y .
I am ready to spent time a make tests when and if you implement this kind of calibration .
Anyway I did already purchased formware personal licence, so I am at your disposal to make tests.

Best Martin



are there any updates for the calibration? would really love to start using formware but I can’t leave asura if I can’t calibrate my new slicer.



yes it’s in planning in 1-2 weeks. Had some other issues to build with higher prio.
But it’s on my todo list. I’ll give an update here once done.

1 Like


Yes, every Form 1/+ printer has his own calibration grid stored in flash memory and sends it to Preform for path generation.

I recorded some test grids on UV sensitive paper, that worked well. But it is difficult to align the paper accurately on the build plate. So i think working with pre-printed rectangles would not be feasible. Maybe with some kind of jig to fasten the paper on the build plate?
Atm i think the best idea is to create a plate with an array of photodiodes that form a grid and use that for calibration.
Look at the Form 2. It has photodiodes around the tank, i think for thermal drift correction.




I’ve been working on the XY correction and implemented it.
I’m just doubting if i miss something.

The Moai docs describe a procedure for averaging the value you measure from your printed part.
i.e. you measure 60mm at location 61mm -> you insert in your config file 60.5mm. (see

When I inspect the GCodes with various combinations of config files i notice the output gets multiplied by x2 again. Is there any reason for writing it down like 60.5mm that i’m missing?
(I’m assuming the first thing the machine controller does is shift the axis system again to the center; and then calculate galvo movements based on this value)

It looks to me the final result from asura is “measured” is applied directly to the GCode. Is this correct @peopoly ?

@peopoly, if the implementation logic/reasoning for the filter can be shared; would be great.

For anyone interested; i tested with a 130x130mm square block; below the output of the outer wall coordinates from Asura3D. (spotsize 0.067)

----No correction filter.
G1 F300 X129.967 Y0.033
G1 X129.967 Y129.967
G1 X0.033 Y129.967
G1 X0.033 Y0.033

----Correction filter without any numerical difference (all zero measurements)
G1 F300 X129.967 Y0.033
G1 X129.967 Y129.967
G1 X0.033 Y129.967
G1 X0.033 Y0.033

–only -X corrected with 1 mm. (-61 -60) (measured -59mm -> 2mm shrinkage if 60 is average)
G1 F300 X129.967 Y0.033
G1 X129.967 Y129.967
G1 X-1.967 Y129.967 --> X goes -2mm here
G1 X-1.967 Y0.033 --> X goes -2mm here

–only -X and +X corrected with 1 mm. (-61 -60, 61 60) (measured -59mm -> 2mm shrinkage if 60 is average)
G1 F300 X131.967 Y0.033 --> X goes +2mm here
G1 X131.967 Y129.967 --> X goes +2mm here
G1 X-1.967 Y129.967 --> X goes -2mm here
G1 X-1.967 Y0.033 --> X goes +2mm here
–> no correlation between left and right

–> -X with 0.5 and +X with 1mm.
G1 F300 X131.967 Y0.033
G1 X131.967 Y129.967
G1 X-.967 Y129.967
G1 X-.967 Y0.033
–> left side -1mm, right side still +2mm

–> -X with 0.4 and +X with 1mm.
G1 F300 X131.967 Y0.033
G1 X131.967 Y129.967
G1 X-.767 Y129.967
G1 X-.767 Y0.033
–> left side -0.8, right side still +2mm

–only -X (2x corrected with 1 mm. (-61 -60, -51 50)
G1 F300 X131.967 Y0.033
G1 X131.967 Y129.967
G1 X-1.967 Y129.967
G1 X-1.967 Y0.033
–> no correlation 51-61mm with outside 61mm

– both X and Y, - and + corrected with 1mm (measured 59 at all corners -> 60 is average from calc.)
G1 F300 X131.967 Y-1.967
G1 X131.967 Y131.967
G1 X-1.967 Y131.967
G1 X-1.967 Y-1.967
–> no correlation between X and Y?

1 Like


have you tried implementing the same correction or tried to design your own?

doing peopolys is a pain in the arse, and is completely not user friendly, or do you need to copy it because of the way the machinery works?



Well; we are having generic doubts here in the office as to what it is we are actually correcting.
It seems to us that printing a cross of the size of the test STL causes shrinkage or expansion inherent on the type of resin you are using. Most are exothermic and generate heat and/or expansion with larger cross sections. Not sure how the effect of the laser minimizes that.

My first tought of what the deviation is causing was it was the change in spot size because of the angle; but this effect is very small.

So the reasoning is now to just implement a lineair interpolated correction that can be set by an absolute value. This would allow the end user the freedom to tune it anyway he/she likes.
Only question i have it why Moai does this division/multiplacation by 2…

Any better ideas of course are welcome.



linear regression should be fine
If the distortion is linear just apply a general offset
If not apply local offset every 1 ,5 or 10 mm on Y and X ( reversed in Moai hardware)
Same principle as Z mesh levelling in FDM technology



Top stop shrinkage could you do it printing little disconnected pillars across the plate and measuring distance between those?



The distortion compensation is to correct the error in galvo offset when moving further away from the VAT center. the further away the laser moves, the more the error, so instead of moving 60mm away from the center the laser could move 61.2 or something similar.

I have a test print I did for the distortion compensation, will check the measurements and let you know if it’s linear, but my understanding is that it is not.



ok thanks; that clearifies.

I’ve uploaded version that includes the lineair distortion compensation.

To keep it really simple it’s just absolute correction.
Measure a value -> calcuate the difference -> enter that value.

I.e. You measure 61.4 where it should be 61; then you correct with -0.4
So this differs a bit from Asura’s logic; but in my opinion it’s a bit more generic and easy to understand like this.

There are sample values included of course.



and what is the correction value if for -61 the measurement is -61.9



it’s just the way you want to move your part in… normal cartesian coordinate system that GCode is also defined in.

So -61 - -61.9 = 0.9
(you correct 0.9) in positive direction, makes sense because you printed to big in negative direction)

1 Like


This is great news. Thanks for being so fast with this. I was an advocate before but this addition means I need nothing else to prep prints for my MOAI.

Are the value in there by default consistent with the defaults for the Asura software?



Hi all,

Please be advised there is another change in the latest software that can cause users that are updating their software to have a print table with a wrong origin; if you keep your old settings files when updating.
Forgot to mention this earlier.

Make sure the Origin setting of your machine is set to -65, -65 mm.
This is to make sure the origin of exported gcode is at that location.
When you update your installer, but keep your old settings, the values will default to 0,0mm (wrong)

Screenshot of correct setting:



Becare ,because Moai X and Y are reversed, front is left and left is front



aah didn’t know that.
Only matters where you insert your correction values i guess…

But from what i see from the values i have seen it seems to be roughly a sinus shaped function that is mirrored in the center… one should be able to sanity check the values.



Thank you for this update! Guess it’s time to activate my trial :slight_smile: I was waiting on this for quite some time.