
Time is good
Fork of Robot2016_2-0 by
Diff: Odometry/Odometry.cpp
- Revision:
- 78:c28bdbf29b6e
- Parent:
- 77:f19cc7f81f2a
--- a/Odometry/Odometry.cpp Thu May 05 08:46:08 2016 +0000 +++ b/Odometry/Odometry.cpp Thu May 05 13:17:00 2016 +0000 @@ -17,6 +17,12 @@ m_pulses_right = 0; m_pulses_left = 0; pos_prog = 0; + + paused = false; + + timer.stop(); + timer.reset(); + wait_ms(100); } @@ -88,20 +94,29 @@ void Odometry::GotoXY(double x_goal, double y_goal) { + saved_x_goal = x_goal; + saved_y_goal = y_goal; + + currentStep = STEP_D; + currentMainFunction = MAIN_FCT_XY; + double theta_ = atan2(y_goal-y, x_goal-x); double dist_ = sqrt(carre(x_goal-x)+carre(y_goal-y)); - logger.printf("Dist : %3.2f\tTheta : %3.2f\n\r", dist_, theta_*180/PI); GotoThet(theta_); - logger.printf("J'ai fais theta je suis pas trop un fdp\n\r"); GotoDist(dist_); - logger.printf("J'ai fais Dist je suis pas trop un fdp\n\r"); } void Odometry::GotoXYT(double x_goal, double y_goal, double theta_goal) { + saved_x_goal = x_goal; + saved_y_goal = y_goal; + saved_theta_goal = theta_goal; + + currentStep = STEP_D; + currentMainFunction = MAIN_FCT_XYT; + double theta_ = atan2(y_goal-y, x_goal-x); double dist_ = sqrt(carre(x_goal-x)+carre(y_goal-y)); - logger.printf("Dist : %3.2f\tTheta : %3.2f\n\r", dist_, theta_*180/PI); GotoThet(theta_); GotoDist(dist_); GotoThet(theta_goal); @@ -109,6 +124,8 @@ void Odometry::GotoThet(double theta_) { + saved_theta_goal = theta_; + currentStep = STEP_T; //pos_prog++; //logger.printf("Theta : %3.2f\n\r", theta_*180/PI); //arrived = false; @@ -123,8 +140,6 @@ while(erreur_theta >= PI) erreur_theta -= 2*PI; while(erreur_theta < -PI) erreur_theta += 2*PI; - logger.printf("ET : %3.2f\n\r", erreur_theta*180/PI); - if(erreur_theta < 0) { distance_ticks_left = (int32_t) pos_initiale_left + (erreur_theta*m_v/2)/m_distPerTick_left; distance_ticks_right = (int32_t) pos_initiale_right - (erreur_theta*m_v/2)/m_distPerTick_right; @@ -141,23 +156,33 @@ //logger.printf("IniR:%6d\tDistR:%6d\tIniL:%6d\tDistL:%6d\n\r", pos_initiale_right, distance_ticks_right, pos_initiale_left, distance_ticks_left); - while(abs(m_pulses_right - distance_ticks_right) >= 1 && abs(m_pulses_left - distance_ticks_left) >= 1) { - if (SDevant && SHomologation) { - roboclaw.SpeedAccelM1M2(accel_dista, 0, 0); - while(1); - } + //while(abs(m_pulses_right - distance_ticks_right) >= 1 && abs(m_pulses_left - distance_ticks_left) >= 1) wait(0.001); + + while(abs(erreur_theta) > 2.f*PI/180.f) + { + wait(0.001); + + erreur_theta = theta_ - getTheta(); + while(erreur_theta >= PI) erreur_theta -= 2*PI; + while(erreur_theta < -PI) erreur_theta += 2*PI; } + //logger.printf ("[Thet] %d\t%d\n\r", m_pulses_right - distance_ticks_right, m_pulses_left - distance_ticks_left); //logger.printf("%6d\t%6d\t%6d\t%6d\t%6d\n\r",m_pulses_right - pos_initiale_right, distance_ticks_right, m_pulses_left - pos_initiale_left, distance_ticks_left); wait(0.4); - theta = theta_; + + /*roboclaw.ForwardM1(0); + roboclaw.ForwardM2(0);*/ + + //theta = theta_; //arrived = true; //logger.printf("arrivey %d\n\r",pos_prog); } void Odometry::GotoDist(double distance) { + currentStep = STEP_D; //pos_prog++; //logger.printf("Dist : %3.2f\n\r", distance); //arrived = false; @@ -166,22 +191,28 @@ int32_t distance_ticks_right = (int32_t) distance/m_distPerTick_right + pos_initiale_right; int32_t distance_ticks_left = (int32_t) distance/m_distPerTick_left + pos_initiale_left; - logger.printf("Je suis un fdp a l'envoi d'une commande 1 !\n\r"); if (distance >= 0) roboclaw.SpeedAccelDeccelPositionM1M2(accel_dista, vitesse_dista, deccel_dista, distance_ticks_right, accel_dista, vitesse_dista, deccel_dista, distance_ticks_left, 1); else roboclaw.SpeedAccelDeccelPositionM1M2(accel_dista, -vitesse_dista, deccel_dista, distance_ticks_right, accel_dista, -vitesse_dista, deccel_dista, distance_ticks_left, 1); - logger.printf("J'suis un fdp 2\n\r"); //logger.printf("IniR:%6d\tDistR:%6d\tIniL:%6d\tDistL:%6d\n\r", pos_initiale_right, distance_ticks_right, pos_initiale_left, distance_ticks_left); - while(abs(m_pulses_right - distance_ticks_right) >= 1 && abs(m_pulses_left - distance_ticks_left) >= 1) //logger.printf("PR:%6d\tIR:%6d\tDR:%6d\tPL:%6d\tIL:%6d\tDL:%6d\n\r",m_pulses_right, pos_initiale_right, distance_ticks_right, m_pulses_left, pos_initiale_left, distance_ticks_left); + while(abs(m_pulses_right - distance_ticks_right) >= 30 || abs(m_pulses_left - distance_ticks_left) >= 30) //logger.printf("PR:%6d\tIR:%6d\tDR:%6d\tPL:%6d\tIL:%6d\tDL:%6d\n\r",m_pulses_right, pos_initiale_right, distance_ticks_right, m_pulses_left, pos_initiale_left, distance_ticks_left); { - if (SDevant && SHomologation) { - roboclaw.SpeedAccelM1M2(accel_dista, 0, 0); - while(1) ; - } + wait(0.1); } + + /*while( carre(x-saved_x_goal) + carre(y-saved_y_goal) > 4*4) + { + wait(0.1); + logger.printf("Dist error : %f (%f,%f -> %f,%f)\r\n", sqrt(carre(x-saved_x_goal) + carre(y-saved_y_goal)),x,y,saved_x_goal,saved_y_goal); + }*/ + wait(0.4); + + /*roboclaw.ForwardM1(0); + roboclaw.ForwardM2(0);*/ + //logger.printf("arrivey %d\n\r",pos_prog); //logger.printf("X : %3.2f\tY : %3.2f\tTheta : %3.2f\n\r", getX(), getY(), getTheta()*180/PI); } @@ -203,8 +234,7 @@ roboclaw.SpeedAccelDeccelPositionM1M2(accel_angle, vitesse_angle, deccel_angle, distance_ticks_right, accel_angle, vitesse_angle, deccel_angle, distance_ticks_left, 1); - while((m_pulses_right != distance_ticks_right)&&(m_pulses_left != distance_ticks_left)) - logger.printf ("[Dist] %d\t%d\n\r", m_pulses_right - distance_ticks_right, m_pulses_left - distance_ticks_left); + while((m_pulses_right != distance_ticks_right)&&(m_pulses_left != distance_ticks_left)); wait(0.4); } @@ -221,4 +251,37 @@ while((m_pulses_right != distance_ticks_right)&&(m_pulses_left != distance_ticks_left)); //logger.printf("PR:%6d\tIR:%6d\tDR:%6d\tPL:%6d\tIL:%6d\tDL:%6d\n\r",m_pulses_right, pos_initiale_right, distance_ticks_right, m_pulses_left, pos_initiale_left, distance_ticks_left); wait(0.4); +} + +void Odometry::stop() { + paused = false; + timer.stop(); + timer.reset(); + + roboclaw.ForwardM1(0); + roboclaw.ForwardM2(0); +} + +void Odometry::pause() { + timer.start(); + timer.reset(); + paused = true; + roboclaw.ForwardM1(0); + roboclaw.ForwardM2(0); +} + +void Odometry::resume() { + if(paused && timer.read() > 0.5f) + { + paused = false; + timer.stop(); + timer.reset(); + + if(currentMainFunction == MAIN_FCT_XY) + GotoXY(saved_x_goal,saved_y_goal); + else + GotoXYT(saved_x_goal,saved_y_goal,saved_theta_goal); + + + } } \ No newline at end of file