Bagaimana cara menghitung pergerakan delta?

8

Pada pergerakan printer Cartesius sangat sederhana. Jika kita menganggap printer memiliki 100 langkah / mm pada setiap sumbu, maka gerakan 10mm pada sumbu hanya 1000 langkah pada sumbu itu.

Gerakan yang tidak selaras dengan satu sumbu juga sederhana. Pindah dari x, y = 0,0 ke 10,10 akan menjadi 1000 langkah pada x dan y.

Pada delta bahkan untuk gerakan sederhana, lebih dari satu motor harus bergerak. Dan hanya menghitung jumlah langkah pada setiap sumbu yang dibutuhkan untuk mencapai tujuan mungkin memberikan gerakan melengkung.

Jadi apa algoritma untuk menghitung langkah-langkah untuk langkah yang diberikan untuk printer delta?

Lars Pötter
sumber
Ini tampaknya hanya pertanyaan teori yang mungkin lebih cocok untuk situs yang berhubungan dengan pemrograman dan / atau matematika karena cara firmware bekerja secara internal tidak relevan dengan penggunaan printer 3D. Di sisi lain, pertanyaannya adalah khusus untuk pencetakan 3D dan mungkin relevan bagi seseorang yang mencoba memodifikasi atau mengubah firmware printer mereka.
Tom van der Zanden

Jawaban:

7

Ada dua langkah khusus utama untuk teknik yang digunakan oleh sebagian besar pengontrol printer open-source 3d:

  1. Bagilah setiap segmen kode linier menjadi banyak sub-bagian yang sangat kecil ("Segmentasi")
  2. Gunakan beberapa trigonometri dasar atau teorema pythagoras untuk mengikat posisi ekstruder dengan ketinggian kereta untuk masing-masing dari tiga menara ("Invers Kinematika") untuk menemukan posisi target untuk setiap segmen kecil

Kinematika terbalik ternyata sangat sederhana. Segitiga 90 derajat virtual dibangun dari dua panjang yang diketahui untuk dipecahkan untuk panjang ketiga yang tidak diketahui:

  • Panjang lengan delta tetap adalah sisi miring dari segitiga
  • Jarak horizontal antara sambungan kolom dan sambungan end-effector dihitung dari koordinat XY nozzle dan posisi tetap kolom, untuk menentukan panjang sisi bawah segitiga.
  • Panjang sisi atas segitiga dihitung dari dua sebelumnya melalui teorema pythagoras
  • Panjang sisi atas ditambahkan ke ketinggian nozzle Z untuk mendapatkan ketinggian carriage yang diperlukan

Saya pikir referensi open-source terbaik di sini adalah dokumen Rostock Kinematika Steve Grave, rev3 tersedia untuk diunduh di sini: https://groups.google.com/d/msg/deltabot/V6ATBdT43eU/jEORG_l3dTEJ Beberapa gambar yang relevan: masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Perhitungan kinematika terbalik ini dilakukan untuk setiap carriage untuk mendapatkan posisi target "carriage space", dan ini dilakukan untuk setiap sub-segmen jalur.

Hasil dari langkah-langkah ini kemudian dapat dimasukkan kembali ke dalam teknik interpolasi jalur linier standar untuk printer, di mana ia meluncurkan langkah-langkah dalam rasio yang diperlukan dan pada tingkat yang diperlukan untuk menghasilkan gerakan garis lurus yang diinginkan dan profil percepatan / kecepatan. (Bagaimana hal itu dilakukan adalah pertanyaan yang berbeda.)

Efek bersihnya adalah bahwa printer akan bergerak melalui serangkaian gerakan carriage "linear" kecil (linear yang berarti kecepatan * konstan berkenaan dengan waktu) yang secara kolektif memperkirakan gerakan kereta yang diperlukan melengkung (posisi kuadrat dengan memperhatikan waktu) yang diperlukan untuk menghasilkan langkah-efek akhir garis lurus.

