Robot secondaire

Dependencies:   RoboClaw mbed StepperMotor

Fork of RoboClaw by Simon Emarre

Committer:
sype
Date:
Tue Jan 05 14:51:10 2016 +0000
Revision:
12:d5e21f71c2a9
Parent:
10:ae3178aa94e9
Child:
30:58bfac39e701
Old odo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sype 0:ad9600df4a70 1 #include "Odometry.h"
sype 0:ad9600df4a70 2
sype 0:ad9600df4a70 3 // M1 = Moteur droit, M2 = Moteur gauche
sype 0:ad9600df4a70 4
sype 10:ae3178aa94e9 5 Odometry::Odometry(double diameter_right, double diameter_left, double v, uint16_t quadrature, RoboClaw &rc) : roboclaw(rc)
sype 10:ae3178aa94e9 6 {
sype 0:ad9600df4a70 7 m_v = v;
sype 10:ae3178aa94e9 8 m_distPerTick_left = diameter_left*PI/quadrature;
sype 10:ae3178aa94e9 9 m_distPerTick_right = diameter_right*PI/quadrature;
sype 4:3e6e78d6d3d9 10
sype 3:62e9d715de65 11 roboclaw.ForwardM1(ADR, 0);
sype 3:62e9d715de65 12 roboclaw.ForwardM2(ADR, 0);
sype 10:ae3178aa94e9 13 roboclaw.ResetEnc(ADR);
sype 4:3e6e78d6d3d9 14 // Erreur autorisée sur le déplacement en angle
sype 3:62e9d715de65 15 erreur_ang = 0.01;
sype 4:3e6e78d6d3d9 16
sype 0:ad9600df4a70 17 m_pulses_right = 0;
sype 0:ad9600df4a70 18 m_pulses_left = 0;
sype 10:ae3178aa94e9 19 pos_prog = 0;
sype 2:abdf8c6823a1 20 wait_ms(100);
sype 0:ad9600df4a70 21 }
sype 0:ad9600df4a70 22
sype 10:ae3178aa94e9 23 void Odometry::setPos(double x, double y, double theta)
sype 10:ae3178aa94e9 24 {
sype 0:ad9600df4a70 25 this->x = x;
sype 0:ad9600df4a70 26 this->y = y;
sype 0:ad9600df4a70 27 this->theta = theta;
sype 0:ad9600df4a70 28 }
sype 12:d5e21f71c2a9 29 void Odometry::getEnc()
sype 12:d5e21f71c2a9 30 {
sype 12:d5e21f71c2a9 31 pc.printf("EncM1 : %d\tEncM2 : %d\n\r", roboclaw.ReadEncM1(ADR), roboclaw.ReadEncM2(ADR));
sype 12:d5e21f71c2a9 32 }
sype 0:ad9600df4a70 33
sype 10:ae3178aa94e9 34 void Odometry::setX(double x)
sype 10:ae3178aa94e9 35 {
sype 0:ad9600df4a70 36 this->x = x;
sype 0:ad9600df4a70 37 }
sype 0:ad9600df4a70 38
sype 10:ae3178aa94e9 39 void Odometry::setY(double y)
sype 10:ae3178aa94e9 40 {
sype 0:ad9600df4a70 41 this->y = y;
sype 0:ad9600df4a70 42 }
sype 0:ad9600df4a70 43
sype 10:ae3178aa94e9 44 void Odometry::setTheta(double theta)
sype 10:ae3178aa94e9 45 {
sype 0:ad9600df4a70 46 this->theta = theta;
sype 0:ad9600df4a70 47 }
sype 0:ad9600df4a70 48
sype 10:ae3178aa94e9 49 void Odometry::update_odo(void)
sype 10:ae3178aa94e9 50 {
sype 3:62e9d715de65 51 int32_t delta_right = roboclaw.ReadEncM1(ADR) - m_pulses_right;
sype 0:ad9600df4a70 52 m_pulses_right = roboclaw.ReadEncM1(ADR);
sype 3:62e9d715de65 53 int32_t delta_left = roboclaw.ReadEncM2(ADR) - m_pulses_left;
sype 0:ad9600df4a70 54 m_pulses_left = roboclaw.ReadEncM2(ADR);
sype 12:d5e21f71c2a9 55
sype 12:d5e21f71c2a9 56 double deltaS = (m_distPerTick_left*delta_left + m_distPerTick_right*delta_right)*C / 2.0f;
sype 12:d5e21f71c2a9 57 double deltaTheta = (m_distPerTick_left*delta_left - m_distPerTick_right*delta_right)*C / m_v;
sype 4:3e6e78d6d3d9 58
sype 12:d5e21f71c2a9 59 /*double R = deltaS/deltaTheta;
sype 10:ae3178aa94e9 60
sype 10:ae3178aa94e9 61 double xO = x - R*sin(theta);
sype 10:ae3178aa94e9 62 double yO = y + R*cos(theta);
sype 4:3e6e78d6d3d9 63
sype 0:ad9600df4a70 64 theta += deltaTheta;
sype 4:3e6e78d6d3d9 65
sype 10:ae3178aa94e9 66 if(deltaTheta == 0) {
sype 10:ae3178aa94e9 67 x = x + deltaS*cos(theta);
sype 10:ae3178aa94e9 68 y = y + deltaS*sin(theta);
sype 10:ae3178aa94e9 69 }
sype 10:ae3178aa94e9 70 else {
sype 10:ae3178aa94e9 71 x = xO + R*sin(theta);
sype 10:ae3178aa94e9 72 y = yO - R*cos(theta);
sype 12:d5e21f71c2a9 73 }*/
sype 10:ae3178aa94e9 74
sype 12:d5e21f71c2a9 75 double dx = deltaS*cos(theta);
sype 10:ae3178aa94e9 76 double dy = deltaS*sin(theta);
sype 10:ae3178aa94e9 77 x += dx;
sype 10:ae3178aa94e9 78 y += dy;
sype 12:d5e21f71c2a9 79 theta += deltaTheta;
sype 4:3e6e78d6d3d9 80
sype 0:ad9600df4a70 81 while(theta > PI) theta -= 2*PI;
sype 0:ad9600df4a70 82 while(theta <= -PI) theta += 2*PI;
sype 0:ad9600df4a70 83 }
sype 0:ad9600df4a70 84
sype 12:d5e21f71c2a9 85 void Odometry::GotoXY(double x_goal, double y_goal)
sype 12:d5e21f71c2a9 86 {
sype 12:d5e21f71c2a9 87 double theta_ = atan2(y_goal-y, x_goal-x);
sype 12:d5e21f71c2a9 88 double dist_ = sqrt(carre(x_goal-x)+carre(y_goal-y));
sype 12:d5e21f71c2a9 89 pc.printf("Dist : %3.2f\tTheta : %3.2f\n\r", dist_, theta_*180/PI);
sype 12:d5e21f71c2a9 90 GotoThet(theta_);
sype 12:d5e21f71c2a9 91 GotoDist(dist_);
sype 12:d5e21f71c2a9 92 }
sype 12:d5e21f71c2a9 93
sype 10:ae3178aa94e9 94 void Odometry::GotoXYT(double x_goal, double y_goal, double theta_goal)
sype 10:ae3178aa94e9 95 {
sype 0:ad9600df4a70 96 double theta_ = atan2(y_goal-y, x_goal-x);
sype 3:62e9d715de65 97 double dist_ = sqrt(carre(x_goal-x)+carre(y_goal-y));
sype 12:d5e21f71c2a9 98 pc.printf("Dist : %3.2f\tTheta : %3.2f\n\r", dist_, theta_*180/PI);
sype 2:abdf8c6823a1 99 GotoThet(theta_);
sype 3:62e9d715de65 100 GotoDist(dist_);
sype 12:d5e21f71c2a9 101 GotoThet(theta_goal);
sype 0:ad9600df4a70 102 }
sype 2:abdf8c6823a1 103
sype 10:ae3178aa94e9 104 void Odometry::GotoThet(double theta_)
sype 10:ae3178aa94e9 105 {
sype 10:ae3178aa94e9 106 led = 0;
sype 10:ae3178aa94e9 107 //pos_prog++;
sype 10:ae3178aa94e9 108 //pc.printf("Theta : %3.2f\n\r", theta_*180/PI);
sype 10:ae3178aa94e9 109 //arrived = false;
sype 10:ae3178aa94e9 110
sype 10:ae3178aa94e9 111 int32_t distance_ticks_left;
sype 10:ae3178aa94e9 112 int32_t distance_ticks_right;
sype 10:ae3178aa94e9 113
sype 10:ae3178aa94e9 114 int32_t pos_initiale_right = m_pulses_right, pos_initiale_left = m_pulses_left;
sype 4:3e6e78d6d3d9 115
sype 4:3e6e78d6d3d9 116 // Le calcul d'erreur est bon (testé), tu peux le vérifier par dessin
sype 3:62e9d715de65 117 double erreur_theta = theta_ - getTheta();
sype 4:3e6e78d6d3d9 118
sype 3:62e9d715de65 119 while(erreur_theta >= PI) erreur_theta -= 2*PI;
sype 12:d5e21f71c2a9 120 while(erreur_theta < -PI) erreur_theta += 2*PI;
sype 12:d5e21f71c2a9 121
sype 12:d5e21f71c2a9 122 pc.printf("ET : %3.2f\n\r", erreur_theta*180/PI);
sype 12:d5e21f71c2a9 123
sype 12:d5e21f71c2a9 124 if(erreur_theta < 0) {
sype 12:d5e21f71c2a9 125 distance_ticks_left = (int32_t) pos_initiale_left + (erreur_theta*m_v/2)/m_distPerTick_left;
sype 12:d5e21f71c2a9 126 distance_ticks_right = (int32_t) pos_initiale_right - (erreur_theta*m_v/2)/m_distPerTick_right;
sype 4:3e6e78d6d3d9 127 } else {
sype 12:d5e21f71c2a9 128 distance_ticks_left = (int32_t) pos_initiale_left + (erreur_theta*m_v/2)/m_distPerTick_left;
sype 12:d5e21f71c2a9 129 distance_ticks_right = (int32_t) pos_initiale_right - (erreur_theta*m_v/2)/m_distPerTick_right;
sype 2:abdf8c6823a1 130 }
sype 10:ae3178aa94e9 131
sype 12:d5e21f71c2a9 132 //pc.printf("TV %3.2f\tTh %3.2f\tET %3.2f\n\r",theta_*180/PI,getTheta()*180/PI,erreur_theta*180/PI);
sype 12:d5e21f71c2a9 133 //pc.printf("X : %3.2f\tY : %3.2f\tTheta : %3.2f\n\r", getX(), getY(), getTheta()*180/PI);
sype 10:ae3178aa94e9 134 //pc.printf("M1 %6d\tM2 %6d\n\r",distance_ticks_right, distance_ticks_left);
sype 10:ae3178aa94e9 135
sype 10:ae3178aa94e9 136 roboclaw.SpeedAccelDeccelPositionM1M2(ADR, accel_angle, vitesse_angle, deccel_angle, distance_ticks_right, accel_angle, vitesse_angle, deccel_angle, distance_ticks_left, 1);
sype 10:ae3178aa94e9 137
sype 10:ae3178aa94e9 138 //pc.printf("IniR:%6d\tDistR:%6d\tIniL:%6d\tDistL:%6d\n\r", pos_initiale_right, distance_ticks_right, pos_initiale_left, distance_ticks_left);
sype 10:ae3178aa94e9 139
sype 10:ae3178aa94e9 140 while((m_pulses_right != distance_ticks_right)&&(m_pulses_left != distance_ticks_left)); //pc.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);
sype 12:d5e21f71c2a9 141 setTheta(theta_);
sype 10:ae3178aa94e9 142 led = 1;
sype 10:ae3178aa94e9 143 //arrived = true;
sype 10:ae3178aa94e9 144 //pc.printf("arrivey %d\n\r",pos_prog);
sype 2:abdf8c6823a1 145 }
sype 2:abdf8c6823a1 146
sype 10:ae3178aa94e9 147 void Odometry::GotoDist(double distance)
sype 10:ae3178aa94e9 148 {
sype 10:ae3178aa94e9 149 led = 0;
sype 10:ae3178aa94e9 150 //pos_prog++;
sype 10:ae3178aa94e9 151 //pc.printf("Dist : %3.2f\n\r", distance);
sype 10:ae3178aa94e9 152 //arrived = false;
sype 10:ae3178aa94e9 153
sype 10:ae3178aa94e9 154 int32_t pos_initiale_right = m_pulses_right, pos_initiale_left = m_pulses_left;
sype 10:ae3178aa94e9 155
sype 10:ae3178aa94e9 156 int32_t distance_ticks_right = (int32_t) distance/m_distPerTick_right + pos_initiale_right;
sype 10:ae3178aa94e9 157 int32_t distance_ticks_left = (int32_t) distance/m_distPerTick_left + pos_initiale_left;
sype 10:ae3178aa94e9 158
sype 10:ae3178aa94e9 159 roboclaw.SpeedAccelDeccelPositionM1M2(ADR, accel_dista, vitesse_dista, deccel_dista, distance_ticks_right, accel_dista, vitesse_dista, deccel_dista, distance_ticks_left, 1);
sype 10:ae3178aa94e9 160
sype 10:ae3178aa94e9 161 //pc.printf("IniR:%6d\tDistR:%6d\tIniL:%6d\tDistL:%6d\n\r", pos_initiale_right, distance_ticks_right, pos_initiale_left, distance_ticks_left);
sype 12:d5e21f71c2a9 162
sype 10:ae3178aa94e9 163 while((m_pulses_right != distance_ticks_right)&&(m_pulses_left != distance_ticks_left)); //pc.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);
sype 10:ae3178aa94e9 164 led = 1;
sype 10:ae3178aa94e9 165 //pc.printf("arrivey %d\n\r",pos_prog);
sype 10:ae3178aa94e9 166 //pc.printf("X : %3.2f\tY : %3.2f\tTheta : %3.2f\n\r", getX(), getY(), getTheta()*180/PI);
sype 2:abdf8c6823a1 167 }