Contenido principal

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

Colocar el robot delta con cinemática inversa generalizada

Modele un robot delta utilizando el modelo de robot rigidBodyTree . Especifique las restricciones cinemáticas de la cinemática inversa generalizada (GIK) para garantizar el comportamiento adecuado del robot. Resuelva la configuración de articulaciones que obedezcan al modelo y a las restricciones definidas.

Crear un robot delta

Normalmente, los robots delta contienen cadenas cinemáticas de lazo cerrado. El objeto rigidBodyTree no admite cadenas de lazo cerrado. Para evitar esto, el robot se modela como un árbol en el que los brazos del robot delta permanecen desconectados. Llame a la función auxiliar que construye el modelo de robot y genera el objeto rigidBodyTree object.

En un paso posterior, el solver de cinemática inversa generalizada aplicará restricciones que obliguen a los brazos separados del árbol a moverse juntos, garantizando así que el robot se comporte de una manera cinemáticamente precisa.

El robot es bastante complicado, por lo que se utiliza una función auxiliar para crear el objeto rigidBodyTree.

robot = exampleHelperDeltaRobot;
show(robot);

Figure contains an axes object. The axes object with xlabel X, ylabel Y contains 43 objects of type patch, line. These objects represent base, arm1_body1, arm1_body2, arm1_body3, arm1_body4, arm1_body5, arm1_body6, base_120, arm2_body1, arm2_body2, arm2_body3, arm2_body4, arm2_body5, arm2_body6, base_240, arm3_body1, arm3_body2, arm3_body3, arm3_body4, arm3_body5, arm3_body6, endEffector.

Como se muestra, el robot consta de tres brazos, pero aún deben conectarse para que coincidan con la configuración clásica del robot delta.

Crear restricciones cinemáticas inversas

Cree un objeto generalizedInverseKinematics y especifique el modelo de robot. Limite el número máximo de interacciones en función del rendimiento.

gik1 = generalizedInverseKinematics('RigidBodyTree', robot);
gik1.SolverParameters.MaxIterations = 20;

Cree un objeto interactiveRigidBodyTree para visualizar el modelo de robot y proporcione marcadores interactivos para cuerpos en movimiento. Esta interactividad ayuda a verificar las restricciones cinemáticas. Especifique el solver gik1 utilizando pares nombre-valor. Especifique un vector de ponderación de pose que solo se centre en la posición xyz y no en la orientación.

viztree = interactiveRigidBodyTree(robot, 'IKSolver', gik1, 'SolverPoseWeights', [0 1]);

Con este objeto interactivo se puede arrastrar el efector final para mostrar cómo se mueve el robot. Actualmente, el comportamiento no es el deseado para un robot delta normal.

Almacene los ejes actuales.

ax = gca;

Añada restricciones al solver de GIK para asegurarse de que los brazos estén conectados. Una los dos brazos sin efector final al 6.º cuerpo del brazo primario que incluye el efector final.

% Ensure that the body 6 of arm 2 maintains a pose relative to body 6 of arm 1
poseTgt1 = constraintPoseTarget('arm2_body6');
poseTgt1.ReferenceBody = 'arm1_body6';
poseTgt1.TargetTransform = trvec2tform([-sqrt(3)*0.5*0.2, 0.5*0.2, 0]) * eul2tform([2*pi/3, 0, 0]);

% Ensure that the body 6 of arm 3 maintains a pose relative to body 6 of arm 1
poseTgt2 = constraintPoseTarget('arm3_body6');
poseTgt2.ReferenceBody = 'arm1_body6';
poseTgt2.TargetTransform = trvec2tform([-sqrt(3)*0.5*0.2, -0.5*0.2, 0]) * eul2tform([-2*pi/3, 0, 0]);

Para aplicar estas restricciones al robot, llame a addConstraint para el objeto vizTree.

addConstraint(viztree,poseTgt1);
addConstraint(viztree,poseTgt2);

Figure Interactive Visualization contains an axes object. The axes object with xlabel X, ylabel Y contains 53 objects of type patch, line, surface.

Ahora, cuando se desplaza el efector final, se respetan las restricciones y los brazos permanecen conectados.

Resolver la cinemática inversa generalizada mediante programación

La visualización interactiva es útil para validar las restricciones del solver, pero para un uso programático directo, cree un solver de GIK independiente al que se pueda llamar. Este solver puede copiarse de la propiedad IKSolver del objeto interactiveRigidBodyTree o crearse de forma independiente.

gik2 = generalizedInverseKinematics('RigidBodyTree', robot);
gik2.SolverParameters.MaxIterations = 20;

Para el solver de GIK, se requiere una restricción adicional para definir la posición del efector final, que normalmente está controlada por el marcador interactivo. Actualice TargetTransform para resolver diferentes posiciones deseadas del efector final.

poseTgt3 = constraintPoseTarget('endEffector');
poseTgt3.ReferenceBody = 'base';
poseTgt3.TargetTransform = trvec2tform([0, 0, -1]);

Especifique todos los tipos de restricciones utilizados por el solver.

gik2.ConstraintInputs = {'pose','pose', 'pose'};

Llame al solver gik2 con los objetos de restricción de la pose objetivo especificados. Indique una estimación inicial de la configuración inicial del robot. Muestre la solución.

% Provide an initial guess for the solver
q0 = homeConfiguration(robot);

% Solve for a the target pose given to poseTgt3
[q, solutionInfo] = gik2(q0, poseTgt1, poseTgt2, poseTgt3);

% Visualize the results
figure;
show(robot, q);

Figure contains an axes object. The axes object with xlabel X, ylabel Y contains 43 objects of type patch, line. These objects represent base, arm1_body1, arm1_body2, arm1_body3, arm1_body4, arm1_body5, arm1_body6, base_120, arm2_body1, arm2_body2, arm2_body3, arm2_body4, arm2_body5, arm2_body6, base_240, arm3_body1, arm3_body2, arm3_body3, arm3_body4, arm3_body5, arm3_body6, endEffector.

Consulte también

|

Temas