デルタ移動はどのように計算されますか?


8

デカルトプリンタでは、動きは本当に簡単です。プリンターの各軸に100ステップ/ mmがあると仮定すると、軸上での10mmの移動は、その軸上での1000ステップにすぎません。

1つの軸に沿っていない移動も簡単です。x、y = 0,0から10,10に移動すると、xとyで1000ステップになります。

デルタでは、単純な動きでも、複数のモーターを動かす必要があります。そして、目的地に到達するために必要な各軸の歩数を計算するだけで、おそらく曲線状の動きが得られます。

それでは、デルタプリンターの特定の移動のステップを計算するアルゴリズムは何ですか?


ファームウェアが内部でどのように機能するかは3Dプリンターの使用とは関係がないため、これは理論上の質問にすぎないと思われ、プログラミングや数学を扱うサイトに適しています。一方、質問は3D印刷に固有であり、プリンターのファームウェアを変更または微調整しようとしている誰かに関連する可能性があります。
トムファンデルザンデン2016

回答:


7

ほとんどのオープンソース3Dプリンターコントローラーで使用される手法には、2つの主要な特別な手順があります。

  1. 各線形gcodeセグメントを多数の非常に小さなサブセグメントに分割します(「セグメンテーション」)
  2. 基本的な三角法またはピタゴラスの定理を使用して、3つのタワーそれぞれの押出機の位置をキャリッジの高さに結び付け(「逆運動学」)、各小さなセグメントの目標位置を見つけます。

インバースキネマティクスは驚くほど簡単です。未知の3番目の長さを解くために、2つの既知の長さから仮想90度三角形が構築されます。

  • 固定デルタアームの長さは、三角形の斜辺です。
  • カラムジョイントとエンドエフェクタジョイントの間の水平距離は、ノズルのXY座標とカラムの固定位置から計算され、三角形の下辺の長さを決定します
  • 三角形の上辺の長さは、ピタゴラスの定理によって前の2つから計算されます
  • 必要なキャリッジ高さを取得するために、ノズルZの高さに上辺の長さが追加されます

