Создание зависимости относительно положения тела
constraintPositionTarget объект описывает ограничение, которое требует, чтобы положение одного тела (конечного эффектора) соответствовало целевому положению в пределах допуска расстояния в любом направлении. Целевое положение задается относительно рамки тела эталонного тела.
Объекты-ограничения используются в generalizedInverseKinematics объекты для задания нескольких кинематических зависимостей на роботе.
Пример использования нескольких объектов-зависимостей см. в разделе Планирование траектории с несколькими кинематическими зависимостями.
возвращает целевой объект позиции, который представляет ограничение на теле модели робота, указанной positionConst = constraintPositionTarget(endeffector)endeffector.
возвращает целевой объект позиции с каждым указанным именем свойства, равным указанному значению, на один или несколько positionConst = constraintPositionTarget(endeffector,Name,Value)Name,Value аргументы пары.
endeffector - Имя конечного эффектораИмя конечного эффектора, указанное как строковый скалярный или символьный вектор. При использовании этого ограничения с generalizedInverseKinematics, имя должно соответствовать телу, указанному в модели робота (rigidBodyTree).
Пример: "left_palm"
Типы данных: char | string
EndEffector - Имя конечного эффектораИмя конечного эффектора, заданного как строковый скалярный или символьный вектор. При использовании этого ограничения с generalizedInverseKinematics, имя должно соответствовать телу, указанному в модели робота (rigidBodyTree).
Пример: "left_palm"
Типы данных: char | string
ReferenceBody - Наименование опорной рамки корпуса'' (по умолчанию) | символьный векторИмя опорной основной рамки, указанное как символьный вектор. Дефолт '' указывает, что ограничение находится относительно основания модели робота. При использовании этого ограничения с generalizedInverseKinematics, имя должно соответствовать телу, указанному в модели робота (rigidBodyTree).
Пример:
TargetPosition - Положение цели относительно опорного тела[0 0 0] (по умолчанию) | [x y z] векторПоложение цели относительно тела привязки, указанное как [x y z] вектор. Целевое положение - это точка, указанная в рамке опорного тела.
Пример:
PositionTolerance - Максимально допустимое расстояние от цели0 (по умолчанию) | числовой скалярМаксимально допустимое расстояние от цели в метрах, указанное как числовой скаляр. Это значение является верхней границей расстояния между конечным началом эффектора и целевой позицией.
Пример:
Weights - Вес ограничения1 (по умолчанию) | числовой скалярВес ограничения, заданного как числовой скаляр. Этот вес используется вместе с Weights свойства всех ограничений, указанных в generalizedInverseKinematics чтобы правильно сбалансировать каждое ограничение.
Пример:
В этом примере показано, как использовать обобщенную обратную кинематику для планирования пространственно-совместной траектории роботизированного манипулятора. Он объединяет несколько зависимостей для создания траектории, которая направляет захват к чашке, опирающейся на стол. Эти ограничения гарантируют, что захват приближается к чашке по прямой линии и что захват остается на безопасном расстоянии от стола, не требуя предварительного определения положения захвата.
Настройка модели робота
В этом примере используется модель KUKA LBR iiwa, робота-манипулятора 7 степени свободы. importrobot генерирует rigidBodyTree модель из описания, хранящегося в файле Unified Robot Description Format (URDF).
lbr = importrobot('iiwa14.urdf'); % 14 kg payload version lbr.DataFormat = 'row'; gripper = 'iiwa_link_ee_kuka';
Определите размеры чашки.
cupHeight = 0.2; cupRadius = 0.05; cupPosition = [-0.5, 0.5, cupHeight/2];
Добавьте фиксированное тело к модели робота, представляющей центр чашки.
body = rigidBody('cupFrame');
setFixedTransform(body.Joint, trvec2tform(cupPosition))
addBody(lbr, body, lbr.BaseName);Определение проблемы планирования
Целью этого примера является создание последовательности конфигураций роботов, удовлетворяющих следующим критериям:
Запуск в домашней конфигурации
Нет резких изменений в конфигурации робота
Держите захват на высоте не менее 5 см над «столом» (z = 0)
Захват должен быть совмещен с чашкой по мере приближения
Отделка захватом в 5 см от центра чашки
В этом примере объекты ограничения используются для создания конфигураций роботов, удовлетворяющих этим критериям. Сформированная траектория состоит из пяти ППМ конфигурации. Первый ППМ, q0, устанавливается в качестве домашней конфигурации. Предварительное распределение остальных конфигураций в qWaypoints использование repmat.
numWaypoints = 5; q0 = homeConfiguration(lbr); qWaypoints = repmat(q0, numWaypoints, 1);
Создать generalizedInverseKinematics решатель, принимающий следующие входные данные ограничения:
Декартовы границы - ограничивает высоту захвата
Цель положения - указывает положение чашки относительно захвата.
Зависимость прицеливания - выравнивает захват по оси чаши
Цель ориентации - поддерживает фиксированную ориентацию захвата при приближении к чашке
Границы положения стыка - ограничивает изменение положений стыка между ППМ.
gik = generalizedInverseKinematics('RigidBodyTree', lbr, ... 'ConstraintInputs', {'cartesian','position','aiming','orientation','joint'})
gik =
generalizedInverseKinematics with properties:
NumConstraints: 5
ConstraintInputs: {1x5 cell}
RigidBodyTree: [1x1 rigidBodyTree]
SolverAlgorithm: 'BFGSGradientProjection'
SolverParameters: [1x1 struct]
Создание объектов зависимостей
Создайте объекты зависимости, которые передаются в качестве входных данных решателю. Эти объекты содержат параметры, необходимые для каждого ограничения. При необходимости измените эти параметры между вызовами решателя.
Создайте декартово ограничение границ, которое требует, чтобы захват находился на высоте не менее 5 см над таблицей (отрицательное направление z). Все остальные значения указаны как inf или -inf.
heightAboveTable = constraintCartesianBounds(gripper); heightAboveTable.Bounds = [-inf, inf; ... -inf, inf; ... 0.05, inf]
heightAboveTable =
constraintCartesianBounds with properties:
EndEffector: 'iiwa_link_ee_kuka'
ReferenceBody: ''
TargetTransform: [4x4 double]
Bounds: [3x2 double]
Weights: [1 1 1]
Наложите зависимость на положение стакана относительно захвата с допуском 5 мм.
distanceFromCup = constraintPositionTarget('cupFrame');
distanceFromCup.ReferenceBody = gripper;
distanceFromCup.PositionTolerance = 0.005distanceFromCup =
constraintPositionTarget with properties:
EndEffector: 'cupFrame'
ReferenceBody: 'iiwa_link_ee_kuka'
TargetPosition: [0 0 0]
PositionTolerance: 0.0050
Weights: 1
Создайте зависимость нацеливания, для которой требуется ось Z iiwa_link_ee чтобы рама была приблизительно вертикальной, поместив цель далеко над роботом. iiwa_link_ee рама ориентирована так, что эта зависимость выравнивает захват с осью чаши.
alignWithCup = constraintAiming('iiwa_link_ee');
alignWithCup.TargetPoint = [0, 0, 100]alignWithCup =
constraintAiming with properties:
EndEffector: 'iiwa_link_ee'
ReferenceBody: ''
TargetPoint: [0 0 100]
AngularTolerance: 0
Weights: 1
Создайте ограничение границ положения соединения. Установите Bounds свойство этого ограничения на основе предыдущей конфигурации для ограничения изменения положений соединения.
limitJointChange = constraintJointBounds(lbr)
limitJointChange =
constraintJointBounds with properties:
Bounds: [7x2 double]
Weights: [1 1 1 1 1 1 1]
Создайте зависимость ориентации для ручки с допуском в один градус. Это ограничение требует, чтобы ориентация захвата соответствовала значению, заданному параметром TargetOrientation собственность. Это ограничение используется для фиксации ориентации захвата во время окончательного приближения к чашке.
fixOrientation = constraintOrientationTarget(gripper); fixOrientation.OrientationTolerance = deg2rad(1)
fixOrientation =
constraintOrientationTarget with properties:
EndEffector: 'iiwa_link_ee_kuka'
ReferenceBody: ''
TargetOrientation: [1 0 0 0]
OrientationTolerance: 0.0175
Weights: 1
Найти конфигурацию, которая указывает на кубок
Эта конфигурация должна помещать захват на некотором расстоянии от стакана, так что окончательный подход может быть сделан с захватом, надлежащим образом выровненным.
intermediateDistance = 0.3;
Объекты-ограничения имеют Weights свойство, определяющее, как решатель обрабатывает конфликтующие ограничения. Установка нулевого веса ограничения отключает ограничение. Для этой конфигурации отключите ограничения положения соединения и ограничение ориентации.
limitJointChange.Weights = zeros(size(limitJointChange.Weights)); fixOrientation.Weights = 0;
Установите целевое положение стакана в рамке захвата. Чашка должна лежать на оси Z захвата на заданном расстоянии.
distanceFromCup.TargetPosition = [0,0,intermediateDistance];
Решите для конфигурации робота, которая удовлетворяет входным ограничениям, используя gik решатель. Необходимо указать все ограничения ввода. Задайте эту конфигурацию в качестве второго ППМ.
[qWaypoints(2,:),solutionInfo] = gik(q0, heightAboveTable, ... distanceFromCup, alignWithCup, fixOrientation, ... limitJointChange);
Поиск конфигураций, перемещающих захват в чашу вдоль прямой линии
Повторно включите ограничения положения соединения и ориентации.
limitJointChange.Weights = ones(size(limitJointChange.Weights)); fixOrientation.Weights = 1;
Отключите ограничение align-with-cup, так как ограничение ориентации делает его избыточным.
alignWithCup.Weights = 0;
Установите ограничение ориентации для удержания ориентации на основе предыдущей конфигурации (qWaypoints(2,:)). Переход от захвата к базе модели робота. Преобразование однородного преобразования в кватернион.
fixOrientation.TargetOrientation = ...
tform2quat(getTransform(lbr,qWaypoints(2,:),gripper));Определение расстояния между чашкой и захватом для каждой ППМ
finalDistanceFromCup = 0.05; distanceFromCupValues = linspace(intermediateDistance, finalDistanceFromCup, numWaypoints-1);
Определите максимально допустимое изменение позиций соединения между каждым ППМ.
maxJointChange = deg2rad(10);
Вызовите решатель для каждого оставшегося ППМ.
for k = 3:numWaypoints % Update the target position. distanceFromCup.TargetPosition(3) = distanceFromCupValues(k-1); % Restrict the joint positions to lie close to their previous values. limitJointChange.Bounds = [qWaypoints(k-1,:)' - maxJointChange, ... qWaypoints(k-1,:)' + maxJointChange]; % Solve for a configuration and add it to the waypoints array. [qWaypoints(k,:),solutionInfo] = gik(qWaypoints(k-1,:), ... heightAboveTable, ... distanceFromCup, alignWithCup, ... fixOrientation, limitJointChange); end
Визуализация созданной траектории
Интерполяция между ППМ для создания гладкой траектории. Использовать pchip во избежание перестрелок, которые могут нарушить границы соединения робота.
framerate = 15; r = rateControl(framerate); tFinal = 10; tWaypoints = [0,linspace(tFinal/2,tFinal,size(qWaypoints,1)-1)]; numFrames = tFinal*framerate; qInterp = pchip(tWaypoints,qWaypoints',linspace(0,tFinal,numFrames))';
Вычислите положение захвата для каждой интерполированной конфигурации.
gripperPosition = zeros(numFrames,3); for k = 1:numFrames gripperPosition(k,:) = tform2trvec(getTransform(lbr,qInterp(k,:), ... gripper)); end
Отображение робота в его начальной конфигурации вместе с таблицей и чашкой
figure; show(lbr, qWaypoints(1,:), 'PreservePlot', false); hold on exampleHelperPlotCupAndTable(cupHeight, cupRadius, cupPosition); p = plot3(gripperPosition(1,1), gripperPosition(1,2), gripperPosition(1,3));

Анимация манипулятора и печать положения захвата.
hold on for k = 1:size(qInterp,1) show(lbr, qInterp(k,:), 'PreservePlot', false); p.XData(k) = gripperPosition(k,1); p.YData(k) = gripperPosition(k,2); p.ZData(k) = gripperPosition(k,3); waitfor(r); end hold off

Если необходимо сохранить сгенерированные конфигурации в MAT-файл для последующего использования, выполните следующие действия.
>> save('lbr_trajectory.mat', 'tWaypoints', 'qWaypoints');
constraintPositionTarget был переименованИзменение поведения в будущем выпуске
constraintPositionTarget объект был переименован из robotics.PositionTarget. Использовать constraintPositionTarget для создания всех объектов.
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.