# ======================================================== # 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 and DISABLED by default. # Traditional trapezoidal acceleration is used when: # - PLANNER_TYPE = 0, OR # - MAX_LINEAR_JERK = 0 (or not specified) # # ======================================================== [EMC] VERSION = 1.1 MACHINE = scurve_example DEBUG = 0 [DISPLAY] JOG_AXES = X Y Z A C GEOMETRY = X Y Z A C #DISPLAY = python3 /home/ruediger/linuxcnc/script/script/lcncServer-v0.0.1.py DISPLAY = axis # dummy # CYCLE_TIME = 0.1 POSITION_OFFSET = RELATIVE POSITION_FEEDBACK = ACTUAL MAX_FEED_OVERRIDE = 1.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 = 0 SERVO_PERIOD = 1000000 [TASK] TASK = milltask CYCLE_TIME = 0.010 [HAL] HALUI = halui HALFILE = XYZAC-Sim.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 ;PLANNER_TYPE = 0 # 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 # # 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 = 100000.0 # DEFAULT_LINEAR_JERK: Default jerk for programmed feed moves # Units: machine-units/second^3 # Should be <= MAX_LINEAR_JERK # Default: 0.0 # # NOTE: This parameter can be changed at RUNTIME via HAL pin: # ini.traj_default_jerk DEFAULT_LINEAR_JERK = 100000.0 # -------------------------------------------------------- # Standard TRAJ parameters (still required with S-curve) # -------------------------------------------------------- COORDINATES = X Y Z A C LINEAR_UNITS = mm ANGULAR_UNITS = degree CYCLE_TIME = 0.010 DEFAULT_LINEAR_VELOCITY = 500.0 MAX_LINEAR_VELOCITY = 500.0 DEFAULT_LINEAR_ACCELERATION = 10000.0 MAX_LINEAR_ACCELERATION = 10000.0 DEFAULT_ANGULAR_VELOCITY = 360.0 MAX_ANGULAR_VELOCITY = 360.0 DEFAULT_ANGULAR_ACCELERATION = 7200.0 MAX_ANGULAR_ACCELERATION = 7200.0 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] # 5axiskins misnomer 1 more joint for W KINEMATICS = xyzac-trt-kins JOINTS = 5 [RS274NGC] SUBROUTINE_PATH = ./remap_subs HAL_PIN_VARS = 1 REMAP = M428 modalgroup=10 ngc=428remap REMAP = M429 modalgroup=10 ngc=429remap REMAP = M430 modalgroup=10 ngc=430remap # 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 = 250 MAX_ACCELERATION = 5000.0 MAX_JERK = 50000.0 MIN_LIMIT = -1000.0 MAX_LIMIT = 1000.0 HOME_ABSOLUTE_ENCODER = 2 HOME_SEARCH_VEL = 0.0 HOME_LATCH_VEL = 0.0 HOME_SEQUENCE = 0 HOME_USE_INDEX = NO HOME_FINAL_VEL = 0.0 FERROR = 0.0 [JOINT_1] TYPE = LINEAR HOME = 0.0 MAX_VELOCITY = 250 MAX_ACCELERATION = 5000.0 MAX_JERK = 50000.0 MIN_LIMIT = -1000.0 MAX_LIMIT = 1000.0 HOME_ABSOLUTE_ENCODER = 2 HOME_SEARCH_VEL = 0.0 HOME_LATCH_VEL = 0.0 HOME_SEQUENCE = 0 HOME_USE_INDEX = NO HOME_FINAL_VEL = 0.0 FERROR = 0.0 [JOINT_2] TYPE = LINEAR HOME = 0.0 MAX_VELOCITY = 250 MAX_ACCELERATION = 5000.0 MAX_JERK = 50000.0 MIN_LIMIT = -1000.0 MAX_LIMIT = 1000.0 HOME_ABSOLUTE_ENCODER = 2 HOME_SEARCH_VEL = 0.0 HOME_LATCH_VEL = 0.0 HOME_SEQUENCE = 0 HOME_USE_INDEX = NO HOME_FINAL_VEL = 0.0 FERROR = 0.0 [JOINT_3] TYPE = ANGULAR HOME = 0.0 MAX_VELOCITY = 360.0 MAX_ACCELERATION = 7200.0 MAX_JERK = 72000.0 MIN_LIMIT = -1000.0 MAX_LIMIT = 1000.0 HOME_ABSOLUTE_ENCODER = 2 HOME_SEARCH_VEL = 0.0 HOME_LATCH_VEL = 0.0 HOME_SEQUENCE = 0 HOME_USE_INDEX = NO HOME_FINAL_VEL = 0.0 FERROR = 0.0 [JOINT_4] TYPE = ANGULAR HOME = 0.0 MAX_VELOCITY = 360.0 MAX_ACCELERATION = 7200.0 MAX_JERK = 36000.0 MIN_LIMIT = -1000.0 MAX_LIMIT = 1000.0 HOME_ABSOLUTE_ENCODER = 2 HOME_SEARCH_VEL = 0.0 HOME_LATCH_VEL = 0.0 HOME_SEQUENCE = 0 HOME_USE_INDEX = NO HOME_FINAL_VEL = 0.0 FERROR = 0.0 # ======================================================== # AXIS CONFIGURATION # ======================================================== [AXIS_X] MIN_LIMIT = -1000.0 MAX_LIMIT = 1000.0 MAX_VELOCITY = 250 MAX_ACCELERATION = 5000.0 MAX_JERK = 50000.0 [AXIS_Y] MIN_LIMIT = -1000.0 MAX_LIMIT = 1000.0 MAX_VELOCITY = 250 MAX_ACCELERATION = 5000.0 MAX_JERK = 50000.0 [AXIS_Z] MIN_LIMIT = -1000.0 MAX_LIMIT = 1000.0 MAX_VELOCITY = 250 MAX_ACCELERATION = 5000.0 MAX_JERK = 50000.0 [AXIS_A] MIN_LIMIT = -1000.0 MAX_LIMIT = 1000.0 MAX_VELOCITY = 360.0 MAX_ACCELERATION = 7200.0 MAX_JERK = 72000.0 [AXIS_C] MIN_LIMIT = -1000.0 MAX_LIMIT = 1000.0 MAX_VELOCITY = 360.0 MAX_ACCELERATION = 7200.0 MAX_JERK = 72000.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 # # ========================================================