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.
Cree un objeto de cuerpo rígido.
body1 = rigidBody('body1');
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óntrvec2tform
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;
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;
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')
Cree un segundo cuerpo. Defina las propiedades de este cuerpo y acóplelo al primer cuerpo rígido. Defina la transformación respecto a la estructura 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
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
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');
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
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.
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')
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);
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
rigidBodyTree
| inverseKinematics