I love that people are actually implementing this stuff in a feasible way now. I read the Duet forums thread a few days ago and it's good stuff. The Klipper input shaping work is also good stuff. What I do want to see is application tests in more diverse print geometry. The results on rectangular shapes oriented with printer axes are AWESOME, but does it make organic shapes worse? Does it have wacky behaviors if you rotate the test print 45 degrees or 31 degrees?
Some of us printer-control nerds have been kicking around feed-forward ringing compensation ideas for years, but it really wasn't feasible to implement back in, say, 2015. Certainly 8bit Sailfish/Marlin/Repetier weren't powerful enough to do it, and Smoothieware's motion control coding was too rigid to accommodate stuff like this (or even linear advance) without a major refactor that the devs didn't want to tackle at that time. There was a university team (can't remember which one or find the paper) that made an input-shaping demonstration printer a number of years ago and achieved pretty ludicrous speeds on factory hardware, but that was some pretty janky custom coding/toolchain. Being able to implement it as a hobbyist-tunable firmware mode is very much necessary for the approach to go anywhere. Getting more powerful controller platforms with broader dev support like Klipper and Duet/RRF seems to be putting it in reach now.
The constant "rediscovery" in this space is always frustrating to me, and I wish we could spend a lot more time documenting things better than forum/group posts. Like the "two ringing modes" thing (decel ringing causing transverse errors and accel ringing causing extrusion width errors) was discussed in some detail on the Duet forums a couple years ago. Likewise the resonant frequencies varying with nozzle position within the build volume, belt elasticity being dominated by the length of the shorter leg of the loop, and the dominant resonant modes varying by machine architecture. All "already known" to SOMEBODY, but it isn't obvious nor well-documented. (A few of these things are in my Volume 2 which hopefully I will finish and publish someday...) The ~2018 S-curve ringing reduction discussion was when David Crocker figured out (with a lot of input from the hive mind) that there are accel/jerk combos that can partially self-cancel ringing, and S-curve is worse than trapezoid in some situations.
In terms of eliminating corner jerk / junction deviation (velocity jumps) one corner-smoothing approach is fairly well-proven by MachineKit. They establish a per-axis acceleration limit, and a maximum allowable error, and the trajectory planner creates a smooth curve trajectory that satisfies all individual axis accel limits and the maximum off-path error at the highest attainable speed. This is really favorable for milling because you can do a high-velocity roughing pass with a wide tolerance and then come back for a low-velocity finish pass with a tight tolerance. But that's fairly similar to how we do perimeters slower than infill. That MachineKit trajectory planner mode is also only implemented for 3-axis XYZ motion, it doesn't support E-axis extruders, so there's a 3d printing workaround based on a wire-laying approach (slaving extruder speed to XYZ speed) which is viable... but makes life a lot harder for modern slicer features like variable extrusion width or layer height slicing.
So, the challenge for me is, how do you make a ringing cancellation approach that is flexible enough to work on different machine types, but simple enough to be usable by anyone other than a few power-users? Like...
- Delta ringing can be dominated by drivetrain elasticities or by frame sway. (Plastic corner vertices or undersized columns --> frame flex.) Frame sway gets worse as Z height increases, but whether belt elasticity gets better or worse with Z height depends on whether motors are at top or bottom. So you can have a U-shaped elasticity curve with Z height. And since you have three drivetrains with "gear ratios" that vary with nozzle distance from that tower, you could have one dominant drivetrain resonance frequency that splits into 2-3 different frequencies near the edges of the bed.
- CoreXY has diagonal resonance axes in the drivetrain via belts/motors, and separate X axis and bridge-torsion resonance modes from rod/rail flex.
- Ender3 / i3 printer elasticities are dominated by belt stretch (particularly cheap printers with cheap belts) which is fairly linear with motion stage position. Y axis ringing should be relatively constant with Z height, while X axis ringing can increase with Z height.
All of these things depend on motor selection, belt selection, frame design, etc. Which means you can pick 10 random printers and find there is 7 different elasticity curve shapes to accommodate in the tuning parameters.
So, folks like me are pretty caught up in "admiring the problem" and maybe are making it look too complex to solve. Yet there is definitely a large subset of users (say anybody with an i3 or XY gantry Cartesian machine) that would benefit greatly from a minimum-viable-product type user-tuned approach with a few parameters. And maybe we don't care too much at the end of the day whether high Z heights or printing at delta bed-edge decreases print quality, because let's be honest, that's already true today, and most people do most printing at bed-center and low Z height.
I do think an automated accelerometer-based tuning approach is going to be the most fruitful at the end of the day. David Crocker's delta bed leveling code absolutely transformed the viability of deltas as production printers, and that's the model I would personally prefer moving towards for ringing as well. You can do a resonance frequency/magnitude/orientation scan of the build volume, and just map out a matrix of compensation factors like mesh leveling. Heck, you could roll backlash compensation and bed leveling into one accelerometer scan routine if you wanted. Building this into a Smart Effector or bolt-on MEMS dongle puts all the complexity into the up-front design/coding and then would be fairly painless for users.
Maybe a more practical question, is there an intermediate step we can do with RRF that puts some input shaping work into the code base that can be extended for an accelerometer approach later?