Заметки о дельта-роботе. Часть 5. Крутящие моменты и угловые ускорения в приводных звеньях. Точность. Выбор приводов

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

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

Список обозначений

image-loader.svg — крутящие моменты первого, второго и третьего рычагов соответственно;

image-loader.svg — составляющие приложенной к исполнительному звену силы по осям ;

image-loader.svg — матрица Якоби;

image-loader.svg — приведённая к точке V масса каретки (подвижной платформы);

image-loader.svg— приведённые к точке V массы рычагов механизма;

image-loader.svg — момент инерции i-го звена относительно мгновенной оси вращения;

image-loader.svg— масса i-го звена;

image-loader.svg— угловая скорость i-го звена относительно мгновенной оси вращения;

image-loader.svg— линейная скорость мгновенной оси вращения i-го звена;

image-loader.svg— линейная скорость точки приведения A;

image-loader.svg— масса каретки;

image-loader.svg— момент инерции рычага (никакого отношения к матрице Якоби это не имеет);

image-loader.svg — первый, второй и третий элементы i-ой строки транспонированной матрицы Якоби;

image-loader.svg— максимальный крутящий момент i-го рычага.

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

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

Почему вообще, привод (или двигатель), который будет вращать рычаги дельта-робота, должен обладать моментом? Дело в том, что для того, чтобы начать вращать рычаг с какой-то скоростью, это звено нужно сначала разогнать, то есть придать ему ускорение. А чтобы обеспечить ускорение, нужна сила или вращающий момент (для вращательного движения). Например, если мы возьмём тяжелое и длинное бревно, но мы не можем сразу начать крутить его со скоростью, скажем, 60 оборотов в минуту. Сначала мы будем медленно раскручивать его, а вот, когда раскрутим, тогда момента уже почти к нему прикладывать и не надо — бревно будет крутиться по инерции. Без сил трения оно будет вращаться вечно (если очень грубо).

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

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

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

Решить задачу силового расчёта можно двумя (а может и больше) методами.

Что можно сказать о первом?

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

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

image-loader.svg

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

Решаешь ты такой себе решаешь, а потом получаешь что-то вроде этого:

Ну как тут не приуныть?Ну как тут не приуныть?

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

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

(1)(1)

где image-loader.svg — крутящие моменты первого, второго и третьего рычагов соответственно;

image-loader.svg — составляющие приложенной к исполнительному звену силы по осям image-loader.svg;

image-loader.svg — матрица Якоби.

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

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

Пример

Нагрузка — Video | VK

vk.com

На видео я измеряю примерную силу, необходимую для смены рабочего органа (Nozzle-а), так называемого, вакуумного пинцета расстановщика электронных компонентов.

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

image-loader.svg

«Снять» эти данные можно с какого-нибудь промышленного станочка.

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

Пример алгоритма в MATLAB

%Задаём область для анализа
X = 40;
Y = 40;
Z = -380;
a = 30;
b = 30;
c = 10;
F = 3;
%Флаг необходимости рассматривания наихудшего направления
worDir = 0;
F_vect = [3; 2; 1];
Mmax = 0;
%Плотность точек
dotDensity = 30;
%Рабочая зона
WZ_D = 320;
WZ_d = 100;
WZ_H = 150;
WZ_Z = -390;
WZ_h = 50;
%Переменная, показывающая необходимость дополнительного
addSeg = 0;

vmax = 1000;
R_l = 170;
R_r = 320;
OQ = 77.9423;
VM = 23.094;
cos120 = cosd(120);
sin120 = sind(120);
cos240 = cosd(240);
sin240 = sind(240);

%Проверяем, находится ли заданная область в рабочей зоне
%Задаём точки для проверки
CP_X = [X, X+a, X+a, X, X, X, X+a, X+a];
CP_Y = [Y, Y, Y+b, Y+b, Y+b, Y, Y, Y+b];
CP_Z = [Z, Z, Z, Z, Z+c, Z+c, Z+c, Z+c];
%Находим индексы точек, попадающих в цилиндрическую область
inCil = CP_X.^2+CP_Y.^2 <= (WZ_D/2)^2;
%Находим инексы точек попадающих
%1 Только в цилиндрическую РЗ
if addSeg == 0
    inDopSeg = (CP_Z >= WZ_Z) & (CP_Z <= (WZ_Z+WZ_H));
end
%В цилиндрическую РЗ и усечённый конус
if addSeg == 1
    z0 = WZ_Z - WZ_h*(WZ_D/2)/((WZ_D-WZ_d)/2);
    a2_c2 = ((WZ_D/2)/(WZ_Z-z0))^2;
    inDopSeg = CP_X.^2 + CP_Y.^2 <= a2_c2*(CP_Z-z0).^2;
end
%В цилиндрическую РЗ и в часть сферы
if addSeg == 2
    inDopSeg = (CP_X.^2 + CP_Y.^2 + (CP_Z-(WZ_Z-WZ_h+WZ_d/2)).^2 <= (WZ_d/2)^2)|(CP_Z > WZ_Z);
