generateIKFunction

Сгенерируйте функцию для инверсной кинематики закрытой формы

Описание

пример

ikFunction = generateIKFunction(analyticalIK,functionName) генерирует функцию с указанным именем, functionName, это вычисляет решения закрытой формы для инверсной кинематики (IK) для выбранной кинематической группы, чтобы достигнуть желаемого положения исполнительного элемента конца. Чтобы сгенерировать список настроек, которые достигают желаемого положения исполнительного элемента конца, используйте сгенерированный функциональный ikFunction. Заданный analyticalInverseKinematics объект analyticalIK должен содержать допустимую кинематическую группу. Для получения информации об определении допустимых кинематических групп смотрите showdetails функция.

Для синтаксиса сгенерированной функции смотрите ikFunction выходной аргумент.

Примеры

свернуть все

Сгенерируйте решения для инверсной кинематики (IK) закрытой формы для желаемого исполнительного элемента конца. Загрузите предоставленную модель робота и смотрите детали о выполнимых кинематических группах корпусов исполнительного элемента конца и основы. Сгенерируйте функцию для своей желаемой кинематической группы. Смотрите различные настройки для определенного положения исполнительного элемента конца.

Модель робота

Загрузите модель робота ABB IRB 120 в рабочую область. Отобразите модель.

robot = loadrobot('abbIrb120','DataFormat','row');
show(robot);

Аналитический IK

Создайте аналитический решатель IK. Покажите детали для модели робота, которая перечисляет различные кинематические группы, доступные для закрытой формы аналитические решения IK. Выберите вторую кинематическую группу путем нажатия на Use эта кинематическая ссылка группы во второй строке таблицы.

aik = analyticalInverseKinematics(robot);
showdetails(aik)
--------------------
Robot: (8 bodies)

Index      Base Name   EE Body Name     Type                    Actions
-----      ---------   ------------     ----                    -------
    1      base_link         link_6   RRRSSS   Use this kinematic group
    2      base_link          tool0   RRRSSS   Use this kinematic group

Смотрите кинематическую группу, которая перечисляет основу и имена корпуса исполнительного элемента конца. Для этого робота группа использует 'base_link' и 'tool0' тела, соответственно.

aik.KinematicGroup
ans = struct with fields:
               BaseName: 'base_link'
    EndEffectorBodyName: 'tool0'

Сгенерируйте функцию

Сгенерируйте функцию IK для выбранной кинематической группы. Задайте имя для функции, которая сгенерирована и сохранена в текущем каталоге.

generateIKFunction(aik,'robotIK');

Задайте желаемое положение исполнительного элемента конца. Преобразуйте xyz-позиционное в гомогенное преобразование.

eePosition = [0 0.5 0.5];
eePose = trvec2tform(eePosition);
hold on
plotTransforms(eePosition,tform2quat(eePose))
hold off

Сгенерируйте настройку для решения IK

Задайте гомогенное преобразование к сгенерированной функции IK, которая генерирует все решения для желаемого положения исполнительного элемента конца. Отобразите первую сгенерированную настройку, чтобы проверить, что желаемое положение было достигнуто.

ikConfig = robotIK(eePose); % Uses the generated file

show(robot,ikConfig(1,:));
hold on
plotTransforms(eePosition,tform2quat(eePose))
hold off

Отобразите всю закрытую форму решения IK последовательно.

figure;
numSolutions = size(ikConfig,1);

for i = 1:size(ikConfig,1)
    subplot(1,numSolutions,i)
    show(robot,ikConfig(i,:));
end

Некоторые модели робота манипулятора имеют большие степени свободы (ЧИСЛО СТЕПЕНЕЙ СВОБОДЫ). Чтобы достигнуть определенных положений исполнительного элемента конца, однако, только шесть ЧИСЕЛ СТЕПЕНЕЙ СВОБОДЫ требуются. Используйте analyticalInverseKinematics объект, который поддерживает роботов с шестью степенями свободы, чтобы определить различные допустимые кинематические группы для этой модели робота большой степени свободы. Используйте showdetails возразите функции, чтобы получить информацию о модели.

Загрузите модель робота и сгенерируйте решатель IK

Загрузите модель робота в рабочую область и создайте analyicalInverseKinematics объект. Используйте showdetails возразите функции, чтобы видеть поддерживаемые кинематические группы.

robot = loadrobot('willowgaragePR2','DataFormat','row');
aik = analyticalInverseKinematics(robot);
opts = showdetails(aik);
--------------------
Robot: (94 bodies)

