Klipper module for automatically calculating your printer's maximum acceleration/velocity
With one copy/paste and one line in your configuration, automatically optimize your printer's motion
This module automatically performs movements on the x, y, x-diagonal, y-diagonal, and z axes, and measures your steppers missed steps at various accelerations/velocities. With the default configuration, this may take awhile (~10 minutes). Most of the testing time is waiting for your printer to home. On my printer with default settings (except MAX_MISSED), it takes ~3.5 minutes for acceleration, and ~5 minutes for velocity.
Sensorless homing: If you're using sensorless homing MAX_MISSED=1.0
is probably too low.
The endstop variance check will tell you how many steps you lose when homing.
For instance, on my printer I lose around 0-4.2 steps each home.
I run AUTO_SPEED MAX_MISSED=10.0
to account for that variance, and occasional wildly different endstop results.
This module is under development, and has only been validated on CoreXY printers: You may run into issues or bugs, feel free to use the discord channel, or post an issue here.
Your printer shouldn't have any crashes due to the movement patterns used, and re-homing before/after each test, so it's safe to walk away and let it do it's thing.
Using Ellis' pattern (AUTO_SPEED_VALIDATE) is NOT a safe movement pattern. Please ensure your toolhead isn't crashing before walking away.
AUTO_SPEED
AUTO_SPEED_ACCEL AXIS="y"
AUTO_SPEED_VELOCITY AXIS="y,x"
AUTO_SPEED_VALIDATE
AUTO_SPEED_GRAPH
AUTO_SPEED_GRAPH VELOCITY_MIN=100 VELOCITY_MAX=1000 VELOCITY_DIV=9
AUTO_SPEED
MAX_MISSED
ACCEL_MIN
and ACCEL_MAX
max_missed
, go to next stepVELOCITY_MIN
and VELOCITY_MAX
max_missed
, go to next step[update_manager klipper_auto_speed]
type: git_repo
path: ~/klipper_auto_speed
origin: https://github.com/anonoei/klipper_auto_speed.git
primary_branch: main
install_script: install.sh
managed_services: klipper
To install this module you need to clone the repository and run the install.sh
script.
Depending on when you installed klipper, you may also need to update your klippy-env python version.
cd ~
git clone https://github.com/Anonoei/klipper_auto_speed.git
cd klipper_auto_speed
./install.sh
cd ~
git clone https://github.com/Anonoei/klipper_auto_speed.git
cd klipper_auto_speed
ln -sf ~/klipper_auto_speed/auto_speed.py ~/klipper/klippy/extras/auto_speed.py
~/klippy-env/bin/python -m pip install matplotlib
sudo systemctl restart klipper
sudo apt install python3
sudo apt install python3-numpy
sudo systemctl stop klipper
python3 -m venv --update ~/klippy-env
~/klippy-env/bin/pip install -r "~/klipper/scripts/klippy-requirements.txt"
Place this in your printer.cfg
[auto_speed]
The values listed below are the defaults Auto Speed uses. You can include them if you wish to change their values or run into issues.
[auto_speed]
#axis: diag_x, diag_y ; One or multiple of `x`, `y`, `diag_x`, `diag_y`, `z`
#margin: 20 ; How far away from your axes to perform movements
#settling_home: 1 ; Perform settling home before starting Auto Speed
#max_missed: 1.0 ; Maximum full steps that can be missed
#endstop_samples: 3 ; How many endstop samples to take for endstop variance
#accel_min: 1000.0 ; Minimum acceleration test may try
#accel_max: 50000.0 ; Maximum acceleration test may try
#accel_accu: 0.05 ; Keep binary searching until the result is within this percentage
#velocity_min: 50.0 ; Minimum velocity test may try
#velocity_max: 5000.0 ; Maximum velocity test may try
#velocity_accu: 0.05 ; Keep binary searching until the result is within this percentage
#derate: 0.8 ; Derate discovered results by this amount
#validate_margin: Unset ; Margin for VALIDATE, Defaults to margin
#validate_inner_margin: 20.0 ; Margin for VALIDATE inner pattern
#validate_iterations: 50 ; Perform VALIDATE pattern this many times
#results_dir: ~/printer_data/config ; Destination directory for graphs
Auto Speed is split into 5 separate macros. The default AUTO_SPEED
automatically calls the other three (AUTO_SPEED_ACCEL
, AUTO_SPEED_VELOCITY
, AUTO_SPEED_VALIDATE
). You can use any argument from those macros when you call AUTO_SPEED
.
You can also use AUTO_SPEED_GRAPH
to find your printers velocity-to-accel relationship.
AUTO_SPEED finds maximum acceleration, velocity, and validates results at the end.
Argument |
Default | Description |
---|---|---|
AXIS | Unset | Perform test on these axes, defaults to diag_x, diag_y |
Z | 50 | Z position to run Auto Speed |
MARGIN | 20 | How far away from your axis maximums to perform the test movement |
SETTLING_HOME | 1 | Perform settling home before starting Auto Speed |
MAX_MISSED | 1.0 | Maximum full steps that can be missed |
ENDSTOP_SAMPLES | 3 | How many endstop samples to take for endstop variance |
TEST_ATTEMPTS | 2 | Re-test this many times if test fails |
ACCEL_MIN | 1000.0 | Minimum acceleration test may try |
ACCEL_MAX | 50000.0 | Maximum acceleration test may try |
ACCEL_ACCU | 0.05 | Keep binary searching until the result is within this percentage |
VELOCITY_MIN | 50.0 | Minimum velocity test may try |
VELOCITY_MAX | 5000.0 | Maximum velocity test may try |
VELOCITY_ACCU | 0.05 | Keep binary searching until the result is within this percentage |
LEVEL | 1 | Level the printer if it's not leveled |
VARIANCE | 1 | Check endstop variance |
AUTO_SPEED_ACCEL find maximum acceleration
Argument |
Default | Description |
---|---|---|
AXIS | Unset | Perform test on these axes, defaults to diag_x, diag_y |
MARGIN | 20.0 | Used when DIST is 0.0, how far away from axis to perform movements |
DERATE | 0.8 | How much to derate maximum values for the recommended max |
MAX_MISSED | 1.0 | Maximum fulls steps that can be missed |
ACCEL_MIN | 1000.0 | Minimum acceleration test may try |
ACCEL_MAX | 50000.0 | Maximum acceleration test may try |
ACCEL_ACCU | 0.05 | Keep binary searching until the result is within this percentage |
AUTO_SPEED_VELOCITY finds maximum velocity
Argument |
Default | Description |
---|---|---|
AXIS | Unset | Perform test on these axes, defaults to diag_x, diag_y |
MARGIN | 20.0 | Used when DIST is 0.0, how far away from axis to perform movements |
DERATE | 0.8 | How much to derate maximum values for the recommended max |
MAX_MISSED | 1.0 | Maximum fulls steps that can be missed |
VELOCITY_MIN | 100.0 | Minimum velocity test may try |
VELOCITY_MAX | 5000.0 | Maximum velocity test may try |
VELOCITY_ACCU | 0.05 | Keep binary searching until the result is within this percentage |
AUTO_SPEED_VALIDATE validates a specified acceleration/velocity, using Ellis' TEST_SPEED Pattern
Argument |
Default | Description |
---|---|---|
MAX_MISSED | 1.0 | Maximum fulls steps that can be missed |
VALIDATE_MARGIN | 20.0 | Margin axes max/min pattern can move to |
VALIDATE_INNER_MARGIN | 20.0 | Margin from axes center pattern can move to |
VALIDATE_ITERATIONS | 50 | Repeat the pattern this many times |
ACCEL | Unset | Defaults to current max accel |
VELOCITY | Unset | Defaults to current max velocity |
AUTO_SPEED_GRAPH
graphs your printer's velocity-to-accel relationship on specified axes
You must specify VELOCITY_MIN
and VELOCITY_MAX
.
Argument | Default | Description |
---|---|---|
AXIS | Unset | Perform test on these axes, defaults to diag_x, diag_y |
MARGIN | 20.0 | Used when DIST is 0.0, how far away from axis to perform movements |
DERATE | 0.8 | How much to derate maximum values for the recommended max |
MAX_MISSED | 1.0 | Maximum fulls steps that can be missed |
VELOCITY_MIN | Unset | Minimum velocity test may try |
VELOCITY_MAX | Unset | Maximum velocity test may try |
VELOCITY_DIV | 5 | How many velocities to test |
VELOCITY_ACCU | 0.05 | Keep binary searching until the result within this percent |
ACCEL_MIN_SLOPE | 100 | Calculated min slope value $\frac{10000}{velocity \div slope}$ |
ACCEL_MAX_SLOPE | 1800 | Calculated max slope value $\frac{10000}{velocity \div slope}$ |
Console output is slightly different depending on whether testing acceleration/velocity, and which axis is being tested.
axis
is one of x
, y
, diag_x
, diag_y
, z
after
are (first home time)/(movement time)/(end home time)#
s before decimals are variable, #
s after decimals are staticAUTO SPEED accel on `axis` try # (#.##s)
Moved #.##mm at a###/v### after #.##/#.##/#.##s
Missed X #.##, Y #.##
Example:
AUTO SPEED accel on diag_x try 1 (19.66s)
Moved 1.43mm at a17333/v241 after 8.92/0.30/9.93s
Missed X 0.31, Y 2.00
AUTO SPEED velocity on `axis` try # (#.##s)
Moved #.##mm at a###/v### after #.##/#.##/#.##s
Missed X #.##, Y #.##
Example:
AUTO SPEED velocity on diag_y try 1 (23.91s)
Moved 13.44mm at a91456/v1700 after 8.92/0.31/13.87s
Missed X 0.06, Y 132.00
AUTO SPEED found maximum acceleration after #.##s
| `AXIS 1` max: ###
| `AXIS 2` max: ###
Recommended values:
| `AXIS 1` max: ###
| `AXIS 2` max: ###
Recommended acceleration: ###
Example:
AUTO SPEED found maximum acceleration after 218.00s
| DIAG X max: 48979
| DIAG Y max: 48979
Recommended values:
| DIAG X max: 39183
| DIAG Y max: 39183
Recommended acceleration: 39183
AUTO SPEED found maximum velocity after #.##s
| `AXIS 1` max: ###
| `AXIS 2` max: ###
Recommended values
| `AXIS 1` max: ###
| `AXIS 2` max: ###
Recommended velocity: ###
Example:
AUTO SPEED found maximum velocity after 307.60s
| DIAG X max: 577
| DIAG Y max: 552
Recommended values
| DIAG X max: 462
| DIAG Y max: 442
Recommended velocity: 442
AUTO SPEED found recommended acceleration and velocity after #.##s
| `AXIS 1` max: a### v###
| `AXIS 2`: a### v###
Recommended accel: ###
Recommended velocity: ###
Example:
AUTO SPEED found recommended acceleration and velocity after 525.61s
| DIAG X max: a39183 v462
| DIAG Y max: a39183 v442
Recommended accel: 39183
Recommended velocity: 442