Main Content

Construir modelos de árbol de cuerpo rígido básicos

En este ejemplo se muestra cómo utilizar los elementos del modelo de robot de árbol de cuerpo rígido para construir un brazo robótico básico con cinco grados de libertad. El modelo creado en este ejemplo representa unos brazos robóticos de mesa comunes construidos con servos y una placa de circuito integrado.

Para cargar un modelo de robot a partir de un conjunto de robots comunes disponibles en el mercado, utilice la función loadrobot. Para ver un ejemplo, consulte Cargar modelos de robot predefinidos.

Si tiene un archivo URDF o un modelo de Simscape Multibody™ del robot, puede importarlo como un árbol de cuerpo rígido mediante importrobot. Para ver un ejemplo, consulte Importar un robot desde un archivo URDF.

Crear elementos de cuerpo rígido

En primer lugar, cree un modelo de robot rigidBodyTree. El modelo de robot de árbol de cuerpo rígido representa el robot completo, que está formado por cuerpos rígidos y articulaciones que los unen. La base del robot es un marco fijo que define las coordenadas del mundo real. Al añadir el primer cuerpo, se fija el cuerpo a la base.

robot = rigidBodyTree("DataFormat","column");
base = robot.Base;

Luego, cree una serie de enlaces como objetos rigidBody. El robot consta de una base giratoria, 3 brazos rectangulares y una pinza.

rotatingBase = rigidBody("rotating_base");
arm1 = rigidBody("arm1");
arm2 = rigidBody("arm2");
arm3 = rigidBody("arm3");
gripper = rigidBody("gripper");

Cree objetos de colisión para cada cuerpo rígido con diferentes formas y dimensiones. Al crear los objetos de colisión, el marco de coordenadas se centra de forma predeterminada en el centro del objeto. Establezca la propiedad Pose para mover el marco a la parte inferior de cada cuerpo a lo largo del eje z. Modele la pinza como una esfera para mayor simplicidad.

collBase = collisionCylinder(0.05,0.04); % cylinder: radius,length
collBase.Pose = trvec2tform([0 0 0.04/2]);
coll1 = collisionBox(0.01,0.02,0.15); % box: length, width, height (x,y,z)
coll1.Pose = trvec2tform([0 0 0.15/2]);
coll2 = collisionBox(0.01,0.02,0.15); % box: length, width, height (x,y,z)
coll2.Pose = trvec2tform([0 0 0.15/2]);
coll3 = collisionBox(0.01,0.02,0.15); % box: length, width, height (x,y,z)
coll3.Pose = trvec2tform([0 0 0.15/2]);
collGripper = collisionSphere(0.025); % sphere: radius
collGripper.Pose = trvec2tform([0 -0.015 0.025/2]);

Añada los cuerpos de colisión a los objetos de cuerpo rígido.

addCollision(rotatingBase,collBase)
addCollision(arm1,coll1)
addCollision(arm2,coll2)
addCollision(arm3,coll3)
addCollision(gripper,collGripper)

Fijar las articulaciones

Cada cuerpo rígido se acopla mediante una articulación rotativa. Cree los objetos rigidBodyJoint para cada cuerpo. Especifique el eje x como eje de rotación para las articulaciones del brazo rectangular. Especifique el eje y de la pinza. El eje predeterminado es el eje z.

jntBase = rigidBodyJoint("base_joint","revolute");
jnt1 = rigidBodyJoint("jnt1","revolute");
jnt2 = rigidBodyJoint("jnt2","revolute");
jnt3 = rigidBodyJoint("jnt3","revolute");
jntGripper = rigidBodyJoint("gripper_joint","revolute");

jnt1.JointAxis = [1 0 0]; % x-axis
jnt2.JointAxis = [1 0 0];
jnt3.JointAxis = [1 0 0];
jntGripper.JointAxis = [0 1 0] % y-axis
jntGripper = 
  rigidBodyJoint with properties:

                      Type: 'revolute'
                      Name: 'gripper_joint'
                 JointAxis: [0 1 0]
            PositionLimits: [-3.1416 3.1416]
              HomePosition: 0
    JointToParentTransform: [4x4 double]
     ChildToJointTransform: [4x4 double]

