Skip to content

Add the SEPTIC motion profile - #54

Open
Jepson2k wants to merge 2 commits into
mainfrom
feat/septic-profile
Open

Jepson2k wants to merge 2 commits into
mainfrom
feat/septic-profile

Conversation

@Jepson2k

@Jepson2k Jepson2k commented Oct 11, 2026 •

Copy link
Copy Markdown
Collaborator

This PR adds SEPTIC, a seventh-order point-to-point profile whose velocity, acceleration and jerk are all zero at both ends. QUINTIC starts and stops with a jerk step, while SEPTIC ramps jerk in and out. par6 moves with the same profile under the same rule, so both backends offer the same set of profiles.

  • Point-to-point only. SEPTIC times a straight joint run, just as RUCKIG does. A cartesian path or a blended chain is timed by TOPPRA instead, as in par6. Timing a path with one polynomial lets its steepest row decide the duration of the whole move: from standby, a 40 mm MoveL planned 24 s.
  • Duration. Each joint's displacement against its velocity, acceleration and jerk limits gives a bound, and the duration is the largest of these. A requested duration can stretch it but never shorten it.
  • Shared code. SEPTIC and QUINTIC's straight-run case use one per-joint polynomial builder (_septic_samples beside _quintic_samples). QUINTIC's output is unchanged.
  • Profile names. VALID_PROFILES and the invalid-profile remedy are now derived from ProfileType, instead of being lists maintained by hand.
  • CI lint fix. The Lint check failed under ty 0.0.86 on the async client's robot setter, a line this PR didn't otherwise touch. The setter now takes any waldoctl Robot, as the interface declares, and asserts that it is parol6's own.

Tests

  • Limits and jerk ramp. test_septic_holds_its_limits_and_starts_and_stops_without_a_jerk_step uses a move short enough that the jerk limit sets its duration. Without the jerk term, jerk reaches 1.97× the limit. The test also checks that SEPTIC's jerk ramps in and out while QUINTIC's steps, using a threshold that holds at any control rate.
  • Cartesian timing. test_a_septic_cartesian_move_is_timed_along_its_path previews a 40 mm MoveL from standby under SEPTIC and under TOPPRA. Before the point-to-point rule, SEPTIC planned 23.76 s against TOPPRA's 2.02 s.
  • Velocity test. test_trajectory_respects_joint_velocity_limits now differentiates at the control tick. It used to divide by duration / (N − 1), which understated velocity.
  • Results. Locally, 433 tests passed and 8 were skipped. The one failure, test_msg_mounts_on_the_flange_not_inside_the_wrist, is caused by rtree missing from the local venv; the dev extra installs it.

Not in this PR

  • _enforce_segment_limits never checks jerk, and its acceleration stretch only takes effect on segments already at full speed. As a result, QUINTIC, LINEAR and TOPPRA along a path that bends can exceed the hard acceleration and jerk limits. This is pre-existing and deserves its own PR.

🤖 Generated with Claude Code

https://claude.ai/code/session_016uVshJDKTz7nCqrMGVxVJU

Jepson2k and others added 2 commits October 11, 2026 16:44
A septic time scaling of the path coordinate whose velocity, acceleration
and jerk are all zero at both ends, alongside the existing profiles: the
trajectory builder, the profile command, the error catalogue, the state
and streaming executors, both clients and the README, with tests. It is
what par6 moves on too, so the two backends offer the same profile set.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MozxHZWkbgHcaRGMkHnJe9
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016uVshJDKTz7nCqrMGVxVJU
Timed as one polynomial along a cartesian path, SEPTIC sized the whole
move from its steepest row. From standby the wrist's turn off its
singularity leaves a few degrees of J4 in the path's first row, so a
40 mm MoveL planned 24 s against TOPPRA's 2 s; along a bent path its jerk
bound did not hold either. SEPTIC now runs a straight joint run only, on
the per-joint polynomial builder it shares with QUINTIC, and a cartesian
path or a blended chain is timed by TOPPRA, as with RUCKIG and as par6
does.

- VALID_PROFILES and the invalid-profile remedy come from ProfileType.
- The async client's robot setter takes any waldoctl Robot, as the
  interface declares; ty 0.0.86 refuses the narrower one.
- The limit test runs a move the jerk limit times, and the velocity test
  differentiates at the tick the rows are played at.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016uVshJDKTz7nCqrMGVxVJU
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.

1 participant