From 19ffaa9ff0d12b5c7d2b2b6c3123f9782241b096 Mon Sep 17 00:00:00 2001 From: Kevin O'Connor Date: Wed, 19 Apr 2017 20:28:37 -0400 Subject: [PATCH] docs: Reword parts of the pressure advance kinematics description. Signed-off-by: Kevin O'Connor --- docs/Kinematics.md | 54 ++++++++++++++++-------------- docs/img/ooze.svg | 74 ++++++++++++++++++++++++++++++++---------- docs/img/ooze.svg.png | Bin 9319 -> 13111 bytes 3 files changed, 86 insertions(+), 42 deletions(-) diff --git a/docs/Kinematics.md b/docs/Kinematics.md index 3face1db..92de88ad 100644 --- a/docs/Kinematics.md +++ b/docs/Kinematics.md @@ -54,10 +54,10 @@ of zero duration (if the end speed is equal to the cruising speed). ![trapezoids](img/trapezoids.svg.png) -Lookahead -========= +Look-ahead +========== -The "lookahead" system is used to determine cornering speeds between +The "look-ahead" system is used to determine cornering speeds between moves. Consider the following two moves contained on an XY plane: @@ -70,7 +70,7 @@ but that is not ideal as all that acceleration and deceleration would greatly increase the print time and the frequent changes in extruder flow would result in poor print quality. -To solve this, the "lookahead" mechanism queues multiple incoming +To solve this, the "look-ahead" mechanism queues multiple incoming moves and analyzes the angles between moves to determine a reasonable speed that can be obtained during the "junction" between two moves. If the next move forms an acute angle (the head is going to travel in @@ -85,17 +85,17 @@ acceleration". Best [described](https://onehossshay.wordpress.com/2011/09/24/improving_grbl_cornering_algorithm/) by the author. -Klipper implements lookahead between moves contained in the XY plane +Klipper implements look-ahead between moves contained in the XY plane that have similar extruder flow rates. Other moves are rare and -implementing lookahead between them is unnecessary. +implementing look-ahead between them is unnecessary. -Key formula for lookahead: +Key formula for look-ahead: ``` end_velocity^2 = start_velocity^2 + 2*accel*move_distance ``` -Smoothed lookahead ------------------- +Smoothed look-ahead +------------------- Klipper also implements a mechanism for smoothing out the motions of short "zig-zag" moves. Consider the following moves: @@ -124,7 +124,7 @@ top-speed. Generating steps ================ -Once the lookahead process completes, the print head movement for the +Once the look-ahead process completes, the print head movement for the given move is fully known (time, start position, end position, velocity at each point) and it is possible to generate the step times for the move. This process is done within "kinematic classes" in the @@ -249,18 +249,20 @@ pressure. Pressure increases when filament is pushed into the extruder the pressure necessary to extrude is dominated by the flow rate through the nozzle orifice (as in [Poiseuille law](https://en.wikipedia.org/wiki/Poiseuille_law)). The -details of the above physics are not important - only that the -relationship between pressure and flow rate is linear. See the -[pressure advance](Pressure_Advance.md) document for information on -how to find the pressure advance coefficients. +key idea is that the relationship between filament, pressure, and flow +rate can be modeled using a linear coefficient: +``` +extra_filament = pressure_advance_coefficient * extruder_velocity +``` + +See the [pressure advance](Pressure_Advance.md) document for +information on how to find this pressure advance coefficient. Once configured, Klipper will push in an additional amount of filament -during acceleration and retract that additional filament during -deceleration. The higher the desired filament flow rate, the more -filament must be pushed in during acceleration to account for -pressure. Any additional filament pushed in during head acceleration -is retracted during head deceleration (the extruder will have a -negative velocity). +during acceleration. The higher the desired filament flow rate, the +more filament must be pushed in during acceleration to account for +pressure. During head deceleration the extra filament is retracted +(the extruder will have a negative velocity). ![pressure-advance](img/pressure-advance.svg.png) @@ -268,8 +270,8 @@ One may notice that the pressure advance algorithm can cause the extruder motor to make sudden velocity changes. This is tolerated based on the idea that the majority of the inertia in the system is in changing the extruder pressure. As long as the extruder pressure does -not change rapidly it is okay to make some sudden changes in extruder -motor velocity. +not change rapidly the sudden changes in extruder motor velocity are +tolerated. One area where sudden velocity changes become problematic is during small changes in head speed due to cornering. @@ -277,6 +279,8 @@ small changes in head speed due to cornering. ![pressure-cornering](img/pressure-cornering.svg.png) To prevent this, the Klipper pressure advance code utilizes the move -lookahead queue to detect intermittent speed changes. In these cases -the amount of pressure increased and decreased will be reduced or -eliminated. +look-ahead queue to detect intermittent speed changes. During a +deceleration event the code finds the maximum upcoming head speed +within a configurable time window. The pressure is then only adjusted +to this found maximum. This can greatly reduce (or even completely +eliminate) pressure changes during cornering. diff --git a/docs/img/ooze.svg b/docs/img/ooze.svg index 0c237a30..a2994048 100644 --- a/docs/img/ooze.svg +++ b/docs/img/ooze.svg @@ -15,7 +15,10 @@ id="svg2" version="1.1" inkscape:version="0.91 r13725" - sodipodi:docname="ooze.svg"> + sodipodi:docname="ooze.svg" + inkscape:export-filename="/home/kevin/src/reprap/firmware/klipper/docs/img/ooze.svg.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> image/svg+xml - + @@ -125,43 +128,80 @@ y="283.39032">non-extrude move time + x="436.76678" + y="586.62585">time filament + id="tspan4197" + x="-551.11292" + y="125.37186">actualfilament + + desiredfilament + + diff --git a/docs/img/ooze.svg.png b/docs/img/ooze.svg.png index 138010dd346d98ac5aeb6626f0a46ca829d3478e..2d72aeb3db41771313e14a8a2495b8477ce1ed8c 100644 GIT binary patch literal 13111 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�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 U)fGs5$%RB)Ltni{)i&z?06`gz^Z)<= literal 9319 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