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