Keep the Cartesian streaming executor on its line and under its ceiling - #51
Merged
Merged
Conversation
MOVECART and SERVOL promise the tool travels a straight line. Measured on a 160 mm diagonal it left that line by 4.7 mm and ran the TCP at 1.35x the configured speed. Three things, each verified against the real executor: Ruckig's synchronization was never set, so it defaulted to Time, which only makes the six tangent components FINISH together — each still takes its own time-optimal route there and the tangent bows. Phase holds them to one shared profile. Phase synchronization then has to survive the way a servo stream drives the executor: SERVOL repeats its target every tick, and each re-plan tests the current velocity and acceleration against a fresh profile and drops to time synchronization unless they line up exactly. Once out of phase the state drifts further out, so the next tick fails the test too. Setting the same target again is now a no-op. Set once the path was already straight; repeated every tick it bowed 4.7 mm. The configured ceilings are TCP speeds, but Ruckig bounds each component on its own, so an isotropic envelope let a diagonal run the resultant up to sqrt(3) times the limit. Under one shared profile the tangent runs along a fixed direction, so scaling the per-component ceilings by that direction's largest component over its norm makes the two agree. The same move now leaves the line by 0.000 mm and peaks at exactly the 0.160 m/s jog ceiling. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EmiThKnCSjh69Eu7Jbh5uX
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
MOVECART and SERVOL promise the tool travels a straight line. Measured on a 160 mm diagonal it left that line by 4.7 mm and ran the TCP at 1.35x the configured speed. Three things, each verified against the real executor:
Ruckig's synchronization was never set, so it defaulted to
Time, which only makes the six tangent components finish together — each still takes its own time-optimal route there and the tangent bows.Phaseholds them to one shared profile.Phase synchronization then has to survive the way a servo stream drives the executor. SERVOL repeats its target every tick, and each re-plan tests the current velocity and acceleration against a fresh profile and drops to time synchronization unless they line up exactly. Once out of phase the state drifts further out, so the next tick fails the test too. Setting the same target again is now a no-op. Set once the path was already straight; repeated every tick it bowed 4.7 mm.
The configured ceilings are TCP speeds, but Ruckig bounds each component on its own, so an isotropic envelope let a diagonal run the resultant up to sqrt(3) times the limit. Under one shared profile the tangent runs along a fixed direction, so scaling the per-component ceilings by that direction's largest component over its norm makes the two agree.
The same move now leaves the line by 0.000 mm and peaks at exactly the 0.160 m/s jog ceiling.
tests/unit/test_cartesian_streaming_line.pydrives a diagonal MOVECART through the real executor both ways — target set once and repeated every tick — and asserts the off-line distance, the peak TCP speed against the configured ceiling, and that the move lands; a second test checks a move that translates and rotates at once stays under both the linear and angular ceilings.🤖 Generated with Claude Code