Создание функции для обратной кинематики замкнутой формы
генерирует функцию с указанным именем, ikFunction = generateIKFunction(analyticalIK,functionName)functionName, которая вычисляет решения замкнутой формы для обратной кинематики (IK) для выбранной кинематической группы для достижения желаемой конечной эффекторной позы. Чтобы создать список конфигураций, которые достигают желаемой конечной эффекторной позы, используйте сгенерированную функцию ikFunction. Указанное analyticalInverseKinematics объект analyticalIK должен содержать допустимую кинематическую группу. Для получения информации об определении допустимых кинематических групп см. showdetails функция.
Синтаксис созданной функции см. в разделе ikFunction выходной аргумент.
Создание решений обратной кинематики (IK) замкнутой формы для требуемого конечного эффектора. Загрузить предоставленную модель робота и проверить сведения о возможных кинематических группах тел основания и концевых эффекторов. Создайте функцию для нужной кинематической группы. Проверьте различные конфигурации для конкретной позы концевого эффектора.
Модель робота
Загрузите модель робота ABB IRB 120 в рабочее пространство. Отображение модели.
robot = loadrobot('abbIrb120','DataFormat','row'); show(robot);

Аналитический ИК
Создайте аналитический решатель IK. Показать сведения о модели робота, в которой перечислены различные кинематические группы, доступные для аналитических решений IK закрытой формы. Выберите вторую кинематическую группу, щелкнув ссылку Использовать эту кинематическую группу во второй строке таблицы.
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

Некоторые модели роботов-манипуляторов имеют большие степени свободы (DOF). Однако для достижения определенных конечных эффекторных поз требуется только шесть DOF. Используйте 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
Выберите группу программным способом, используя выходные данные showdetails функция объекта, opts. Выбранная группа использует левое плечо в качестве основания, а левое запястье - в качестве концевого эффектора.
aik.KinematicGroup = opts(1).KinematicGroup; disp(aik.KinematicGroup)
BaseName: 'l_shoulder_pan_link'
EndEffectorBodyName: 'l_wrist_roll_link'
Создайте функцию IK для выбранной группы.
generateIKFunction(aik,'willowRobotIK');Решить аналитический ИК
Определите целевую конечную эффекторную позу, используя произвольно сгенерированную конфигурацию.
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 - Аналитический решатель ИКanalyticalInverseKinematics объектАналитический решатель обратной кинематики, указанный как analyticalInverseKinematics объект.
functionName - Наименование сформированной функцииИмя созданной функции, указанное как строковый скалярный или символьный вектор.
Пример: "jacoIKSolver"
Типы данных: char | string
ikFunction - решатель ИК для выбранной кинематической группыРешатель 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 - Применение пределов соединения модели дерева жесткого тела1 (true) | 0 (false)Принудительное наложение пределов соединения на модель дерева жесткого тела, заданную как логическая, 1 (true или 0 (false). Если установлено значение false, решатель игнорирует пределы соединения модели робота в свойстве HusingBodyTree analyticalInverseKinematics объект.
Типы данных: logical
sortByDistance - Сортировать конфигурации по расстоянию от желаемой позы1 (true) | 0 (false)Сортировать конфигурации по расстоянию от желаемой позы, указанной как логическая, 1 (true или 0 (false).
Типы данных: logical
referenceConfig - Эталонная конфигурация для решения IKСсылочная конфигурация для решения IK, заданная как вектор n-элемента, где n - количество нефиксированных соединений в модели робота дерева жесткого тела. Каждый элемент соответствует положению соединения в виде либо угла поворота в радианах для вращающихся соединений, либо линейного расстояния в метрах для призматических соединений.
Типы данных: single | double
analyticalInverseKinematics объект поддерживает только генерацию кода для функции, созданной вызовом generateIKFunction. Используйте analyticalInverseKinematics для изменения параметров и настройки решателя. Затем используйте generateIKFunction для создания пользовательской функции IK для модели робота. Звонить codegen (Кодер MATLAB) на выходе ikFunction генерируется.
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.