ここで最も優れたオープンソースリファレンスは、Steve GraveのRostock Kinematicsドキュメント、rev3のダウンロード(https://groups.google.com/d/msg/deltabot/V6ATBdT43eU/jEORG_l3dTEJ)です いくつかの関連する画像: ここに画像の説明を入力してください ここに画像の説明を入力してください

これらのインバースキネマティクス計算は、キャリッジごとに実行され、「キャリッジスペース」の目標位置が取得されます。これは、すべてのパスサブセグメントに対して実行されます。

これらのステップの結果は、プリンターの標準の線形パス補間手法に再度挿入できます。この場合、必要な比率と速度でステップが実行され、目的の直線運動と加速/速度プロファイルが生成されます。(それがどのように行われるかは別の質問です。)

正味の効果は、プリンタが一連の小さな「線形」キャリッジ移動(線形は時間に対して一定の速度を意味する)を通過して移動することです。直線的なエンドエフェクタの動き。

*(とにかく、ダイナミクスの制約に従うために、加速のスローダウンの前に一定の速度が適用されます。ここでも、それが別の問題の主題です。)

セグメンテーションは、ポリゴンを使用して円を近似するプロセスに非常に似ています。ファセットが十分に小さい場合、ポリゴンは適切な近似です。セグメンテーション率が高いほど、パス追跡エラーが少なくなります。円弧とデルタモーションパスの描画の主な概念上の違いは、デルタセグメンテーションを使用したいわゆる「ファセットアーク」が、描画に使用するX対Y座標ではなく、高さ対時間座標で構築されることです。コンピューター画面上の円。

デルタスタイルプリンターのサポートは、当初、デカルトプリンターの直線モーションパス専用に作成されたGRBLベースのモーションプランナーにボルトで固定されていたため、このシステムの大部分が使用されています。これは、完全な2次パス補間の実装と比較して、既存のコードベースへの変更が比較的最小限でした。

テクニックは長年にわたって進化してきました。また、代替アプローチがよく使用されます。たとえば、RepRapFirmwareのdc42フォークは、各ステップの後に次のステップの適切な時間を再計算することにより、セグメンテーションなしで正確なパス追跡を実行します。これは、機能的には、ポリゴンファセット数が非常に多い円を近似して、画面上のすべてのピクセルが独自のファセットを取得することと同じです。したがって、モーターの位置決め分解能が許す限り正確です。欠点は、このセグメンテーションフリーの手法はかなりプロセッサを集中的に使用するため、比較的高速なコントローラーでのみ機能し、現在のほとんどの既存の消費者/趣味プリンターに電力を供給する古い8ビットAtmega AVRでは機能しません。

他の手法も可能です。学術的なパラレルロボット制御の文献は、幅広いロボットメカニズムで機能する一般化された制御アルゴリズムを作成するための、数学的手法と複雑さのまったく別の世界です。オープンソースの3Dプリンターで使用するバージョンは、比較すると非常にシンプルでアプリケーション固有です。


2

Marlinファームウェアでこれがどのように行われるかを説明しています。

最初のステップは、(x、y、z)から(x '、y'、z ')への線形移動を多くの個別のセグメントに分割することです。この目的のために、特定の速度で移動にかかる時間を計算し、delta_segments_per_secondの値を使用して、使用されるセグメントの数を計算します。

これは、ファイルMarlin_main.cppの関数prepare_move_deltaで行われます。次に、これらの各セグメントのエンドポイントが関数calculate_deltaに渡されます

void calculate_delta(float cartesian[3]) {
    //reverse kinematics.
    // Perform reversed kinematics, and place results in delta[3]
    // The maths and first version has been done by QHARLEY . Integrated into masterbranch 06/2014 and slightly restructured by Joachim Cerny in June 2014

    float SCARA_pos[2];
    static float SCARA_C2, SCARA_S2, SCARA_K1, SCARA_K2, SCARA_theta, SCARA_psi;

    SCARA_pos[X_AXIS] = cartesian[X_AXIS] * axis_scaling[X_AXIS] - SCARA_offset_x;  //Translate SCARA to standard X Y
    SCARA_pos[Y_AXIS] = cartesian[Y_AXIS] * axis_scaling[Y_AXIS] - SCARA_offset_y;  // With scaling factor.

    #if (Linkage_1 == Linkage_2)
      SCARA_C2 = ((sq(SCARA_pos[X_AXIS]) + sq(SCARA_pos[Y_AXIS])) / (2 * (float)L1_2)) - 1;
    #else
      SCARA_C2 = (sq(SCARA_pos[X_AXIS]) + sq(SCARA_pos[Y_AXIS]) - (float)L1_2 - (float)L2_2) / 45000;
    #endif

    SCARA_S2 = sqrt(1 - sq(SCARA_C2));

    SCARA_K1 = Linkage_1 + Linkage_2 * SCARA_C2;
    SCARA_K2 = Linkage_2 * SCARA_S2;

    SCARA_theta = (atan2(SCARA_pos[X_AXIS], SCARA_pos[Y_AXIS]) - atan2(SCARA_K1, SCARA_K2)) * -1;
    SCARA_psi = atan2(SCARA_S2, SCARA_C2);

    delta[X_AXIS] = SCARA_theta * SCARA_RAD2DEG;  // Multiply by 180/Pi  -  theta is support arm angle
    delta[Y_AXIS] = (SCARA_theta + SCARA_psi) * SCARA_RAD2DEG;  //       -  equal to sub arm angle (inverted motor)
    delta[Z_AXIS] = cartesian[Z_AXIS];
}

この関数は、デルタジオメトリと、セグメントの端点の(x、y、z)座標を対応するキャリッジの位置に変換するために必要な計算を行います。次に、変換された座標がplan_buffer_lineに渡され、各ステッピングモーターに必要なステップが計算され、実際にこれらのステップが実行されます。

この関数で使用される正確な運動学は、Marlin githubでさらに詳しく説明されています。

注意する必要があるのは、plan_buffer_lineがキャリッジを直線的に移動するため、プリントヘッドが直線ではなく弧を描くことです。したがって、直線移動は多くの小さな弧によって近似されます。


コードが読みづらいスカラとは?コードが実装するステップを説明できますか?
LarsPötter2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.