-
Notifications
You must be signed in to change notification settings - Fork 1
Fixed failed prints on Saturn 3 Ultra #1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fixed failed prints on Saturn 3 Ultra #1
Conversation
Create header and source files for GOO format and add them to the build system. Register GOOWriter and GOOReader classes in SLAArchiveFormatRegistry.
Add exposure, timing, lift and retract specific options to SLAMaterialConfig and the material tab. These parameters are needed for generating .goo output files and were not yet present in the slicer. The lift and retract options are prefixed with 'sla_' to avoid conflict with e.g. 'retract_speed' from FFF printing.
Adds GOORLERasterEncoder for encoding the 'Data size', 'Image data' and 'Delimiter' parts of the 'Layer content' segment in goo files.
Add implementations for the required SLAArchiveWriter virtual functions. This adds full support for generating goo files including thumbnails and inclusion of slicer, printer and profile names in the output file. Note that GOOReader is not yet implemented. Usage of GOOReader will result in an error message in the console.
MSVC compiler was ignoring [[gnu::packed]]. This commit adds macros to add the compiler specific attributes.
MSVC was complaining about designated struct initializers in c++17. This commit replaces designated initializers with member-wise initialization. This change should probably be reversed once PrusaSlicer moves on to c++20. The use of capturing structured bindings was also removed in 'libslic3r/SLA/RasterBase.cpp'.
Generation of multi-option lines for lift and retract parameters was moved into a lambda to reduce code duplication and make future optionalizing of the parameters easier.
This allows for SLA printers without tilt mechanisms to be added. Time estimation code will also be able to switch between estimations based on tilt and estimations based on lift and retract by checking for the presence of tilt configuration.
This commit adds time estimate calculation based on lift and retract. Calculation with these parameters gets triggered if tilt parameters are set to null (N/A) in the SLA printer tab. It also adds a `Time estimate correction` field in the `Corrections` section of the SLA printer tab to account for processing delays of the selected printer.
The algorithm used for checksum generation is not explicitly specified in the .goo format spec and was implemented wrong until now. The printer ignores the checksum so this wasn't a problem. This implementation is now equivalent to the one used in UVTools.
…r exposure value to fix broken prints on ELEGOO Saturn 3 Ultra
|
Thanks for contributing! The code has only been tested on Mars printers up until now, so getting some feedback for Saturn printers is quite valuable. The current value of Regarding the change to Could you please confirm that the current (buggy) version of the code actually results in the printer only using the normal exposure times instead of fading from Thanks for also highlighting the differences in the other two values. The anti-aliasing level currently reflects the actual value used in the layer rasterizer. I believe this value is not even used by the printer in any way and is purely for information purposes. |
I'd be happy to but I'm not quite sure how to test this. Should I time the actual layers with a stopwatch while the printer is running or is there a better way? |
Yes, timing the first 3-4 layers with a stopwatch is how I have been testing it on my printer. This should be enough to verify that the first layer uses Thanks again for your help! |
|
Sorry for the delay, I've been busy and getting this version of Prusa to compile seems to get steadily harder the more time passes. But more importantly, I got some very interesting results!
I seemingly undercounted most of the layer times slightly because the initial time should have been 35 seconds and the final stabilized time should have been 3.5 seconds, but that doesn't effect the conclusion. This is clearly the curve from the I think what this must mean is using When Do you want me to go ahead and add an additional flag to fix this? I could probably do the pause fields at the same time. |
|
Thank you for the testing! I do agree that the printer is using the correct exposure times. I have plotted the values you provided and they seem to align quite well (to a margin of human timing error) with what we would expect. Your theory that something else is wrong seems possible. I have again checked for any differences between the data in the As a side note: I do still consider adding a "use header info data" checkbox to the printer settings (or even a hidden option via the printer config file) as a bit of a hack. I don't think we are at the point yet, but if that is the only way to fix this issue I think it would still be a positive addition. Can you observe any other differences in printer behaviour between Regarding your build issues and fixes: I also have a local branch which adds config presets for Elegoo SLA Printers and Anycubic ABS-like resin to PrusaSlicer (saving users of having to manually add them), as well as a new autobuild branch which should be able to provide full binary builds for all future upstream releases. If you would be so kind to add your config for the Saturn 3 Ultra as a comment to this gist, I could also include it in the builds. The autobuild branch should be up and running by end of next week. |
|
Regarding lift speed and distance: I just compared my test cube .GOO files from CHITUBOX and Prusa side-by-side: neither of them interpolates the lift speed and distance. It might be better practice to do so (I don't know enough about printers to weigh in on this) but it's not the cause of the print failures otherwise CHITUBOX prints would also be failing. Regarding exposure times: I currently have SUNLU High Tough Black resin loaded and the exposure times are known good for that resin: I was printing successfully with it using my fixed version of Prusa Slicer. I forget exactly where I got them but I'm fairly sure the numbers come from an official SUNLU publication. Additionally when I first discovered this problem I was using ELEGOO's official resin with their official settings which they publish for every resin and printer combination. Regarding further tests: I'm not keen to run failed prints again because of the danger to the FEP (I broke it at least once while doing my original testing) but I will do so if we need another specific test to distinguish between two hypotheses. However I have had an idea for a test that only requires a successful print. Do you think it's possible that the problem is the exposure time interpolation curve? The main difference between the two states of Regarding rebasing: Go ahead and include my contribution in that commit. Regarding printer config: I'll get you my Saturn 3 Ultra config but do keep in mind it will fail for anyone who tries to use it unless we add that secret "use header info data" flag to the printer config files. I think in the absence of any clarification either from the upcoming test or from ELEGOO about what's going on here adding that flag is the best solution. I will contact ELEGOO about this if the test I described above doesn't reveal the issue. |
6f4de42 to
c0b70c8
Compare
|
We have results! I ran a print with Putting aside measurement errors there's a massive difference here. The printer chooses to hold the bottom exposure time for the first 12 layers. After that it declines to the normal exposure time using the same linear interpolation and slope as Prusa. Adding a special flag to identify a specific printer configuration as a Saturn and then output .GOO files with this altered behavior should be enough to fix the problem. |
|
Results indeed! Looking at the code it is now also painfully obvious why the Saturns curve looks the way it does. With the current implementation we are setting both Going forward, I briefly considered the option to set The more proper solution would be just to add a "Bottom layers" input field in the "Print Settings" tab. The exposure time calculation in the Somewhat of topic: Regarding the build issues you mentioned before: The autobuild workflow is also working and has already produced PrusaSlicer binaries for The current PR that is open on the PrusaSlicer repo has also been part of a discussion (issue prusa3d#13306) regarding the naming of these extra SLA print options. Going forward this should also be considered and some communication with the maintainer of PR prusa3d#10531 might be of value. |
|
I think the "bottom layers" setting in the GUI sounds like a much better solution than any sort of special toggle/flag as it accurately reflects the structure of the underlying file. Should I close this pull request? One change has been added as part of your rebase and the other turns out to be unnecessary now we understand better what the underlying problem really is, so I'm not sure what purpose if any it still serves. Regarding my fork, is there any other work you want me to do? I could correct the pause lift distances if that hasn't already been done, or add the bottom layers setting. |
|
Sounds good. I will close this PR as it has been mainly implemented in 8d2ee78. For the "Bottom layers" and "Pause lift distance" features I will open new issues where we can discuss further details. You are of cause invited to work on these issues if you want to. Thanks again for all the research work you did to get us to this point! |

I've been trying to use your GOO format export fork to get Prusa Slicer working with my ELEGOO Saturn 3 Ultra. Initially the files it generated failed to print and created a flat pancake adhered to either the FEP screen at the bottom of the tank or the build plate. I investigated the differences between the files generated by your exporter and those created by CHITUBOX and VoxelDance and found there were four differences:
header_info:aa_levelbeing non-zero in Prusa exportslayer_definition::pause_lift_distance_mmbeing zero in Prusa exportsheader_info::bottom_exposure_time_sbeing set to the duration of a typical layer exposure, not the bottom layer exposure, in Prusa exportsheader_info::advance_mode_layer_definitionbeing true in Prusa exportsI did a series of test prints changing each these values to the values found in known-good files and found that the bottom two must be changed to get a successful print. The top two have no obvious effect.
This pull request changes those bottom two values:
header_info::bottom_exposure_time_sis now set to the correct bottom exposure time value andheader_info::advance_mode_layer_definitionis now constant false.The new value for
header_info::bottom_exposure_time_sshould be better in all cases but, from my reading of the GOO format standard, changingheader_info::advance_mode_layer_definitionlike this may have unintended side effects via causing the values written into the layer definitions to be ignored. You might know more about this than I do.I have done a test print using the code provided here and I can confirm it prints, at least on the Saturn 3 Ultra.