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.

Crear una trayectoria para un robot ABB YuMi de manera interactiva

Este ejemplo muestra cómo utilizar el objeto interactiveRigidBodyTree para mover un robot, diseñar una trayectoria y repetirla.

Cargar la visualización del robot y crear el entorno

Cargue el modelo de robot 'abbYumi'. Inicialice la figura interactiva con interactiveRigidBodyTree. Guarde los ejes actuales.

robot = loadrobot('abbYumi', 'Gravity', [0 0 -9.81]);
iviz = interactiveRigidBodyTree(robot);
ax = gca;

Cree un entorno compuesto de cuadros de colisión que represente un suelo, dos estanterías con objetos y una mesa en el centro.

plane = collisionBox(1.5,1.5,0.05);
plane.Pose = trvec2tform([0.25 0 -0.025]);
show(plane,'Parent', ax);

leftShelf = collisionBox(0.25,0.1,0.2);
leftShelf.Pose = trvec2tform([0.3 -.65 0.1]);
[~, patchObj] = show(leftShelf,'Parent',ax);
patchObj.FaceColor = [0 0 1];

rightShelf = collisionBox(0.25,0.1,0.2);
rightShelf.Pose = trvec2tform([0.3 .65 0.1]);
[~, patchObj] = show(rightShelf,'Parent',ax);
patchObj.FaceColor = [0 0 1];

leftWidget = collisionCylinder(0.01, 0.07);
leftWidget.Pose = trvec2tform([0.3 -0.65 0.225]);
[~, patchObj] = show(leftWidget,'Parent',ax);
patchObj.FaceColor = [1 0 0];

rightWidget = collisionBox(0.03, 0.02, 0.07);
rightWidget.Pose = trvec2tform([0.3 0.65 0.225]);
[~, patchObj] = show(rightWidget,'Parent',ax);
patchObj.FaceColor = [1 0 0];

centerTable = collisionBox(0.5,0.3,0.05);
centerTable.Pose = trvec2tform([0.75 0 0.025]);
[~, patchObj] = show(centerTable,'Parent',ax);
patchObj.FaceColor = [0 1 0];

Figure Interactive Visualization contains an axes object. The axes object contains 80 objects of type patch, line, surface.

Generar configuraciones de forma interactiva

Utilice la visualización interactiva para mover el robot y establecer configuraciones. Cuando la figura se inicializa, el robot está en la configuración inicial con los brazos cruzados. Haga zoom para ampliar la figura y haga clic en el efector final para obtener más información.

Para seleccionar el cuerpo como efector final, haga clic en el cuerpo con el botón secundario del ratón.

También se puede asignar el cuerpo marcador desde la línea de comandos:

iviz.MarkerBodyName = "gripper_r_base";

Una vez que haya configurado el cuerpo, utilice los elementos marcadores proporcionados para mover el marcador, y el cuerpo seleccionado lo seguirá. Arrastre el marcador gris central para mover el marcador en el espacio cartesiano. Los ejes rojo, verde y azul mueven el marcador a lo largo de los ejes xyz. El círculo gira el marcador sobre los ejes del color correspondiente.

También puede mover articulaciones individuales. Para ello, haga clic con el botón secundario en la articulación y, después, haga clic en Toggle marker control method (Activar método de control del marcador).

La propiedad MarkerControlMethod del objeto está configurada en "JointControl".

También puede realizar estos pasos cambiando las propiedades del objeto directamente.

iviz.MarkerBodyName = "yumi_link_2_r";
iviz.MarkerControlMethod = "JointControl";

Figure Interactive Visualization contains an axes object. The axes object contains 72 objects of type patch, line, surface.

Si cambia al control de articulación, aparecerá un marcador amarillo que permite configurar la posición de la articulación directamente.

Mueva el robot de forma interactiva hasta obtener la configuración deseada. Guarde las configuraciones con addConfiguration. Cada llamada añade la configuración actual a la propiedad StoredConfigurations.

addConfiguration(iviz)

Definir waypoints para una trayectoria

Para este ejemplo, se proporciona un conjunto de configuraciones en un archivo .mat.

Cargue las configuraciones y especifíquelas como el conjunto de configuraciones almacenadas. La primera configuración se añade actualizando la propiedad Configuration y llamando a addConfiguration, de forma interactiva, pero el resto se añaden simplemente asignando la propiedad StoredConfigurations directamente.

load abbYumiSaveTrajectoryWaypts.mat

removeConfigurations(iviz) % Clear stored configurations

% Start at a valid starting configuration
iviz.Configuration = startingConfig;

Figure Interactive Visualization contains an axes object. The axes object contains 72 objects of type patch, line, surface.

addConfiguration(iviz)

% Specify the entire set of waypoints
iviz.StoredConfigurations = [startingConfig, ...
                             graspApproachConfig, ...
                             graspPoseConfig, ...
                             graspDepartConfig, ...
                             placeApproachConfig, ...
                             placeConfig, ...
                             placeDepartConfig, ...
                             startingConfig];

Generar la trayectoria y reproducirla

Una vez que se hayan almacenado todos los waypoints, construya la trayectoria que seguirá el robot. Para este ejemplo, se genera un perfil de velocidad trapezoidal utilizando trapveltraj. Un perfil de velocidad trapezoidal implica que el robot se detiene suavemente en cada uno de los waypoints, pero alcanza un conjunto de velocidades máximas cuando está en movimiento.

numSamples = 100*size(iviz.StoredConfigurations, 2) + 1;
[q,~,~, tvec] = trapveltraj(iviz.StoredConfigurations,numSamples,'EndTime',2);

Repita la trayectoria que ha creado iterando la matriz q generada, que representa una serie de configuraciones de articulaciones que se mueven entre los diferentes waypoints. En este caso se usa un objeto de control de velocidad para garantizar que la velocidad de la repetición refleja la velocidad de ejecución real.

iviz.ShowMarker = false;
showFigure(iviz)
rateCtrlObj = rateControl(numSamples/(max(tvec) + tvec(2)));
for i = 1:numSamples
    iviz.Configuration = q(:,i);
    waitfor(rateCtrlObj);
end

Figure Interactive Visualization contains an axes object. The axes object contains 70 objects of type patch, line.

La figura muestra cómo el robot ejecuta la trayectoria entre todos los waypoints definidos sin problemas.