Сгенерируйте функцию для инверсной кинематики закрытой формы
генерирует функцию с указанным именем, 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
analyticalIK
— Аналитический решатель IKanalyticalInverseKinematics
объектАналитический решатель инверсной кинематики в виде analyticalInverseKinematics
объект.
functionName
— Имя сгенерированной функцииИмя сгенерированной функции в виде строкового скаляра или вектора символов.
Пример: "jacoIKSolver"
Типы данных: char |
string
ikFunction
— Решатель IK для выбранной кинематической группыРешатель IK для выбранной кинематической группы, возвращенной как указатель на функцию. Функция генерирует решения закрытой формы и имеет эти опции синтаксиса:
robotConfig = ikFunction(eeTransform) robotConfig = ikFunction(eeTransform,enforceJointLimits) robotConfig = ikFunction(eeTransform,enforceJointLimits,sortByDistance) robotConfig = ikFunction(eeTransform,enforceJointLimits,sortByDistance,referenceConfig)
eeTransform
— Желаемое положение исполнительного элемента концаЖелаемое положение исполнительного элемента конца в виде гомогенной матрицы преобразования 4 на 4. Чтобы сгенерировать матрицу преобразования от позиционного xyz и ориентация кватерниона, используйте trvec2tform
и quat2tform
функции на соответствующих координатах и умножают получившиеся матрицы.
tform1 = trvec2tform([x y z]); tform2 = quat2tform([qw qx qy qz]); eeTransform = tform1*tform2;
Типы данных: single
| double
enforceJointLimits
— Осуществите объединенные пределы модели дерева твердого тела
TRUE
) | 0
ложь
)Осуществите объединенные пределы модели дерева твердого тела в виде логического, 1
TRUE
или 0
ложь
). Когда установлено в false
, решатель игнорирует объединенные пределы модели робота в свойстве RigidBodyTree analyticalInverseKinematics
объект.
Типы данных: логический
sortByDistance
— Сортировка настроек на основе расстояния от желаемого положения
TRUE
) | 0
ложь
)Сортировка настроек на основе расстояния от желаемого положения в виде логического, 1
TRUE
или 0
ложь
).
Типы данных: логический
referenceConfig
— Ссылочная настройка для решения IKСсылочная настройка для решения IK в виде n - вектор элемента, где n является количеством нефиксированных соединений в модели робота дерева твердого тела. Каждый элемент соответствует объединенной позиции угла поворота в радианах для шарнирных соединений или как линейного расстояния в метрах для призматических соединений.
Типы данных: single
| double
analyticalInverseKinematics
возразите только генерации кода поддержек для функции, созданной путем вызова generateIKFunction
. Используйте analyticalInverseKinematics
объект изменить параметры и установить решатель. Затем используйте generateIKFunction
чтобы создать ваш пользовательский IK функционируют для вашей модели робота. Вызвать codegen
(MATLAB Coder) на выходе ikFunction
это сгенерировано.
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.