Как рассчитываются дельта-движения?

8

На картезианском принтере движения действительно просты. Если мы предположим, что принтер имеет 100 шагов / мм по каждой оси, то перемещение по оси на 10 мм - это всего лишь 1000 шагов по этой оси.

Движения, которые не выровнены по одной оси, также просты. Переход от x, y = 0,0 к 10,10 будет 1000 шагов по x и y.

На дельтах даже для простых движений должно двигаться больше одного мотора. И просто вычисление количества шагов на каждой оси, необходимых для достижения цели, вероятно, дает искривленное движение.

Так, каков алгоритм, чтобы вычислить шаги для данного шага для дельта-принтера?

Ларс Петтер
источник
Похоже, что это исключительно теоретический вопрос, который может быть более уместным для сайта, который занимается программированием и / или математикой, поскольку внутренняя работа встроенного программного обеспечения не имеет отношения к использованию 3D-принтера. С другой стороны, этот вопрос относится к 3D-печати и может иметь отношение к тому, кто пытается изменить или настроить прошивку своего принтера.
Том ван дер Занден

Ответы:

7

Существует два основных специальных шага к технике, используемой большинством контроллеров 3D-принтеров с открытым исходным кодом:

  1. Разделите каждый линейный сегмент gcode на множество очень маленьких подсегментов («Сегментация»)
  2. Используйте некоторую базовую тригонометрию или теорему Пифагора, чтобы привязать положение экструдера к высоте каретки для каждой из трех башен («Обратная кинематика»), чтобы найти целевое положение для каждого небольшого сегмента.

Обратная кинематика удивительно проста. Виртуальный 90-градусный треугольник состоит из двух известных длин, чтобы найти неизвестную третью длину:

  • Фиксированная длина дельта-руки - это гипотенуза треугольника
  • Горизонтальное расстояние между соединениями колонны и концевыми эффекторными соединениями рассчитывается из координат XY сопла и фиксированного положения колонны, чтобы определить длину нижней стороны треугольника.
  • Длина верхней стороны треугольника вычисляется из двух предыдущих по теореме Пифагора
  • Длина верхней стороны прибавляется к высоте сопла Z, чтобы получить необходимую высоту каретки

Я думаю, что лучшая ссылка на этот документ с открытым исходным кодом - документ Стив Грейва «Росток кинематики», rev3, доступный для загрузки здесь: https://groups.google.com/d/msg/deltabot/V6ATBdT43eU/jEORG_l3dTEJ. Некоторые соответствующие изображения: введите описание изображения здесь введите описание изображения здесь

Эти вычисления обратной кинематики выполняются для каждой каретки, чтобы получить целевое положение «пространства каретки», и это выполняется для каждого подсегмента пути.

Результаты этих шагов затем могут быть снова вставлены в стандартные методики интерполяции линейного пути для принтера, в которых он запускает шаги в необходимых соотношениях и с необходимыми скоростями для получения желаемого профиля движения по прямой и ускорения / скорости. (Как ЭТО сделано - другой вопрос.)

Чистый эффект состоит в том, что принтер будет перемещаться через серию небольших «линейных» перемещений каретки (линейное значение означает постоянную * скорость относительно времени), которые в совокупности приближают необходимые изогнутые (квадратичные по времени) движения каретки, необходимые для создания прямолинейное конечное движение.

* ( Постоянная скорость до замедления ускорения применяется, чтобы в любом случае подчиняться динамическим ограничениям. Опять же, это тема другого вопроса.)

Сегментация очень похожа на процесс использования многоугольника для аппроксимации круга. Если грани достаточно малы, полигон является хорошим приближением. Более высокие скорости сегментации дают меньше ошибок следования по пути. Основное концептуальное различие между дугами окружности рисования и путями движения Дельта состоит в том, что так называемая «граненая дуга» с дельта-сегментацией строится в координатах высота-время-время вместо координат X-vs-Y, которые вы использовали бы для рисования круг на экране компьютера.

Эта система используется в значительной степени потому, что поддержка принтеров в стиле Delta изначально была прикреплена к планировщикам движения на основе GRBL, которые были написаны исключительно для прямых линий движения в декартовых принтерах. Это была относительно минимальная модификация существующей кодовой базы по сравнению с реализацией полной квадратичной интерполяции пути.

Методы развивались на протяжении многих лет. И часто используются альтернативные подходы: например, ветвь dc42 RepRapFirmware выполняет точное отслеживание пути без сегментации, пересчитывая подходящее время для следующего шага после каждого шага . Это функционально эквивалентно аппроксимации круга с таким количеством граней полигона, что каждый пиксель на экране получает свой собственный фасет . Так что это точно так, как позволяет разрешение позиционирования двигателей. Недостатком является то, что этот метод без сегментации довольно ресурсоемкий, поэтому он работает только на относительно быстрых контроллерах, а не на старом 8-битном Atmega AVR, который работает сегодня с большинством существующих принтеров для потребителей и любителей.

Другие методы возможны. Академическая литература по параллельному управлению робототехникой - это целый мир математических методов и сложности для создания обобщенных алгоритмов управления, которые работают с широким спектром механизмов роботов. Версия, которую мы используем в 3d-принтерах с открытым исходным кодом, довольно проста и специфична для конкретного приложения.

Райан Карлайл
источник
2

Я описываю, как это делается в прошивке Marlin.

Первый шаг - разделить линейное движение от (x, y, z) до (x ', y', z ') на множество отдельных сегментов. Для этого вычисляется количество времени, которое потребуется движению с заданной скоростью, а значение delta_segments_per_second используется для вычисления количества используемых сегментов.

Это делается в функции prepare_move_delta в файле Marlin_main.cpp. Конечные точки каждого из этих сегментов затем передаются в функцию calc_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 , который вычисляет шаги, необходимые для каждого шагового двигателя, и фактически выполняет эти шаги.

Точная кинематика, используемая в этой функции, более подробно объяснена на GitHub Marlin .

Важно отметить, что plan_buffer_line перемещает каретки линейно, и поэтому печатающая головка описывает дугу, а не прямую линию. Таким образом, движение по прямой линии аппроксимируется многими маленькими дугами.

Том ван дер Занден
источник
Код трудно читать. Что такое СКАРА? Не могли бы вы описать шаги, которые реализует код?
Ларс Петтер