Этот пример показывает, как проследить предопределенную 3-D форму на пробеле. После сглаженного, отличного пути полезно во многих приложениях робототехники, таких как сварка, производство или контроль. 3-D траектория решена на пробеле задачи для трассировки мембраны MATLAB® и выполняется с помощью робота Сойера от Rethink Robotics®. Цель состоит в том, чтобы сгенерировать сглаженный путь для исполнительного элемента конца fo робот, чтобы следовать базирующийся.
Трассировка Формы Манипулятора в MATLAB и примере Simulink показывает, как сгенерировать тесно дискретизированный набор сегментов, которые могут затем быть переданы решателю инверсной кинематики, который будет решен с помощью итеративного решения. Однако этот пример предлагает альтернативный подход, чтобы уменьшать вычислительную сложность. Этот пример разделяет сегменты путей во всего несколько дискретных точек и использования, сглаживающего функции, чтобы интерполировать между waypoints. Этот подход должен сгенерировать более сглаженную траекторию и повысить эффективность во время выполнения.
Этот пример использует робота Сойера от 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®. Мембранная поверхность и сегменты пути сгенерированы как массивы ячеек с помощью функции помощника 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
Чтобы гарантировать, что робот может проследить вывод, визуализируйте форму в рабочей области робота. Покажите робота 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
Создайте инверсную кинематику (IK) с помощью загруженного дерева твердого тела sawyer
. Это первоначально сконфигурировано с универсальным набором весов, с помощью домашней настройки в качестве исходного предположения. Установите исходное предположение на домашнюю настройку и допуски положения с универсальными весами. Исполнительный элемент конца для решателя IK является корпусом 'right_hand'
робота.
ik = robotics.InverseKinematics('RigidBodyTree', sawyer); initialGuess = sawyer.homeConfiguration; weights = [1 1 1 1 1 1]; eeName = 'right_hand';
Используйте решатель инверсной кинематики, чтобы сгенерировать набор объединенного пробела waypoints, которые дают объединенные настройки для робота в каждой точке сгенерированного 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
Используйте модель shapeTracingSawyer
, чтобы выполнить траектории и моделировать их на кинематической модели робота.
open_system("shapeTracingSawyer.slx")
Модель Simulink имеет две основных части:
Раздел Trajectory Generation берет матрицу сегментов пути объединенного пробела, jointPathSegmentMatrix, и преобразовывает сегменты в набор дискретизированного объединенного пробела waypoints (объединенные настройки) на каждом временном шаге в симуляции с помощью блока MATLAB function. Полиномиальный Блок Траектории преобразовывает набор объединенных настроек к сглаживавшей объединенной траектории B-сплайна пробела вовремя.
Раздел Robot Kinematics Simulation принимает объединенный пробел waypoints от сглаживавшей траектории и вычисляет получившееся положение исполнительного элемента конца для робота.
Генерация траектории
Симуляция кинематики робота
Моделируйте модель, чтобы выполнить сгенерировать траектории.
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
В дополнение к визуализации выше, поведение трассировки может быть воссоздано с помощью модели робота Сойера. Выполните итерации через объединенные настройки в jointConfigurationData
, чтобы визуализировать робота с помощью show
и постоянно строить положение исполнительного элемента конца на 3-D пробеле.
% 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