Выполните вперед и инверсная кинематика на роботе с пятью панелями

В этом примере показано, как использовать KinematicsSolver объект выполнить прямую кинематику (FK) и инверсную кинематику (IK) на автоматизированном механизме с пятью панелями. Во-первых, пример демонстрирует, как выполнить исследования FK, чтобы вычислить рабочую область без сингулярности для робота с пятью панелями. Затем пример показывает, как выполнить исследования IK, чтобы вычислить моторные углы, которые соответствуют траектории исполнительного элемента конца в той рабочей области.

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

Теоретически, робот с пятью панелями имеет четыре режима пробела настройки: --, -+, ++, и +-. Как показано в изображении, каждый знак указывает на знак угла смещения между соответствующими ближайшими и дистальными ссылками. Активные шарнирные соединения a и b непосредственно управляются двигателями и пассивными шарнирными соединениями c и d соедините ближайшие и дистальные ссылки.

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

Запустите прямую кинематику на роботе с пятью панелями

Этот раздел демонстрирует, как выполнить исследования FK, чтобы вычислить рабочую область без сингулярности для пера, которое соответствует набору моторных углов. А именно, пример присваивает активные углы поворота шарнира робота как целевые переменные и координаты X и Y пера как выходные переменные. Пример также присваивает пассивные соединения и ориентацию пера как переменные исходного предположения, которые используются, чтобы помочь склонять решения к +- режим.

1. Чтобы выполнить исследования FK, сначала загрузите модель робота с пятью панелями в память и создайте KinematicsSolver объект (fk) для модели.

mdl = 'sm_five_bar_robot';
load_system(mdl);
fk = simscape.multibody.KinematicsSolver(mdl);

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

Добавьте группу поступательных и вращательных переменных системы координат для пера к fk. Задайте мировую систему координат как основу и систему координат Совета пера как последователь. Назовите группу переменной системы координат Pen. Объект имеет шесть переменных системы координат: три поступательных и три вращательных.

base = mdl + "/World Frame/W";
follower = mdl + "/Five Bar Robot/Pen/Pen/Tip";
addFrameVariables(fk,'Pen','Translation', base, follower);
addFrameVariables(fk,'Pen','Rotation', base, follower);

3. Присвойте основанные на положении объединенные переменные активных соединений (j5.Rz.q и j4.Rz.q) как цели. Чтобы найти идентификаторы основанных на положении объединенных переменных, используйте jointPositionVariables объектная функция.

jointPositionVariables(fk)
ans=5×4 table
       ID           JointType                                  BlockPath                               Unit 
    _________    ________________    ______________________________________________________________    _____

    "j1.Rz.q"    "Revolute Joint"    "sm_five_bar_robot/Five Bar Robot/Passive_Joint_c"                "deg"
    "j2.Rz.q"    "Revolute Joint"    "sm_five_bar_robot/Five Bar Robot/Passive_Joint_d"                "deg"
    "j3.Rz.q"    "Revolute Joint"    "sm_five_bar_robot/Five Bar Robot/Passive_Joint_e"                "deg"
    "j4.Rz.q"    "Revolute Joint"    "sm_five_bar_robot/Five Bar Robot/Step_Motor_a/Active_Joint_a"    "deg"
    "j5.Rz.q"    "Revolute Joint"    "sm_five_bar_robot/Five Bar Robot/Step_Motor_b/Active_Joint_b"    "deg"

targetIDs = ["j5.Rz.q";"j4.Rz.q"];
addTargetVariables(fk,targetIDs);

4. Присвойте эти переменные как выходные параметры:

  • Поступательные компоненты X и Y пера (Pen.Translation.x и Pen.Translation.y)

  • Объединенные переменные пассивных соединений (j1.Rz.q и j2.Rz.q)

  • Вращательный z компонент пера (Pen.Rotation.z)

Чтобы найти идентификаторы переменных системы координат, используйте frameVariables объектная функция.

frameVariables(fk)
ans=6×4 table
            ID                           Base                                      Follower                       Unit 
    ___________________    _________________________________    ______________________________________________    _____

    "Pen.Translation.x"    "sm_five_bar_robot/World Frame/W"    "sm_five_bar_robot/Five Bar Robot/Pen/Pen/Tip"    "m"  
    "Pen.Translation.y"    "sm_five_bar_robot/World Frame/W"    "sm_five_bar_robot/Five Bar Robot/Pen/Pen/Tip"    "m"  
    "Pen.Translation.z"    "sm_five_bar_robot/World Frame/W"    "sm_five_bar_robot/Five Bar Robot/Pen/Pen/Tip"    "m"  
    "Pen.Rotation.x"       "sm_five_bar_robot/World Frame/W"    "sm_five_bar_robot/Five Bar Robot/Pen/Pen/Tip"    "deg"
    "Pen.Rotation.y"       "sm_five_bar_robot/World Frame/W"    "sm_five_bar_robot/Five Bar Robot/Pen/Pen/Tip"    "deg"
    "Pen.Rotation.z"       "sm_five_bar_robot/World Frame/W"    "sm_five_bar_robot/Five Bar Robot/Pen/Pen/Tip"    "deg"

outputIDs = ["Pen.Translation.x";"Pen.Translation.y";"j1.Rz.q";"j2.Rz.q";"Pen.Rotation.z"];
addOutputVariables(fk,outputIDs);

5. Присвойте объединенные переменные пассивных соединений (j1.Rz.q и j2.Rz.q) и вращательный z компонент пера (Pen.Rotation.z) как предположения.

guessIDs = ["j1.Rz.q";"j2.Rz.q";"Pen.Rotation.z"];
addInitialGuessVariables(fk,guessIDs);

6. Изображение является эскизом робота с пятью панелями. Углы активных соединений θa и θb, и пассивные соединения θc и θd. Используйте вложенный for цикл, чтобы вычислить рабочую область пера для набора активных углов поворота шарнира, которые варьируются между [95, 150] и [30, 85] степени, соответственно. Гарантировать, что робот находится в +- режим, используйте [50 - 50 - 110] степени как начальные значения для переменных предположения (j1.Rz.q, j2.Rz.q, и Pen.Rotation.z) и затем используйте последние значения переменных предположения, чтобы вести следующее решение FK.

guesses = [50 -50 -110]; % Initial guesses for theta_c, theta_d, and rotational z componenet of the pen
index = 1;

% Generate angles for theta_a and theta_b
theta_a = linspace(95,150,31);
theta_b = linspace(30,85,31);

% Allocate memory for output data
ik_data = zeros(length(theta_a)*length(theta_b),length(outputIDs));

% Calculate the robot's workspace for the given theta_a and theta_b
for i = 1:length(theta_a)
    for j = 1:length(theta_b)
        targets = [theta_b(j),theta_a(i)];
        [outputVec,statusFlag] = solve(fk,targets,guesses);  
        if statusFlag == 1 % Save a solution if its statusFlag is 1
            ik_data(index,1:length(outputIDs)) = outputVec;
            index = index + 1;
            guesses = [outputVec(3),outputVec(4),outputVec(5)]; % Update next guess with last solution
        end
    end
end

7. Постройте углы пассивных соединений, чтобы проверить, находится ли робот с пятью панелями в +- режим. Если робот находится в +- режим, значения θc и θd последовательно положительны и отрицательны, соответственно.

figure
plot(ik_data(1:index-1,3),'b','LineWidth',2); % Note that the total number of the solutions that satisfy statusFlag equals to index-1;
hold on
plot(ik_data(1:index-1,4),'k','LineWidth',2);
hold off


title('Passive Joint Angles')
xlabel('Index')
ylabel('Angle (Degrees)')
legend('Joint c','Joint d')

Figure contains an axes object. The axes object with title Passive Joint Angles contains 2 objects of type line. These objects represent Joint c, Joint d.

График показывает, что робот с пятью панелями находится в +- режим. Кроме того, вычисленная рабочая область без сингулярности потому что значения θc и θd вдали от нуля.

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

% Plot the top-view image of the five-bar robot
figure  
x = [-1 1];
y = [1 -1];
C = imread('top_view_five_bar_robot.png');
image(x,y,C)

hold on

% Plot the calculated workspace as blue dots
plot(ik_data(:,1),ik_data(:,2),'b.')
ylabel('y (m)')
xlabel('x (m)')
axis equal
axis([-1 1 -1 1]);
hold off

Figure contains an axes object. The axes object contains 2 objects of type image, line.

Запустите инверсную кинематику на роботе с пятью панелями

В этом разделе пример показывает, как выполнить исследования IK, чтобы вычислить моторные углы, которые соответствуют траектории исполнительного элемента конца. А именно, пример присваивает поступательные компоненты X и Y пера как целевые переменные и присваивает моторные углы как выходные переменные. Затем пример вычисляет моторные углы для траектории пера. Гарантировать робота находится в +- режим, используйте пассивные соединения и перьевую ориентацию как предположения, чтобы сместить решения IK. Обратите внимание на то, что необходимо запустить раздел FK прежде, чем запустить этот раздел.

1. Задайте круговую траекторию исполнительного элемента конца в ранее расчетной рабочей области. Сохраните координаты круга для исследований IK.

figure
% Plot the calculated workspace as blue dots on the top-view image of the five-bar robot
image(x,y,C)
hold on
plot(ik_data(:,1),ik_data(:,2),'b.')

% Specify the center and radius of the circle
center_x = 0; % m
center_y = 0.3; % m
radius = 0.15; % m
th = 0:pi/50:2*pi; % radians

% Save the x and y coordinates of the circle for the IK analyses
coordinates_x = radius * cos(th) + center_x;
coordinates_y = radius * sin(th) + center_y;

% Plot the circle
plot(coordinates_x,coordinates_y,'r','LineWidth',2)
axis equal
axis([-1 1 -1 1]);
ylabel('Length (m)')
xlabel('Width (m)')
hold off

Figure contains an axes object. The axes object contains 3 objects of type image, line.

2. Чтобы выполнить исследования IK, сначала создайте KinematicsSolver объект (ik) для модели.

ik = simscape.multibody.KinematicsSolver(mdl);

3. Чтобы сформулировать исследования IK, создайте переменные системы координат для настройки для пера относительно мировой системы координат и добавьте их в объект (ik). Можно снова использовать основу и переменные последователя из раздела FK.

addFrameVariables(ik, 'Pen','Translation', base, follower);
addFrameVariables(ik, 'Pen','Rotation', base, follower);

4. Присвойте переменные, которые соответствуют поступательным компонентам X и Y пера (Pen.Translation.x и Pen.Translation.y) как цели. Чтобы найти идентификаторы переменных системы координат, используйте frameVariables объектная функция.

frameVariables(ik)
ans=6×4 table
            ID                           Base                                      Follower                       Unit 
    ___________________    _________________________________    ______________________________________________    _____

    "Pen.Translation.x"    "sm_five_bar_robot/World Frame/W"    "sm_five_bar_robot/Five Bar Robot/Pen/Pen/Tip"    "m"  
    "Pen.Translation.y"    "sm_five_bar_robot/World Frame/W"    "sm_five_bar_robot/Five Bar Robot/Pen/Pen/Tip"    "m"  
    "Pen.Translation.z"    "sm_five_bar_robot/World Frame/W"    "sm_five_bar_robot/Five Bar Robot/Pen/Pen/Tip"    "m"  
    "Pen.Rotation.x"       "sm_five_bar_robot/World Frame/W"    "sm_five_bar_robot/Five Bar Robot/Pen/Pen/Tip"    "deg"
    "Pen.Rotation.y"       "sm_five_bar_robot/World Frame/W"    "sm_five_bar_robot/Five Bar Robot/Pen/Pen/Tip"    "deg"
    "Pen.Rotation.z"       "sm_five_bar_robot/World Frame/W"    "sm_five_bar_robot/Five Bar Robot/Pen/Pen/Tip"    "deg"

targetIds = ["Pen.Translation.x";"Pen.Translation.y"];
addTargetVariables(ik,targetIds);

5. Присвойте эти переменные как выходные параметры:

  • Основанные на положении объединенные переменные активных соединений (j5.Rz.q и j4.Rz.q)

  • Основанные на положении объединенные переменные пассивных соединений (j1.Rz.q и j2.Rz.q)

  • Переменная вращательного z компонента пера (Pen.Rotation.z)

Чтобы найти идентификаторы основанных на положении объединенных переменных, используйте jointPositionVariables объектная функция.

jointPositionVariables(ik)
ans=5×4 table
       ID           JointType                                  BlockPath                               Unit 
    _________    ________________    ______________________________________________________________    _____

    "j1.Rz.q"    "Revolute Joint"    "sm_five_bar_robot/Five Bar Robot/Passive_Joint_c"                "deg"
    "j2.Rz.q"    "Revolute Joint"    "sm_five_bar_robot/Five Bar Robot/Passive_Joint_d"                "deg"
    "j3.Rz.q"    "Revolute Joint"    "sm_five_bar_robot/Five Bar Robot/Passive_Joint_e"                "deg"
    "j4.Rz.q"    "Revolute Joint"    "sm_five_bar_robot/Five Bar Robot/Step_Motor_a/Active_Joint_a"    "deg"
    "j5.Rz.q"    "Revolute Joint"    "sm_five_bar_robot/Five Bar Robot/Step_Motor_b/Active_Joint_b"    "deg"

