Создайте ограничение на относительное положение тела
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
— Положение цели относительно ссылочного тела
(значение по умолчанию) | [x y z]
векторПоложение цели относительно ссылочного тела, заданного как [x y z]
вектор. Целевое положение является точкой, заданной в ссылочной системе координат тела.
Пример:
PositionTolerance
— Максимальное позволенное расстояние от цели
(значение по умолчанию) | числовой скалярМаксимальное позволенное расстояние от цели в метрах, заданных в виде числа. Это значение является верхней границей на расстоянии между источником исполнительного элемента конца и целевым положением.
Пример:
Weights
— Вес ограничения
(значение по умолчанию) | числовой скалярВес ограничения, заданного в виде числа. Этот вес используется с Weights
свойство всех ограничений задано в generalizedInverseKinematics
правильно сбалансировать каждое ограничение.
Пример:
В этом примере показано, как использовать обобщенную инверсную кинематику, чтобы запланировать объединенную пространственную траекторию автоматизированный манипулятор. Это комбинирует несколько ограничений, чтобы сгенерировать траекторию, которая ведет механизм захвата к опоре чашки на таблицу. Эти ограничения гарантируют, что механизм захвата приближается к чашке в прямой линии и что механизм захвата остается на безопасном расстоянии от таблицы, не требуя, чтобы положения механизма захвата были определены заранее.
Настройте модель робота
Этот пример использует модель LBR KUKA iiwa, 7 манипуляторов робота степени свободы. importrobot
генерирует a rigidBodyTree
модель из описания сохранена в файле Объединенного формата описания робота (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 см от центра чашки
Этот пример использует ограничительные объекты сгенерировать настройки робота, которые удовлетворяют этим критериям. Сгенерированная траектория состоит из пяти настроек waypoints. Первый waypoint, q0
, установлен как домашняя настройка. Предварительно выделите остальную часть настроек в qWaypoints
использование repmat
.
numWaypoints = 5; q0 = homeConfiguration(lbr); qWaypoints = repmat(q0, numWaypoints, 1);
Создайте a generalizedInverseKinematics
решатель, который принимает следующие ограничительные входные параметры:
Декартовы границы - Пределы высота механизма захвата
Цель положения - Задает положение чашки относительно механизма захвата.
Ограничение стремления - Выравнивает механизм захвата с осью чашки
Цель ориентации - Обеспечивает фиксированную ориентацию для механизма захвата при приближении к чашке
Объединенные границы положения - Пределы изменение в объединенных положениях между waypoints.
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.005
distanceFromCup = 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
решатель. Необходимо задать все входные ограничения. Установите ту настройку как второй waypoint.
[qWaypoints(2,:),solutionInfo] = gik(q0, heightAboveTable, ... distanceFromCup, alignWithCup, fixOrientation, ... limitJointChange);
Найдите настройки, которые перемещают механизм захвата в Кубок вдоль прямой линии
Повторно включите объединенное связанное положение и ограничения ориентации.
limitJointChange.Weights = ones(size(limitJointChange.Weights)); fixOrientation.Weights = 1;
Отключите выровнять с чашкой ограничение, когда ограничение ориентации сокращает его.
alignWithCup.Weights = 0;
Установите ограничение ориентации содержать ориентацию на основе предыдущей настройки (qWaypoints(2,:)
). Получите преобразование от механизма захвата до основы модели робота. Преобразуйте гомогенное преобразование в кватернион.
fixOrientation.TargetOrientation = ...
tform2quat(getTransform(lbr,qWaypoints(2,:),gripper));
Задайте расстояние между чашкой и механизмом захвата для каждого waypoint
finalDistanceFromCup = 0.05; distanceFromCupValues = linspace(intermediateDistance, finalDistanceFromCup, numWaypoints-1);
Задайте максимальное позволенное изменение в объединенных положениях между каждым waypoint.
maxJointChange = deg2rad(10);
Вызовите решатель для каждого остающегося waypoint.
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
Визуализируйте сгенерированную траекторию
Интерполируйте между waypoints, чтобы сгенерировать сглаженную траекторию. Использование 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
объект был переименован от robotics.PositionTarget
. Используйте constraintPositionTarget
для всего создания объекта.
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.