Deploying to gh-pages from @ Klipper3d/klipper@434770eaf9 🚀

This commit is contained in:
KevinOConnor
2024-05-06 00:04:31 +00:00
parent 1abfa00e23
commit 43cff61d2d
58 changed files with 567 additions and 482 deletions

View File

@@ -1484,21 +1484,23 @@
<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() -&gt; _process_commands() -&gt; cmd_G1()</code>。最终将调用ToolHead类的方法实现移动 <code>cmd_G1() -&gt; ToolHead.move()</code></li>
<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() -&gt; LookAheadQueue.add_move() -&gt; LookAheadQueue.flush() -&gt; Move.set_junction() -&gt; ToolHead._process_moves()</code>.<ul>
<li>
<p>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() -&gt; LookAheadQueue.add_move() -&gt; LookAheadQueue.flush() -&gt; Move.set_junction() -&gt; ToolHead._process_moves()</code>.</p>
<ul>
<li>ToolHead.move()将创建一个Move()对象实例其中将包含移动的参数在笛卡尔空间中并这些参数以mm和s为单位</li>
<li>kinematics类将检查每个运动命令<code>ToolHead.move() -&gt; kin.check_move()</code>。各种kinematics类存放于 klippy/kinematics/ 目录。check_move()能在运动命令不合理时抛出错误。如果 check_move()成功,这意味着打印机必定能完成运动命令。</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 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() -&gt; trapq_append()</code> (in klippy/chelper/trapq.c). The step times are then generated: <code>ToolHead._process_moves() -&gt; ToolHead._advance_move_time() -&gt; ToolHead._advance_flush_time() -&gt; MCU_Stepper.generate_steps() -&gt; itersolve_generate_steps() -&gt; 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() -&gt; PrinterExtruder.move()</code>类继续宁处理。尽管挤出机使用了独立的Move()类由于Move() 实例包含了实际运动的时间,并且脉冲时间的设备是定时发送到微控制器上,因此由挤出机类产生的步进运动将与打印头的运动同步。</li>
<li>当迭代计算器计算出步进时长后,计算结果将被置于一个数组中:<code>itersolve_gen_steps_range() -&gt; stepcompress_append()</code> (位于 klippy/chelper/stepcompress.c)。数组(结构体 stepcompress.queue)存储每一步对应的微处理器时钟计数器时间。上述的“微处理器计数器”的值指的是微处理器硬件上的计数器——其值基于微处理器最后一次上电而定。</li>
<li>接下来重要的是,对步进数据进行压缩: <code>stepcompress_flush() -&gt; compress_bisect_add()</code> (位于 klippy/chelper/stepcompress.c)。上述代码将基于前述的 步进时间列表 生成和编码一系列的微控制器"queue_step"(队列步进)命令。这些"queue_step"命令将被队列化,优先处理,并发送到微控制器中(上位机通过 stepcompress.c:steppersync下位机通过serialqueue.c:serialqueue))。</li>
<li>在微控制器queue_step命令将经由 src/command.c 处理。改代码将对命令进行解释,并调用 <code>command_queue_step()</code>。command_queue_step()位于src/stepper.c将每个queue_step命令的参数附加到对应的步进队列中。正常运行下一“步”将在其执行前100ms被解释并加入队列。最后通过 <code>stepper_event()</code>结束步进事件的生成。该代码会基于queue_step命令的参数生成步进脉冲并安排下一次步进脉冲生成的时间。硬件定时器发出中断在设定的事件调用相应的stepper_event。queue_step命令的参数包含“间隔”、“计数”、“增量”。总体而言stepper_event()将执行下列内容,“记录时间”: <code>do_step(); next_wake_time = last_wake_time + interval; interval += add;</code></li>
</ul>
</li>
</ul>
<p>上面的运动过程看似十分复杂。然而真正需要注意的只有ToolHead打印头 和 kinematic (运动学)类,上述两个类的代码确定了运动执行和定时。剩下的代码仅用于处理通讯和管道的问题。</p>
<h2 id="_6">添加上位机模块<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h2>
<p>Klippy上位机的主程序能对模块进行热加载。如果设置文件中出现了类似"[my_module]" 的字段名,程序会自动尝试加载 klippy/extras/my_module.py 文件内的模块。Klipper推荐使用上述方式扩展Klipper功能。</p>