Main Content

analyticalInverseKinematics

Resolver la cinemática inversa de forma cerrada

Desde R2020b

Descripción

El objeto analyticalInverseKinematics genera funciones que calculan todas las soluciones de la cinemática inversa (IK) de forma cerrada para manipuladores de cadenas en serie utilizando un enfoque basado en el método de Pieper [1]. El objeto genera una función personalizada para encontrar múltiples configuraciones de articulaciones distintas que consigan la pose de efector final deseada para un grupo cinemático de un modelo de robot de árbol de cuerpo rígido, dado que el grupo cinemático especificado representa un manipulador en serie de seis DOF aplicable con una muñeca y parámetros cinemáticos compatibles. Una muñeca se define como tres articulaciones rotativas consecutivas con ejes ortogonales.

Estos son los elementos clave del solver:

  • Modelo de robot: modelo de árbol de cuerpo rígido que define la cinemática del robot. Especifique este modelo como objeto rigidBodyTree cuando cree el solver.

  • Grupo cinemático: nombres de cuerpo de la base y del efector final para una cadena en serie de seis DOF que forma parte del modelo de robot. Para establecer este parámetro, utilice la función showdetails.

  • Tipo de grupo cinemático: clasificación de las articulaciones que conectan la base al efector final.

Para ver todos los posibles grupos cinemáticos admitidos para el robot, utilice la función de objeto showdetails. Para establecer un grupo específico de la lista, haga clic en el enlace Use this kinematic group de un grupo cinemático de la lista devuelta.

Para calcular la cinemática inversa de un grupo cinemático específico, utilice la función de objeto generateIKFunction. Para asegurarse de que el modelo del robot y el grupo cinemático son compatibles, compruebe la propiedad IsValidGroupForIK después de seleccionar un grupo cinemático.

Para generar soluciones numéricas, utilice los objetos inverseKinematics y generalizedInverseKinematics.

Creación

Descripción

ejemplo

analyticalIK = analyticalInverseKinematics(robotRBT) crea un solver de cinemática inversa analítica para un modelo de robot de árbol de cuerpo rígido, especificado como un objeto rigidBodyTree. El efector final es el cuerpo final que figura en la propiedad Bodies del modelo de robot. El argumento robotRBT establece la propiedad RigidBodyTree.

analyticalIK = analyticalInverseKinematics(robotRBT,'KinematicGroup',kinGroup) establece la propiedad KinematicGroup en el argumento kinGroup, especificado como una estructura.

Propiedades

expandir todo

Modelo de robot de árbol de cuerpo rígido, especificado como un objeto rigidBodyTree. Para utilizar un modelo de robot proporcionado, consulte loadrobot. Para importar modelos de formato de descripción de robot unificado (URDF), consulte la función importrobot.

Nombres de cuerpo de la base y del efector final, especificados como una estructura. La estructura contiene estos campos:

  • BaseName: nombre del cuerpo del modelo de robot almacenado en la propiedad RigidBodyTree que representa la base del grupo cinemático. El valor predeterminado es la base de la propiedad RigidBodyTree.

  • EndEffectorBodyName: nombre del cuerpo del modelo de robot almacenado en la propiedad RigidBodyTree que representa el final del grupo cinemático. El valor predeterminado es el último cuerpo de la propiedad Bodies del modelo de robot.

Un grupo cinemático válido debe representar una cadena en serie de seis DOF con una muñeca y debe contener tipos de articulaciones definidos por KinematicGroupType como 'XXXSSS'. Una muñeca se define como tres articulaciones rotativas consecutivas con ejes ortogonales con parámetros cinemáticos compatibles y se representa como SSS. XXX son tres articulaciones rotacionales RRR u otra muñeca SSS. Si el tipo de grupo cinemático contiene una articulación prismática, P, el grupo cinemático no es válido para su uso con este solver. Para comprobar si el grupo cinemático es válido para este solver, consulte la propiedad IsValidGroupForIK.

Cuando se crea, el objeto selecciona automáticamente un grupo cinemático del modelo de robot, pero puede haber otras opciones disponibles. Para ver los grupos cinemáticos válidos para el modelo, utilice la función de objeto showdetails.

Ejemplo: struct("BaseName","base","EndEffectoryBodyName","tool0")

Tipos de datos: struct

Esta propiedad o parámetro es de solo lectura.

Clasificación del grupo cinemático, almacenada como un vector de caracteres. Cada carácter especifica el tipo de articulación de cada cuerpo rígido desde la base hasta el efector final del grupo cinemático. Estas son las opciones para los caracteres:

  • R: articulación rotativa que no forma una muñeca

  • P: articulación prismática

  • S: articulación rotativa de una muñeca

    Nota

    Una articulación esférica o de muñeca se compone de tres articulaciones rotativas consecutivas con ejes ortogonales.

Para que un grupo cinemático sea válido para el objeto analyticalInverseKinematics, el tipo de grupo cinemático debe ser 'XXXSSS', donde XXX puede ser RRR o SSS. Si el tipo de grupo cinemático contiene una articulación prismática, P, el grupo cinemático no es válido para su uso con este solver. Para comprobar si el grupo cinemático es válido para este solver, consulte la propiedad IsValidGroupForIK.

