Robot's source code

Dependencies:   mbed

Committer:
sype
Date:
Tue May 05 16:35:42 2015 +0000
Revision:
108:890094ee202a
Parent:
106:05096985d1b2
Child:
112:df5388d9f706
Asserv B, 6/10

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jagang 62:454cd844fe1e 1 #include "planB.h"
Jagang 71:95d76c181b22 2 #include "defines.h"
Jagang 71:95d76c181b22 3
Jagang 71:95d76c181b22 4 extern Serial logger;
Jagang 71:95d76c181b22 5
Jagang 71:95d76c181b22 6 aserv_planB::aserv_planB(Odometry2 &odometry,Motor &motorL,Motor &motorR) : m_odometry(odometry), m_motorL(motorL), m_motorR(motorR)
Jagang 62:454cd844fe1e 7 {
sype 106:05096985d1b2 8 somme_erreur = 0;
sype 106:05096985d1b2 9 Kp_angle = 3.0; //Fixed à 3.0 pour 180 deg
sype 108:890094ee202a 10 Ki_angle = 0.00;
sype 79:d97090bb6470 11 cmd = 0;
sype 85:8e95432d99d3 12 cmd_g = 0, cmd_d = 0;
sype 79:d97090bb6470 13 N = 0;
sype 108:890094ee202a 14 arrived = false;
sype 106:05096985d1b2 15 squip = false;
sype 79:d97090bb6470 16 state = 0; // Etat ou l'on ne fait rien
sype 106:05096985d1b2 17 distanceGoal = 0;
sype 106:05096985d1b2 18 distance = 0;
sype 106:05096985d1b2 19 Kp_distance = 0.004;
sype 108:890094ee202a 20 Ki_distance = 0.001;
sype 108:890094ee202a 21 Kd_distance = 0.0;
Jagang 71:95d76c181b22 22 }
Jagang 71:95d76c181b22 23
sype 106:05096985d1b2 24 void aserv_planB::setGoal(float x, float y, float phi)
Jagang 71:95d76c181b22 25 {
Jagang 71:95d76c181b22 26 m_goalX = x;
Jagang 71:95d76c181b22 27 m_goalY = y;
sype 106:05096985d1b2 28 m_goalPhi = phi;
sype 108:890094ee202a 29 distanceGoal = sqrt(carre(m_goalX-m_odometry.getX())+carre(m_goalY-m_odometry.getY()));
sype 108:890094ee202a 30 state = 1; // Etat de rotation 1
sype 106:05096985d1b2 31 N = 0;
sype 108:890094ee202a 32 Kp_angle = 3.0;
sype 108:890094ee202a 33 arrived = false;
sype 108:890094ee202a 34 }
sype 108:890094ee202a 35
sype 108:890094ee202a 36 void aserv_planB::stop(void)
sype 108:890094ee202a 37 {
sype 108:890094ee202a 38 m_motorL.setSpeed(0);
sype 108:890094ee202a 39 m_motorR.setSpeed(0);
sype 108:890094ee202a 40 m_goalX = m_odometry.getX();
sype 108:890094ee202a 41 m_goalY = m_odometry.getY();
sype 108:890094ee202a 42 setGoal(m_goalX, m_goalY);
sype 106:05096985d1b2 43 }
sype 106:05096985d1b2 44
sype 106:05096985d1b2 45 void aserv_planB::setGoal(float x, float y)
sype 106:05096985d1b2 46 {
sype 106:05096985d1b2 47 squip = true;
sype 106:05096985d1b2 48 setGoal(x, y, 0);
sype 106:05096985d1b2 49 squip = false;
sype 64:6489bcfc1173 50 }
sype 64:6489bcfc1173 51
sype 106:05096985d1b2 52 void aserv_planB::update(float dt)
sype 108:890094ee202a 53 {
sype 108:890094ee202a 54
sype 106:05096985d1b2 55 thetaGoal = atan2(m_goalY-m_odometry.getY(),m_goalX-m_odometry.getX());
sype 106:05096985d1b2 56 float erreur_theta = thetaGoal-m_odometry.getTheta();
sype 108:890094ee202a 57 float erreur_distance = sqrt(carre(m_goalX-m_odometry.getX())+carre(m_goalY-m_odometry.getY()));
sype 106:05096985d1b2 58 if(erreur_theta <= PI) erreur_theta += 2.0f*PI;
sype 106:05096985d1b2 59 if(erreur_theta >= PI) erreur_theta -= 2.0f*PI;
sype 108:890094ee202a 60
sype 106:05096985d1b2 61 // Etat 1 : Angle theta pour viser dans la direction du point M(x,y)
sype 108:890094ee202a 62 if(state == 1)
sype 108:890094ee202a 63 {
sype 106:05096985d1b2 64 //logger.printf("%.2f\r\n", erreur_theta*180/PI);
sype 106:05096985d1b2 65 cmd = erreur_theta*Kp_angle + (erreur_theta-erreur_precedente)*Kd_angle + somme_erreur*Ki_angle;
sype 106:05096985d1b2 66 erreur_precedente = erreur_theta;
sype 106:05096985d1b2 67 somme_erreur += erreur_theta;
sype 106:05096985d1b2 68
sype 108:890094ee202a 69 if(cmd > 0.8) cmd = 0.8;
sype 108:890094ee202a 70 else if(cmd < -0.8) cmd = -0.8;
sype 108:890094ee202a 71
sype 106:05096985d1b2 72 m_motorL.setSpeed(-cmd);
sype 106:05096985d1b2 73 m_motorR.setSpeed(cmd);
sype 106:05096985d1b2 74
sype 108:890094ee202a 75 if(abs(erreur_theta)< 0.05) N++;
sype 108:890094ee202a 76 else N = 0;
sype 108:890094ee202a 77 if(N > 10)
sype 108:890094ee202a 78 {
sype 108:890094ee202a 79 m_motorL.setSpeed(0);
sype 108:890094ee202a 80 m_motorR.setSpeed(0);
sype 106:05096985d1b2 81 state = 2;
sype 106:05096985d1b2 82 logger.printf("Erreur theta : %.2f\r\n", erreur_theta*180/PI);
sype 108:890094ee202a 83 somme_erreur = 0;
sype 106:05096985d1b2 84 N = 0;
sype 108:890094ee202a 85 Kp_angle = 5.0;
sype 106:05096985d1b2 86 }
sype 106:05096985d1b2 87 }
sype 108:890094ee202a 88
sype 106:05096985d1b2 89 // Etat 2 : Parcours du robot jusqu'au point M(x,y)
sype 108:890094ee202a 90 if(state == 2)
sype 108:890094ee202a 91 {
sype 108:890094ee202a 92 //logger.printf("%.2f %.2f %.2f\r\n", erreur_distance, cmd_g, cmd_d);
sype 108:890094ee202a 93 cmd_g = erreur_distance*Kp_distance + somme_erreur*Ki_distance - erreur_theta*Kp_angle;
sype 108:890094ee202a 94 cmd_d = erreur_distance*Kp_distance + somme_erreur*Ki_distance + erreur_theta*Kp_angle;
sype 106:05096985d1b2 95
sype 108:890094ee202a 96 if(cmd_g > 0.8) cmd_g = 0.8;
sype 108:890094ee202a 97 else if(cmd_g < -0.8) cmd_g = -0.8;
sype 108:890094ee202a 98
sype 108:890094ee202a 99 if(cmd_d > 0.8) cmd_d = 0.8;
sype 108:890094ee202a 100 else if(cmd_d < -0.8) cmd_d = -0.8;
sype 108:890094ee202a 101
sype 106:05096985d1b2 102 m_motorL.setSpeed(cmd_g);
sype 106:05096985d1b2 103 m_motorR.setSpeed(cmd_d);
sype 106:05096985d1b2 104
sype 108:890094ee202a 105 if(abs(erreur_distance) <= 10.0)
sype 106:05096985d1b2 106 {
sype 108:890094ee202a 107 arrived = true;
sype 108:890094ee202a 108 logger.printf("Erreur distance : %.2f, arrived = %d\r\n", erreur_distance, (int)arrived);
sype 106:05096985d1b2 109 state = 3;
sype 108:890094ee202a 110 N = 0;
sype 106:05096985d1b2 111 }
sype 108:890094ee202a 112 /*if(abs(erreur_distance) < 20.0) N++;
sype 108:890094ee202a 113 else N = 0;
sype 108:890094ee202a 114 if(N > 50)
sype 108:890094ee202a 115 {
sype 108:890094ee202a 116 logger.printf("Erreur distance : %.2f\r\n", erreur_distance);
sype 108:890094ee202a 117 state = 3;
sype 108:890094ee202a 118 N = 0;
sype 108:890094ee202a 119 }*/
sype 106:05096985d1b2 120 }
sype 108:890094ee202a 121
sype 106:05096985d1b2 122 // Etat 3 : Placement au bon angle Phi souhaité au point M(x,y)
sype 108:890094ee202a 123 if(state == 3)
sype 106:05096985d1b2 124 {
sype 108:890094ee202a 125 //float erreur_phi = m_goalPhi-m_odometry.getTheta();
sype 108:890094ee202a 126 //logger.printf("%.2f\r\n", erreur_phi*180/PI);
sype 106:05096985d1b2 127 m_motorL.setSpeed(0);
sype 106:05096985d1b2 128 m_motorR.setSpeed(0);
sype 108:890094ee202a 129 arrived = true;
sype 106:05096985d1b2 130 }
sype 106:05096985d1b2 131 }