explains various things about input shaping and, to show how it can reduce ringing, brings the example of the tool head being “pulled back” by the amount it would oscillate, therefore bringing it back close to the planned path.
There is also a video of an object hanging with strings from a gantry and indeed in that device the gantry at the top is pulled back to ensure the hanging object stops when/where it’s supposedly to stop.
Is the explanation correct?
I expected Klipper to band-filter (so filter out) the resonating frequencies from the toolhead motion (hence resulting in smoothing when excessive of it is applied), not to actively compensate by introducing extra motion commands.
Is it possible to clarify the behaviour?
I have no means and no knowledge to log the commands klipper generates after the filtering to study them and understand myself (if there is a way please let me know!).
@dmbutyugin developed the input shaper so he may help.
The author of the video was informed about me opening a thread here, maybe he’ll read it and participate.
Well, the explanation is only partially correct. The motion is indeed split into sub-commands (as ZV gives 2 pulses, MZV - 3, and so forth), but the toolhead is not being ‘pulled back’, not with the input shapers supported by Klipper (which have all positive coefficients). FWIW, the video with a hanging object also does not have a backwards motion if you look closely at slow playback speed: it first does some forward motion (with ZV shaper), goes to a standstill, and then goes a bit further. What you may mistake as a tiny backwards motion is, I suspect, a backlash in the belts which may be not tensioned very well.
Then, splitting the motion into more segments, in fact, acts as a frequency filter, when the timing of such commands is appropriate. For example, the ZV shaper X'(t) = 1/2 * (X(t+T) + X(t)) when acting on a harmonic signal X(t) = exp(i * 2 * pi * f * t) gives an amplitude abs(cos(pi*T*f)), and so effectively cancels the vibrations at frequencies f = 1/(2*T), f = 3 / (2 * T), …: