Моделирование дельта-робота с помощью rigidBodyTree модель робота. Задание кинематических ограничений для обобщенной обратной кинематики (GIK) для обеспечения правильного поведения робота. Решение для конфигураций соединений, соответствующих определенной модели и ограничениям.
Обычно дельта-роботы содержат кинематические цепи с замкнутым контуром. 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);
