Salta el contingut
clear all 

Modelatge amb la Robotic System Toolbox

Aquest tutorial explica com configurar un robot a la Robotic System Toolbox.

General

La Robotic System Toolbox utilitza estructures per definir els manipuladors robòtics.

Pots crear un rigidBodyTree per omplir-lo amb els valors del teu robot. Defineix el DataFormat com a column o row per als càlculs dinàmics.

robot = rigidBodyTree("DataFormat","column")
robot = 
  rigidBodyTree with properties:

     NumBodies: 0
        Bodies: {1x0 cell}
          Base: [1x1 rigidBody]
     BodyNames: {1x0 cell}
      BaseName: 'base'
       Gravity: [0 0 0]
    DataFormat: 'column'
    FrameNames: {'base'}

Ara hem d’omplir els camps d’aquest objecte amb els valors corresponents al robot.

Crear un robot

Considerem un robot planar simple:

image_0.svg

i els seus paràmetres DH:

Eslabó a \(begin:math:display\)m\(end:math:display\) alpha d \(begin:math:display\)m\(end:math:display\) theta
1 0.30 0 0 0
2 0.25 pi/2 0 0
        %a      alpha   d       theta
DH_1 = [0.3     0       0       0];
DH_2 = [0.25    pi/2    0       0];

addicionalment, tenim una translació i una rotació de la base a la primera articulació. Això es pot representar amb la matriu de transformació homogènia següent:

$$ T_{\textrm{B0}} =\left\lbrack \begin{array}{cccc} 0 & 1 & 0 & 0\newline -1 & 0 & 0 & -0\ldotp 1\newline 0 & 0 & 1 & 0\newline 0 & 0 & 0 & 1 \end{array}\right\rbrack $$

TB0= [  0,  1,  0,  0;
        -1, 0,  0,  -0.1;
        0,  0,  1,  0;
        0,  0,  0,  1 ];

primer crea cell arrays buits de cossos i articulacions

bodies = cell(3,1);
joints = cell(3,1);

defineix els cossos com a rigidBody i assigna un nom a cada cos

bodies{1} = rigidBody('body_base');
bodies{2} = rigidBody('body_1');
bodies{3} = rigidBody('body_2');

defineix les articulacions com a rigidBodyJoint, estableix-ne el nom i defineix si són una articulació revolute, prismatic o fixed.

joints{1} = rigidBodyJoint('base_link', 'fixed');
joints{2} = rigidBodyJoint('joint_1', 'revolute');
joints{3} = rigidBodyJoint('joint_2', 'revolute');

Si una articulació té un límit en termes de posicions viables, podem establir els límits de posició. Considerem que la primera articulació rotacional està restringida per \(\theta {\;}_{\textrm{Joint}\;1} \in \left\lbrack 0\;,\pi \right\rbrack\)

joints{2}.PositionLimits = [0 , pi];

defineix les transformacions per a les articulacions. Afegeix el paràmetre 'dh' perquè la toolbox sàpiga que li estàs introduint dades en format DH. També pots passar-hi una matriu de transformació homogènia.

Per a una articulació rotacional, el sistema ignorarà automàticament el paràmetre "theta", ja que theta és l’acció de l’articulació. Per a les articulacions prismàtiques, s’ignorarà el paràmetre "d", ja que és l’acció de l’articulació.

setFixedTransform(joints{1}, TB0);
setFixedTransform(joints{2}, DH_1, 'dh');
setFixedTransform(joints{3}, DH_2, 'dh');

afegeix les articulacions als cossos:

bodies{1}.Joint = joints{1};
bodies{2}.Joint = joints{2};
bodies{3}.Joint = joints{3};

finalment, afegeix els cossos a l’estructura del robot.

El primer cos està connectat a la base.

addBody(robot, bodies{1}, "base");

Els cossos següents estan connectats al seu predecessor.

Pots introduir manualment els seus noms:

addBody(robot, bodies{2}, 'body_base')

o accedir als noms definits prèviament

addBody(robot, bodies{3}, bodies{2}.Name);

Per accedir i canviar valors de les articulacions del robot després d’afegir els cossos al robot, podem utilitzar notació d’estructura i de cell. Per canviar els límits de l’articulació podem fer:

robot.Bodies{2}.Joint.PositionLimits = [-pi,pi/2];

Per afegir desplaçaments per a un estat d’articulació ("theta" per a articulacions rotacionals o "d" per a prismàtiques), pots definir-ne la posició inicial. Aquests valors seran els valors per defecte per mostrar el robot.

Per a aquest robot d’exemple utilitzarem el paràmetre "theta" guardat a la 4a posició dels nostres paràmetres DH.

robot.Bodies{2}.Joint.HomePosition = DH_1(4);
robot.Bodies{3}.Joint.HomePosition = DH_2(4);

addicionalment, hem d’establir la direcció i la magnitud de la gravetat respecte del sistema de la base:

robot.Gravity = [0, 9.81, 0];  
showdetails(robot)
--------------------
Robot: (3 bodies)

 Idx        Body Name       Joint Name       Joint Type        Parent Name(Idx)   Children Name(s)
 ---        ---------       ----------       ----------        ----------------   ----------------
   1        body_base        base_link            fixed                 base(0)   body_1(2)  
   2           body_1          joint_1         revolute            body_base(1)   body_2(3)  
   3           body_2          joint_2         revolute               body_1(2)   
--------------------

Visualitzar l’estructura del robot

Per veure el robot a MATLAB pots utilitzar la funció show(); mostrarà el robot en la seva configuració inicial:

show(robot)

figure_0.png

ans = 
  Axes (Primary) with properties:

             XLim: [-1 1]
             YLim: [-1 1]
           XScale: 'linear'
           YScale: 'linear'
    GridLineStyle: '-'
         Position: [0.1300 0.1100 0.7750 0.8150]
            Units: 'normalized'

  Show all properties

Per veure el robot en una altra configuració:

myconfig_2 = [0;-pi/2];  %column vector because we defined the robot as: robot = rigidBodyTree("DataFormat","column")
show(robot, myconfig_2) %we only have two joints

%This configuration is the one needed for the JointStatesToRviz
myconfig = [0,-pi/2,0,-pi/2,0,0]; 

Visualitzar a Rviz

En aquest tutorial pots utilitzar l'eina de visualització de ROS2 Rviz.

Per arrancar Rviz:

StartTutorialApplication('Rviz','model','ur3e'); 
%StartTutorialApplication('Rviz','model','ur3e', 'docker',false); %use this
%when using a native ROS workspace

Pots especificar qualsevol model UR, per exemple 'UR5e' (el model per defecte és UR3e).

Un cop Rviz està en execució, pots enviar-li una configuració desitjada com:

myconfig = [0,-pi/2,0,-pi/2,0,0]; 
JointStatesToRviz(myconfig, 'ur5e');