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 de pick-and-place con Stateflow para MATLAB

En este ejemplo se muestra cómo configurar un flujo de trabajo de pick-and-place 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 Model Predictive Control Toolbox para planificar, controlar, y MATLAB para simular el robot. Para otros usos, consulte:

Visión general

Este ejemplo clasifica los objetos detectados y los coloca en bancos con el manipulador KINOVA Gen3. El ejemplo usa herramientas de cuatro toolboxes:

  • Robotics System Toolbox™ se usa para modelar, simular y visualizar el manipulador, y comprobar colisiones.

  • Model Predictive Control Toolbox™ y Optimization Toolbox™ se utilizan para generar trayectorias optimizadas y sin colisiones que el manipulador puede seguir.

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

Este ejemplo se basa en conceptos clave de estos dos ejemplos relacionados:

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 exampleHelperFlowChartPickPlace.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 con una pinza simulada. Cuando la pinza se activa, exampleCommandActivateGripper añade la malla de colisión de la pieza a la representación rigidBodyTree del robot, que simula agarrarla. 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 suelta la pieza de la pinza.

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 exampleHelperPlanExecuteTrajectoryPickPlace define un solver con un controlador predictivo basado en modelo no lineal (consulte Nonlinear MPC (Model Predictive Control Toolbox)) que calcula una trayectoria de referencia factible y optimizada sin colisiones mediante nlmpcmove (Model Predictive Control Toolbox) y checkCollision. Los obstáculos se representan como esferas para garantizar la aproximación precisa de la jacobiana de la restricción en la definición del algoritmo de control predictivo basado en modelo no lineal (consulte [1]). Luego, la función helper simula el movimiento del manipulador bajo el control con el par motor calculado a medida que sigue la trayectoria de referencia con el objeto jointSpaceMotionModel y actualiza la visualización. Desde el gráfico de Stateflow se llama a la función helper a través de exampleCommandMoveToTaskConfig, que define las entradas correctas.

Este flujo de trabajo se examina en detalle en Plan and Execute Collision-Free Trajectories Using KINOVA Gen3 Manipulator. El controlador se utiliza para garantizar un movimiento sin colisiones. 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 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 diagramas 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('exampleHelperKINOVAGen3GripperColl.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 = exampleHelperCoordinatorPickPlace(robot,currentRobotJConfig, "gripper");

Especifique la configuración inicial y dos poses para colocar objetos de diferentes tipos.

coordinator.HomeRobotTaskConfig = trvec2tform([0.4, 0, 0.6])*axang2tform([0 1 0 pi]);
coordinator.PlacingPose{1} = trvec2tform([0.23 0.62 0.33])*axang2tform([0 1 0 pi]);
coordinator.PlacingPose{2} = trvec2tform([0.23 -0.62 0.33])*axang2tform([0 1 0 pi]);

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 = exampleHelperFlowChartPickPlace('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 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.

Referencias

[1] Schulman, J., et al. "Motion planning with sequential convex optimization and convex collision checking." The International Journal of Robotics Research 33.9 (2014): 1251-1270.