Main Content

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.

Flujo de trabajo pick-and-place con el planificador RRT y Stateflow para MATLAB

En este ejemplo se muestra cómo configurar un flujo de trabajo pick-and-place de extremo a extremo para un manipulador robótico como KINOVA® Gen3.

El flujo de trabajo de pick-and-place implementado en este ejemplo se puede adaptar a distintos escenarios, planificadores, plataformas de simulación y opciones de detección de objetos. El ejemplo que se muestra aquí utiliza el algoritmo de árbol aleatorio de exploración rápida para planificar, y MATLAB para simular el robot. Para otros usos, consulte:

Visión general

Este ejemplo clasifica objetos detectados en estanterías mediante el manipulador KINOVA Gen3. El ejemplo usa herramientas de dos toolboxes:

  • Robotics System Toolbox™ se usa para modelar, simular y visualizar el manipulador, y planificar rutas sin colisiones para que las siga el manipulador mediante RRT.

  • Stateflow® se usa para programar las tareas de alto nivel en el ejemplo y pasar de una tarea a otra.

En este ejemplo se utiliza el algoritmo RRT para planificar rutas. Para otro ejemplo sobre el planificador RRT, consulte Pick and Place Using RRT for Manipulators.

Gráfico de Stateflow

Este ejemplo usa un gráfico de Stateflow para programar tareas en el ejemplo. Abra el gráfico para examinar el contenido y seguir las transiciones de estado durante la ejecución del gráfico.

edit exampleHelperFlowChartPickPlaceRRT.sfx

El gráfico indica cómo interactúa el manipulador con los objetos o piezas. Consta de pasos básicos de inicialización, seguidos de dos secciones principales:

  • Identificar las piezas y determinar dónde colocarlas

  • Ejecutar el flujo de trabajo de pick-and-place

Inicializar el robot y el entorno

En primer lugar, el gráfico crea un entorno formado por el manipulador KINOVA Gen3, tres piezas que se deben clasificar, las estanterías utilizadas para clasificar y un obstáculo azul. Luego, el robot se desplaza hacia la posición inicial.

Identificar las piezas y determinar dónde colocarlas

En el primer paso de la fase de identificación, se deben detectar las piezas. La función exampleCommandDetectParts proporciona directamente las poses del objeto. Sustituya esta clase con su propio algoritmo de detección de objetos en función de los sensores u objetos.

Luego, se deben clasificar las piezas. La función exampleCommandClassifyParts clasifica las piezas en dos tipos para determinar dónde colocarlas (estantería superior o inferior). De nuevo, puede sustituir esta función con otro método para clasificar piezas.

Ejecutar el flujo de trabajo de pick-and-place

Una vez que las piezas se han identificado y se han asignado sus ubicaciones, el manipulador debe tomar cada pieza y ubicarla en la mesa correcta.

Recoger el objeto

En la fase de captura, el robot se desplaza hacia el objeto, lo recoge y se desplaza a una posición segura, como se muestra en el siguiente diagrama:

La función exampleCommandComputeGraspPose calcula la pose de agarre. La clase calcula una posición de agarre en el espacio cartesiano para cada pieza. También se han definido pasos intermedios para acercarse y alcanzar la pieza.

Este robot recoge objetos mediante una pinza neumática simulada. Cuando la pinza se activa, exampleCommandActivateGripper añade la malla de colisión para la pieza en la representación rigidBodyTree del robot, mediante la función objeto addCollision. La detección de colisiones incluye este objeto mientras esté adjunto. Luego, el robot toma una posición retraída lejos de las demás piezas.

Colocar el objeto

Después, el robot coloca el objeto en la estantería adecuada.

Al igual que con el flujo de trabajo de recogida, el enfoque de colocación y las posiciones retraídas se calculan en relación con la posición de colocación deseada. La pinza se desactiva con exampleCommandActivateGripper, que elimina la pieza del robot mediante clearCollision. Cada vez que se coloca una pieza de un tipo especificado, la pose de colocación para este tipo de objeto se actualiza para que la siguiente pieza del mismo tipo se coloque al lado de la pieza ya colocada.

Mover el manipulador a una pose específica

La mayoría de la ejecución de la tarea consiste en instruir al robot para que se desplace entre las diferentes poses especificadas. La función exampleHelperMoveToTaskConfig define un planificador RRT con el objeto manipulatorRRT, que planifica rutas desde una configuración de articulación inicial hasta una deseada evadiendo colisiones con objetos de colisión especificados en la escena. La ruta resultante se acorta en primer lugar y, después, se interpola a una distancia de validación deseada. Para generar una trayectoria, la función trapveltraj se utiliza para asignar unidades de tiempo a cada uno de los waypoints interpolados según un perfil trapezoidal. Por último, los waypoints con sus tiempos asociados se interpolan a una tasa de muestreo deseada (cada 0,1 segundos). Las trayectorias generadas garantizan que el robot se traslade lentamente al inicio y al final del movimiento cuando se está acercando a un objeto o colocándolo.

