Skip to content

Keep the Cartesian streaming executor on its line and under its ceiling - #51

Merged
Jepson2k merged 1 commit into
mainfrom
claude/happy-shannon-dsvwnj
Sep 20, 2026
Merged

Jepson2k merged 1 commit into
mainfrom
claude/happy-shannon-dsvwnj

Conversation

@Jepson2k

Copy link
Copy Markdown
Collaborator

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.

tests/unit/test_cartesian_streaming_line.py drives 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

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
@Jepson2k
Jepson2k merged commit 6868916 into main Sep 20, 2026
25 of 26 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants