Инверсная кинематика: простой и быстрый алгоритм. Инверсная кинематика (только для Pro версий)

Инверсная кинематика: простой и быстрый алгоритм. Инверсная кинематика (только для Pro версий)

21.05.2019

Градиентный спуск

Простейший способ разобраться в работе градиентного спуска - представить холмистый рельеф. Мы находимся в случайном месте и хотим достигнуть самой низкой точки. Назовём её минимумом рельефа. На каждом шаге градиентный спуск говорит нам двигаться в направлении, снижающем нашу высоту. Если геометрия рельефа относительно проста , то такой подход приведёт нас к самому низу долины.

На графике ниже показан стандартный случай, в котором градиентный спуск будет успешным. В этом простейшем примере у нас есть функция. Она получает один параметр (ось X) и возвращает значение ошибки (ось Y). Мы начинаем со случайной точки на оси X (синяя и зелёная точки). Градиентный спуск должен заставить нас двигаться в направлении минимума (синяя и зелёная стрелки).

Если мы будем смотреть на функцию в целом, то направление движения очевидно. К сожалению, градиентный спуск не имеет заранее информации о том, где находится минимум. Лучшей догадкой, которую может допустить алгоритм, станет движение по направлению к склону, также называемом градиентом функции. Если вы находитесь на горе, отпустите мяч, и он сам достигнет долины. На графике ниже показан градиент функции ошибок в двух разных точках.

Насколько хорошо выглядит рельеф?

Чтобы градиентный спуск был эффективным, минимизируемая нами функция должна удовлетворять определённым требованиям. Если рельеф функции относительно плавный, то вероятность успешного применения градиентного спуска выше. Если у функции есть разрывы или множество максимумов, то это особенно сложно, потому что для достижения дна долины потребуется гораздо более долгое путешествие.

Вот как может выглядеть рельеф для робота-манипулятора с двумя соединениями (управляемыми и ):


Оценка градиента

Если вы изучали математический анализ, то, наверно, знаете, что градиент функции непосредственно связан с её производной . Однако для вычисления производной функции необходимо, чтобы она удовлетворяла определённым математическим свойствам, и выполнение этого требования для любой проблемы в общем случае гарантировать невозможно. Более того, для аналитического взятия производной нужно, чтобы функция ошибок была представлена в аналитическом виде. И у нас не всегда есть аналитический вид функции, которую нужно минимизировать.

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

В чём разница между градиентом и производной?

Понятия градиента и произвольной тесно связаны.

Градиент или косая производная функции - это вектор, указывающий в направлении наискорейшего подъёма. В случае одномерных функций (как на наших графиках) градиент равен или , если функция идёт вверх, или , если функция идёт вниз. Если функция определена через две переменные (например, робот-манипулятор с двумя соединениями), то градиент является «стрелкой» (единичным вектором ) двух элементов, направленным в сторону наискорейшего подъёма.

Производная функции, в отличие от градиента - это просто число, определяющее скорость подъёма функции при движении в направлении градиента.

В этой статье мы не будем стремиться вычислить настоящий градиент функции. Вместо этого мы создадим оценку. Наш приблизительный градиент - это вектор, который, как мы надеемся, указывает в направлении наискорейшего подъёма. Как мы увидим, это необязательно будет единичный вектор.


Насколько важно создание выборки?

Оно очень важно. Выборка близлежащих точек требует оценки функции на определённом расстоянии от текущего положения. Это расстояние критически важно.

Посмотрите на график:

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

Снижение расстояния выборки позволяет уменьшить эту проблему, но избавиться от неё никогда не удастся. Более того, меньшее расстояние выборки приводит ко всё более медленному приближению к решению.

Эту проблему можно решить с помощью более сложных вариаций градиентных спусков.


Что если у функции есть несколько локальных минимумов?

В общем случае такой «жадный» подход не даёт нам никаких гарантий, что мы на самом деле достигнем самой низкой точки долины. Если есть другие долины, то мы можем застрять в одной из них и не сможем достичь нашей истинной цели.

С учётом изложенного выше наивного описания градиентного спуска мы можем заметить, что именно это произойдёт с функцией на графике выше. У этой функции есть три локальных минимума , создающих три отдельные долины. Если мы инициализируем градиентный спуск в точке из зелёной области, то он закончится на дне зелёной долины. То же самое относится к красной и синей областям.

Все эти проблемы тоже можно решить с помощью усложнённых вариаций градиентного спуска.

Математика

Теперь, когда у нас есть общее понимание графической работы градиентного спуска, давайте посмотрим, как перевести его на язык математики. Первый этап - вычисление градиента нашей функции ошибок в конкретной точке . Нам требуется найти направление, в котором растёт функция. Градиент функции тесно связан с её производной. Поэтому неплохо бы начать создание нашей оценки с изучения того, как вычисляется производная.

С математической точки зрения производная функции называется . Её значение в точке равно , и оно показывает, насколько быстро растёт функция. Согласно ей:

Идея заключается в том, чтобы использовать оценку для вычисления градиента, обозначаемого . Математически определяется как:

На графике ниже показано, что это значит:

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

Подведём итог. Для вычисления истинной производной функции необходимо использовать предел. Наш градиент является приблизительной оценкой производной, созданной с помощью достаточно небольшого расстояния выборки:

В следующем разделе мы увидим, чем эти два понятия отличаются при нескольких переменных.

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

Константу часто называют learning rate . Она определяет, как быстро мы будем двигаться по градиенту. Чем больше значения, тем быстрее найдётся решение, но тем больше вероятность пропустить его.

lim?

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

Рассмотрим наш условный пример. Чем меньше расстояние выборки , тем лучше мы можем оценить истинный градиент функции. Однако мы не можем задать , потому что деление на ноль не разрешено. Пределы позволяют нам обойти эту проблему. Мы не можем делить на ноль, но с помощью пределов мы можем задать число, условно близкое к нулю, но на самом деле ему не равное.

Несколько переменных

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

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

Мы можем ввести понятие частных производных , которые, в сущности, являются «традиционными» производными, вычисляемыми для каждой из переменных:

Они представляют собой три различных скалярных числа, каждое из которых показывает, как растёт функция в определённом направлении (или по оси). Для вычисления общего градиента мы аппроксимируем каждую частную производную соответствующим градиентом с помощью достаточно малых расстояний выборки , и :

Для нашего градиентного спуска мы будем в качестве градиента использовать вектор, содержащий в себе все три результата:

Это не единичный вектор!

Косая производная функции - это единичный вектор, показывающий направление наискорейшего подъёма. Направления - это векторы единичной длины. Однако можно легко заметить, что вычисленный градиент необязательно является единичным вектором.

Хотя это и может выглядеть как насилие над математикой (а возможно, так оно и есть!), но при этом оно не обязательно станет проблемой для нашего алгоритма. Нам нужен вектор, указывающий в направлении наискорейшего подъёма. Использование приблизительных значений частных производных в качестве элементов такого вектора удовлетворяет нашим ограничениям. Если нам нужно, чтобы это был единичный вектор, то можно просто нормализовать его, поделив на его длину.

Использование единичного вектора даёт нам преимущество определения максимальной скорости, с которой мы движемся по поверхности. Эта скорость является learning rate . Использование ненормализованного вектора означает, что мы будем быстрее или медленнее, в зависимости от наклона . Это не хорошо и не плохо, это просто ещё один подход к решению нашей проблемы.

Часть 5. Инверсная кинематика для робота-манипулятора

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

Введение

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

Для этого мы сначала вычислим градиент функции при текущем . Градиент - это вектор, показывающий направление наискорейшего подъёма. Проще говоря, это стрелка, указывающая нам направление, в котором растёт функция. Каждый элемент градиента - это приблизительное значение частной производной .

Например, если у робота-манипулятора есть три сочленения, то у нас будет функция , получающая три параметра: , и . Тогда наш градиент задаётся как:

А , и - достаточно малые значения.

Мы получили приблизительный градиент . Если мы хотим минимизировать , то необходимо двигаться в противоположном направлении. Это означает обновление , и следующим образом:

Где - это learning rate , положительный параметр, управляющий скоростью удаления от поднимающегося градиента.

Реализация

Теперь у нас есть все знания, необходимые для реализации простого градиентного спуска на C#. Давайте начнём с функции, вычисляющей приблизительное значение частного градиента i -того сочленения. Как говорилось выше, для этого нам нужно создать выборку функции (которая является нашей функцией ошибок DistanceFromTarget , описанной во «Введении в градиентный спуск») в двух точках:

Public float PartialGradient (Vector3 target, float angles, int i) { // Сохраняет угол, // который будет восстановлен позже float angle = angles[i]; // Градиент: / h float f_x = DistanceFromTarget(target, angles); angles[i] += SamplingDistance; float f_x_plus_d = DistanceFromTarget(target, angles); float gradient = (f_x_plus_d - f_x) / SamplingDistance; // Восстановление angles[i] = angle; return gradient; }
При вызове этой функции она возвращает одно число, определяющее, как изменяется расстояние от цели как функция от поворота сочленения.

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

Public void InverseKinematics (Vector3 target, float angles) { for (int i = 0; i < Joints.Length; i ++) { // Градиентный спуск // Обновление: Solution -= LearningRate * Gradient float gradient = PartialGradient(target, angles, i); angles[i] -= LearningRate * gradient; } }
Многократный вызов InverseKinematics перемещает робот-манипулятор ближе к целевой точке.

Преждевременное завершение

Одна из основных проблем инверсной кинематики, реализованной этим наивным подходом - малая вероятность окончательного схождения градиента. В зависимости от выбранных для LearningRate и SamplingDistance значений очень возможно, что манипулятор будет «качаться» рядом с истинным решением.

Так происходит потому, что мы обновляем углы слишком часто, и это приводит к «перелёту» через истинную точку. Правильным решением этой проблемы будет использование адаптивного learning rate, изменяющегося в зависимости от близости к решению. Более дешёвая альтернатива - останавливать алгоритм оптимизации, если мы ближе, чем определённое пороговое значение:

< DistanceThreshold) return; for (int i = Joints.Length -1; i >= 0; i --) { // Градиентный спуск // Обновление: Solution -= LearningRate * Gradient float gradient = PartialGradient(target, angles, i); angles[i] -= LearningRate * gradient; // Преждевременное завершение if (DistanceFromTarget(target, angles) < DistanceThreshold) return; } }
Если мы будем повторять эту проверку после каждого поворота сочленения, мы выполним минимальное количество требуемых движений.

Чтобы ещё больше оптимизировать движение манипулятора, мы можем применить градиентный спуск в обратном порядке. Если мы начнём с конечного звена, а не с основания, то это позволит нам совершать более короткие движения. В целом, эти небольшие хитрости позволяют приблизиться к более естественному решению.

Ограничения

Одна из характеристик реальных сочленений заключается в том, что у них обычно есть ограниченный диапазон возможных углов поворота. Не все сочленения могут вращаться на 360 градусов вокруг своей оси. Пока мы не наложили никаких ограничений на наш алгоритм оптимизации. Это значит, что мы, скорее всего, получим вот такое поведение:

Решение достаточно очевидно. Мы добавим в класс RobotJoint минимальные и максимальные углы:

Using UnityEngine; public class RobotJoint: MonoBehaviour { public Vector3 Axis; public Vector3 StartOffset; public float MinAngle; public float MaxAngle; void Awake () { StartOffset = transform.localPosition; } }
затем нужно убедиться, что мы ограничиваем углы нужным диапазоном:

Public void InverseKinematics (Vector3 target, float angles) { if (DistanceFromTarget(target, angles) < DistanceThreshold) return; for (int i = Joints.Length -1; i >= 0; i --) { // Градиентный спуск // Обновление: Solution -= LearningRate * Gradient float gradient = PartialGradient(target, angles, i); angles[i] -= LearningRate * gradient; // Ограничение angles[i] = Mathf.Clamp(angles[i], Joints[i].MinAngle, Joints[i].MaxAngle); // Преждевременное завершение if (DistanceFromTarget(target, angles) < DistanceThreshold) return; } }

Проблемы

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

Посмотрите на анимацию:


Рука манипулятора ушла слишком далеко, и при возврате в исходное положение она перевернулась. Наилучшим способом избежать этого будет использование функции комфорта . Если мы достигли требуемой точки, то нужно попытаться изменить ориентацию манипулятора на более удобное, естественное положение. Следует заметить, что это не всегда бывает возможно. Изменение ориентации манипулятора может заставить алгоритм увеличить расстояние до цели, что может противоречить его параметрам.

Часть 6. Инверсная кинематика щупалец

Введение

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

У некоторых существ есть части тела, имеющие несколько степеней свободы. Примером могут служить хобот слона и щупальце осьминога. Моделирование таких частей тела - особо сложная задача, потому что приведённые выше традиционные техники не смогут создать реалистичных результатов.

Мы начнём с примера из предыдущей части и постепенно придём к поведению, которое для наших целей окажется достаточно реалистичным.

Риггинг щупальца

В созданном нами роботе-манипуляторе каждая часть двигалась независимо от других. Щупальца, в отличие от робота, могут изгибаться. Это необходимая особенность, которую нельзя игнорировать, если мы хотим нацелены на реализм. Наше щупальце должно уметь изгибаться.

Компонент Unity, позволяющий реализовать эту функцию, называется Skinned Mesh Renderer :


К сожалению, Unity не предоставляет возможности создания рендерера сеток со скиннингом в редакторе. Необходим редактор 3D-моделей, например, Blender . На изображении ниже показана модель щупальца, которое мы будем использовать в этой части. Внутри видно несколько костей , соединённых друг с другом. Это объекты, позволяющие нам изгибать модель.


В этом туториале мы не будем изучать добавление костей к моделям, также называемое риггингом . Хорошее введение в предмет можно прочитать в статье Blender 3D: Noob to Pro/Bones .

Кости и сочленения

Следующий этап реализации инверсной кинематики щупальца - прикрепление к каждой кости скрипта RobotJoint . Благодаря этому мы даём нашему алгоритму инверсной кинематики возможность сгибать щупальце.

У обычного осьминога каждое сочленение может свободно поворачиваться по всем трём осям. К сожалению, код написанный для робота-манипулятора, позволяет вращать сочленения только по одной оси. Если попытаться изменить это, то мы добавим нашему коду новый уровень сложности. Вместо этого мы можем циклично менять ось сочленений, чтобы сочленение 0 поворачивалось по X, сочленение 1 - по Y, сочленение 2 - по Z, и так далее. Это может привести к неестественному поведению, но такая проблема у вас может никогда не возникнуть, если кости достаточно малы.

В скачиваемом проекте Unity, продаваемом с этим туториалом, скрипт SetRobotJointWeights автоматически инициализирует параметры всех сочленений щупальца. Вы можете делать это вручную, чтобы иметь более точный контроль над движением каждой кости.

Функция комфорта

На представленной ниже анимации показано два щупальца. Щупальце слева тянется к красной сфере с помощью алгоритма из «Инверсной кинематики для робота-манипулятора». Правое щупальце добавляет совершенно новый уровень реализма, закручиваясь спирально, в более органическом стиле. Этого примера должно быть достаточно, чтобы понять, почему для щупалец нужен свой собственный туториал.


Для обоих щупалец используется градиентный спуск. Разница заключается в функции ошибок , которую они стремятся минимизировать. Механическое щупальце слева просто стремится достать до мяча, её не волнуют все остальные параметры. Как только конечное звено касается мяча, приближение считается завершённым и щупальце просто перестаёт двигаться.

Щупальце справа минимизирует другую функцию. Функция DistanceFromTarget , использованная для манипулятора, заменена на новую, более сложную функцию. Мы можем заставить эту новую функцию ErrorFunction учитывать и другие параметры, которые нам важны. Показанные в этом туториале щупальца минимизируют три различные функции:

  • Расстояние до цели : уже готова
  • Поворот конечного звена : конец щупальца пытается соответствовать повороту объекта, к которому мы хотим приблизиться. Такое поведение можно заметить в анимации выше, когда правое щупальце спирально загибается вокруг сферы. Поскольку каждое сочленение имеет ограниченный диапазон движений, это создаёт пульсации, распространяющиеся вниз по кинетической цепи костей. Мы можем заставить щупальце соответствовать повороту объекта, к которому она стремится. Для этого мы можем измерить угол между поворотом конечного звена и поворотом цели. В Unity есть для этого удобная функция - Quaternion.Angle:

    Float rotationPenalty = Mathf.Abs (Quaternion.Angle(EndEffector.rotation, Destination.rotation) / 180f);
    Такое приведение к соответствию с локальным поворотом не всегда подходит. В зависимости от ситуации можно выравнивать щупальце иначе.

  • Кручение : держать части тела неестественным образом некомфортно. Этот параметр «штрафует» криволинейные движения, заставляя инверсную кинематику выполнять более линейный, простой поворот. Для вычисления штрафа за кручение нам нужно сначала определить, что же такое «кручение» в данном контексте. Проще всего определить его как среднее углов для всех сочленений. Такой штраф стремится к тому, чтобы щупальце было расслабленным, и «наказывает» решения, требующие большого количества изгибов.

    Float torsionPenalty = 0; for (int i = 0; i < solution.Length; i++) torsionPenalty += Mathf.Abs(solution[i]); torsionPenalty /= solution.Length;

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

Используем разные единицы измерения?

Эти три параметра, скорее всего, будут выражаться в разных единицах измерения. Расстояние до цели может указываться в метрах, а поворот конечного звена - в градусах. Нужно добавить им веса согласно их важности, чтобы разница в десять градусов не считалась такой же плохой, как расстояние в десять метров до цели.

В идеале их нужно нормализовать между и . После этого можно будет использовать коэффициенты для указания их относительной важности:

Public float ErrorFunction (Vector3 target, float angles) { return NormalisedDistance(target, angles) * DistanceWeight + NormalisedRotation(target, angles) * RotationWeight + NormalisedTorsion (target, angles) * TorsionWeight ; }
Такой подход ещё и обеспечивает более точный контроль за поведением щупальца. В любой момент можно изменить коэффициенты, чтобы менять способ движения в зависимости от ситуации. Например, можно увеличить TorsionWeight , чтобы распутывать запутавшиеся щупальца.


У нас нет аналитического определения!

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

На данный момент у нас есть функция, которую, возможно, не получится описать аналитически. Если бы мы выбрали традиционный, аналитический подход к решению инверсной кинематики, то нам не удалось бы добавить такие нюансы поведения щупальца. Использование градиентного спуска означает, что теперь мы можем минимизировать (почти!) любую произвольную функцию, есть у неё уравнение или нет.

Усовершенствования

Практически нет никаких ограничений для внесения улучшений в нашу модель. Повысить реализм щупалец определённо поможет функция замедления. Щупальца должны двигаться медленнее, когда приближаются к цели.

Кроме того, щупальца не должны взаимно пересекаться. Чтобы избежать этого, следует использовать коллайдеры для каждого сочленения. Однако это может привести к причудливому поведению. В нашем коде коллизии игнорируются и он может приблизиться к решению, в котором возникают самопересечения. Решение заключается в изменении функции пригодности, чтобы решения с самопересечением имели высокие штрафы.

[Готовый проект Unity со скриптами и 3D-моделями можно приобрести за 10 долларов на странице Patreon автора оригинала статьи.]


Перевод осуществил Pavel A. Chuvanov, участник проекта Almighty.

Кинематика - есть процесс вычисление позиции в пространстве для конца взаимосвязанной структуры при заданных углах поворота всех шарнирных точек (Joints). Это легко осуществляется, если есть только одно решение. Инверсная кинематика делает обратное. Для данной конечной точки вычисляются необходимые углы поворота шарниров таким образом, чтобы удалось достичь этой конечной точки. При этом могут возникнуть трудности, если есть много или бесконечно много решений.

Данный процесс чрезвычайно полезен в робототехнике. Например, вы захотели, чтобы рука робота потянулась и взяла объект. Если программа знает местоположение объекта относительно плечевого сустава, то ей достаточно расчитать углы поворота шарниров чтобы достичь объекта. Также инверсная кинематика полезна в 3D играх. Возьмем для примера дракона с очень длинной шеей. Дракон должен реалистично изогнуть шею и слопать игрока стоящего на полу. Или игрок захотел поднять с пола некий объект или нажать на кнопку. Пользователь увидит на экране как игрок потянется и коснется объекта, вместо того чтобы просто махнуть рукой где-то вблизи объекта (как например в Alone In The Dark).

Она используется в основном в тех ситуациях, когда необходимо точное позиционирование гибких сочленений одного объекта относительно других объектов окружающей среды. Алгоритм инверсной кинематики противоположен алгоритму прямой кинематики .

Описание

Инверсная кинематика, как и прямая , применяются к моделям каких-либо персонажей или объектов, которые созданы с использованием скелетной анимации . Суть скелетной анимации состоит в том, что объект состоит из набора твёрдых сегментов (компонентов), соединённых сочленениями (англ. joint ). При этом сегменты могут объединяться в кинематические пары , которые в свою очередь объединяются в кинематические цепи . Данные сегменты образуют иерархические цепочки, которые имеют «верхний» и «нижний» уровень. Сегменты (компоненты) верхних уровней называются компонентами-предками (или родительскими сегментами), а компоненты нижних - компонентами-потомками (или дочерними сегментами). Например, если рассмотреть руку человека, то плечевой сустав будет самым верхним уровнем, а кончик пальца - самым нижним, т. е. компонентом-потомком к плечевому суставу. Локтевой сустав находится внутри цепочки, он будет иметь как родительские (плечо), так и дочерние (запястье, пальцы) сегменты.

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

В инверсной кинематике дочерний сегмент (компонент-потомок), который вызывает изменение положения и ориентацию других объектов и расположен в середине отдельной иерархической цепочке сегментов, называется эффектором (англ. effector ) . Если эффектор является конечным объектом данной иерархической цепочки, то он называется конечным эффектором (англ. end effector ). Именно через эффектор осуществляется манипулирование всей иерархической цепочкой. Изменение положения и/или ориентации конечного эффектора приводит к изменению положения и/или ориентации всех сегментов иерархической цепочки по законам инверсной кинематики. Изменение положения и/или ориентации простого (не конечного) эффектора приводит к тому, что положение объектов, стоящих по иерархии ниже его, меняется по законам прямой кинематики, а объектов с более высокой иерархией - по законам инверсной кинематики.

Ключом к успешной реализации инверсной кинематики является анимация в пределах ограничений (англ. constraints ): конечности модели персонажа должны вести себя в разумных антропоморфических пределах. Точно такая же ситуация и с робототехническими устройствами, которые имеют физические ограничения, такие как среда, в которой они работают, ограничения движения их суставов и ограниченные физические нагрузки и скорости, с которыми они в состоянии работать.

Использование и примеры

Инверсная кинематика является инструментом, который часто используют художники трёхмерной графики . Для художника проще выразить желаемое пространственное действие, чем непосредственно манипулировать углами сочленений. Например, инверсная кинематика позволяет художнику двигать рукой модели трёхмерного гуманоидного персонажа к желаемой позиции и ориентации. При этом сам алгоритм, а не художник, выбирает правильные углы запястья, локтя и плечевого сустава.

Например, если человек хочет схватить дверную ручку рукой, то его мозг должен сделать необходимые вычисления для правильного позиционирования руки и туловища человека. Основная цель состоит в том, чтобы двигать рукой, но нужно задействовать много сложных суставов с несколькими сочленениями, чтобы добраться рукой к желаемому объекту. Подобным образом происходит процесс в технологических приложениях - чтобы достичь желаемой цели, должны быть выполнены математические вычисления инверсной кинематики для расположения конечностей правильным образом. Примером, когда вычисления инверсной кинематики часто необходимы, является робототехника. Например, оператор робота хочет поместить какой-либо объект с помощью манипулятора , однако, естественно, он не хочет управлять каждым сочленением манипулятора отдельно.

Другими приложениями, где используется инверсная кинематика, являются приложения компьютерной графики и анимации . Например, аниматоры хотят управлять моделью гуманоидного персонажа, анимация которого генерируется компьютером, однако очень трудно анимировать индивидуальные сочленения. Решение состоит в том, чтобы смоделировать виртуальные сочленения «марионеточной куклы» и позволить аниматору двигать руками, ногами и туловищем куклы, а компьютер с использованием инверсной кинематики автоматически сгенерирует необходимые позиции конечностей для достижения результата.

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

К другим приложениям, которые используют инверсную кинематику, относятся интерактивная манипуляция, управление анимацией и избежание столкновений .

Напишите отзыв о статье "Инверсная кинематика"

Примечания

Внешние ссылки

Англоязычные источники
  • Hugo Elias. (англ.) . freespace.virgin.net. Проверено 5 июня 2009. .
  • Hugo Elias. (англ.) . freespace.virgin.net. Проверено 5 июня 2009. .
  • (англ.) . www.learnaboutrobots.com. Проверено 5 июня 2009. .
  • (англ.) . Проверено 5 июня 2009. .
  • Martin John Baker. (англ.) . www.euclideanspace.com. Проверено 5 июня 2009. .
  • Lydia E. Kavraki. (англ.) . cnx.org. Проверено 5 июня 2009. .
  • Diego Park. (англ.) . diegopark.googlepages.com. Проверено 5 июня 2009. .
  • Bill Baxter. (англ.) . billbaxter.com (21 февраля 2000 года). Проверено 5 июня 2009. .
  • (англ.) . www.virtualitoy.com. - Флэш-скрипт на сайте, который позволяет "одеть" человеческую модель. Для анимации одевания используется инверсная кинематика. Проверено 5 июня 2009. .
Русскоязычные источники
  • Hugo Elias (перевод на русский - Pavel A. Chuvanov). . GameDev.ru (8 июня 2002 года). Проверено 5 июня 2009. .
  • . . Проверено 5 июня 2009. .
  • Светлана Шляхтина. . журнал . Проверено 7 июня 2009. .
  • . Проверено 5 июня 2009. .
  • . . Проверено 7 июня 2009. .
  • . . Проверено 7 июня 2009. .
  • Алексеев В. (недоступная ссылка - история ) . (10 января 2008 года). Проверено 5 июня 2009. .
  • Майкл Комет. . Mir3D.ru . - Урок по созданию инверсной кинематике в 3ds Max . Проверено 7 декабря 2009.

Отрывок, характеризующий Инверсная кинематика

– Он теперь здесь, скажите ему… чтобы он прост… простил меня. – Она остановилась и еще чаще стала дышать, но не плакала.
– Да… я скажу ему, – говорил Пьер, но… – Он не знал, что сказать.
Наташа видимо испугалась той мысли, которая могла притти Пьеру.
– Нет, я знаю, что всё кончено, – сказала она поспешно. – Нет, это не может быть никогда. Меня мучает только зло, которое я ему сделала. Скажите только ему, что я прошу его простить, простить, простить меня за всё… – Она затряслась всем телом и села на стул.
Еще никогда не испытанное чувство жалости переполнило душу Пьера.
– Я скажу ему, я всё еще раз скажу ему, – сказал Пьер; – но… я бы желал знать одно…
«Что знать?» спросил взгляд Наташи.
– Я бы желал знать, любили ли вы… – Пьер не знал как назвать Анатоля и покраснел при мысли о нем, – любили ли вы этого дурного человека?
– Не называйте его дурным, – сказала Наташа. – Но я ничего – ничего не знаю… – Она опять заплакала.
И еще больше чувство жалости, нежности и любви охватило Пьера. Он слышал как под очками его текли слезы и надеялся, что их не заметят.
– Не будем больше говорить, мой друг, – сказал Пьер.
Так странно вдруг для Наташи показался этот его кроткий, нежный, задушевный голос.
– Не будем говорить, мой друг, я всё скажу ему; но об одном прошу вас – считайте меня своим другом, и ежели вам нужна помощь, совет, просто нужно будет излить свою душу кому нибудь – не теперь, а когда у вас ясно будет в душе – вспомните обо мне. – Он взял и поцеловал ее руку. – Я счастлив буду, ежели в состоянии буду… – Пьер смутился.
– Не говорите со мной так: я не стою этого! – вскрикнула Наташа и хотела уйти из комнаты, но Пьер удержал ее за руку. Он знал, что ему нужно что то еще сказать ей. Но когда он сказал это, он удивился сам своим словам.
– Перестаньте, перестаньте, вся жизнь впереди для вас, – сказал он ей.
– Для меня? Нет! Для меня всё пропало, – сказала она со стыдом и самоунижением.
– Все пропало? – повторил он. – Ежели бы я был не я, а красивейший, умнейший и лучший человек в мире, и был бы свободен, я бы сию минуту на коленях просил руки и любви вашей.
Наташа в первый раз после многих дней заплакала слезами благодарности и умиления и взглянув на Пьера вышла из комнаты.
Пьер тоже вслед за нею почти выбежал в переднюю, удерживая слезы умиления и счастья, давившие его горло, не попадая в рукава надел шубу и сел в сани.
– Теперь куда прикажете? – спросил кучер.
«Куда? спросил себя Пьер. Куда же можно ехать теперь? Неужели в клуб или гости?» Все люди казались так жалки, так бедны в сравнении с тем чувством умиления и любви, которое он испытывал; в сравнении с тем размягченным, благодарным взглядом, которым она последний раз из за слез взглянула на него.
– Домой, – сказал Пьер, несмотря на десять градусов мороза распахивая медвежью шубу на своей широкой, радостно дышавшей груди.
Было морозно и ясно. Над грязными, полутемными улицами, над черными крышами стояло темное, звездное небо. Пьер, только глядя на небо, не чувствовал оскорбительной низости всего земного в сравнении с высотою, на которой находилась его душа. При въезде на Арбатскую площадь, огромное пространство звездного темного неба открылось глазам Пьера. Почти в середине этого неба над Пречистенским бульваром, окруженная, обсыпанная со всех сторон звездами, но отличаясь от всех близостью к земле, белым светом, и длинным, поднятым кверху хвостом, стояла огромная яркая комета 1812 го года, та самая комета, которая предвещала, как говорили, всякие ужасы и конец света. Но в Пьере светлая звезда эта с длинным лучистым хвостом не возбуждала никакого страшного чувства. Напротив Пьер радостно, мокрыми от слез глазами, смотрел на эту светлую звезду, которая, как будто, с невыразимой быстротой пролетев неизмеримые пространства по параболической линии, вдруг, как вонзившаяся стрела в землю, влепилась тут в одно избранное ею место, на черном небе, и остановилась, энергично подняв кверху хвост, светясь и играя своим белым светом между бесчисленными другими, мерцающими звездами. Пьеру казалось, что эта звезда вполне отвечала тому, что было в его расцветшей к новой жизни, размягченной и ободренной душе.

С конца 1811 го года началось усиленное вооружение и сосредоточение сил Западной Европы, и в 1812 году силы эти – миллионы людей (считая тех, которые перевозили и кормили армию) двинулись с Запада на Восток, к границам России, к которым точно так же с 1811 го года стягивались силы России. 12 июня силы Западной Европы перешли границы России, и началась война, то есть совершилось противное человеческому разуму и всей человеческой природе событие. Миллионы людей совершали друг, против друга такое бесчисленное количество злодеяний, обманов, измен, воровства, подделок и выпуска фальшивых ассигнаций, грабежей, поджогов и убийств, которого в целые века не соберет летопись всех судов мира и на которые, в этот период времени, люди, совершавшие их, не смотрели как на преступления.
Что произвело это необычайное событие? Какие были причины его? Историки с наивной уверенностью говорят, что причинами этого события были обида, нанесенная герцогу Ольденбургскому, несоблюдение континентальной системы, властолюбие Наполеона, твердость Александра, ошибки дипломатов и т. п.
Следовательно, стоило только Меттерниху, Румянцеву или Талейрану, между выходом и раутом, хорошенько постараться и написать поискуснее бумажку или Наполеону написать к Александру: Monsieur mon frere, je consens a rendre le duche au duc d"Oldenbourg, [Государь брат мой, я соглашаюсь возвратить герцогство Ольденбургскому герцогу.] – и войны бы не было.
Понятно, что таким представлялось дело современникам. Понятно, что Наполеону казалось, что причиной войны были интриги Англии (как он и говорил это на острове Св. Елены); понятно, что членам английской палаты казалось, что причиной войны было властолюбие Наполеона; что принцу Ольденбургскому казалось, что причиной войны было совершенное против него насилие; что купцам казалось, что причиной войны была континентальная система, разорявшая Европу, что старым солдатам и генералам казалось, что главной причиной была необходимость употребить их в дело; легитимистам того времени то, что необходимо было восстановить les bons principes [хорошие принципы], а дипломатам того времени то, что все произошло оттого, что союз России с Австрией в 1809 году не был достаточно искусно скрыт от Наполеона и что неловко был написан memorandum за № 178. Понятно, что эти и еще бесчисленное, бесконечное количество причин, количество которых зависит от бесчисленного различия точек зрения, представлялось современникам; но для нас – потомков, созерцающих во всем его объеме громадность совершившегося события и вникающих в его простой и страшный смысл, причины эти представляются недостаточными. Для нас непонятно, чтобы миллионы людей христиан убивали и мучили друг друга, потому что Наполеон был властолюбив, Александр тверд, политика Англии хитра и герцог Ольденбургский обижен. Нельзя понять, какую связь имеют эти обстоятельства с самым фактом убийства и насилия; почему вследствие того, что герцог обижен, тысячи людей с другого края Европы убивали и разоряли людей Смоленской и Московской губерний и были убиваемы ими.
Для нас, потомков, – не историков, не увлеченных процессом изыскания и потому с незатемненным здравым смыслом созерцающих событие, причины его представляются в неисчислимом количестве. Чем больше мы углубляемся в изыскание причин, тем больше нам их открывается, и всякая отдельно взятая причина или целый ряд причин представляются нам одинаково справедливыми сами по себе, и одинаково ложными по своей ничтожности в сравнении с громадностью события, и одинаково ложными по недействительности своей (без участия всех других совпавших причин) произвести совершившееся событие. Такой же причиной, как отказ Наполеона отвести свои войска за Вислу и отдать назад герцогство Ольденбургское, представляется нам и желание или нежелание первого французского капрала поступить на вторичную службу: ибо, ежели бы он не захотел идти на службу и не захотел бы другой, и третий, и тысячный капрал и солдат, настолько менее людей было бы в войске Наполеона, и войны не могло бы быть.
Ежели бы Наполеон не оскорбился требованием отступить за Вислу и не велел наступать войскам, не было бы войны; но ежели бы все сержанты не пожелали поступить на вторичную службу, тоже войны не могло бы быть. Тоже не могло бы быть войны, ежели бы не было интриг Англии, и не было бы принца Ольденбургского и чувства оскорбления в Александре, и не было бы самодержавной власти в России, и не было бы французской революции и последовавших диктаторства и империи, и всего того, что произвело французскую революцию, и так далее. Без одной из этих причин ничего не могло бы быть. Стало быть, причины эти все – миллиарды причин – совпали для того, чтобы произвести то, что было. И, следовательно, ничто не было исключительной причиной события, а событие должно было совершиться только потому, что оно должно было совершиться. Должны были миллионы людей, отрекшись от своих человеческих чувств и своего разума, идти на Восток с Запада и убивать себе подобных, точно так же, как несколько веков тому назад с Востока на Запад шли толпы людей, убивая себе подобных.
Действия Наполеона и Александра, от слова которых зависело, казалось, чтобы событие совершилось или не совершилось, – были так же мало произвольны, как и действие каждого солдата, шедшего в поход по жребию или по набору. Это не могло быть иначе потому, что для того, чтобы воля Наполеона и Александра (тех людей, от которых, казалось, зависело событие) была исполнена, необходимо было совпадение бесчисленных обстоятельств, без одного из которых событие не могло бы совершиться. Необходимо было, чтобы миллионы людей, в руках которых была действительная сила, солдаты, которые стреляли, везли провиант и пушки, надо было, чтобы они согласились исполнить эту волю единичных и слабых людей и были приведены к этому бесчисленным количеством сложных, разнообразных причин.

Прямая и инверсная кинематика - это два разных способа вращения суставов в цепи. Из них более простым и требующим меньших вычислительных затрат является прямая кинематика (Forward Kinematics - FK), но при этом она лишена многих интуитивно по­ нятных возможностей управления, которыми обладает инверсная кинематика (Inverse Kinematics - IK), обеспечивающая вращение суставов по цепи.

В случае прямой кинематики каждый сустав просто поворачивается вручную, как это было сделано в предыдущем разделе с примером скелета. При повороте корневого суста­ ва цепи (например, плечевого сустава) вращательное движение передается по цепи сус­ тавов дальше вниз и перемещает все дочерние суставы. На рис. 8.9 представлена создан­ ная в предыдущем разделе структура руки с повернутым суставом плеча. Хотя создать такое движение относительно несложно и в Майя просто рассчитать его, для располо­ женных ниже по цепи суставов оно недостаточно точное. Если, например, необходимо прикоснуться запястьем к другому объекту, то сначала необходимо повернуть плечо, по­ том локоть, а потом, возможно, настроить поворот обоих суставов так, чтобы в точности

получить необходимое движение. И этот способ не только занимает больше времени для перемещения конечности. Так как вращение корневого сустава иерархии перемещает всю иерархию, в этом примере сустав запястья будет перемещаться при перемещении любых других расположенных выше по иерархии суставов, в результате чего по ходу анимации он будет плавно двигаться вокруг своей оси. Такой эффект определенно неже­ лателен, а управление им занимает много времени и сил. С другой стороны, прямая ки­ нематика идеальна для создания дугообразных движений, как у рук при плавании или ног при выполнении гимнастического упражнения "колесо", так что это средство имеет смысл держать в арсенале оснащения персонажей.

В то же время инверсная кинематика намного более сложная математически, но вместе с тем предусматривает точную регулировку суставов конечностей и, когда остальная часть иерархии уже установлена, помогает управлять движением этих суставов. В инверсной ки­ нематике движение сустава конечности (на самом деле управляющего положением сустава маркера (handle)) приводит к повороту суставов вверх по цепи, поэтому движение распро­ страняется по цепи в обратном (backward), или инверсном (inverse), направлении.

Инверсная кинематика использует маркеры инверсной кинематики (IK handle), или просто маркеры IK, и решатели инверсной кинематики (IK solver), или просто решатели IK. Маркер инверсной кинематики проходит по суставам, на которые распространяется его влияние, эти суставы называют цепью управляемой инверсной кинематикой (IK chain), и сквозь эту же цепь проходит линия маркера (handle wire). Управляющий вектор (handle vector) выходит из начального сустава и заканчивается в конечном, в ко­ тором располагается конечный исполнительный элемент (end effector). После добавления решателя IK в рассмотренную в предыдущем примере цепь суставов можно будет ани- мировать простым перемещением сустава запястья. При этом плечо и локоть будут вра­ щаться так, чтобы вся рука двигалась правильно, как показано на рис. 8.10.

Рис. 8.9. Прямая кинематика: при Рис. 8.10. Перемещение цепи сус- повороте сустава, старшего в тавов с помощью перемещения ко- иерархии, перемещается вся цепь печного исполнительного элемента суставов маркера инверсной кинематики

Чтобы выполнить правильный поворот всех суставов (от начального до конечного) цепи, управляемой инверсной кинематикой, при котором конечный сустав окажется на месте конечного исполнительного элемента, решатель IK обращается к позиции конеч­ ного исполнительного элемента цепи и выполняет необходимые вычисления. Когда ко­ нечный исполнительный элемент перемещается, решатель IK преобразует значения его перемещений в значения поворотов суставов и суставы соответственно обновляются. Обычно управляемая инверсной кинематикой цепь распространяется только на три сус-

тава, но суставов в ней может быть и больше, особенно если используется маркер инверс­ ной кинематики сплайна (IK Spline handle), который управляет лежащими в его основе суставами с помощью кривой. Среди реализованных в Maya решателей инверсной кине­ матики можно выделить четыре (и соответствующие типы инверсной кинематики): ре­ шатель ikrP для расчета инверсной кинематики вращения плоскости (IK rotat e Plane), решатель ikSC для расчета инверсной кинематики простой цепи (IK Single Chain), реша­ тель ikSpline для расчета инверсной кинематики сплайна (IK Spline) и решатель ikSpring для расчета инверсной кинематики пружины (IK Spring). Каждый тип реша­ теля IK имеет собственный тип маркера IK.

В данной статье мы разберемся, что такое 3D печать и какая бывает кинематика 3D принтеров.

1. 3D печать. Какая она на вкус?

Технологий печати существует большое множество, от FDM (FFF), по которой печатает больше 90% принтеров на данном портале, до SLA/DLP/LCD (с фотополимерами) и SLS/SLM (спекание порошка с помощью мощных лазеров)
Нас на начальном этапе интересует FDM - послойное наплавление расплавленного прутка. На картинке ниже изображен хотенд (Hot end) - та часть экструдера 3D принтера, где происходит расплавление прутка.

Пластиковый пруток подается через тефлоновую трубку и радиатор в термобарьер, и через него в нагревательный блок. Там плавится и выходит через сопло. Сопло имеет определенный диаметр, который маркируется на нем.Часто его делают из латуни, так как материал недорогой,легко обрабатывается. От сопла зависит точность печати. Чем меньше сопло, тем больше ниточек укладывается в один мм.

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

Термобарьер служит для того,что бы минимизировать нагрев пластика выше термоблока.

Наиболее часто выполняется из нержавеющей стали. У нее теплопроводность ниже, чем у обычной,нелегированной стали. Для предотвращения плавления прутка выше термоблока сверху на термобарьер накручивается радиатор и обдувается кулером. Все достаточно просто.
Очень часто возникает протечка расплавленного пластика через резьбу.Это означает, что сопло не поджало термобарьер в нагревательном блоке. Поэтому при разборке и сборке хотэнда вкручиваем сначала термобарьер в нагревательный блок, а потом поджимаем соплом. Если у вас при закручивании сопла остается зазор между торцем сопла и нагревательным блоком, то это нормально, зазор для того, что бы поджать соплом термобарьер.Для того, чтобы подать пруток в нужное время и в нужном месте необходим фидер (feeder), то есть устройство подачи прутка.
Иногда его выполняют совмещенным с хотэндом, и тогда такой тип экструдера (это все вместе хотэнд+фидер) называют директом (direct), то есть подача прямая, без трубок.Та же фидер делают отдельно, а подачу прутка осуществляют через фторопластовую трубку. Называют такую систему - боуден (bowden).Это делается для того, чтобы облегчить движущуюся часть. По части положительных моментов и недостатков - у каждой конструкции они,несомненно, есть.
Директ экструдер:
1. Достоинства:
а) Более надежный за счет меньшего числа соединений для подачи пластика;
б) Менее придирчив к материалам, которыми печатает, в частности резиной на основе каучуков проблематично печатать на боуден экструдерах;
2. Недостатки:
а) Большой вес, за счет этого при ускорениях/замедлениях можно наблюдать небольшую рябь на поверхности детали;
б) Габариты. Они очень сильно влияют на область построения. Скажем, как на картинке выше, директ с 4 цветами был бы очень громадным. А для боудена это в самый раз.
Боуден экструдер:
1. Достоинства:
а) Вынесенный мотор снижает вес движущихся частей принтера, а их меньшая инерционность не влияет на поверхность модели;
б) Катушка не дергается вслед за моделью, а то при витков катушки с директом получим пропуск шагов, так как каретка будет тянуть за собой катушку.
2. Недостатки:
а) Настройки ретракта (вытягивание прутка обратно при холостых перемещениях, что бы расплавленный пластик, расширяясь не сочился из сопла) сложнее, так как пруток меньше внутреннего диаметра трубки, он имеет свойство тянуться;
б) Сложнее, чем на директе, выбрать все зазоры, чтобы печатать различными гибкими пластиками. Все, кто говорит,что на боудене печать невозможна гибкими пластиками - нагло врут. Я . И вполне успешно.

Теперь переходим непосредственно к механике и ее калибровке.

Часть 2. Механика. Что, как и чем дергает?

Существует весьма ограниченное число кинематических схем, под которые написана прошивка, и которые вполне сносно отрабатывают перемещения.
Рассмотрим все, от самых распространенных:
1. Конструкция и кинематика от Джозефа Прюши (не надо читать Прусся,Праша и прочее, это имя человека, в конце концов).

Перемещение вдоль каждой из осей обеспечивается своим независимым мотором. Перемещение по оси Z (вверх-вниз) обеспечивается с помощью 2 моторов и с помощью кинематической пары винт-гайка. Часто используются шпильки М5, в последнее время все чаще ставят винты с трапециеидальной резьбой.
Вот винт с трапециеидальной резьбой. Как шпильки с метрической резьбой выглядят прикладывать не буду.Единственное, что объясню относительно перемещения по шпилькам и трапециям - для производства трапеций берут калиброванный пруток и прокатывают между роликов, находящихся под углом. Получаются винтовые канавки. Такой метод, априори, дает лучшее качество и точность шага, нежели у строительных шпилек по далеко не самому высокому квалитету.Для подключения одновременно 2 двигателей на одну ось (и на 1 разъем) применяется следующая схема.Соединение последовательное, 2 провода запаиваются, а оставшиеся обжимаются. На цвета можно не обращать внимания, главное, что бы обмотки звонились. А и В это обмотки, а 1 и 2 - выводы.
Плюсы данной кинематики:
1) Независимое перемещение каждой из осей. Легко поймать понять какая ось пропускает шаги. Кинематика перекочевала в принтеры от фрезерных ЧПУ, поэтому многие производители делают на ней настольные фрезерные станки, вместо экструдера предлагают установить лазер для гравировок или резки, шпиндель для фрезеровки плат, экструдер для шоколада или даже теста, что б печь блины.На фото выше - принтер ZMorph. Он может использоваться и как принтер (с одним или двумя экструдерами), как гравировщик (установка Dremel), лазером для гравировок и так далее. Небольшое презентацонное видео.Фрезерный станок на этой кинематике. Замечу, что для фрезеровки необходимо использовать для перемещения пару винт-гайка,а не ремни, они не предназначены для таких нагрузок.

Принтеры для печати шоколадом и для выпечки блинов по вашему эскизу. Стоит заметить, что шоколадки типа Аленка или Бабаевские использовать не рекомендуется, так как они уже имеют в своем составе какао-масло и при переработке (расплавка и затвердевание) результат непредсказуем. Необходимо использовать шоколад в галлетах, например бельгийский Callebaut, так как в нем нет какао-масла, и для окончательной заливки его нужно добавить. Для такого типа шоколада на каждой пачке есть график его кристализации. Масло желательно брать в порошке. Для более подробной информации рекомендую погуглить про темперирование шоколада. 2) Кинематика проста как два пальца. Ее очень просто собрать. Многие даже собирают на старых DVD дисководах. 3) Легко изменяется под свои нужды, размер экструдера тоже имеет небольшое значение, так как он выступает вперед и не мешает движению остальных частей. Многие ставят второй экструдер, или делают сопла качающимися, что бы сопли одного экструдера не оставались на детали, при печати вторым соплом.Поэтому для данной кинематики существует огромное число вариаций экструдера, на любой вкус, на очень известном сайте .
Недостатки данной кинематики:
1) Сложная калибровка. Да, поскольку стол "дрыгается" печатать сложновато качественно, ибо деталь+стол при резкой смене направления перемещения по инерции стремяться ехать дальше. Получаются некрасивые артефакты печати. И для качественной печати нужна небольшая скорость. А вообще, все зависит от рамы. У меня первым принтером была китайская прюша. С акриловой рамой. А акрил не очень-то жесткий. А как известно, жесткость принтера как и ЧПУ - самое важное. И печатать можно было более или менее качественно на скоростях 40-50 мм/с. Далее я его на стальную раму от МЗТО.И после этого без потери качества печати смог печатать на скоростях до 100 мм/с.
2) Деламинация. Из-за открытого корпуса и постоянно перемещающейся платформы горячий воздух, можно сказать, постоянно сдувается, а охлаждая излишне деталь сквозняками мы увеличиваем и без того большую усадку нейлонов,абс и прочих капризных пластиков. Кто-то шьет шубу для принтера из ткани, а кто-то довольствуется и коробками.Но цель, как всегда, одна и та же - уменьшить влияние сквозняков на усадку детали.

Основные моменты правильной калибровки принтеров с данной кинематикой:
1) Установить принтер на ровную поверхность. Желательно горизонтальную. Для этого необходим пузырьковый уровень. Далее устанавливаем по уровню положение оси X. 2) Переводим в домашнее положение. Делается либо в меню принтера командой Home/Домой, если печатаете с компьютера, то или командой G28 в строку команд, или специальными кнопками с иконкой домика.

Далее подкручиваем винт стола так, что бы сопло касалось стекла. Не давило на стекло, а касалось. Смотрим на просвет и крутим. После этого перемещаем экструдер к другому углу стрелками в +Х, +Y с ПК, или через меню Точно так же крутим винтик до соприкосновения с соплом. И повторяем операцию для остальных точек.
Постараюсь избавить вас от ошибок. На фото принтера выше стекло на столе крепится аж 8 зажимами. И вполне возможно, что по центру будет горб. Чтобы избежать подобных проблем стекло стоит закреплять 3 зажимами. Плоскость строится, как известно из начертательной геометрии, по 3 точкам. И калибровка будет проще в этом случае. Просто подкручиваем винт над концевиком по Z.Чтобы сопло касалось стекла посередине той стороны, на которой стоит 1 зажим. Дальше перегоняем хотенд в угол где еще один зажим, подкручиваем винт стола, и повторяем операцию с другим углом.
Касательно вобблинга.
Всякие антивобблинговые системы вроде установки продшипника в верхнюю опору не работают.Просто потому, что поставить идеально параллельно и в одной плоскости 4 далеко не идеально ровных циллиндра - задача нереальная. Особенно на хлипкой акриловой раме с печатными деталями. Поэтому, если принять за константу прямизну валов, и выставить их параллельно на раме (чисто гипотетически), а винты освободить (снизу муфта для крепления к мотору) и гайки для крепления оси Х. Винты за счет своей кривизны будут вертеться как миксер, но на печать это не будет влиять.Иначе конструкция будет работать на то, кто же окажется сильнее на сопротивление изгибу. И будет получаться далеко не ровная стенка. Оно вам надо?

