Моделируйте робота дельты с помощью rigidBodyTree
модель робота. Задайте кинематические ограничения для обобщенной обратной кинематики (GIK), чтобы гарантировать правильное поведение робота. Решите для строений соединений, которые подчиняются заданной модели и ограничениям.
Обычно дельта- роботы содержат кинематические цепи с обратной связью. The rigidBodyTree
объект не поддерживает цепей с обратной связью. Чтобы избежать этого, робот моделируется как дерево, при этом руки дельта-робота остаются несвязанными. Вызовите функцию-помощника, которая создает модель робота и выводит rigidBodyTree object
.
На следующем этапе решатель обобщенной обратной кинематики применит ограничения, которые заставляют отдельные плечи дерева перемещаться вместе, таким образом гарантируя, что робот ведет себя кинематически точно.
Робот довольно сложен, поэтому для создания объекта rigidBodyTree используется функция-помощник.
robot = exampleHelperDeltaRobot; show(robot);
Как показано, робот состоит из трех рук, но их еще нужно подключить, чтобы соответствовать классическому строению дельта-робота.
Создайте generalizedInverseKinematics
объект и задайте модель робота. Ограничьте максимальное количество взаимодействий в зависимости от эффективности.
gik1 = generalizedInverseKinematics('RigidBodyTree', robot);
gik1.SolverParameters.MaxIterations = 20;
Создайте interactiveRigidBodyTree
объект для визуализации модели робота и предоставления интерактивных маркеров для движущихся контактирующих тел Эта интерактивность помогает проверить ваши кинематические ограничения. Задайте gik1
решатель, использующий пары "имя-значение". Задайте вектор веса положения, который фокусируется только на xyz-положении, а не на ориентации.
viztree = interactiveRigidBodyTree(robot, 'IKSolver', gik1, 'SolverPoseWeights', [0 1]);
Используя этот интерактивный объект, конечный эффектор можно перетащить, чтобы показать, как робот перемещается. В настоящее время поведение не так желательно для нормального дельта- робота.
Сохраните текущие системы координат.
ax = gca;
Добавьте ограничения к решателю GIK, чтобы убедиться, что рычаги соединены. Прикрепите два рычага без концевого эффектора к 6-му корпусу первичного рычага, который включает в себя концевой эффектор.
% Ensure that the body 6 of arm 2 maintains a pose relative to body 6 of arm 1 poseTgt1 = constraintPoseTarget('arm2_body6'); poseTgt1.ReferenceBody = 'arm1_body6'; poseTgt1.TargetTransform = trvec2tform([-sqrt(3)*0.5*0.2, 0.5*0.2, 0]) * eul2tform([2*pi/3, 0, 0]); % Ensure that the body 6 of arm 3 maintains a pose relative to body 6 of arm 1 poseTgt2 = constraintPoseTarget('arm3_body6'); poseTgt2.ReferenceBody = 'arm1_body6'; poseTgt2.TargetTransform = trvec2tform([-sqrt(3)*0.5*0.2, -0.5*0.2, 0]) * eul2tform([-2*pi/3, 0, 0]);
Чтобы применить эти ограничения к роботу, позвоните addConstraint
на vizTree
объект.
addConstraint(viztree,poseTgt1); addConstraint(viztree,poseTgt2);
Теперь, когда конечный эффектор перемещается, ограничения соблюдаются, и руки остаются связанными.
Интерактивная визуализация полезна для проверки ограничений решателя, но для прямого программного использования создайте отдельный решатель GIK, который можно вызвать. Этот решатель может быть скопирован из IKSolver
свойство interactiveRigidBodyTree
объект, или созданный независимо.
gik2 = generalizedInverseKinematics('RigidBodyTree', robot);
gik2.SolverParameters.MaxIterations = 20;
Для решателя GIK требуется дополнительное ограничение, чтобы задать положение конечного эффектора, которое обычно управляется интерактивным маркером. Обновление TargetTransform
для решения различных желаемых положений концевого эффектора.
poseTgt3 = constraintPoseTarget('endEffector'); poseTgt3.ReferenceBody = 'base'; poseTgt3.TargetTransform = trvec2tform([0, 0, -1]);
Задайте все типы ограничений, используемые решателем.
gik2.ConstraintInputs = {'pose','pose', 'pose'};
Вызовите gik2
решатель с заданными объектами ограничений положения. Дайте начальное предположение о домашнем строении робота. Показать решение.
% Provide an initial guess for the solver q0 = homeConfiguration(robot); % Solve for a the target pose given to poseTgt3 [q, solutionInfo] = gik2(q0, poseTgt1, poseTgt2, poseTgt3); % Visualize the results figure; show(robot, q);