Advertisement
Guest User

Untitled

a guest
Jun 4th, 2018
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Robots 8.18 KB | None | 0 0
  1. #pragma  platform(NXT)
  2. #include "writeFile.c"
  3.  
  4. const string  sFileName = "datos.txt";
  5.  
  6. task main()
  7. {
  8.    long i = 0;
  9.      float tfinal=30.0;
  10.      long niteraciones=0;
  11.      float posruedaAnue=0;      //Posicion instante actual rueda derecha (motorA)
  12.      float posruedaAant=0;      //Posicion instante anterior rueda derecha (motorA)
  13.      float posruedaBnue=0;      //Posicion instante actual rueda izquierda (motorB)
  14.      float posruedaBant=0;      //Posicion instante anterior rueda izquierda (motorB)
  15.      float acontrolA,acontrolB;             //Accion de control motor rueda derecha e izquierda instante k
  16.      float acontrolA1=0,acontrolB1=0;       //Accion de control motor rueda derecha e izquierda instante k-1
  17.      float vel_ang_d, vel_ang_i;
  18.      float vel_lin_d, vel_lin_i;
  19.      float vref_d, vref_i;
  20.      float wref_d,wref_i;
  21.      float error_vel_d, error_vel_i;         //Error de velocidad rueda derecha e izquierda instante k
  22.      float error_vel_d1=0, error_vel_i1=0;   //Error de velocidad rueda derecha e izquierda instante k-1
  23.      float error_vel_d2=0, error_vel_i2=0;   //Error de velocidad rueda derecha e izquierda instante k-2
  24.      float velLin_robot, velAng_robot;
  25.      float refx,refy;
  26.      float xpunto=0.0;
  27.      float ypunto=0.0;
  28.      float velxref=0.0;
  29.      float velyref=0.0;
  30.    float errorcua=0.0;        //indice integral error cuadrado
  31.    float ex=0.0, ey=0.0;
  32.  
  33.      float kx=1.0;        //Parametro de ponderacion para el control cinematico con punto descentralizado en x
  34.      float ky=1.0;        //Parametro de ponderacion para el control cinematico con punto descentralizado en y
  35.  
  36.      float theta=0;          // Orientacion inicial del robot (rad)
  37.      float x=500.0;             // Coordenada X inicial del robot (mm)
  38.      float y=0.0;               // Coordenada Y inicial del robot (mm)
  39.  
  40.      float b=56;                // (separación entre las ruedas)/2 (mm)
  41.      float e=56;                // punto descentrado para cálculo la velocidad y posición (mm)
  42.  
  43.      float pul2rad=0.0174533;   // pul2rad=2*pi/360=0.0174533: cad vuelta: 360 pulsos de encoder
  44.      float radiorueda=28.0;     // radio de la rueda (mm)
  45.  
  46.      float Ts=0.05;             // periodo de muestreo utilizado para el control
  47.  
  48.    nMotorEncoder[motorA] = 0; // reseteamos el encoder de la rueda derecha
  49.    nMotorEncoder[motorB] = 0; // reseteamos el encoder de la rueda izquierda
  50.    Delete(sFileName,nIoResult);
  51.    createTextFile(sFileName, 30000);
  52.  
  53.    float q0,q1,q2;       // parametros del controlador
  54.  
  55.    //Parametros P,Pi
  56.      float Kp=7.5;
  57.    float Kpi=7.5;
  58.    float T=0.05;
  59.    float Ti=0.1707;
  60.  
  61.    //incialización parámetros del controlador
  62.    //Controles P
  63.  
  64.    q0=Kp;
  65.    q1=0.0;
  66.    q2=0.0;
  67.  
  68.    //Controles PI
  69.    /*
  70.    q0=Kpi;
  71.    q1=Kpi*((T-Ti)/Ti);
  72.    q2=0.0;
  73.    */
  74.  
  75.    i=0;
  76.    niteraciones=(int)((tfinal)/0.05);
  77.  
  78.    while(i < niteraciones)    //bucle de control
  79.       {
  80.         // reseteamos el temporizador para empezar el bucle de control
  81.               ClearTimer(T1);
  82.  
  83.         //---------------Trayectoria circular-------------------------------------
  84.         // posicion y orientacion inicial: x=500.0, y=0.0, theta=pi/2;
  85.         /*
  86.         refx=500*cos(2*3.14159*0.04*0.05*i);
  87.         refy=500*sin(2*3.14159*0.04*0.05*i);
  88.         velxref=-500*2*3.14159*0.04*sin(2*3.14159*0.04*0.05*i);
  89.         velyref=500*2*3.14159*0.04*cos(2*3.14159*0.04*0.05*i);
  90.         */
  91.         //---------------Trayectoria infinito--------------------------------------
  92.         // posicion y orientacion inicial: x=500.0, y=0.0, theta=pi/4;
  93.         /*
  94.         refx=500*sin(2*3.14159*0.04*0.05*i)+500;
  95.         refy=250*sin(4*3.14159*0.04*0.05*i);
  96.         velxref=500*2*3.14159*0.04*cos(2*3.14159*0.04*0.05*i);
  97.         velyref=250*4*3.14159*0.04*cos(4*3.14159*0.04*0.05*i);
  98.         */
  99.         //---------------Trayectoria cuadrada--------------------------------------
  100.         // posicion y orientacion inicial: x=500.0, y=0.0, theta=0;
  101.  
  102.             if (i < niteraciones/4)
  103.           {
  104.             refx=500+(1500-500)*i/(niteraciones/4);
  105.             refy=0;
  106.             velxref=(1500-500)/(niteraciones/4);
  107.             velyref=0;
  108.           }
  109.         else if (i < niteraciones/2)
  110.           {
  111.             refx=1500;
  112.             refy=(1000-0)*(i-(niteraciones/4))/(niteraciones/4);
  113.             velxref=0;
  114.             velyref=(1000-0)/(niteraciones/4);
  115.           }
  116.         else if (i < niteraciones*3/4)
  117.           {
  118.             refx=1500-(1500-500)*(i-2*(niteraciones/4))/(niteraciones/4);
  119.             refy=1000;
  120.             velxref=-(1500-500)/(niteraciones/4);
  121.             velyref=0;
  122.           }
  123.         else
  124.           {
  125.             refx=500;
  126.             refy=1000-(1000-0)*(i-3*(niteraciones/4))/(niteraciones/4);
  127.             velxref=0;
  128.             velyref=-(1000-0)/(niteraciones/4);
  129.           }
  130.  
  131.  
  132.         //-------------------------------------------------------------------------
  133.  
  134.         // obtenemos el valor de los encoders (rad) para ver cuanto se ha movido
  135.         posruedaAnue=nMotorEncoder[motorA]*pul2rad;
  136.         posruedaBnue=nMotorEncoder[motorB]*pul2rad;
  137.  
  138.         // calculamos las velocidades angulares (rad/s) de las ruedas
  139.             vel_ang_d=(posruedaAnue-posruedaAant)/Ts;
  140.             vel_ang_i=(posruedaBnue-posruedaBant)/Ts;
  141.  
  142.             // calculamos las velocidades lineales (mm/s) de las ruedas: v = w*radio
  143.             vel_lin_d=vel_ang_d*radiorueda;
  144.             vel_lin_i=vel_ang_i*radiorueda;
  145.  
  146.             // calculamos la velocidad lineal del robot (mm/s)
  147.             velLin_robot= (vel_lin_d+vel_lin_i)/2;
  148.  
  149.             // calculamos la velocidad angular del robot (rad/s)
  150.             velAng_robot= (vel_lin_d-vel_lin_i)/(2*b);
  151.  
  152.             // calculamos la posicion X-Y (mm) y la orientacion del robot (rad)
  153.               x=x+velLin_robot*Ts*cos(theta);
  154.               y=y+velLin_robot*Ts*sin(theta);
  155.               theta=theta+velAng_robot*Ts;
  156.  
  157.             // calculamos la expresion del control cinematico del robot (mm/s)
  158.             xpunto=velxref+kx*(refx-(x+e*cos(theta)));
  159.             ypunto=velyref+ky*(refy-(y+e*sin(theta)));
  160.  
  161.             // calculamos el modelo cinematico inverso del robot (mm/s)
  162.             vref_d=((e*cos(theta)-b*sin(theta))*xpunto+(e*sin(theta)+b*cos(theta))*ypunto)/e;
  163.             vref_i=((e*cos(theta)+b*sin(theta))*xpunto+(e*sin(theta)-b*cos(theta))*ypunto)/e;
  164.  
  165.             // calculamos las velocidades angulares de referencia para el control dinamico (rad/s)
  166.             wref_d=vref_d/radiorueda;
  167.             wref_i=vref_i/radiorueda;
  168.  
  169.             // calculamos los errores de la velocidad angular de las ruedas (rad/s)
  170.             error_vel_d=wref_d-vel_ang_d;
  171.             error_vel_i=wref_i-vel_ang_i;
  172.  
  173.             // calculamos las acciones de control a aplicar a cada rueda
  174.             acontrolA= q0*error_vel_d; //Accion de control P
  175.             acontrolB= q0*error_vel_i; //Accion de control P
  176.  
  177.             //acontrolA=(q0*error_vel_d+q1*error_vel_d1+acontrolA1); //Accion de control PI
  178.             //acontrolB=(q0*error_vel_i+q1*error_vel_i1+acontrolB1); //Accion de control PI
  179.  
  180.             // saturamos las acciones de control
  181.             if (acontrolA>100)
  182.                 {
  183.                     acontrolA=100;
  184.                 }
  185.             if (acontrolA<-100)
  186.                 {
  187.                     acontrolA=-100;
  188.                 }
  189.             if (acontrolB>100)
  190.                 {
  191.                     acontrolB=100;
  192.                 }
  193.             if (acontrolB<-100)
  194.                 {
  195.                     acontrolB=-100;
  196.                 }
  197.  
  198.               // aplicamos las acciones de control a los motores
  199.             motor[motorA] = acontrolA;
  200.             motor[motorB] = acontrolB;
  201.  
  202.         // almacenamos los valores de los encoder para la proxima iteracion
  203.             posruedaAant=posruedaAnue;
  204.             posruedaBant=posruedaBnue;
  205.  
  206.             // actualizacion de los errores y acciones anteriores
  207.         acontrolA1=acontrolA;
  208.         acontrolB1=acontrolB;
  209.         error_vel_d2=error_vel_d1;
  210.         error_vel_i2=error_vel_i1;
  211.         error_vel_d1=error_vel_d;
  212.         error_vel_i1=error_vel_i;
  213.  
  214.             // calculo indice integral error cuadratico
  215.                 ex=refx-x;
  216.                 ey=refy-y;
  217.                 errorcua=errorcua+sqrt(ex*ex+ey*ey);
  218.  
  219.         // escribimos los valores mas importantes en el fichero de datos
  220.             writeFloatNumber(refx);
  221.             writeFloatNumber(refy);
  222.             writeFloatNumber(x);
  223.             writeFloatNumber(y);
  224.             writeFloatNumber(errorcua);
  225.             writeFloatNumber(vel_ang_d);
  226.             writeFloatnumber(vel_ang_i);
  227.             writeNewLine();
  228.  
  229.             i++;
  230.  
  231.         //Esperar el tiempo restante hasta el siguiente periodo
  232.             wait1Msec(50-(time1(T1)));
  233.   }
  234.   closeWriteTextFile();
  235. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement