Трассировка формы манипулятора в MATLAB и Simulink

В этом примере показано, как проследить предопределенную 3-D форму в пространстве. Следование плавному, четкому пути полезно во многих робототехнических приложениях, таких как сварка, производство или осмотр. Траектория 3-D решается в пространстве задач для трассировки мембраны MATLAB ® и выполняется с помощью робота Sawyer из Rethink Robotics ®. Цель состоит в том, чтобы сгенерировать гладкий путь для конечного эффектора робота, чтобы следовать на основе установленных путевых точек.

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

Загрузка робота

В этом примере используется робот Sawyer из Rethink Robotics ®. Импортируйте файл URDF, задающий динамику твердого тела. Установите DataFormat использовать векторы-столбцы для определения строений робота. Simulink ® использует векторы-столбцы. Пределы пространства задач заданы на основе эмпирических данных.

sawyer = importrobot('sawyer.urdf');
sawyer.DataFormat = 'column';
taskSpaceLimits = [0.25 0.5; -0.125 0.125; -0.15 0.1];
numJoints = 8; % Number of joints in robot

Сгенерируйте набор путевых точек пространства задач

В данном примере цель состоит в том, чтобы получить набор сегментов контура, которые отслеживают логотип мембраны MATLAB ®. Мембранная поверхность и сегменты контура генерируются как массивы ячеек с помощью функции helper generateMembranePaths. Чтобы визуализировать пути, наложенные на поверхность, постройте график поверхности с помощью surf и сегменты контура путем итерации через массив ячеек сегмента контура. Можно увеличить numSamples чтобы пробовать более мелко через surace.

numSamples = 7;
[pathSegments, surface] = generateMembranePaths(numSamples, taskSpaceLimits);

% Visualize the output
figure
surf(surface{:},'FaceAlpha',0.3,'EdgeColor','none');
hold all
for i=1:numel(pathSegments)
    segment = pathSegments{i};
    plot3(segment(:,1),segment(:,2),segment(:,3),'x-','LineWidth', 2);
end
hold off

Figure contains an axes. The axes contains 7 objects of type surface, line.

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

figure
show(sawyer);
hold all

for i=1:numel(pathSegments)
    segment = pathSegments{i};
    plot3(segment(:,1),segment(:,2),segment(:,3),'x-','LineWidth',2);
end

view(135,20)
axis([-1 1 -.5 .5 -1 .75])
hold off

Figure contains an axes. The axes contains 59 objects of type patch, line. These objects represent base, controller_box, pedestal_feet, pedestal, right_arm_base_link, right_l0, head, screen, head_camera, right_l1, right_l2, right_l3, right_l4, right_arm_itb, right_l5, right_hand_camera, right_l6, right_hand, right_wrist, right_torso_itb, torso, pedestal_mesh, right_arm_base_link_mesh, right_l0_mesh, head_mesh, screen_mesh, right_l1_mesh, right_l2_mesh, right_l3_mesh, right_l4_mesh, right_l5_mesh, right_l6_mesh, torso_mesh.

Создайте решатель обратной кинематики

Создайте обратную кинематику (IK), используя загруженную sawyer древовидное твердое тело. Первоначально он сконфигурирован с единым набором весов, используя домашнее строение в качестве исходного предположения. Установите начальное предположение в исходное строение и допуски положения с равномерными весами. Конечным эффектором для решателя IK является 'right_hand' тело робота.

ik = inverseKinematics('RigidBodyTree', sawyer);
initialGuess = sawyer.homeConfiguration;
weights = [1 1 1 1 1 1];
eeName = 'right_hand';

Преобразуйте точки пути пространства задач в пространство соединений с помощью обратной кинематики

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

% Initialize the output matrix
jointPathSegmentMatrix = zeros(length(pathSegments),numJoints,numSamples);

% Define the orientation so that the end effector is oriented down
sawyerOrientation = axang2rotm([0 1 0 pi]);

% Compute IK at each waypoint along each segment
for i = 1:length(pathSegments)
    currentTaskSpaceSegment = pathSegments{i};
    currentJointSegment = zeros(numJoints, length(currentTaskSpaceSegment));
    for j = 1:length(currentTaskSpaceSegment)
        pose = [sawyerOrientation currentTaskSpaceSegment(j,:)'; 0 0 0 1];
        currentJointSegment(:,j) = ik(eeName,pose,weights,initialGuess);
        initialGuess = currentJointSegment(:,j);
    end
    
    jointPathSegmentMatrix(i, :, :) = (currentJointSegment);
end

Загрузка модели Simulink

Используйте shapeTracingSawyer модель, чтобы выполнить траектории и симулировать их на кинематической модели робота.

open_system("shapeTracingSawyer.slx")

Модель Simulink имеет две основные части:

  1. Раздел Генерация траектории берёт матрицу сегментов контура пространства соединений, jointPathSegmentMatrix, и преобразует сегменты в набор дискретизированных точек пути пространства соединений (строения соединений) на каждом временном шаге симуляции с помощью Блока MATLAB function. Блок Полиномиальной Траектории преобразует набор строений соединений в сглаженное пространство соединений B-сплайн траектории во времени.

  2. Раздел Симуляции кинематики робота принимает путевые точки пространства соединений из сглаженной траектории и вычисляет полученное положение концевого эффектора для робота.

Генерация траектории

Симуляция кинематики робота

Выполните траектории пространства соединений в Simulink

Симулируйте модель, чтобы выполнить генерацию траекторий.

sim("shapeTracingSawyer.slx")

Просмотр результатов генерации траектории

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

% End effector positions
xPositionsEE = reshape(eePosData.Data(1,:,:),1,size(eePosData.Data,3));
yPositionsEE = reshape(eePosData.Data(2,:,:),1,size(eePosData.Data,3));
zPositionsEE = reshape(eePosData.Data(3,:,:),1,size(eePosData.Data,3));

% Extract joint-space results
jointConfigurationData = reshape(jointPosData.Data, numJoints, size(eePosData.Data,3));

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

figure
surf(surface{:},'FaceAlpha',0.3,'EdgeColor','none');
hold all
plot3(xPositionsEE,yPositionsEE,zPositionsEE)
grid on
hold off

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

Визуализация движения робота

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

% For faster visualization, only display every few steps
vizStep = 5;

% Initialize a new figure window
figure
set(gcf,'Visible','on');

% Iterate through all joint configurations and end-effectort positions
for i = 1:vizStep:length(xPositionsEE)
    show(sawyer, jointConfigurationData(:,i),'Frames','off','PreservePlot',false);
    hold on
    plot3(xPositionsEE(1:i),yPositionsEE(1:i),zPositionsEE(1:i),'b','LineWidth',3)
    
    view(135,20)
    axis([-1 1 -.5 .5 -1 .75])
    
    drawnow
end
hold off

Figure contains an axes. The axes contains 253 objects of type line, patch. These objects represent base, controller_box, pedestal_feet, pedestal, right_arm_base_link, right_l0, head, screen, head_camera, right_l1, right_l2, right_l3, right_l4, right_arm_itb, right_l5, right_hand_camera, right_l6, right_hand, right_wrist, right_torso_itb, torso, pedestal_mesh, right_arm_base_link_mesh, right_l0_mesh, head_mesh, screen_mesh, right_l1_mesh, right_l2_mesh, right_l3_mesh, right_l4_mesh, right_l5_mesh, right_l6_mesh, torso_mesh.