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

Аналитический IK
Создайте аналитический решатель 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, которая генерирует все решения для желаемого положения end-effector. Отобразите первую сгенерированное строение, чтобы убедиться, что требуемое положение достигнуто.
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

Некоторые модели роботов имеют большие степени свободы (DOFs). Однако для достижения определенных конечных эффекторных положений требуется только шесть чИСЛО СТЕПЕНЕЙ СВОБОДЫ. Используйте analyticalInverseKinematics объект, который поддерживает роботов с шестью DOF, для определения различных действительных кинематических групп для этой модели робота с большим DOF. Используйте 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');Решение аналитического IK
Задайте целевое положение end-effector с помощью случайным образом сгенерированного строения.
rng(0); expConfig = randomConfiguration(robot); eeBodyName = aik.KinematicGroup.EndEffectorBodyName; baseName = aik.KinematicGroup.BaseName; expEEPose = getTransform(robot,expConfig,eeBodyName,baseName);
Решите для всех строений робота, которые достигают заданного положения end-effector с помощью сгенерированной функции IK. Чтобы игнорировать пределы соединений, задайте false как второй входной параметр.
ikConfig = willowRobotIK(expEEPose,false);
Чтобы отобразить целевое положение end-effector в мировой системе координат, получите преобразование из основы модели робота, а не основы кинематической группы. Отображение всех сгенерированных решений 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 - Желаемое концевое-эффекторное положениеЖелаемое положение end-effector, заданное как матрица однородного преобразования 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решатель игнорирует пределы соединений модели робота в свойстве RigidBodyTree analyticalInverseKinematics объект.
Типы данных: logical
sortByDistance - Сортировка строений на основе расстояния от требуемого положения1 (true) | 0 (false)Сортировка строений на основе расстояния от требуемого положения, заданная как логический, 1 (true или 0 (false).
Типы данных: logical
referenceConfig - Ссылочное строение для решения IKСсылочное строение для решения IK, заданная как вектор n-element, где n - количество нефиксированных соединений в модели робота-древовидного твердого тела. Каждый элемент соответствует положению соединения как угол поворота в радианах для шарниров вращения или линейное расстояние в метрах для призматических соединений.
Типы данных: single | double
The analyticalInverseKinematics объект поддерживает генерацию кода только для функции, созданной вызовом generateIKFunction. Используйте analyticalInverseKinematics объект для изменения параметров и настройки решателя. Затем используйте generateIKFunction чтобы создать пользовательскую функцию IK для модели робота. Звонить codegen (MATLAB Coder) на выходном ikFunction это сгенерировано.
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.