Establezca las transformaciones del acoplamiento de las articulaciones entre los cuerpos. Cada transformación se basa en las dimensiones de la longitud del cuerpo rígido anterior (eje z). Desplace las articulaciones del brazo en el eje x para evitar colisiones durante la rotación.

setFixedTransform(jnt1,trvec2tform([0.015 0 0.04]))
setFixedTransform(jnt2,trvec2tform([-0.015 0 0.15]))
setFixedTransform(jnt3,trvec2tform([0.015 0 0.15]))
setFixedTransform(jntGripper,trvec2tform([0 0 0.15]))

Ensamblar el robot

Cree un arreglo de objetos para los cuerpos y las articulaciones, incluida la base original. Añada cada articulación al cuerpo y después añada el cuerpo al árbol. Visualice cada paso.

bodies = {base,rotatingBase,arm1,arm2,arm3,gripper};
joints = {[],jntBase,jnt1,jnt2,jnt3,jntGripper};

figure("Name","Assemble Robot","Visible","on")
for i = 2:length(bodies) % Skip base. Iterate through adding bodies and joints.
            bodies{i}.Joint = joints{i};
            addBody(robot,bodies{i},bodies{i-1}.Name)
            show(robot,"Collisions","on","Frames","off");
            drawnow;
end

Llame a la función showdetails para ver una lista de la información final del árbol. Asegúrese de que la relación principal-secundario y los tipos de articulación sean correctos.

showdetails(robot)
--------------------
Robot: (5 bodies)

 Idx            Body Name           Joint Name           Joint Type            Parent Name(Idx)   Children Name(s)
 ---            ---------           ----------           ----------            ----------------   ----------------
   1        rotating_base           base_joint             revolute                     base(0)   arm1(2)  
   2                 arm1                 jnt1             revolute            rotating_base(1)   arm2(3)  
   3                 arm2                 jnt2             revolute                     arm1(2)   arm3(4)  
   4                 arm3                 jnt3             revolute                     arm2(3)   gripper(5)  
   5              gripper        gripper_joint             revolute                     arm3(4)   
--------------------

Interactuar con el modelo de robot

Visualice el modelo de robot para confirmar las dimensiones mediante el objeto interactiveRigidBodyTree. Utilice la interfaz gráfica interactiva para mover el modelo. Puede seleccionar cuerpos específicos y establecer la posición de sus articulaciones. Para interactuar con modelos más detallados proporcionados con Robotics System Toolbox™, consulte Cargar modelos de robot predefinidos o la función loadrobot.

figure("Name","Interactive GUI")
gui = interactiveRigidBodyTree(robot,"MarkerScaleFactor",0.25);

Mueva el marcador interactivo para probar las distintas posiciones deseadas de las pinzas. La interfaz gráfica utiliza la cinemática inversa para generar la mejor configuración de las articulaciones. Para obtener más información sobre la interfaz gráfica interactiva, consulte el objeto interactiveRigidBodyTree.

Siguientes pasos

Con el modelo creado en MATLAB®, podrá hacer varias cosas distintas.

  • Calcule Cinemática inversa para obtener configuraciones de articulaciones basadas en las posiciones deseadas del efector final. Además de los parámetros del modelo del robot, especifique otras restricciones, como apuntamiento, límites cartesianos o poses objetivo.

  • Genere Generación de trayectorias basadas en waypoints y en otros parámetros con perfiles de velocidad trapezoidal, B-splines o trayectorias polinómicas.

  • Realice Planificación de manipuladores mediante los modelos de robot y el planificador de rutas de árboles aleatorios de exploración rápida (RRT).

  • Compruebe si se producen Detección de colisiones con obstáculos del entorno para garantizar que el robot se mueve de forma segura y eficaz.