outputIds = ["j5.Rz.q";"j4.Rz.q";"j1.Rz.q";"j2.Rz.q";"Pen.Rotation.z"];
addOutputVariables(ik,outputIds);

6. Используйте for цикл, чтобы реализовать исследования IK. А именно, используйте for цикл, чтобы присвоить координаты предопределенной траектории к перу и вычислить соответствующие моторные углы.

N = length(coordinates_x); % Number of points on trajectory
index_in_ik = 1;
ik_data = zeros(N,length(outputIds)); % Allocate memory for the variable

for ind = 1:N
    targets = [coordinates_x(ind), coordinates_y(ind)]; % Use the x and y coordinates of the predefined circle for the inverse kinematics problem
    [outputVec_ik,statusFlag_ik] = solve(ik,targets);
    if statusFlag_ik == 1 
        viewSolution(ik) % View the solution in the Kinematics Solver Viewer
        ik_data(index_in_ik,1:length(outputIds)) = outputVec_ik; % save the output data
        index_in_ik = index_in_ik+1;   
    else
        error('Did not hit targets');
    end
end
closeViewer(ik);

7. Постройте пассивные соединения робота, чтобы видеть, находится ли робот в +- режим.

% Plot the angles of the passive joints
figure
plot(ik_data(:,3),'b','LineWidth',2);
hold on
plot(ik_data(:,4),'k','LineWidth',2);
hold off
title('Passive Joint Angles')
xlabel('Point')
ylabel('Angle (Degrees)')
legend('Joint c','Joint d')

Figure contains an axes object. The axes object with title Passive Joint Angles contains 2 objects of type line. These objects represent Joint c, Joint d.

График показывает, что робот не находится в +- режим, потому что значения обоих пассивных соединений положительны.

Во время исследований IK Средство просмотра Решателя Кинематики открывает и показывает анимацию процесса. Анимация также показывает, что результат не желаем, потому что робот с пятью панелями не находится в +- режим. Изображение показывает снимок состояния анимации.

8. Чтобы помочь гарантировать, что все решения остаются дома + - режим, присвойте объединенные переменные пассивных соединений (j1.Rz.q и j2.Rz.q) и переменная вращательного z компонента пера (Pen.Rotation.z) как предполагает, чтобы сместить решения IK.

guessIds = ["j1.Rz.q";"j2.Rz.q";"Pen.Rotation.z"];
addInitialGuessVariables(ik,guessIds);

Используйте [50 - 50 - 110] степени как начальные значения для переменных предположения (j1.Rz.q, j2.Rz.q, и Pen.Rotation.z) и используйте последние значения переменных предположения, чтобы вести следующее решение IK.

guesses = [50 -50 -110]; % Assign initial guesses for passive joints and z rotation component of the pen
N = length(coordinates_x);
index_in_ik = 1;
ik_data = zeros(N,length(outputIds)); % Allocate memory for the variable
for ind = 1:N
    targets = [coordinates_x(ind), coordinates_y(ind)]; % Use the x and y coordinates of the prescribed circle for the inverse kinematics problem
    [outputVec_ik,statusFlag_ik] = solve(ik,targets, guesses);
    if statusFlag_ik == 1 
        viewSolution(ik) % View the solution in the Kinematics Solver Viewer
        ik_data(index_in_ik,1:length(outputIds)) = outputVec_ik; % Save the rotations of the motors
        index_in_ik=index_in_ik+1;
        guesses = [outputVec_ik(3) outputVec_ik(4) outputVec_ik(5)]; % Update next guess with last solution
    else
        error('Did not hit targets');
    end
end
closeViewer(ik);

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

% Plot the angles of the passive joints
figure
plot(ik_data(:,3),'b','LineWidth',2);
hold on
plot(ik_data(:,4),'k','LineWidth',2);
hold off
title('Passive Joint Angles')
xlabel('Index')
ylabel('Angle (Degrees)')
legend('Joint c','Joint d')

Figure contains an axes object. The axes object with title Passive Joint Angles contains 2 objects of type line. These objects represent Joint c, Joint d.

Смотрите также

| | | | | | | | | | | |

Похожие темы