Index                                          Base Name                                       EE Body Name     Type                    Actions
-----                                          ---------                                       ------------     ----                    -------
    1                                l_shoulder_pan_link                                  l_wrist_roll_link   RSSSSS   Use this kinematic group
    2                                r_shoulder_pan_link                                  r_wrist_roll_link   RSSSSS   Use this kinematic group
    3                                l_shoulder_pan_link                                l_gripper_palm_link   RSSSSS   Use this kinematic group
    4                                r_shoulder_pan_link                                r_gripper_palm_link   RSSSSS   Use this kinematic group
    5                                l_shoulder_pan_link                                l_gripper_led_frame   RSSSSS   Use this kinematic group
    6                                l_shoulder_pan_link                 l_gripper_motor_accelerometer_link   RSSSSS   Use this kinematic group
    7                                l_shoulder_pan_link                               l_gripper_tool_frame   RSSSSS   Use this kinematic group
    8                                r_shoulder_pan_link                                r_gripper_led_frame   RSSSSS   Use this kinematic group
    9                                r_shoulder_pan_link                 r_gripper_motor_accelerometer_link   RSSSSS   Use this kinematic group
   10                                r_shoulder_pan_link                               r_gripper_tool_frame   RSSSSS   Use this kinematic group

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

aik.KinematicGroup = opts(1).KinematicGroup;
disp(aik.KinematicGroup)
               BaseName: 'l_shoulder_pan_link'
    EndEffectorBodyName: 'l_wrist_roll_link'

Сгенерируйте функцию IK для выбранной группы.

generateIKFunction(aik,'willowRobotIK');

Решите аналитический IK

Задайте целевое положение исполнительного элемента конца с помощью случайным образом сгенерированной настройки.

rng(0);
expConfig = randomConfiguration(robot);

eeBodyName = aik.KinematicGroup.EndEffectorBodyName;
baseName = aik.KinematicGroup.BaseName;
expEEPose = getTransform(robot,expConfig,eeBodyName,baseName);

Решите для всех настроек робота, которые достигают заданного положения исполнительного элемента конца с помощью сгенерированной функции IK. Чтобы проигнорировать объединенные пределы, задайте false как второй входной параметр.

ikConfig = willowRobotIK(expEEPose,false);

Чтобы отобразить целевое положение исполнительного элемента конца в мировой системе координат, получите преобразование от основы модели робота, а не основы кинематической группы. Отобразите все сгенерированные решения IK путем определения индексов для кинематической группы решение IK в векторе настройки, используемом с show функция.

eeWorldPose = getTransform(robot,expConfig,eeBodyName);

generatedConfig = repmat(expConfig, size(ikConfig,1), 1);
generatedConfig(:,aik.KinematicGroupConfigIdx) = ikConfig;

for i = 1:size(ikConfig,1)
    figure;
    ax = show(robot,generatedConfig(i,:));
    hold all;
    plotTransforms(tform2trvec(eeWorldPose),tform2quat(eeWorldPose),'Parent',ax);
    title(['Solution ' num2str(i)]);
end

Входные параметры

свернуть все

Аналитический решатель инверсной кинематики в виде analyticalInverseKinematics объект.

Имя сгенерированной функции в виде строкового скаляра или вектора символов.

Пример: "jacoIKSolver"

Типы данных: char | string

Выходные аргументы

свернуть все

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

robotConfig = ikFunction(eeTransform)
robotConfig = ikFunction(eeTransform,enforceJointLimits)
robotConfig = ikFunction(eeTransform,enforceJointLimits,sortByDistance)
robotConfig = ikFunction(eeTransform,enforceJointLimits,sortByDistance,referenceConfig)

Желаемое положение исполнительного элемента конца в виде гомогенной матрицы преобразования 4 на 4. Чтобы сгенерировать матрицу преобразования от позиционного xyz и ориентация кватерниона, используйте trvec2tform и quat2tform функции на соответствующих координатах и умножают получившиеся матрицы.

tform1 = trvec2tform([x y z]);
tform2 = quat2tform([qw qx qy qz]);
eeTransform = tform1*tform2;

Типы данных: single | double

Осуществите объединенные пределы модели дерева твердого тела в виде логического, 1 TRUE или 0 ложь). Когда установлено в false, решатель игнорирует объединенные пределы модели робота в свойстве RigidBodyTree analyticalInverseKinematics объект.

Типы данных: логический

Сортировка настроек на основе расстояния от желаемого положения в виде логического, 1 TRUE или 0 ложь).

Типы данных: логический

Ссылочная настройка для решения IK в виде n - вектор элемента, где n является количеством нефиксированных соединений в модели робота дерева твердого тела. Каждый элемент соответствует объединенной позиции угла поворота в радианах для шарнирных соединений или как линейного расстояния в метрах для призматических соединений.

Типы данных: single | double

Расширенные возможности

Введенный в R2020b