Para otro ejemplo sobre el planificador RRT, consulte Pick and Place Using RRT for Manipulators.

Para las trayectorias más simples en las que se sabe que las rutas están libres de obstáculos, las trayectorias pueden ejecutarse mediante herramientas de generación de trayectorias y simularse con modelos de movimiento del manipulador. Consulte el ejemplo Planificar y ejecutar trayectorias de espacio cartesiano o articular utilizando el manipulador KINOVA Gen3.

Planificación de tareas en un gráfico de Stateflow

Este ejemplo usa un gráfico de Stateflow para dirigir el flujo de trabajo de MATLAB®. Para obtener más información sobre cómo crear inicios de flujo de estado, consulte Create Stateflow Charts for Execution as MATLAB Objects (Stateflow).

El gráfico de Stateflow dirige la ejecución de tareas en MATLAB mediante funciones de comandos. Cuando se termina de ejecutar, el comando envía un evento de entrada para activar el gráfico y pasar al siguiente paso en la ejecución de la tarea. Consulte Execute a Standalone Chart (Stateflow).

Ejecutar y visualizar la simulación

Esta simulación usa un manipulador KINOVA Gen3 con una pinza Robotiq. Cargue el modelo de robot desde un archivo .mat como un objeto rigidBodyTree.

load('exampleHelperKINOVAGen3GripperCollRRT.mat'); 

Inicializar el coordinador de pick-and-place

Establezca la configuración inicial del robot. Cree el coordinador, que maneja el control del robot, proporcionando el modelo de robot, la configuración inicial y el nombre del efector final.

currentRobotJConfig = homeConfiguration(robot);
coordinator = exampleHelperCoordinatorPickPlaceRRT(robot,currentRobotJConfig, "gripper");

Especifique la configuración inicial y dos poses para colocar objetos de dos tipos diferentes. La primera pose corresponde a la estantería central donde se colocan todas las piezas del tipo 1 y la segunda pose corresponde a la estantería superior donde se colocan las piezas del tipo 2. Las poses de colocación se actualizan en el gráfico de Stateflow cada vez que una pieza nueva se coloca correctamente. Las piezas de tipos diferentes se identifican con colores distintos.

coordinator.HomeRobotTaskConfig = trvec2tform([0.4, 0, 0.5])*axang2tform([0 1 0 pi]);
coordinator.PlacingPose{1} = trvec2tform([[-0.15 0.52 0.46]])*axang2tform([1 0 0 -pi/2]);
coordinator.PlacingPose{2} = trvec2tform([[-0.15 0.52 0.63]])*axang2tform([1 0 0 -pi/2]);

Ejecutar y visualizar la simulación

Conecte el coordinador al gráfico de Stateflow. Una vez iniciado, el gráfico de Stateflow se encarga de pasar continuamente por los estados de detección de objetos, recogerlos y colocarlos en el área de preparación correcta.

coordinator.FlowChart = exampleHelperFlowChartPickPlaceRRT('coordinator', coordinator); 

Use un cuadro de diálogo para iniciar la ejecución de la tarea de pick-and-place. Haga clic en Yes en el cuadro de diálogo para comenzar la simulación.

answer = questdlg('Do you want to start the pick-and-place job now?', ...
         'Start job','Yes','No', 'No');

switch answer
    case 'Yes'
        % Trigger event to start Pick and Place in the Stateflow Chart
        coordinator.FlowChart.startPickPlace;        
    case 'No'
        % End Pick and Place
        coordinator.FlowChart.endPickPlace;        
        delete(coordinator.FlowChart);
        delete(coordinator);
end

Finalizar la tarea de pick-and-place

El gráfico de Stateflow terminará de ejecutarse automáticamente después de 3 intentos fallidos de detectar nuevos objetos. Para finalizar la tarea de pick-and-place antes de tiempo, elimine el comentario y ejecute las siguientes líneas de código o presione Ctrl+C en la ventana de comandos.

% coordinator.FlowChart.endPickPlace;        
% delete(coordinator.FlowChart);
% delete(coordinator);

Observar los estados de la simulación

Durante la ejecución, los estados activos en cada momento se resaltan en azul en el gráfico de Stateflow. Esto ayuda a realizar un seguimiento de lo que hace el robot y cuándo. Puede hacer clic en los subsistemas para ver los detalles del estado en acción.

Visualizar la acción de pick-and-place

El ejemplo usa el objeto interactiveRigidBodyTree para la visualización del robot. La visualización muestra al robot en el área de trabajo mientras mueve piezas. El robot evade obstáculos en el entorno (cilindro azul) y coloca objetos en la estantería superior o inferior en función de su clasificación. El robot continúa trabajando hasta que se han colocado todas las piezas.