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.

Construir un robot paso a paso

Este ejemplo muestra paso a paso el proceso de construcción de un robot, sus diferentes componentes y cómo llamar a las funciones para construirlo. Se han incluido secciones de código, pero los valores reales de las dimensiones y las transformaciones dependen de cada robot.

  1. Cree un objeto de cuerpo rígido.

    body1 = rigidBody('body1');
    

    Rigid body object represented as an ellipse

  2. Cree una articulación y asígnela al cuerpo rígido. Defina la propiedad de la posición inicial de la articulación, HomePosition. Configure la transformada de la articulación al elemento primario utilizando una transformación homogénea, tform. Utilice la función trvec2tform para convertir un vector de traslación en una transformación homogénea. ChildToJointTransform se configura en una matriz de identidad.

    jnt1 = rigidBodyJoint('jnt1','revolute');
    jnt1.HomePosition = pi/4;
    tform = trvec2tform([0.25, 0.25, 0]); % User defined
    setFixedTransform(jnt1,tform);
    body1.Joint = jnt1;
    

    Rigid body object represented as an ellipse with a body frame and an arrow indicating transformation between body frame and previous frame

  3. Cree un árbol de cuerpo rígido. Este árbol se inicializa con el marco de coordenadas de la base, al que se acoplan cuerpos.

    robot = rigidBodyTree;

    Workspace of robot and position of base frame with rigid body object represented as an ellipse with a body frame and an arrow indicating transformation between body frame and previous frame outside the workspace

  4. Añada el primer cuerpo al árbol. Especifique que lo acopla a la base del árbol. La transformada fija definida anteriormente va de la base (elemento principal) al primer cuerpo.

    addBody(robot,body1,'base')

    Workspace of robot and position of base frame with rigid body object represented as an ellipse with frame attached to the base of the new rigid body tree.

  5. Cree un segundo cuerpo. Defina las propiedades de este cuerpo y acóplelo al primer cuerpo rígido. Defina la transformación respecto al marco del cuerpo anterior.

    body2 = rigidBody('body2');
    jnt2 = rigidBodyJoint('jnt2','revolute');
    jnt2.HomePosition = pi/6; % User defined
    tform2 = trvec2tform([1, 0, 0]); % User defined
    setFixedTransform(jnt2,tform2);
    body2.Joint = jnt2;
    addBody(robot,body2,'body1'); % Add body2 to body1

    Rigid tree body with an additional body, represented as an ellipse, added to the end of the first body.

  6. Añada más cuerpos. Acople los cuerpos 3 y 4 al cuerpo 2.

    body3 = rigidBody('body3');
    body4 = rigidBody('body4');
    jnt3 = rigidBodyJoint('jnt3','revolute');
    jnt4 = rigidBodyJoint('jnt4','revolute');
    tform3 = trvec2tform([0.6, -0.1, 0])*eul2tform([-pi/2, 0, 0]); % User defined
    tform4 = trvec2tform([1, 0, 0]); % User defined
    setFixedTransform(jnt3,tform3);
    setFixedTransform(jnt4,tform4);
    jnt3.HomePosition = pi/4; % User defined
    body3.Joint = jnt3
    body4.Joint = jnt4
    addBody(robot,body3,'body2'); % Add body3 to body2
    addBody(robot,body4,'body2'); % Add body4 to body2

    Previous rigid tree body with additional two bodies, both attached to the second body

  7. Si tiene un efector final de control específico, defínalo como un cuerpo rígido con una articulación fija. En el caso de este robot, añada un efector final al body4 para obtener sus transformaciones.

    bodyEndEffector = rigidBody('endeffector');
    tform5 = trvec2tform([0.5, 0, 0]); % User defined
    setFixedTransform(bodyEndEffector.Joint,tform5);
    addBody(robot,bodyEndEffector,'body4');
  8. Ahora que ha creado un robot, puede generar sus configuraciones. Si tiene una configuración determinada, también puede obtener una transformación entre los marcos de dos cuerpo utilizando getTransform. Obtenga una transformación desde el efector final hasta la base.

    config = randomConfiguration(robot)
    tform = getTransform(robot,config,'endeffector','base')
    config = 
    
      1×2 struct array with fields:
    
        JointName
        JointPosition
    
    
    tform =
    
       -0.5484    0.8362         0         0
       -0.8362   -0.5484         0         0
             0         0    1.0000         0
             0         0         0    1.0000

    Completed rigid body tree with transformation from the end effector to the base

    Nota

    Esta transformación es específica para las dimensiones indicadas en este ejemplo. Los valores del robot variarán en función de las transformaciones que defina.

  9. Puede crear un subárbol a partir de un robot existente o de otros modelos de robot utilizando subtree. Especifique el nombre de cuerpo que se usará como base para el nuevo subárbol. Puede modificar este subárbol añadiendo cuerpos, modificándolos o eliminándolos.

    newArm = subtree(robot,'body2');
    removeBody(newArm,'body3');
    removeBody(newArm,'endeffector')
    

    Additional two-body robot created as a sub-tree but is independent of the other robot

  10. También puede añadir estos subárboles al robot. El proceso de añadir un subárbol es similar al de añadir un cuerpo. El nombre del cuerpo especificado actúa como base para el acoplamiento, y todas las transformaciones del subárbol son relativas al marco de ese cuerpo. Antes de añadir el subárbol, debe asegurarse de que todos los nombres de los cuerpos y las articulaciones son únicos. Cree copias de los cuerpos y las articulaciones, cámbieles el nombre y reemplácelas en el subárbol. Llame a addSubtree para acoplar el subárbol a un cuerpo especificado.

    newBody1 = copy(getBody(newArm,'body2'));
    newBody2 = copy(getBody(newArm,'body4'));
    newBody1.Name = 'newBody1';
    newBody2.Name = 'newBody2';
    newBody1.Joint = rigidBodyJoint('newJnt1','revolute');
    newBody2.Joint = rigidBodyJoint('newJnt2','revolute');
    tformTree = trvec2tform([0.2, 0, 0]); % User defined
    setFixedTransform(newBody1.Joint,tformTree);
    replaceBody(newArm,'body2',newBody1);
    replaceBody(newArm,'body4',newBody2);
    
    addSubtree(robot,'body1',newArm);

    Sub rigid body tree connected to the first body of the first rigid body tree

  11. Por último, puede usar showdetails para examinar el robot que ha construido. Compruebe que los tipos de articulación sean correctos.

    showdetails(robot)
     Idx          Body Name             Joint Name             Joint Type          Parent Name(Idx)   Children Name(s)
     ---          ---------             ----------             ----------          ----------------   ----------------
       1              body1                   jnt1               revolute                   base(0)   body2(2)  newBody1(6)  
       2              body2                   jnt2               revolute                  body1(1)   body3(3)  body4(4)  
       3              body3                   jnt3               revolute                  body2(2)   
       4              body4                   jnt4               revolute                  body2(2)   endeffector(5)  
       5        endeffector        endeffector_jnt                  fixed                  body4(4)   
       6           newBody1                newJnt1               revolute                  body1(1)   newBody2(7)  
       7           newBody2                newJnt2               revolute               newBody1(6)   
    --------------------

Consulte también

|

Temas relacionados