Vfa calibs - Input Shaping & Junction Deviation (#9160)

@RF47 and I have been working on a **two-step input shaping
calibration** to help fine-tune print quality and Junction Deviation
Test for Marlin2 printers.
This is based on [Klipper's Resonance
Compensation](https://www.klipper3d.org/Resonance_Compensation.html#resonance-compensation),
[Marlin’s M593 G-code](https://marlinfw.org/docs/gcode/M593.html),
discussions from
[SoftFever/OrcaSlicer#1820](https://github.com/SoftFever/OrcaSlicer/issues/1820),
some elements from the [input_shaping
branch](https://github.com/SoftFever/OrcaSlicer/tree/feature/input_shaping)
and Junction Deviation [Marlin
Documentation](https://marlinfw.org/docs/configuration/configuration.html#junction-deviation-)

This is for Marlin only, but I'm working on a future Klipper-compatible
version here:
[VFA-Calibs+Klipper](https://github.com/ianalexis/OrcaSlicer/tree/VFA-Calibs%2BKlipper).
However, we don't own a Klipper machine, so we're unsure how to improve
it or verify if it works correctly.

### Calibration Steps

1. **Frequency Test** – Helps identify the optimal input shaping
frequency.
2. **Damping Test** – Fine-tunes the damping ratio for smoother prints. 

### Screenshots

![imagen](https://github.com/user-attachments/assets/bfa9ef9c-3a81-499e-b7f8-d60a77952304)

![imagen](https://github.com/user-attachments/assets/df764cfd-85ca-4048-8748-c95a56bc2c8b)

![imagen](https://github.com/user-attachments/assets/cb991d1b-d1f5-489c-81f2-c25d4f9e394c)

![imagen](https://github.com/user-attachments/assets/7da6607c-7644-49af-8c13-97349d7226ef)

![imagen](https://github.com/user-attachments/assets/db8ce73a-6b51-4bcd-ad7e-b654074096e5)

![imagen](https://github.com/user-attachments/assets/5deea699-e5d1-4a09-85f4-809d07395ca1)

![imagen](https://github.com/user-attachments/assets/cc87c756-75a3-40e4-9df3-7437ea78ac4e)

![imagen](https://github.com/user-attachments/assets/de5a8329-3567-473f-bf40-8649d84279b6)

## Tests
- Marlin tested on **Ender 3-class printers** (@RF47 and @ianalexis)
- Klipper tested in Voron 2.4 and an FLSun T1 Pro @ShaneDelmore 
- Tested in Windows and MacOs.
This commit is contained in:
Noisyfox 2025-04-06 20:16:12 +08:00 committed by GitHub
commit 32efc176d9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
16 changed files with 925 additions and 35 deletions

View file

@ -2975,6 +2975,43 @@ void MainFrame::init_menubar_as_editor()
},
"", nullptr,
[this]() {return m_plater->is_view3D_shown();; }, this);
// Input Shaping calibrations
auto input_shaping_menu = new wxMenu();
append_menu_item(
input_shaping_menu, wxID_ANY, _L("Input Shaping Frequency"), _L("Input Shaping Frequency"),
[this](wxCommandEvent&) {
if (!m_IS_freq_calib_dlg)
m_IS_freq_calib_dlg = new Input_Shaping_Freq_Test_Dlg((wxWindow*)this, wxID_ANY, m_plater);
m_IS_freq_calib_dlg->ShowModal();
},
"", nullptr,
[this]() {return m_plater->is_view3D_shown();; }, this);
append_menu_item(
input_shaping_menu, wxID_ANY, _L("Input Shaping Damping/zeta factor"), _L("Input Shaping Damping/zeta factor"),
[this](wxCommandEvent&) {
if (!m_IS_damp_calib_dlg)
m_IS_damp_calib_dlg = new Input_Shaping_Damp_Test_Dlg((wxWindow*)this, wxID_ANY, m_plater);
m_IS_damp_calib_dlg->ShowModal();
},
"", nullptr,
[this]() {return m_plater->is_view3D_shown();; }, this);
m_topbar->GetCalibMenu()->AppendSubMenu(input_shaping_menu, _L("Input Shaping"));
// Add Junction Deviation option to More menu
append_menu_item(
advance_menu, wxID_ANY, _L("Junction Deviation"), _L("Junction Deviation calibration"),
[this](wxCommandEvent&) {
if (!m_junction_deviation_calib_dlg)
m_junction_deviation_calib_dlg = new Junction_Deviation_Test_Dlg((wxWindow*)this, wxID_ANY, m_plater);
m_junction_deviation_calib_dlg->ShowModal();
},
"", nullptr,
[this]() {return m_plater->is_view3D_shown();; }, this);
m_topbar->GetCalibMenu()->AppendSubMenu(advance_menu, _L("More..."));
// help
@ -3073,6 +3110,41 @@ void MainFrame::init_menubar_as_editor()
}, "", nullptr,
[this]() {return m_plater->is_view3D_shown();; }, this);
// Add Junction Deviation option to More menu
append_menu_item(
advance_menu, wxID_ANY, _L("Junction Deviation"), _L("Junction Deviation calibration"),
[this](wxCommandEvent&) {
if (!m_junction_deviation_calib_dlg)
m_junction_deviation_calib_dlg = new Junction_Deviation_Test_Dlg((wxWindow*)this, wxID_ANY, m_plater);
m_junction_deviation_calib_dlg->ShowModal();
}, "", nullptr,
[this]() {return m_plater->is_view3D_shown();; }, this);
// Input Shaping calibrations
auto input_shaping_menu = new wxMenu();
append_menu_item(
input_shaping_menu, wxID_ANY, _L("Input Shaping Frequency"), _L("Input Shaping Frequency"),
[this](wxCommandEvent&) {
if (!m_IS_freq_calib_dlg)
m_IS_freq_calib_dlg = new Input_Shaping_Freq_Test_Dlg((wxWindow*)this, wxID_ANY, m_plater);
m_IS_freq_calib_dlg->ShowModal();
},
"", nullptr,
[this]() {return m_plater->is_view3D_shown();; }, this);
append_menu_item(
input_shaping_menu, wxID_ANY, _L("Input Shaping Damping/zeta factor"), _L("Input Shaping Damping/zeta factor"),
[this](wxCommandEvent&) {
if (!m_IS_damp_calib_dlg)
m_IS_damp_calib_dlg = new Input_Shaping_Damp_Test_Dlg((wxWindow*)this, wxID_ANY, m_plater);
m_IS_damp_calib_dlg->ShowModal();
},
"", nullptr,
[this]() {return m_plater->is_view3D_shown();; }, this);
calib_menu->AppendSubMenu(input_shaping_menu, _L("Input Shaping"));
append_submenu(calib_menu, advance_menu, wxID_ANY, _L("More..."), _L("More calibrations"), "",
[this]() {return m_plater->is_view3D_shown();; });
// help