
Robot's source code
Dependencies: mbed
Asserv_Plan_B/planB.cpp
- Committer:
- sype
- Date:
- 2015-05-05
- Revision:
- 106:05096985d1b2
- Parent:
- 93:4d5664e9188a
- Child:
- 108:890094ee202a
File content as of revision 106:05096985d1b2:
#include "planB.h" #include "defines.h" extern Serial logger; aserv_planB::aserv_planB(Odometry2 &odometry,Motor &motorL,Motor &motorR) : m_odometry(odometry), m_motorL(motorL), m_motorR(motorR) { erreur_precedente = 0; somme_erreur = 0; Kp_angle = 3.0; //Fixed à 3.0 pour 180 deg Ki_angle = 0.0; Kd_angle = 0.0; cmd = 0; cmd_g = 0, cmd_d = 0; N = 0; done = false; squip = false; state = 0; // Etat ou l'on ne fait rien distanceGoal = 0; distance = 0; Kp_distance = 0.004; Ki_distance = 0; Kd_distance = 0; } void aserv_planB::setGoal(float x, float y, float phi) { m_goalX = x; m_goalY = y; m_goalPhi = phi; distanceGoal = sqrt(carre(m_goalY-m_odometry.getY())+carre(m_goalX-m_odometry.getX())); state = 3; // Etat de rotation 1 N = 0; } void aserv_planB::setGoal(float x, float y) { squip = true; setGoal(x, y, 0); squip = false; } void aserv_planB::update(float dt) { thetaGoal = atan2(m_goalY-m_odometry.getY(),m_goalX-m_odometry.getX()); float erreur_theta = thetaGoal-m_odometry.getTheta(); if(erreur_theta <= PI) erreur_theta += 2.0f*PI; if(erreur_theta >= PI) erreur_theta -= 2.0f*PI; // Etat 1 : Angle theta pour viser dans la direction du point M(x,y) if(state == 1 && N < 120) { //logger.printf("%.2f\r\n", erreur_theta*180/PI); cmd = erreur_theta*Kp_angle + (erreur_theta-erreur_precedente)*Kd_angle + somme_erreur*Ki_angle; erreur_precedente = erreur_theta; somme_erreur += erreur_theta; m_motorL.setSpeed(-cmd); m_motorR.setSpeed(cmd); N++; if(N==120) // && (abs(erreur_theta)<=2.0) { state = 2; logger.printf("Erreur theta : %.2f\r\n", erreur_theta*180/PI); N = 0; /*m_odometry.setDistLeft(0); m_odometry.setDistRight(0); memo_g = m_odometry.getDistLeft(); memo_d = m_odometry.getDistRight();*/ } } // Etat 2 : Parcours du robot jusqu'au point M(x,y) if(state == 2) { float erreur_distance = sqrt(carre(m_goalX-m_odometry.getX())+carre(m_goalY-m_odometry.getY())); //logger.printf("%.2f\r\n", erreur_distance); cmd_g = erreur_distance*Kp_distance - erreur_theta*Kp_angle; cmd_d = erreur_distance*Kp_distance + erreur_theta*Kp_angle; m_motorL.setSpeed(cmd_g); m_motorR.setSpeed(cmd_d); N++; if(abs(erreur_distance) <= 3.5 || N > 500) { state = 3; logger.printf("Erreur de distance : %.1f\r\n", erreur_distance); } } // Etat 3 : Placement au bon angle Phi souhaité au point M(x,y) if(state == 3 && squip==false) { float erreur_phi = m_goalPhi-m_odometry.getTheta(); logger.printf("%.2f\r\n", erreur_phi); m_motorL.setSpeed(0); m_motorR.setSpeed(0); done = true; } } /*float erreur_distance_g = distance_g-(m_odometry.getDistLeft()-memo_g); //- distance parcourue par la roue gauche depuis l'état 2 float erreur_distance_d = distance_d-(m_odometry.getDistRight()-memo_d); cmd_g = erreur_distance_g*Kp_distance; cmd_d = erreur_distance_d*Kp_distance; m_motorL.setSpeed(cmd_g); m_motorR.setSpeed(cmd_d);*/ /*void aserv_planB::control_speed() { vitesse_d = m_odometry.getVitRight(); vitesse_g = m_odometry.getVitLeft(); erreur_g = consigne_g - vitesse_g; cmd_g = erreur_g*Kp; erreur_d = consigne_d - vitesse_d; cmd_d = erreur_d*Kp; m_motorL.setSpeed(cmd_g); m_motorR.setSpeed(cmd_d); }*/