thats awesome guys

looking forward to testing when i get time

a jerk control is one of the major things lacking in linuxcnc so will be
great to test out

cheers

Andrew

On Thu, Jan 8, 2026 at 1:50 PM Luca Toniolo <[email protected]> wrote:

> Thank you Andy for your support, this is grandixximo and 杨阳 aka
> YangYang, we're excited to see what the linuxcnc community comes up
> with, we'll be here to support and improve the S-Curve / finite-jerk TP
> For anyone interested in reporting issues about this, as explained in
> the forum, please provide written description pictures or video, of
> comparisons between
> PLANNER_TYPE = 1 #New S-Curve TP
> and
> PLANNER_TYPE = 0 #Original Linear Acc TP
> We will try to reproduce the issue on our end, and possibly provide a fix.
> Thank you everyone for your attention.
>
> On 1/8/2026 7:56 AM, andy pugh wrote:
> > With many thanks to Grandixximo and 杨阳 we now have an experimental
> > S-curve / finite-jerk trajectory planner for testing.
> >
> > For those that build from source just look for the new v2.10.0-pre1 tag.
> >
> > Others can download debs from github for the next 90 days:
> > x86 / bookwormhttps://
> github.com/LinuxCNC/linuxcnc/actions/runs/20798441121/artifacts/5056097663
> > x86 / trixie
> >
> https://github.com/LinuxCNC/linuxcnc/actions/runs/20798441121/artifacts/5056161668
> > ARM64 / bookworm
> >
> https://github.com/LinuxCNC/linuxcnc/actions/runs/20798441121/artifacts/5056139840
> > ARM64 / trixie
> >
> https://github.com/LinuxCNC/linuxcnc/actions/runs/20798441121/artifacts/5056124080
> >
> > Make no mistake, this is experimental, there are no guarantees that
> > these won't break your machines. The first user already hit the hard
> > stops when homing (too-low max jerk setting)
> > With the jerk setting it is probably best to start high and reduce, as
> > infinite jerk is closer to current behavior.
> >
> > If you run these you are volunteering to be a guinea-pig.
> > https://magazine.punch.co.uk/image/I0000NOWOOdkXT_k
> >
> > The docs have been updated, but here is the README original pull-request.
> >
> >
> ================================================================================
> >    LINUXCNC S-CURVE MOTION PLANNING - QUICK REFERENCE
> >
> ================================================================================
> >
> > OVERVIEW
> > --------
> > S-curve motion planning provides smoother acceleration by limiting jerk
> > (the rate of change of acceleration). This can reduce machine vibration,
> > improve surface finish, and extend machine life.
> >
> > STATUS: Optional feature, disabled by default for backward compatibility
> >
> >
> > ENABLING S-CURVE PLANNING
> > --------------------------
> > Add to [TRAJ] section of your INI file:
> >
> >      PLANNER_TYPE = 1              # 0=trapezoidal (default), 1=S-curve
> >      MAX_LINEAR_JERK = 1000.0      # Units: machine-units/s^3
> >      DEFAULT_LINEAR_JERK = 500.0   # Default jerk for moves
> >
> > Add to [JOINT_n] sections:
> >
> >      MAX_JERK = 1000.0             # Per-joint jerk limit
> >
> > Add to [AXIS_l] sections:
> >
> >      MAX_JERK = 1000.0             # Per-axis jerk limit
> >
> >
> > CONSTANTS DEFINED
> > -----------------
> > File: src/emc/nml_intf/emccfg.h
> >
> >      DEFAULT_TRAJ_DEFAULT_JERK    = 0.0  (disabled)
> >      DEFAULT_TRAJ_MAX_JERK        = 0.0  (disabled)
> >      DEFAULT_TRAJ_PLANNER_TYPE    = 0    (trapezoidal)
> >      DEFAULT_JOINT_MAX_JERK       = 0.0  (disabled)
> >      DEFAULT_AXIS_MAX_JERK        = 0.0  (disabled)
> >
> >
> > BEHAVIOR
> > --------
> > S-curve planning is ACTIVE when:
> >    - PLANNER_TYPE = 1, AND
> >    - MAX_LINEAR_JERK > 0
> >
> > Trapezoidal planning is used when:
> >    - PLANNER_TYPE = 0, OR
> >    - MAX_LINEAR_JERK = 0 (or not specified)
> >
> > Note: Setting MAX_JERK=0 with PLANNER_TYPE=1 reverts to trapezoidal
> >        for backward compatibility and easy testing.
> >
> >
> > HAL PINS ADDED
> > --------------
> > *** IMPORTANT: All trajectory-level HAL pins support RUNTIME changes! ***
> > You can switch between trapezoidal and S-curve planning on-the-fly
> > by connecting HAL signals to these pins.
> >
> > Trajectory level (all support runtime modification):
> >    - ini.traj_default_jerk (IN, float)  - Can change while running
> >    - ini.traj_max_jerk (IN, float)      - Can change while running
> >    - ini.traj_planner_type (IN, s32)    - Can change while running (0 or
> 1)
> >
> > Joint level (for each joint N):
> >    - ini.N.jerk (IN, float)             - Joint jerk limit
> >    - joint.N.jerk-cmd (OUT, float)      - Current commanded jerk
> >
> > Axis level (for each axis L):
> >    - ini.L.jerk (IN, float)             - Axis jerk limit
> >
> >
> > TYPICAL VALUES
> > --------------
> > Units depend on your LINEAR_UNITS setting (mm or inch)
> >
> > Light/rigid machines:     1,000 - 10,000 units/s^3
> > Medium machines:            100 -  1,000 units/s^3
> > Heavy/flexible machines:    100 -    500 units/s^3
> > Very rigid machines:     10,000 - 100,000 units/s^3
> >
> > Rule of thumb: MAX_JERK ≈ 10-100 × MAX_ACCELERATION
> >
> >
> > TUNING PROCEDURE
> > ----------------
> > 1. Start with PLANNER_TYPE=0 (verify machine works normally)
> > 2. Set PLANNER_TYPE=1, MAX_LINEAR_JERK=100 (very conservative)
> > 3. Test simple moves (jog, MDI commands)
> > 4. Gradually increase MAX_LINEAR_JERK by 2-3x steps
> > 5. Monitor motor current, following errors, vibration
> > 6. Find sweet spot: smooth motion without sluggishness
> > 7. Test coordinated motion (G2/G3 arcs, 3D paths)
> >
> >
> > RUNTIME SWITCHING (Advanced Feature)
> > -------------------------------------
> > All trajectory jerk parameters can be changed while LinuxCNC is running!
> > This allows dynamic switching between planning modes.
> >
> > EXAMPLE 1: Toggle button to switch planners
> > In your HAL file:
> >
> >      # Create a toggle button
> >      net planner-toggle-btn pyvcp.scurve-enable => ini.traj_planner_type
> >
> >      # When button=0: Trapezoidal
> >      # When button=1: S-curve
> >
> > EXAMPLE 2: Automatic switching based on feedrate
> > In your HAL file:
> >
> >      # Use motion.current-vel to switch planners
> >      # High speed = trapezoidal (faster), Low speed = S-curve (smoother)
> >      loadrt comp names=vel-compare
> >      addf vel-compare servo-thread
> >
> >      setp vel-compare.in0 150.0  # Switch threshold (units/sec)
> >      net current-vel motion.current-vel => vel-compare.in1
> >      net use-scurve vel-compare.out => ini.traj_planner_type
> >
> > EXAMPLE 3: MDI commands to change jerk on-the-fly
> > You can use halcmd in MDI or scripts:
> >
> >      halcmd setp ini.traj_max_jerk 2000.0
> >      halcmd setp ini.traj_planner_type 1
> >
> > EXAMPLE 4: Material-specific jerk settings
> > In PyVCP or custom GUI:
> >
> >      <pyvcp>
> >        <labelframe text="Motion Profile">
> >          <radiobutton>
> >            <choices>["Wood (500)", "Aluminum (1500)", "Steel
> (2500)"]</choices>
> >            <halpin>"material-jerk"</halpin>
> >          </radiobutton>
> >        </labelframe>
> >      </pyvcp>
> >
> >      # In HAL, use mux component to select jerk value
> >      # and connect to ini.traj_max_jerk
> >
> > NOTES:
> >    - Changes take effect on the NEXT motion command
> >    - Safe to change during idle or between moves
> >    - Existing queued moves use old parameters
> >    - Great for A/B testing different jerk values
> >
> >
> > TROUBLESHOOTING
> > ---------------
> > Q: No difference between PLANNER_TYPE=0 and PLANNER_TYPE=1?
> > A: Verify MAX_LINEAR_JERK > 0 and all joint/axis MAX_JERK > 0
> >
> > Q: Motion is slower with S-curve?
> > A: Increase MAX_LINEAR_JERK value
> >
> > Q: Following errors increased?
> > A: Decrease MAX_LINEAR_JERK or tune PID parameters
> >
> > Q: Want to disable S-curve temporarily?
> > A: Set PLANNER_TYPE=0 (no need to change jerk values)
> >
> >
> > FILES MODIFIED
> > --------------
> > Core implementation:
> >    - src/emc/tp/sp_scurve.c           (NEW - S-curve algorithm)
> >    - src/emc/tp/sp_scurve.h           (NEW - S-curve header)
> >    - src/emc/motion/simple_tp.c       (dispatch to S-curve planner)
> >    - src/emc/motion/simple_tp.h       (add jerk support)
> >
> > Motion control:
> >    - src/emc/motion/motion.h          (add jerk commands/status)
> >    - src/emc/motion/command.c         (handle jerk commands)
> >    - src/emc/motion/control.c         (jerk limiting in motion loop)
> >    - src/emc/motion/axis.c            (axis jerk limits)
> >
> > INI file parsing:
> >    - src/emc/ini/initraj.cc           (parse TRAJ jerk params)
> >    - src/emc/ini/inijoint.cc          (parse JOINT jerk params)
> >    - src/emc/ini/iniaxis.cc           (parse AXIS jerk params)
> >    - src/emc/ini/inihal.cc            (HAL pin creation & updates)
> >    - src/emc/ini/inihal.hh            (HAL data structures)
> >
> > Configuration:
> >    - src/emc/nml_intf/emccfg.h        (default constants)
> >    - lib/hallib/check_config.tcl      (INI validation)
> >
> > Build system:
> >    - src/Makefile                     (add sp_scurve.o to build)
> >    - src/emc/motion-logger/Submakefile
> >
> >
> > EXAMPLE CONFIGURATIONS
> > ----------------------
> > See: configs/scurve_example.ini for complete examples
> >
> >
> > TESTING RECOMMENDATIONS
> > -----------------------
> > 1. Air cut test programs with known good results
> > 2. Compare surface finish: trapezoidal vs S-curve
> > 3. Monitor following errors during complex paths
> > 4. Check motor temperature (shouldn't increase significantly)
> > 5. Listen for unusual vibrations or resonances
> > 6. Measure cycle time differences
> >
> >
> > FOR DEVELOPERS
> > --------------
> > S-curve algorithm location: src/emc/tp/sp_scurve.c
> >
> > Key function: simple_scurve_tp_update()
> >    - Called from simple_tp_update() when jerk > 0
> >    - Implements 7-segment S-curve profile
> >    - Updates position, velocity, acceleration, jerk
> >
> > Integration points:
> >    - simple_tp.c: Planner selection based on max_jerk
> >    - axis.c: Apply axis jerk limits
> >    - control.c: Apply joint jerk limits
> >    - command.c: Process EMCMOT_SET_JERK commands
> >
> >
> > COMMUNITY TESTING
> > -----------------
> > This feature is new and needs community testing. Please report:
> >    - Machine configuration (type, size, rigidity)
> >    - Jerk values that worked well
> >    - Any issues or unexpected behavior
> >    - Comparison to trapezoidal planning
> >
> > Report to: LinuxCNC forum or Discord
> >
> >
> >
> ================================================================================
> > Last updated: 2026-01-01
> >
> ================================================================================
> _______________________________________________
> Emc-users mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/emc-users
>

_______________________________________________
Emc-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/emc-users

Reply via email to