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);
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);
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);
Consulte también
generalizedInverseKinematics
| constraintPositionTarget