2. Конструкция по типу кинематики принтеров компании Felix printers.

Таких принтеров много, такие делает МЗТО (mz3d.ru), уже упомянутые Felix. По сути кинематика та же, что и у Prusa. Независимые друг от друга оси. Только теперь стол ездит не вдоль одной оси, а сразу вдоль целых двух. Вдоль оси Z, и по оси Y.Конструкция стола примерно такая. На валах по Z ездит платформа. Сзади висит двигатель. По рельсам при помощи ремня передвигается стол. Хотенд передвигается только вдоль одной оси. Конструкция весьма забавна, так как стол весит куда больше хотенда, а его пытаются перемещать по 2 осям сразу.

Плюсы данной кинематики:
1) Отсутствует второй мотор по оси Z. Пресловутого вобблинга нет просто потому, что есть 2 вала и 1 винт. Винт, так же не стоит закреплять сверху. Если это не ШВП.
ШВП это отдельная тема. Если брать качественную ШВП, скажем, от тех же Hiwin, то она изготавливается как минимум по 7 классу точности (если катанная, а если шлифованная, то класс еще выше) и устанавливаться должны в подшипниковых опорах. Со стороны привода - 2 радиально-упорных подшипника back-to-back,а с другого конца - радиальный со свободной посадкой для компенсаци теплового расширения.

