На картезианском принтере движения действительно просты. Если мы предположим, что принтер имеет 100 шагов / мм по каждой оси, то перемещение по оси на 10 мм - это всего лишь 1000 шагов по этой оси.
Движения, которые не выровнены по одной оси, также просты. Переход от x, y = 0,0 к 10,10 будет 1000 шагов по x и y.
На дельтах даже для простых движений должно двигаться больше одного мотора. И просто вычисление количества шагов на каждой оси, необходимых для достижения цели, вероятно, дает искривленное движение.
Так, каков алгоритм, чтобы вычислить шаги для данного шага для дельта-принтера?
Ответы:
Существует два основных специальных шага к технике, используемой большинством контроллеров 3D-принтеров с открытым исходным кодом:
Обратная кинематика удивительно проста. Виртуальный 90-градусный треугольник состоит из двух известных длин, чтобы найти неизвестную третью длину:
Я думаю, что лучшая ссылка на этот документ с открытым исходным кодом - документ Стив Грейва «Росток кинематики», rev3, доступный для загрузки здесь: https://groups.google.com/d/msg/deltabot/V6ATBdT43eU/jEORG_l3dTEJ. Некоторые соответствующие изображения:
Эти вычисления обратной кинематики выполняются для каждой каретки, чтобы получить целевое положение «пространства каретки», и это выполняется для каждого подсегмента пути.
Результаты этих шагов затем могут быть снова вставлены в стандартные методики интерполяции линейного пути для принтера, в которых он запускает шаги в необходимых соотношениях и с необходимыми скоростями для получения желаемого профиля движения по прямой и ускорения / скорости. (Как ЭТО сделано - другой вопрос.)
Чистый эффект состоит в том, что принтер будет перемещаться через серию небольших «линейных» перемещений каретки (линейное значение означает постоянную * скорость относительно времени), которые в совокупности приближают необходимые изогнутые (квадратичные по времени) движения каретки, необходимые для создания прямолинейное конечное движение.
* ( Постоянная скорость до замедления ускорения применяется, чтобы в любом случае подчиняться динамическим ограничениям. Опять же, это тема другого вопроса.)
Сегментация очень похожа на процесс использования многоугольника для аппроксимации круга. Если грани достаточно малы, полигон является хорошим приближением. Более высокие скорости сегментации дают меньше ошибок следования по пути. Основное концептуальное различие между дугами окружности рисования и путями движения Дельта состоит в том, что так называемая «граненая дуга» с дельта-сегментацией строится в координатах высота-время-время вместо координат X-vs-Y, которые вы использовали бы для рисования круг на экране компьютера.
Эта система используется в значительной степени потому, что поддержка принтеров в стиле Delta изначально была прикреплена к планировщикам движения на основе GRBL, которые были написаны исключительно для прямых линий движения в декартовых принтерах. Это была относительно минимальная модификация существующей кодовой базы по сравнению с реализацией полной квадратичной интерполяции пути.
Методы развивались на протяжении многих лет. И часто используются альтернативные подходы: например, ветвь dc42 RepRapFirmware выполняет точное отслеживание пути без сегментации, пересчитывая подходящее время для следующего шага после каждого шага . Это функционально эквивалентно аппроксимации круга с таким количеством граней полигона, что каждый пиксель на экране получает свой собственный фасет . Так что это точно так, как позволяет разрешение позиционирования двигателей. Недостатком является то, что этот метод без сегментации довольно ресурсоемкий, поэтому он работает только на относительно быстрых контроллерах, а не на старом 8-битном Atmega AVR, который работает сегодня с большинством существующих принтеров для потребителей и любителей.
Другие методы возможны. Академическая литература по параллельному управлению робототехникой - это целый мир математических методов и сложности для создания обобщенных алгоритмов управления, которые работают с широким спектром механизмов роботов. Версия, которую мы используем в 3d-принтерах с открытым исходным кодом, довольно проста и специфична для конкретного приложения.
источник
Я описываю, как это делается в прошивке Marlin.
Первый шаг - разделить линейное движение от (x, y, z) до (x ', y', z ') на множество отдельных сегментов. Для этого вычисляется количество времени, которое потребуется движению с заданной скоростью, а значение delta_segments_per_second используется для вычисления количества используемых сегментов.
Это делается в функции prepare_move_delta в файле Marlin_main.cpp. Конечные точки каждого из этих сегментов затем передаются в функцию calc_delta :
Эта функция заботится о дельта-геометрии и вычислениях, необходимых для преобразования (x, y, z) координат конечных точек сегмента в соответствующие позиции для кареток. Затем переведенные координаты передаются в plan_buffer_line , который вычисляет шаги, необходимые для каждого шагового двигателя, и фактически выполняет эти шаги.
Точная кинематика, используемая в этой функции, более подробно объяснена на GitHub Marlin .
Важно отметить, что plan_buffer_line перемещает каретки линейно, и поэтому печатающая головка описывает дугу, а не прямую линию. Таким образом, движение по прямой линии аппроксимируется многими маленькими дугами.
источник