* ( Kecepatan konstan sebelum perlambatan akselerasi diterapkan untuk mematuhi batasan dinamika. Lagi-lagi, itulah subjek pertanyaan yang berbeda.)

Segmentasi sangat mirip dengan proses menggunakan poligon untuk memperkirakan lingkaran. Jika segi cukup kecil, poligon adalah pendekatan yang baik. Tingkat Segmentasi yang lebih tinggi menghasilkan lebih sedikit kesalahan mengikuti jalur. Perbedaan konseptual utama antara busur lingkaran gambar dan jalur gerak Delta adalah bahwa apa yang disebut "busur segi-segi" dengan Delta Segmentation dibangun dalam koordinat tinggi-vs-waktu, bukan koordinat X-vs-Y yang akan Anda gunakan untuk menggambar lingkari layar komputer.

Sistem ini digunakan sebagian besar karena dukungan untuk printer gaya Delta pada awalnya melesat ke perencana gerakan berbasis GRBL yang ditulis khusus untuk jalur gerak garis lurus pada printer Cartesius. Itu adalah modifikasi yang relatif minimal untuk basis kode yang ada dibandingkan dengan menerapkan interpolasi jalur kuadratik penuh.

Teknik telah berkembang selama bertahun-tahun. Dan pendekatan alternatif sering digunakan: misalnya, garpu dc42 dari RepRapFirmware melakukan path-following yang tepat tanpa segmentasi, dengan menghitung ulang waktu yang tepat untuk langkah berikutnya setelah setiap langkah . Ini secara fungsional setara dengan mendekati lingkaran dengan jumlah segi poligon begitu tinggi sehingga setiap piksel pada layar mendapatkan segi sendiri . Jadi persis seakurat resolusi posisi motor memungkinkan. Kelemahannya adalah bahwa teknik bebas segmentasi ini cukup intensif-prosesor, sehingga hanya bekerja pada pengontrol yang relatif cepat, bukan Atmega AVR 8bit yang lebih lama yang menggerakkan sebagian besar printer konsumen / penggemar saat ini.

Teknik lain dimungkinkan. Literatur kontrol robotika akademik paralel adalah seluruh dunia lain dari teknik matematika dan kompleksitas untuk menghasilkan algoritma kontrol umum yang bekerja untuk berbagai mekanisme robot. Versi yang kami gunakan dalam printer 3d open-source cukup sederhana dan spesifik aplikasi dibandingkan.

Ryan Carlyle
sumber
2

Saya menjelaskan bagaimana ini dilakukan dalam firmware Marlin.

Langkah pertama adalah membagi gerakan linier dari (x, y, z) ke (x ', y', z ') menjadi banyak segmen diskrit. Untuk tujuan ini, jumlah waktu langkah akan diambil pada kecepatan yang diberikan dihitung, dan nilai delta_segments_per_second digunakan untuk menghitung jumlah segmen yang digunakan.

Ini dilakukan dalam fungsi prep_move_delta dalam file Marlin_main.cpp. Titik akhir dari masing-masing segmen ini kemudian diteruskan ke fungsi calcul_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];
}

Fungsi ini menangani geometri delta dan perhitungan yang diperlukan untuk mengkonversi (x, y, z) koordinat titik akhir segmen ke posisi yang sesuai untuk gerbong. Koordinat yang diterjemahkan kemudian diteruskan ke plan_buffer_line , yang menghitung langkah-langkah yang diperlukan untuk setiap motor stepper dan benar-benar membuat langkah-langkah ini terjadi.

Kinematika yang tepat digunakan dalam fungsi ini dijelaskan lebih detail di Marlin github .

Yang penting untuk dicatat adalah plan_buffer_line memindahkan carriage secara linier, dan printhead dengan demikian menggambarkan lengkungan dan bukan garis lurus. Dengan demikian, sebuah garis lurus diperkirakan oleh banyak busur kecil.

Tom van der Zanden
sumber
Kode sulit dibaca. Apa itu SCARA? Bisakah Anda menjelaskan langkah-langkah yang diterapkan kode?
Lars Pötter