Цель установки ШВП - обеспечение точности перемещения. Если же ее устанавливать неправильно - деньги на ветер, и точность будет не выше пары винт-гайка с трапециеидальной резьбой. Для FDM c лихвой хватит точности трапеций.
2) Много места для установки директ-экструдера. Как и в предыдущей кинематике есть простор для творчества, подбирать тот самый, единственный и неповторимый экструдер, который вам по душе.
3) Жесткая рама. Есть возможность сделать нормальную раму. Жесткую,прочную. Да хоть чугуниевую. Ребята из Феликса решили не забивать голову и лепят из алюминиевого профиля. МЗТО пошли дальше, погнули стальной лист. А полку под установку стола отфрезеровали из листа алюминия.
4) Если брать конструкцию Феликса на профиле, то с помощью замены пары кусков профиля и винта по Z можно увеличить область печати.Только обязательно добавить жесткости. А то получится как это чудо конструкторской мысли. Большое, бессмысленное и беспощадное.

Недостатки кинематики:
1) Несомненно, большие дергающиеся массы. Стол вперед-назад,а если включить движение по Z при холостых перемещениях (Z-hope), то будет дискотека.
2) Нет возможности сделать ему нормальную термокамеру. Стол двигается вперед-назад и градиент температуры просто сдувается. Отсюда проблемы при печати нейлонами или ABS. Небольшие сквознячки в комнате с легкостью покажут вам где раки зимуют как усаживается материал.

Калибровка стола данного принтера аналогична калибровке стола у Prusa, только несколько проще. Проще за счет того, что ось X вам выставлять по уровню не надо, она автоматически выставлена при сборке рамы. Подводим сопло к столу и крутим барашки.

3. Кинематика Ultimaker.
Одна из наиболее распространенных вариаций Cartesian кинематики.

Таких принтеров не очень много, но они есть. Вариация от Zortrax заслуживает внимания. Вариант того же Raise более приближен к классике.У Zortrax установлены двойные валы, причина проста - на них стоит директ экструдер с полноразмерным двигателем Nema 17. У Raise Dual стоит двойной директ экструдер, поэтому классические 6 мм валы заменены на 8 мм. А общий вес "головы" составляет почти 900 грамм.Кинематика построена полностью на валах. Они выступают одновременно и как направляющие, и как шкивы. Кинематика так же относится к Cartesian кинематикам с независимым перемещением вдоль каждой оси своим мотором. Очень привередлива к прямоте валов. Если использовать кривые валы можно получить весьма забавные артефакты на стенках моделей. И они будут по всем 3 координатам. Чаще всего это выглядит как разная толщина первого слоя и небольшие волны по стенкам. Поэтому вся соль и высокая цена оригинальных Ultimaker только в качественных комплектующих. А именно в прямых валах. Ремни используются часто кольцевые, что упрощает систему их натяжки, так как важно, чтобы все 4 ремня были одинаково натянуты.

Плюсы данной кинематики:
1) Стол движется только вдоль одной оси. Вертикальной. И градиент температур никоим образом от этого не страдает. Стол консольный, поэтому желательно предусмотреть ребра жесткости или учесть это толщиной стола.Отгиб металла на столе работает как ребро жесткости.Многие китайские клоны комплектуются такими вот ребрами жесткости для стола. 2) При всей кажущейся сложности кинематической схемы она проста и каждая ось перемещается с помощью своего же мотора.
3) Корпус закрытый, что защищает от сквозняков, и следовательно деламинации. Некоторые для пущего эффекта ставят акриловую дверцу.

Минусы кинематики:
1) Для хорошей печати мало купить пачку ровных валов. Собрать все эти валы правильно воедино та еще задачка. Заодно и купить хорошие подшипники. Не то, китайское барахло, что чаще втюхивают на али, а нормальные подшипники. Если подшипники, что ставят в корпус будут плохо вращаться - печать будет рывками и со сдвигом слоев. Последствия можно спросить у Вани (Plastmaska). Так же, покупая леопардовые втулки латунные подшипники с графитовыми вставками будьте готовы к тому, что они будут люфтить. А если будет люфт - вся конструкция будет стучать. А так же, китаезы любят вместо бронзы впихивать латунь. А при равномерном износе латуни и графита на валах будет будет маслянистая липкая черная пленка, из-за чего перемещения будут происходить тяжелее. Хорошие втулки предлагает Илья (tiger). Он же и про эти сложности. 2) Необходимо выставить правильно все параллели валов. Предлагаю воспользоваться таким девайсом.4 вала, что идут вдоль стенок корпуса автоматически встают правильно, а вот крестовину важно выставить правильно, что бы получить углы 90 градусов в плоскости XY.
3) Конструкция не предусматривает увеличение области печати с помощью пары кусоков профиля, поэтому размеры хотенда имеют значение. Директ сложновато поставить, но можно при желании.

Калибровка стола проще некуда. Стол часто на 3 точках крепления. Перемещаем хотенд по 3 точкам и крутим барашки.

