mirror of
https://github.com/Klipper3d/klipper.git
synced 2025-11-15 09:46:04 +01:00
Deploying to gh-pages from @ Klipper3d/klipper@7b490f3ec1 🚀
This commit is contained in:
@@ -1484,16 +1484,16 @@
|
||||
<p>典型的打印机运动始于klipper上位机接收到"G1"命令,并在微控制器发出对应的步进脉冲结束。本节将简述典型运动命令的代码流。<a href="Kinematics.html">运动学</a>文档将更为细致的描述运动的机械原理。</p>
|
||||
<ul>
|
||||
<li>移动命令的处理始于gcode.py,该代码将G代码转化为内部调用。G1命令将调用klippy/extras/gcode_move.py中的cmd_G1()函数。gcode_move.py中的代码将处理 原点变换(G92),绝对坐标模式(G90)和单位变换(如F6000=100mm/s)。一个移动命令的处理路径为:<code>_process_data() -> _process_commands() -> cmd_G1()</code>。最终将调用ToolHead类的方法实现移动 <code>cmd_G1() -> ToolHead.move()</code></li>
|
||||
<li>ToolHead类(位于toolhead.py)处理“前瞻”行为和记录打印的时间点。移动命令的代码路径为 <code>ToolHead.move() -> MoveQueue.add_move() -> MoveQueue.flush() -> Move.set_junction() -> ToolHead._process_moves()</code>。<ul>
|
||||
<li>The ToolHead class (in toolhead.py) handles "look-ahead" and tracks the timing of printing actions. The main codepath for a move is: <code>ToolHead.move() -> LookAheadQueue.add_move() -> LookAheadQueue.flush() -> Move.set_junction() -> ToolHead._process_moves()</code>.<ul>
|
||||
<li>ToolHead.move()将创建一个Move()对象实例,其中将包含移动的参数(在笛卡尔空间中,并这些参数以mm和s为单位)。</li>
|
||||
<li>kinematics类将检查每个运动命令(<code>ToolHead.move() -> kin.check_move()</code>)。各种kinematics类存放于 klippy/kinematics/ 目录。check_move()能在运动命令不合理时抛出错误。如果 check_move()成功,这意味着打印机必定能完成运动命令。</li>
|
||||
<li>MoveQueue.add_move()将一个move实例添加到“前瞻”队列。</li>
|
||||
<li>MoveQueue.flush()将进行每次运动 起始和结束 速度。</li>
|
||||
<li>LookAheadQueue.add_move() places the move object on the "look-ahead" queue.</li>
|
||||
<li>LookAheadQueue.flush() determines the start and end velocities of each move.</li>
|
||||
<li>Move.set_junction()实现移动的“梯形加减速(trapezoid generator)”。“梯形加减速”将每次移动拆分为三部分:恒加速度加速阶段、恒速度阶段、恒加速度减速阶段。所有移动均含有上述三个阶段,但单个阶段的持续时间可能为0。</li>
|
||||
<li>当ToolHead._process_moves()被调用时,一次移动的所有要素均已就绪——移动的起始位置、结束位置、加速度、起始/巡航/结束速度、以及起始/巡航/结束的距离。所有信息以笛卡尔坐标的形式存储在Move()实例中,单位为mm和s。</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Klipper使用<a href="https://en.wikipedia.org/wiki/Root-finding_algorithm">迭代求解</a>的方式生成步进电机的每步的时长。为了提高效率,步进脉冲时间是以C语言代码生成。一个运动先经过“梯形运动队列化” :<code>ToolHead._process_moves() -> trapq_append()</code> (位于 klippy/chelper/trapq.c),然后生成步进时间 <code>ToolHead._process_moves() -> ToolHead._update_move_time() -> MCU_Stepper.generate_steps() -> itersolve_generate_steps() -> itersolve_gen_steps_range()</code> (位于 klippy/chelper/itersolve.c)。迭代求解器通过一个时间-位置方程计算出步进时间。求解时通过“假定”时间点,以时间-位置方程计算出下一步的位置。如果计算结果与实际需求的下一步位置一致,假定值将用于实际运动;否则,通过计算结果对“假定时间”进行修正,并进行下一次试算。这种反馈方式会使迭代快速收敛。运动学所使用的时间-位置函数位于 klippy/chelper/ 目录 (例如, kin_cart.c, kin_corexy.c, kin_delta.c, kin_extruder.c)。</li>
|
||||
<li>Klipper uses an <a href="https://en.wikipedia.org/wiki/Root-finding_algorithm">iterative solver</a> to generate the step times for each stepper. For efficiency reasons, the stepper pulse times are generated in C code. The moves are first placed on a "trapezoid motion queue": <code>ToolHead._process_moves() -> trapq_append()</code> (in klippy/chelper/trapq.c). The step times are then generated: <code>ToolHead._process_moves() -> ToolHead._advance_move_time() -> ToolHead._advance_flush_time() -> MCU_Stepper.generate_steps() -> itersolve_generate_steps() -> itersolve_gen_steps_range()</code> (in klippy/chelper/itersolve.c). The goal of the iterative solver is to find step times given a function that calculates a stepper position from a time. This is done by repeatedly "guessing" various times until the stepper position formula returns the desired position of the next step on the stepper. The feedback produced from each guess is used to improve future guesses so that the process rapidly converges to the desired time. The kinematic stepper position formulas are located in the klippy/chelper/ directory (eg, kin_cart.c, kin_corexy.c, kin_delta.c, kin_extruder.c).</li>
|
||||
<li>需要注意,挤出机有独特的运动学模型,使用<code>ToolHead._process_moves() -> PrinterExtruder.move()</code>类继续宁处理。尽管挤出机使用了独立的Move()类,由于Move() 实例包含了实际运动的时间,并且脉冲时间的设备是定时发送到微控制器上,因此由挤出机类产生的步进运动将与打印头的运动同步。</li>
|
||||
<li>当迭代计算器计算出步进时长后,计算结果将被置于一个数组中:<code>itersolve_gen_steps_range() -> stepcompress_append()</code> (位于 klippy/chelper/stepcompress.c)。数组(结构体 stepcompress.queue)存储每一步对应的微处理器时钟计数器时间。上述的“微处理器计数器”的值指的是微处理器硬件上的计数器——其值基于微处理器最后一次上电而定。</li>
|
||||
<li>接下来重要的是,对步进数据进行压缩: <code>stepcompress_flush() -> compress_bisect_add()</code> (位于 klippy/chelper/stepcompress.c)。上述代码将基于前述的 步进时间列表 生成和编码一系列的微控制器"queue_step"(队列步进)命令。这些"queue_step"命令将被队列化,优先处理,并发送到微控制器中(上位机通过 stepcompress.c:steppersync;下位机通过serialqueue.c:serialqueue))。</li>
|
||||
|
||||
Reference in New Issue
Block a user