Cuando se crea, el objeto selecciona automáticamente un grupo cinemático del modelo de robot, pero puede haber otras opciones disponibles. Para ver los grupos cinemáticos válidos para el modelo, utilice la función de objeto showdetails.

Ejemplo: 'RRRSSS'

Tipos de datos: char

Esta propiedad o parámetro es de solo lectura.

Correspondencia entre la configuración de la solución de IK a la configuración de árbol de cuerpo rígido, especificada como un vector de seis elementos. Esta correspondencia convierte los índices de la solución de IK que se genera a partir de la función generateIKFunction a los índices para el modelo de robot almacenados en la propiedad RigidBodyTree.

Ejemplo: [1 2 3 4 5 6]

Tipos de datos: double

Esta propiedad o parámetro es de solo lectura.

Indicación de si es posible una solución de forma cerrada, almacenada como 1 (true) o 0 (false) lógicos. Cuando esta propiedad es false, la función generateIKFunction no puede generar un solver de IK para el grupo cinemático actual. Use la función de objeto showdetails para comprobar si existe algún grupo válido. Para seleccionar un grupo válido, especifique una base o un efector final diferente a los de la propiedad KinematicGroup, o cambie los parámetros cinemáticos del modelo de robot almacenados en la propiedad RigidBodyTree.

Para que un grupo cinemático sea válido para el objeto analyticalInverseKinematics, el tipo de grupo cinemático debe ser 'XXXSSS', donde XXX puede ser RRR o SSS. Si el tipo de grupo cinemático contiene una articulación prismática, P, el grupo cinemático no es válido para su uso con este solver. Para comprobar si el grupo cinemático es válido para este solver, consulte la propiedad IsValidGroupForIK.

Tipos de datos: logical

Funciones del objeto

generateIKFunctionGenerate function for closed-form inverse kinematics
showdetailsDisplay overview of available kinematic groups

Ejemplos

contraer todo

Genere soluciones de cinemática inversa (IK) de forma cerrada para un efector final deseado. Cargue el modelo de robot proporcionado e inspeccione los detalles sobre los grupos cinemáticos factibles de los cuerpos de la base y del efector final. Genere una función para el grupo cinemático deseado. Inspeccione las distintas configuraciones para una pose específica del efector final.

Modelo de robot

Cargue el modelo de robot ABB IRB 120 en el área de trabajo. Muestre el modelo.

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

IK analítica

Cree el solver de IK analítica. Muestre los detalles del modelo de robot, que enumera los diferentes grupos cinemáticos disponibles para las soluciones de IK analítica de forma cerrada. Seleccione el segundo grupo cinemático haciendo clic en el enlace Use this kinematic group en la segunda fila de la tabla.

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

Inspeccione el grupo cinemático, que enumera los nombres de cuerpo de la base y del efector final. Para este robot, el grupo utiliza los cuerpos base_link' y 'tool0', respectivamente.

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

Generar función

Genere la función de IK para el grupo cinemático seleccionado. Especifique un nombre para la función, que se genera y se guarda en el directorio actual.

generateIKFunction(aik,'robotIK');

Especifique la posición deseada del efector final. Convierta la posición xyz a una transformación homogénea.

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

Generar la configuración para la solución de IK

Especifique la transformación homogénea a la función de IK generada, que genera todas las soluciones para la pose deseada del efector final. Muestre la primera configuración generada para comprobar que se ha alcanzado la pose deseada.

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

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

Muestre todas las soluciones de IK de forma cerrada secuencialmente.

figure;
numSolutions = size(ikConfig,1);

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

Algunos modelos de manipuladores robóticos tienen grados de libertad (DOF) amplios. Sin embargo, para alcanzar determinadas poses del efector final, solo se necesitan seis DOF. Utilice el objeto analyticalInverseKinematics, que admite robots de seis DOF, para determinar varios grupos cinemáticos válidos para este modelo de robot de gran DOF. Utilice la función de objeto showdetails para obtener información sobre el modelo.

Cargar el modelo de robot y generar el solver de IK

Cargue el modelo de robot en el área de trabajo y cree un objeto analyicalInverseKinematics. Utilice la función de objeto showdetails para ver los grupos cinemáticos admitidos.

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

Seleccione un grupo programáticamente utilizando la salida de la función de objeto showdetails, opts. El grupo seleccionado utiliza el hombro izquierdo como base y la muñeca izquierda como efector final.

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

Genere la función de IK para el grupo seleccionado.

generateIKFunction(aik,'willowRobotIK');

Resolver la IK analítica

Defina una pose del efector final objetivo utilizando una configuración generada aleatoriamente.

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

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

Resuelva todas las configuraciones del robot que alcancen la pose definida del efector final utilizando la función de IK generada. Para ignorar los límites de articulación, especifique false como segundo argumento de entrada.

ikConfig = willowRobotIK(expEEPose,false);

Para mostrar la pose del efector final objetivo en el marco del mundo real, obtenga la transformación a partir de la base del modelo de robot en lugar de a partir de la base del grupo cinemático. Muestre todas las soluciones de IK generadas especificando los índices de la solución IK de grupo cinemático en el vector de configuración utilizado con la función 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

Referencias

[1] Pieper, Donald. The Kinematics of Manipulators Under Computer Control. Stanford University, 1968.

Capacidades ampliadas

Historial de versiones

Introducido en R2020b