4. Кинематика, используемая фирмой Makerbot.
Так же, весьма широко распространена. В частности принтеры компании Makerbot, BQ, BCN3D ,Magnum, клон магнума - Zenit и вполне сносные реплики makerbot - Flashforge и Hori работают на данной кинематической схеме.В данном случае мы имеем независимое движение каждой из осей, с Z столом и всеми вытекающими из этого сторонами.
Основной недостаток заключается в том, что на катающейся балке с одной стороны висит двигатель, создавая эдакий дисбаланс. Этот недостаток компенсировали в двухэкструдерном варианте - BCN3D Sigma. Там у каждой bowden-головы для перемещения вдоль балки есть свой двигатель. И они установлены по краям балки и уравновешивают друг друга. Для равномерного перемещения каждого из краев балки применяется 2 вала, шкивы и ремни. Ремни необходимо натягивать одинаково.
Достоинства кинематики:
1) Независимое перемещение каждой из осей.
2) Движущийся по Z стол. Градиент температур не страдает "сдуванием".
3) Закрытый корпус. Если не закрытый, то есть вполне нормальный с точки зрения эстетики шанс закрыть его.
4) Масштабируемость кинематики возможна. Различные BigREP и иже с ними с метровыми областями печати используют именно эту кинематику, так как различные H-bot/CoreXY будут адово звенеть по причине наличия 4-5 метровых ремней и их растяжения во время ускорений.
Недостатки кинематики:
1) Неуравновешенные массы на движущейся балке, отсюда максимальная скорость печати, с приемлемым качеством не больше 60-80 мм/с. Некоторые умудряются их уравновесить и это не столь заметно.
2) Громоздкие конструкции на валах, дабы избежать дисбалланса при перемещениях.
3) Необходимо следить, чтобы натяжения ремней справа и слева были одинаковы.

4. Кинематика H-bot/CoreXY.
Следующая по распространению. Так же, Cartesian. Два мотора неподвижны, но перемещают каретку по направляющим с помощью одного длинного куска ремня, или с помощью двух, но покороче. Математика сложнее, чем у предыдущих, так как необходимо синхронизировать поворот обоих роторов двигателя. То есть, для перемещения вдоль каждой оси нужно вращать оба мотора, а для перемещения по диагонали - всего 1.

По сути математика для вращения моторов одна и та же, а реализация в механике разная. Один из самых больших недостатков H-bot перед CoreXY состоит в том, что при перемещениях ремень стремится повернуть балку.На картинке слева это заметно, силы справа и силы слева создают крутящий момент. Поэтому для реализации этой кинематики необходима жесткость кинематической схемы. Чаще всего ее реализуют в рельсах.С жесткой балкой. Некоторые делают, конечно, на валах, но по итогу - это не фонтан.А потом понимают это и переезжают на рельсы.Ибо они и проще в сборке и настройке, и выдумывать каретки, что б хорошо валы закрепить не нужно.
CoreXY, в отличии от H-bot, приводится в движение при помощи двух ремней.И так, для простоты понимания, опишу положительные и отрицательные стороны каждой вариации этой кинематики.
H-bot.
Достоинства:
1) Ремень необходим всего один, а схема предусматривает его работу без скручиваний.
2) Натягивать один ремень удобнее, чем 2, поэтому в этой схеме нужен всего один нормальный натяжитель.Можно даже так.
Недостатки:
1) Ремень имеет свойство растягиваться со временем, а так как величина растяжения напрямую зависит от длины, то необходимо следить за его натяжением. Иначе получатся некрасивые волны на поверхности перед остановками.При слабой натяжке ремня каретка будет иметь такой люфт.
2) Необходимо выставлять ролики строго перпендикулярно плоскости XY, так как при небольшом перекосе ролика ремень будет съедаться об буртики ролика. И мы получим такую вот бяку.Проверено на своей шкуре и принтере ZAV. Поэтому всегда рекомендую нормально закреплять ролики, а не консольно, дабы избежать изгиба оси ролика от натяжки ремня.
3) Сложная математика, из-за чего на скоростях выше 100 мм/с могут быть проблемы с нехваткой ресурсов 8 битных плат.
CoreXY.
Достоинства:
1) Два коротких куска ремня. Их проще найти, чем один длинный.
2) Силы уравновешивают балку, а не стремятся ее повернуть, поэтому эту кинематику можно собирать и на валах.
Недостатки:
1) Есть схемы с перекручиванием ремней и перехода ремня с одного уровня на другой - для ремня это не очень приятно. Особенно, когда один ремень трется об другой. На видео этот момент есть.

2) Сложность нятяжки ремней. Их необходимо натягивать одинаково, иначе силы нятяжки будут стремиться повернуть каретку.
3) Сложность сборки и разработки. Необходимо выдержать вертикальность роликов, относительно горизонтальности площадки для установки моторов и рельс. Небольшой перекос роликов приведет к тому, что ремень будет стремиться съехать по ролику, а если будет упираться в буртик ролика, то будет скрипеть, если буртик большой, а если маленький - то будет пытаться на него заехать, как на фото из описания h-bot.

Общий недостаток кинематики - плохая масштабируемость. То есть ставить такую кинематику для области печати больше 300*300 весьма проблемно просто из-за удлинений ремня при печати. Для небольших принтеров с большой скоростью печати - одна из лучших кинематик.

5. Delta кинематика.
Кинематика основана на движениях дельта-робота.Только вместо захватов устанавливается хотенд. Имеет свои проблемы с настройкой, но на печать можно залипать очень долго. Редко когда устанавливают директ-экструдеры, так как эффектор (площадка для установки хотенда) часто крепится на магнитах и необходимо максимально разгрузить его. Но для уменьшения длины трубки (а конкретнее, влияния длины трубки на качество печати за счет правильной настройки ретрактов (вытягивания пластикового прутка назад с целью уменьшения его вытекания от расширения)) на качество печати, экструдер вешают на те же каретки, но на отдельных подвесах. За счет этого уменьшается длина bowden трубки и увеличивается качество печати.

Достоинства:
1) Легко кастомизируется. Для увеличения высоты достаточно прикупить 3 куска профиля подлиннее, и увеличить максимальную высоту в настройках.
2) Занимает мало места. Она чаще высокая, чем громоздкая по длине и ширине, за счет этого компактность.
3) Если сделать легкий эффектор (каретка, на которой установлен хотенд), то можно добиться больших скоростей без потери качества печати.
4) Перемещение по высоте не отличается от перемещения по XY. Таким образом, нет залипания линейных подшипников на переездах стола, как у Cartesian принтеров, лишних двигателей, катающихся на балке...
5) Отсутствие выступающих частей дает возможность закрыть корпус и придать раме жесткости.
6) Эстетическая часть - на работу дельты интереснее залипать.
Недостатки:
1) Сложная математика перемещений, рекомендуется ставить сразу 32-битные платы.
2) Сложная настройка. Частая проблема в настройке - убрать так называемую "линзу", ведь каждый стержень вращается с радиусом, и при некорректной настройке у вас печатаемая плоскость будет либо выпуклой,либо вогнутой линзой. 3) Сложно и дорого сделать жесткую раму, что бы ее не болтало от постоянных дрыганий кареток.
4) Сложность установки директ-экструдера. Он получается тяжелым, а так как многие дельты делаются на магнитах, то не будет возможности разогнаться. Хотя, есть одно аккуратное и легкое решение - установка готового директ-экструдера с редуктором. Как, например E3D Titan Aero или Bondtech BMG. 5) Проблемы точности изготовления деталей - любые неровности и несоосности будут видны, даже если они на одной оси. И они складываются по осям. Резюмируя , хотите небольшой принтер (не больше 300*300 мм) с шустрой кинематикой? Тогда вам к Ultimaker или H-bot/CoreXY. Нужен принтер с большой областью печати или с 2 независимыми экструдерами? Тогда к Makerbot. Если печатать вазочки, кальяны и достаточно высокие детали - дельта. Для всего остального есть классика - Prusa. Эксперименты с двойными каретками, шоколадом, гравировками? Да все что угодно. И самое главное - дешево.Можно даже 4 цвета прикрутить.



© 2024 beasthackerz.ru - Браузеры. Аудио. Жесткий диск. Программы. Локальная сеть. Windows