end
%Формируем индексы точек, удовлетворяющих всем условиям
inWZ = inCil & inDopSeg;
CP_XX = CP_X(inWZ);
%Если все точки вошли в рабочую зону
if size(CP_X, 2) == size(CP_XX, 2)
    %Формируем массив точек для анализа
    x = linspace(X, X+a, dotDensity);
    y = linspace(Y, Y+b, dotDensity);
    z = linspace(Z, Z+c, dotDensity);
    [X, Y, Z] = meshgrid(x, y, z);
    TestPointsX = reshape(X, [1, size(X, 1)^3, 1]);
    TestPointsY = reshape(Y, [1, size(Y, 1)^3, 1]);
    TestPointsZ = reshape(Z, [1, size(Z, 1)^3, 1]);
%     %Тестовая отрисовка точек
%     hold('on');
%     plot3(aTestPointsX, TestPointsY, TestPointsZ, '.r');
%     hold('off');

    %Запускаем цикл проверки в каждой точке
    for k = 1:size(TestPointsX, 2)
        J = [                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          TestPointsX(k)/(R_l*(1 - ((OQ - VM + TestPointsY(k))^2 + R_l^2 - R_r^2 + TestPointsX(k)^2 + TestPointsZ(k)^2)^2/(4*R_l^2*((OQ - VM + TestPointsY(k))^2 + TestPointsZ(k)^2)))^(1/2)*((OQ - VM + TestPointsY(k))^2 + TestPointsZ(k)^2)^(1/2)),                                                                                                                                                                                                                                                                                                   ((2*OQ - 2*VM + 2*TestPointsY(k))/(2*R_l*((OQ - VM + TestPointsY(k))^2 + TestPointsZ(k)^2)^(1/2)) - ((2*OQ - 2*VM + 2*TestPointsY(k))*((OQ - VM + TestPointsY(k))^2 + R_l^2 - R_r^2 + TestPointsX(k)^2 + TestPointsZ(k)^2))/(4*R_l*((OQ - VM + TestPointsY(k))^2 + TestPointsZ(k)^2)^(3/2)))/(1 - ((OQ - VM + TestPointsY(k))^2 + R_l^2 - R_r^2 + TestPointsX(k)^2 + TestPointsZ(k)^2)^2/(4*R_l^2*((OQ - VM + TestPointsY(k))^2 + TestPointsZ(k)^2)))^(1/2) + (1/((OQ - VM + TestPointsY(k))^2 + TestPointsZ(k)^2)^(1/2) - ((2*OQ - 2*VM + 2*TestPointsY(k))*(OQ - VM + TestPointsY(k)))/(2*((OQ - VM + TestPointsY(k))^2 + TestPointsZ(k)^2)^(3/2)))/(1 - (OQ - VM + TestPointsY(k))^2/((OQ - VM + TestPointsY(k))^2 + TestPointsZ(k)^2))^(1/2),                                                                                                                                                                                                                                 (TestPointsZ(k)/(R_l*((OQ - VM + TestPointsY(k))^2 + TestPointsZ(k)^2)^(1/2)) - (TestPointsZ(k)*((OQ - VM + TestPointsY(k))^2 + R_l^2 - R_r^2 + TestPointsX(k)^2 + TestPointsZ(k)^2))/(2*R_l*((OQ - VM + TestPointsY(k))^2 + TestPointsZ(k)^2)^(3/2)))/(1 - ((OQ - VM + TestPointsY(k))^2 + R_l^2 - R_r^2 + TestPointsX(k)^2 + TestPointsZ(k)^2)^2/(4*R_l^2*((OQ - VM + TestPointsY(k))^2 + TestPointsZ(k)^2)))^(1/2) - (TestPointsZ(k)*(OQ - VM + TestPointsY(k)))/(((OQ - VM + TestPointsY(k))^2 + TestPointsZ(k)^2)^(3/2)*(1 - (OQ - VM + TestPointsY(k))^2/((OQ - VM + TestPointsY(k))^2 + TestPointsZ(k)^2))^(1/2));
            (3^(1/2)/(2*((OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)^(1/2)) - (3^(1/2)*(OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2)/(2*((OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)^(3/2)))/(1 - (OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2/((OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2))^(1/2) + ((TestPointsX(k)/2 + (3^(1/2)*TestPointsY(k))/2 + 3^(1/2)*(OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2))/(2*R_l*((OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)^(1/2)) - (3^(1/2)*(OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)*((TestPointsX(k)/2 + (3^(1/2)*TestPointsY(k))/2)^2 + (OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + R_l^2 - R_r^2 + TestPointsZ(k)^2))/(4*R_l*((OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)^(3/2)))/(1 - ((TestPointsX(k)/2 + (3^(1/2)*TestPointsY(k))/2)^2 + (OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + R_l^2 - R_r^2 + TestPointsZ(k)^2)^2/(4*R_l^2*((OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)))^(1/2), ((VM - OQ + TestPointsY(k)/2 - (3^(1/2)*TestPointsX(k))/2 + 3^(1/2)*(TestPointsX(k)/2 + (3^(1/2)*TestPointsY(k))/2))/(2*R_l*((OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)^(1/2)) + ((OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)*((TestPointsX(k)/2 + (3^(1/2)*TestPointsY(k))/2)^2 + (OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + R_l^2 - R_r^2 + TestPointsZ(k)^2))/(4*R_l*((OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)^(3/2)))/(1 - ((TestPointsX(k)/2 + (3^(1/2)*TestPointsY(k))/2)^2 + (OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + R_l^2 - R_r^2 + TestPointsZ(k)^2)^2/(4*R_l^2*((OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)))^(1/2) + ((OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2/(2*((OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)^(3/2)) - 1/(2*((OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)^(1/2)))/(1 - (OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2/((OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2))^(1/2), (TestPointsZ(k)/(R_l*((OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)^(1/2)) - (TestPointsZ(k)*((TestPointsX(k)/2 + (3^(1/2)*TestPointsY(k))/2)^2 + (OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + R_l^2 - R_r^2 + TestPointsZ(k)^2))/(2*R_l*((OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)^(3/2)))/(1 - ((TestPointsX(k)/2 + (3^(1/2)*TestPointsY(k))/2)^2 + (OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + R_l^2 - R_r^2 + TestPointsZ(k)^2)^2/(4*R_l^2*((OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)))^(1/2) - (TestPointsZ(k)*(OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2))/((1 - (OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2/((OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2))^(1/2)*((OQ - VM - TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)^(3/2));
            ((TestPointsX(k)/2 - (3^(1/2)*TestPointsY(k))/2 + 3^(1/2)*(VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2))/(2*R_l*((VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)^(1/2)) - (3^(1/2)*(VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)*((TestPointsX(k)/2 - (3^(1/2)*TestPointsY(k))/2)^2 + (VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + R_l^2 - R_r^2 + TestPointsZ(k)^2))/(4*R_l*((VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)^(3/2)))/(1 - ((TestPointsX(k)/2 - (3^(1/2)*TestPointsY(k))/2)^2 + (VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + R_l^2 - R_r^2 + TestPointsZ(k)^2)^2/(4*R_l^2*((VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)))^(1/2) - (3^(1/2)/(2*((VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)^(1/2)) - (3^(1/2)*(VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2)/(2*((VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)^(3/2)))/(1 - (VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2/((VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2))^(1/2), ((VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2 - 3^(1/2)*(TestPointsX(k)/2 - (3^(1/2)*TestPointsY(k))/2))/(2*R_l*((VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)^(1/2)) - ((VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)*((TestPointsX(k)/2 - (3^(1/2)*TestPointsY(k))/2)^2 + (VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + R_l^2 - R_r^2 + TestPointsZ(k)^2))/(4*R_l*((VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)^(3/2)))/(1 - ((TestPointsX(k)/2 - (3^(1/2)*TestPointsY(k))/2)^2 + (VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + R_l^2 - R_r^2 + TestPointsZ(k)^2)^2/(4*R_l^2*((VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)))^(1/2) + ((VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2/(2*((VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)^(3/2)) - 1/(2*((VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)^(1/2)))/(1 - (VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2/((VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2))^(1/2), (TestPointsZ(k)/(R_l*((VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)^(1/2)) - (TestPointsZ(k)*((TestPointsX(k)/2 - (3^(1/2)*TestPointsY(k))/2)^2 + (VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + R_l^2 - R_r^2 + TestPointsZ(k)^2))/(2*R_l*((VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)^(3/2)))/(1 - ((TestPointsX(k)/2 - (3^(1/2)*TestPointsY(k))/2)^2 + (VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + R_l^2 - R_r^2 + TestPointsZ(k)^2)^2/(4*R_l^2*((VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)))^(1/2) + (TestPointsZ(k)*(VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2))/((1 - (VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2/((VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2))^(1/2)*((VM - OQ + TestPointsY(k)/2 + (3^(1/2)*TestPointsX(k))/2)^2 + TestPointsZ(k)^2)^(3/2))];
        J = -transpose(inv(J));
        %Если требуется рассмотреть наихудшее направление в каждой точке
        if worDir == 1
            M_max_TP = [norm(J(1, :))*F, norm(J(2, :))*F, norm(J(3, :))*F];
        else
            %Иначе
            M_max_TP = [J(1, :)*F_vect, J(2, :)*F_vect, J(3, :)*F_vect];
        end
        %Находим максимальный момент среди рычагов
        Mmax = max([abs(M_max_TP), Mmax]);
    end
    maxM = Mmax*10^(-3)
else
    %Иначе
    errordlg('Выбранная область не входит в рабочую зону', 'Ошибка');
end

Тот, кто разбирался с прошлыми алгоритмами, разберётся и с этим. Вот небольшая иллюстрация, показывающая смысл входных данных:

image-loader.svg

Гораздо интереснее случай перемещения с высоким ускорением — это основное применение дельта-робота.

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

Приведённую к точке V массу всего механизма image-loader.svg найдём, как сумму приведённых масс от его звеньев:

(2)(2)

где image-loader.svg — приведённая к точке V масса каретки (подвижной платформы);

image-loader.svg — приведённые к точке V массы рычагов механизма.

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

© Habrahabr.ru