# ======================================================== # S-CURVE MOTION PLANNING CONFIGURATION EXAMPLE # ======================================================== # # This file demonstrates how to configure S-curve (jerk-limited) # motion planning in LinuxCNC. S-curve planning produces smoother # acceleration profiles that can reduce machine vibration and # improve surface finish. # # IMPORTANT: S-curve planning is OPTIONAL. # Traditional trapezoidal acceleration is used when: # - PLANNER_TYPE = 0, OR # - MAX_LINEAR_JERK = 0 # # NOTE: If MAX_LINEAR_JERK is not specified, it defaults to 1e9 (1 billion), # which effectively disables jerk limiting while still using S-curve calculations. # This produces motion similar to trapezoidal but not identical. # # ======================================================== [EMC] VERSION = 1.1 MACHINE = scurve_9axis_example DEBUG = 0 [DISPLAY] JOG_AXES = XYZABCUVW GEOMETRY = XYZABCUVW DISPLAY = axis CYCLE_TIME = 0.200 POSITION_OFFSET = RELATIVE POSITION_FEEDBACK = ACTUAL MAX_FEED_OVERRIDE = 2.0 PROGRAM_PREFIX = M-Codes INTRO_GRAPHIC = linuxcnc.gif INTRO_TIME = 5 EDITOR = gedit [EMCMOT] EMCMOT = motmod COMM_TIMEOUT = 1.0 COMM_WAIT = 0.010 BASE_PERIOD = 150000 SERVO_PERIOD = 1000000 [TASK] TASK = milltask CYCLE_TIME = 0.010 [HAL] HALUI = halui HALFILE = axis_9axis_scurve.hal [TRAJ] # -------------------------------------------------------- # S-curve Planner Configuration # -------------------------------------------------------- # PLANNER_TYPE: Select the acceleration profile shape # 0 = Trapezoidal (traditional - constant acceleration) # 1 = S-curve (smoother - limited jerk/derivative of acceleration) # Default: 0 (trapezoidal) # # NOTE: This parameter can be changed at RUNTIME via HAL pin: # ini.traj_planner_type (allows switching on-the-fly) PLANNER_TYPE = 1 # MAX_LINEAR_JERK: Maximum rate of change of acceleration # Units: machine-units/second^3 (e.g., mm/s^3 or inch/s^3) # # Setting this to 0 disables S-curve planning regardless of PLANNER_TYPE # If not specified, defaults to 1e9 (effectively no jerk limiting) # Maximum allowed value is 1e9 (values above are automatically clamped) # # Recommended starting values (adjust based on your machine): # - Light/rigid machines: 1000-10000 # - Heavy/flexible machines: 100-1000 # - Very rigid machines: 10000-100000 # # Higher values = sharper acceleration changes (closer to trapezoidal) # Lower values = smoother acceleration changes (more gradual) # # NOTE: This parameter can be changed at RUNTIME via HAL pin: # ini.traj_max_jerk (allows tuning on-the-fly) MAX_LINEAR_JERK = 10000.0 # -------------------------------------------------------- # Standard TRAJ parameters (still required with S-curve) # -------------------------------------------------------- COORDINATES = X Y Z A B C U V W LINEAR_UNITS = mm ANGULAR_UNITS = deg CYCLE_TIME = 0.010 DEFAULT_LINEAR_VELOCITY = 100.0 MAX_LINEAR_VELOCITY = 300.0 DEFAULT_LINEAR_ACCELERATION = 500.0 MAX_LINEAR_ACCELERATION = 1000.0 # to be able to run gcodes and MDI without homing NO_FORCE_HOMING = 1 ARC_BLEND_ENABLE = 1 ARC_BLEND_FALLBACK_ENABLE = 0 ARC_BLEND_OPTIMIZATION_DEPTH = 50 ARC_BLEND_RAMP_FREQ = 20 ARC_BLEND_GAP_CYCLES = 4 [EMCIO] EMCIO = io CYCLE_TIME = 0.100 [KINS] # 9-axis configuration KINEMATICS = trivkins JOINTS = 9 [RS274NGC] # File containing interpreter variables PARAMETER_FILE = scurve_example.var # ======================================================== # JOINT CONFIGURATION # ======================================================== # Each joint can have its own jerk limit. If not specified, # the joint uses the axis/trajectory jerk limits. [JOINT_0] TYPE = LINEAR HOME = 0.0 MAX_VELOCITY = 300.0 MAX_ACCELERATION = 1000.0 HOME_SEQUENCE = 0 # MAX_JERK: Maximum jerk for this joint # Units: machine-units/second^3 # Default: 0.0 (disabled, uses trapezoidal) # # This should match or be higher than the trajectory jerk # to avoid limiting coordinated motion. MAX_JERK = 10000.0 #MIN_LIMIT = -200.0 #disabled to give more space for testing g-codes #MAX_LIMIT = 200.0 #disabled to give more space for testing g-codes # ======================================================== # HOMING CONFIGURATION FOR S-CURVE # ======================================================== # WARNING: When using S-curve motion (PLANNER_TYPE=1), you MUST set # HOME_SEARCH_VEL and HOME_LATCH_VEL significantly SLOWER than you # would with trapezoidal motion planning. # # S-curve motion requires MORE DISTANCE to decelerate due to the # jerk-limited acceleration profile. If homing velocities are too # high, the axis may overshoot and hit hard limits or sensor limits. # # RECOMMENDED: Start with 50% or less of the velocities you would # use with trapezoidal planning, then increase cautiously. # # Example homing configuration (adjust for your machine): #HOME_SEARCH_VEL = 5.0 # Velocity for initial limit switch search #HOME_LATCH_VEL = 1.0 # Velocity for precise homing (slower) #HOME_OFFSET = 0.0 # Distance from switch to home position #HOME_USE_INDEX = NO # Use encoder index pulse for homing #HOME_IGNORE_LIMITS = NO # Ignore limit switches during homing move # ======================================================== [JOINT_1] TYPE = LINEAR HOME = 0.0 MAX_VELOCITY = 300.0 MAX_ACCELERATION = 1000.0 MAX_JERK = 10000.0 #MIN_LIMIT = -200.0 #disabled to give more space for testing g-codes #MAX_LIMIT = 200.0 #disabled to give more space for testing g-codes HOME_SEQUENCE = 0 # WARNING: S-curve homing requires SLOWER velocities than trapezoidal! # See JOINT_0 for detailed homing configuration examples. #HOME_SEARCH_VEL = 5.0 #HOME_LATCH_VEL = 1.0 [JOINT_2] TYPE = LINEAR HOME = 0.0 MAX_VELOCITY = 200.0 MAX_ACCELERATION = 800.0 MAX_JERK = 10000.0 #MIN_LIMIT = -100.0 #disabled to give more space for testing g-codes #MAX_LIMIT = 100.0 #disabled to give more space for testing g-codes HOME_SEQUENCE = 0 # WARNING: S-curve homing requires SLOWER velocities than trapezoidal! # See JOINT_0 for detailed homing configuration examples. #HOME_SEARCH_VEL = 4.0 #HOME_LATCH_VEL = 0.8 [JOINT_3] TYPE = ANGULAR HOME = 0.0 MAX_VELOCITY = 180.0 MAX_ACCELERATION = 600.0 MAX_JERK = 10000.0 #MIN_LIMIT = -360.0 #MAX_LIMIT = 360.0 HOME_SEQUENCE = 0 # WARNING: S-curve homing requires SLOWER velocities than trapezoidal! #HOME_SEARCH_VEL = 3.0 #HOME_LATCH_VEL = 0.6 [JOINT_4] TYPE = ANGULAR HOME = 0.0 MAX_VELOCITY = 180.0 MAX_ACCELERATION = 600.0 MAX_JERK = 10000.0 #MIN_LIMIT = -360.0 #MAX_LIMIT = 360.0 HOME_SEQUENCE = 0 # WARNING: S-curve homing requires SLOWER velocities than trapezoidal! #HOME_SEARCH_VEL = 3.0 #HOME_LATCH_VEL = 0.6 [JOINT_5] TYPE = ANGULAR HOME = 0.0 MAX_VELOCITY = 180.0 MAX_ACCELERATION = 600.0 MAX_JERK = 10000.0 #MIN_LIMIT = -360.0 #MAX_LIMIT = 360.0 HOME_SEQUENCE = 0 # WARNING: S-curve homing requires SLOWER velocities than trapezoidal! #HOME_SEARCH_VEL = 3.0 #HOME_LATCH_VEL = 0.6 [JOINT_6] TYPE = LINEAR HOME = 0.0 MAX_VELOCITY = 300.0 MAX_ACCELERATION = 1000.0 MAX_JERK = 10000.0 #MIN_LIMIT = -200.0 #MAX_LIMIT = 200.0 HOME_SEQUENCE = 0 # WARNING: S-curve homing requires SLOWER velocities than trapezoidal! #HOME_SEARCH_VEL = 5.0 #HOME_LATCH_VEL = 1.0 [JOINT_7] TYPE = LINEAR HOME = 0.0 MAX_VELOCITY = 300.0 MAX_ACCELERATION = 1000.0 MAX_JERK = 10000.0 #MIN_LIMIT = -200.0 #MAX_LIMIT = 200.0 HOME_SEQUENCE = 0 # WARNING: S-curve homing requires SLOWER velocities than trapezoidal! #HOME_SEARCH_VEL = 5.0 #HOME_LATCH_VEL = 1.0 [JOINT_8] TYPE = LINEAR HOME = 0.0 MAX_VELOCITY = 200.0 MAX_ACCELERATION = 800.0 MAX_JERK = 10000.0 #MIN_LIMIT = -100.0 #MAX_LIMIT = 100.0 HOME_SEQUENCE = 0 # WARNING: S-curve homing requires SLOWER velocities than trapezoidal! #HOME_SEARCH_VEL = 4.0 #HOME_LATCH_VEL = 0.8 # ======================================================== # AXIS CONFIGURATION # ======================================================== [AXIS_X] #MIN_LIMIT = -200.0 #disabled to give more space for testing g-codes #MAX_LIMIT = 200.0 #disabled to give more space for testing g-codes MAX_VELOCITY = 300.0 MAX_ACCELERATION = 1000.0 # MAX_JERK: Maximum jerk for coordinated motion on this axis # Units: machine-units/second^3 # Default: 0.0 (disabled) MAX_JERK = 10000.0 [AXIS_Y] #MIN_LIMIT = -200.0 #disabled to give more space for testing g-codes #MAX_LIMIT = 200.0 #disabled to give more space for testing g-codes MAX_VELOCITY = 300.0 MAX_ACCELERATION = 1000.0 MAX_JERK = 10000.0 [AXIS_Z] #MIN_LIMIT = -100.0 #disabled to give more space for testing g-codes #MAX_LIMIT = 100.0 #disabled to give more space for testing g-codes MAX_VELOCITY = 200.0 MAX_ACCELERATION = 800.0 MAX_JERK = 10000.0 [AXIS_A] #MIN_LIMIT = -360.0 #MAX_LIMIT = 360.0 MAX_VELOCITY = 180.0 MAX_ACCELERATION = 600.0 MAX_JERK = 10000.0 [AXIS_B] #MIN_LIMIT = -360.0 #MAX_LIMIT = 360.0 MAX_VELOCITY = 180.0 MAX_ACCELERATION = 600.0 MAX_JERK = 10000.0 [AXIS_C] #MIN_LIMIT = -360.0 #MAX_LIMIT = 360.0 MAX_VELOCITY = 180.0 MAX_ACCELERATION = 600.0 MAX_JERK = 10000.0 [AXIS_U] #MIN_LIMIT = -200.0 #MAX_LIMIT = 200.0 MAX_VELOCITY = 300.0 MAX_ACCELERATION = 1000.0 MAX_JERK = 10000.0 [AXIS_V] #MIN_LIMIT = -200.0 #MAX_LIMIT = 200.0 MAX_VELOCITY = 300.0 MAX_ACCELERATION = 1000.0 MAX_JERK = 10000.0 [AXIS_W] #MIN_LIMIT = -100.0 #MAX_LIMIT = 100.0 MAX_VELOCITY = 200.0 MAX_ACCELERATION = 800.0 MAX_JERK = 10000.0 # ======================================================== # TUNING GUIDELINES # ======================================================== # # 1. START WITH TRAPEZOIDAL (PLANNER_TYPE=0) # - Verify your machine works correctly with traditional planning # - Note any vibration or resonance issues # # 2. ENABLE S-CURVE WITH CONSERVATIVE VALUES # - Set PLANNER_TYPE = 1 # - Start with low MAX_LINEAR_JERK (e.g., 100-500) # - Jerk should typically be 10-100x your acceleration value # # 3. GRADUALLY INCREASE JERK # - Increase MAX_LINEAR_JERK in steps of 2-3x # - Test with simple moves and observe: # * Motor current/torque # * Vibration levels # * Following errors # * Surface finish quality # # 4. FIND OPTIMAL VALUE # - Too low: Motion becomes sluggish, cycle time increases # - Too high: Approaches trapezoidal behavior, loses smoothness # - Optimal: Smooth motion without excessive deceleration # # 5. VERIFY COORDINATED MOTION # - Test circular interpolation (G2/G3) # - Check complex 3D toolpaths # - Verify axis jerk limits don't constrain trajectory jerk # # ======================================================== # TROUBLESHOOTING # ======================================================== # # SYMPTOM: No difference between PLANNER_TYPE=0 and PLANNER_TYPE=1 # SOLUTION: Verify MAX_LINEAR_JERK > 0 and MAX_JERK > 0 for all joints/axes # # SYMPTOM: Motion is too slow with S-curve enabled # SOLUTION: Increase MAX_LINEAR_JERK value # # SYMPTOM: Following errors increase with S-curve # SOLUTION: Decrease MAX_LINEAR_JERK or increase PID I-gain # # SYMPTOM: Vibration/resonance at certain speeds # SOLUTION: Adjust MAX_LINEAR_JERK to avoid resonant frequencies # Consider using different jerk values for different axes # # ========================================================