Làm thế nào là phong trào delta được tính toán?


8

Trên một phong trào máy in Cartesian thực sự đơn giản. Nếu chúng ta giả sử máy in có 100 bước / mm trên mỗi trục, thì di chuyển 10 mm trên trục chỉ là 1000 Bước trên trục đó.

Các chuyển động không được liên kết với một trục cũng đơn giản. Chuyển từ x, y = 0,0 đến 10,10 sẽ là 1000 bước trên x và y.

Trên đồng bằng ngay cả đối với các di chuyển đơn giản, nhiều hơn một động cơ phải di chuyển. Và chỉ cần tính toán số lượng bước trên mỗi trục cần thiết để đến đích có thể sẽ tạo ra một bước di chuyển cong.

Vậy thuật toán để tính các bước cho một bước di chuyển nhất định cho máy in delta là gì?


Đây dường như chỉ là một câu hỏi lý thuyết có thể phù hợp hơn cho một trang web liên quan đến lập trình và / hoặc toán học vì cách phần sụn hoạt động bên trong không liên quan đến việc sử dụng máy in 3D. Mặt khác, câu hỏi dành riêng cho in 3D và có thể liên quan đến ai đó đang cố gắng sửa đổi hoặc điều chỉnh chương trình cơ sở của máy in của họ.
Tom van der Zanden 23/2/2016

Câu trả lời:


7

Có hai bước đặc biệt chính đối với kỹ thuật được sử dụng bởi hầu hết các bộ điều khiển máy in 3d nguồn mở:

  1. Chia mỗi phân đoạn mã tuyến tính thành nhiều phân đoạn rất nhỏ ("Phân đoạn")
  2. Sử dụng một số lượng giác cơ bản hoặc định lý pythagore để buộc vị trí máy đùn với chiều cao vận chuyển cho mỗi ba tháp ("Động học nghịch đảo") để tìm vị trí mục tiêu cho từng phân đoạn nhỏ

Các động học nghịch đảo là đơn giản đáng ngạc nhiên. Một tam giác 90 độ ảo được xây dựng từ hai độ dài đã biết để giải quyết cho độ dài thứ ba chưa biết:

  • Chiều dài cánh tay delta cố định là cạnh huyền của tam giác
  • Khoảng cách ngang giữa các khớp cột và khớp đầu cuối được tính từ tọa độ XY của vòi phun và vị trí cố định của cột, để xác định chiều dài của cạnh dưới của tam giác
  • Độ dài của cạnh trên của tam giác được tính từ hai trước đó thông qua định lý pythagore
  • Chiều dài của mặt trên được thêm vào chiều cao Z của vòi phun để có được chiều cao vận chuyển cần thiết

Tôi nghĩ rằng tài liệu tham khảo mã nguồn mở tốt nhất ở đây là tài liệu Rostock Kinographics của Steve Grave, rev3 có sẵn để tải xuống tại đây: https://groups.google.com/d/msg/deltabot/V6ATBdT43eU/jEORG_l3dTEJ Một số hình ảnh liên quan: nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Các tính toán động học nghịch đảo này được thực hiện cho từng cỗ xe để có được vị trí mục tiêu "không gian vận chuyển" và điều này được thực hiện cho mọi phân đoạn đường dẫn.

Kết quả từ các bước này sau đó có thể được đưa trở lại vào các kỹ thuật nội suy đường thẳng tuyến tính tiêu chuẩn cho máy in, trong đó nó thực hiện các bước theo tỷ lệ cần thiết và ở tốc độ cần thiết để tạo ra cấu hình chuyển động và gia tốc / vận tốc đường thẳng mong muốn. (Làm thế nào THAT được thực hiện là một câu hỏi khác nhau.)

Hiệu quả thực tế là máy in sẽ di chuyển qua một loạt các chuyển động vận chuyển "tuyến tính" nhỏ (tốc độ không đổi có nghĩa là tuyến tính * tốc độ theo thời gian), gần đúng với các chuyển động cong cần thiết (vị trí bậc hai theo thời gian) cần thiết để tạo ra một chuyển động vận chuyển cần thiết để tạo ra một đường thẳng kết thúc di chuyển.

* ( Tốc độ không đổi trước khi giảm tốc độ được áp dụng để tuân theo các ràng buộc động lực, dù sao đi nữa. Một lần nữa, đó là chủ đề của một câu hỏi khác.)

Phân đoạn rất giống với quá trình sử dụng đa giác để xấp xỉ một vòng tròn. Nếu các khía cạnh đủ nhỏ, đa giác là một xấp xỉ tốt. Tỷ lệ phân đoạn cao hơn tạo ra ít lỗi theo đường dẫn hơn. Sự khác biệt về khái niệm chính giữa vẽ vòng cung vòng tròn và đường chuyển động Delta là cái gọi là "cung tròn mặt" với Phân đoạn Delta được xây dựng theo tọa độ chiều cao so với thời gian thay vì tọa độ X-vs-Y mà bạn sử dụng để vẽ vòng tròn trên màn hình máy tính.

Hệ thống này được sử dụng phần lớn vì hỗ trợ cho máy in kiểu Delta ban đầu được bắt vít vào các nhà hoạch định chuyển động dựa trên GRBL được viết riêng cho các đường chuyển động thẳng trong máy in Cartesian. Đó là một sửa đổi tương đối tối thiểu đối với cơ sở mã hiện tại so với việc thực hiện nội suy đường dẫn bậc hai đầy đủ.

Kỹ thuật đã phát triển qua nhiều năm. Và các cách tiếp cận thay thế thường được sử dụng: ví dụ: ngã ba dc42 của RepRapFirmware thực hiện theo đường dẫn chính xác mà không cần phân đoạn, bằng cách tính lại thời gian thích hợp cho bước tiếp theo sau mỗi bước . Điều này tương đương về mặt chức năng với xấp xỉ một vòng tròn có số mặt đa giác cao đến mức mọi pixel trên màn hình đều có khía cạnh riêng . Vì vậy, nó chính xác là chính xác như độ phân giải định vị của động cơ cho phép. Nhược điểm là kỹ thuật không phân đoạn này khá chuyên sâu về bộ xử lý, do đó, nó chỉ hoạt động trên các bộ điều khiển tương đối nhanh, chứ không phải Atmega AVR 8 bit cũ, cung cấp năng lượng cho hầu hết các máy in tiêu dùng / sở thích hiện nay.

Các kỹ thuật khác là có thể. Tài liệu điều khiển robot song song hàn lâm là cả một thế giới khác về kỹ thuật toán học và độ phức tạp để tạo ra các thuật toán điều khiển tổng quát hoạt động cho một loạt các cơ chế robot. Phiên bản chúng tôi sử dụng trong máy in 3d mã nguồn mở khá đơn giản và dành riêng cho ứng dụng.


2

Tôi đang mô tả làm thế nào điều này được thực hiện trong phần sụn Marlin.

Bước đầu tiên là chia một chuyển động tuyến tính từ (x, y, z) thành (x ', y', z ') thành nhiều phân đoạn riêng biệt. Cuối cùng, lượng thời gian di chuyển sẽ được tính ở một tốc độ nhất định được tính và giá trị delta_segments_per_second được sử dụng để tính số lượng phân đoạn được sử dụng.

Điều này được thực hiện trong hàm Chuẩn bị_move_delta trong tệp Marlin_main.cpp. Các điểm cuối của mỗi phân đoạn này sau đó được chuyển đến hàm notify_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];
}

Hàm này đảm nhiệm hình học delta và các tính toán cần thiết để chuyển đổi tọa độ (x, y, z) của các điểm cuối phân đoạn thành các vị trí tương ứng cho các toa xe. Các tọa độ được dịch sau đó được chuyển đến plan_buffer_line , tính toán các bước cần thiết cho mỗi động cơ bước và thực sự làm cho các bước này xảy ra.

Các động học chính xác được sử dụng trong chức năng này được giải thích chi tiết hơn nhiều tại github Marlin .

Điều quan trọng cần lưu ý là plan_buffer_line di chuyển các toa xe một cách tuyến tính, và đầu in do đó mô tả một vòng cung chứ không phải một đường thẳng. Do đó, một đường thẳng di chuyển được xấp xỉ bởi nhiều cung nhỏ.


Mã này khó đọc. SCARA là gì? Bạn có thể mô tả các bước mà mã thực hiện?
Lars Pötter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.