Дельта положения Робота с использованием обобщенной обратной кинематики

Моделируйте робота дельты с помощью rigidBodyTree модель робота. Задайте кинематические ограничения для обобщенной обратной кинематики (GIK), чтобы гарантировать правильное поведение робота. Решите для строений соединений, которые подчиняются заданной модели и ограничениям.

Создайте робота Delta

Обычно дельта- роботы содержат кинематические цепи с обратной связью. The rigidBodyTree объект не поддерживает цепей с обратной связью. Чтобы избежать этого, робот моделируется как дерево, при этом руки дельта-робота остаются несвязанными. Вызовите функцию-помощника, которая создает модель робота и выводит rigidBodyTree object.

На следующем этапе решатель обобщенной обратной кинематики применит ограничения, которые заставляют отдельные плечи дерева перемещаться вместе, таким образом гарантируя, что робот ведет себя кинематически точно.

Робот довольно сложен, поэтому для создания объекта rigidBodyTree используется функция-помощник.

robot = exampleHelperDeltaRobot;
show(robot);

Figure contains an axes. The axes contains 43 objects of type patch, line. These objects represent base, arm1_body1, arm1_body2, arm1_body3, arm1_body4, arm1_body5, arm1_body6, base_120, arm2_body1, arm2_body2, arm2_body3, arm2_body4, arm2_body5, arm2_body6, base_240, arm3_body1, arm3_body2, arm3_body3, arm3_body4, arm3_body5, arm3_body6, endEffector.

Как показано, робот состоит из трех рук, но их еще нужно подключить, чтобы соответствовать классическому строению дельта-робота.

Создайте обратные кинематические ограничения

Создайте 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);

Figure Interactive Visualization contains an axes. The axes contains 53 objects of type patch, line, surface. This object represents base.

Теперь, когда конечный эффектор перемещается, ограничения соблюдаются, и руки остаются связанными.

Решение обобщенной обратной кинематики программно

Интерактивная визуализация полезна для проверки ограничений решателя, но для прямого программного использования создайте отдельный решатель 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);

Figure contains an axes. The axes contains 43 objects of type patch, line. These objects represent base, arm1_body1, arm1_body2, arm1_body3, arm1_body4, arm1_body5, arm1_body6, base_120, arm2_body1, arm2_body2, arm2_body3, arm2_body4, arm2_body5, arm2_body6, base_240, arm3_body1, arm3_body2, arm3_body3, arm3_body4, arm3_body5, arm3_body6, endEffector.