Guillaume Chauvon
/
Asserve12
asser1
commande_moteurs.cpp@4:deef042e9c02, 2019-05-08 (annotated)
- Committer:
- GuillaumeCH
- Date:
- Wed May 08 20:46:46 2019 +0000
- Revision:
- 4:deef042e9c02
- Parent:
- 3:1dba6eca01ad
f
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
GuillaumeCH | 2:5764f89a27f6 | 1 | |
GuillaumeCH | 2:5764f89a27f6 | 2 | #include "mbed.h" |
GuillaumeCH | 2:5764f89a27f6 | 3 | |
GuillaumeCH | 2:5764f89a27f6 | 4 | #include "commande_moteurs.h" |
GuillaumeCH | 2:5764f89a27f6 | 5 | #include "hardware.h" |
GuillaumeCH | 2:5764f89a27f6 | 6 | #include "reglages.h" |
GuillaumeCH | 2:5764f89a27f6 | 7 | #include "math_precalc.h" |
GuillaumeCH | 2:5764f89a27f6 | 8 | |
GuillaumeCH | 2:5764f89a27f6 | 9 | #include "odometrie.h" |
GuillaumeCH | 2:5764f89a27f6 | 10 | |
GuillaumeCH | 2:5764f89a27f6 | 11 | |
GuillaumeCH | 2:5764f89a27f6 | 12 | void commande_vitesse(float vitesse_G,float vitesse_D){ //fonction pour commander les moteurs sans avoir à utiliser set_PWM |
GuillaumeCH | 2:5764f89a27f6 | 13 | |
GuillaumeCH | 2:5764f89a27f6 | 14 | int sens_G=signe(vitesse_G); |
GuillaumeCH | 2:5764f89a27f6 | 15 | int sens_D=signe(vitesse_D); |
GuillaumeCH | 2:5764f89a27f6 | 16 | double vitesse_local_G=abs(vitesse_G); |
GuillaumeCH | 2:5764f89a27f6 | 17 | double vitesse_local_D=abs(vitesse_D); |
GuillaumeCH | 2:5764f89a27f6 | 18 | |
GuillaumeCH | 2:5764f89a27f6 | 19 | if(abs(vitesse_G) > 900){ |
GuillaumeCH | 2:5764f89a27f6 | 20 | vitesse_local_G=900; |
GuillaumeCH | 2:5764f89a27f6 | 21 | } |
GuillaumeCH | 2:5764f89a27f6 | 22 | if(abs(vitesse_G)<10){ |
GuillaumeCH | 2:5764f89a27f6 | 23 | vitesse_local_G=10; |
GuillaumeCH | 2:5764f89a27f6 | 24 | } |
GuillaumeCH | 2:5764f89a27f6 | 25 | if(abs(vitesse_D) > 900){ |
GuillaumeCH | 2:5764f89a27f6 | 26 | vitesse_local_D=900; |
GuillaumeCH | 2:5764f89a27f6 | 27 | } |
GuillaumeCH | 2:5764f89a27f6 | 28 | if(abs(vitesse_D)< 10){ |
GuillaumeCH | 2:5764f89a27f6 | 29 | vitesse_local_D=10; |
GuillaumeCH | 2:5764f89a27f6 | 30 | |
GuillaumeCH | 2:5764f89a27f6 | 31 | } |
GuillaumeCH | 2:5764f89a27f6 | 32 | ; |
GuillaumeCH | 2:5764f89a27f6 | 33 | int VG_int = (int) vitesse_local_G*sens_G*COEFF_MOTEUR_G; |
GuillaumeCH | 2:5764f89a27f6 | 34 | int VD_int = (int) vitesse_local_D*sens_D*COEFF_MOTEUR_D; |
GuillaumeCH | 2:5764f89a27f6 | 35 | float VG_f = vitesse_local_G*sens_G*COEFF_MOTEUR_G; |
GuillaumeCH | 2:5764f89a27f6 | 36 | float VD_f = vitesse_local_D*sens_D*COEFF_MOTEUR_D; |
GuillaumeCH | 2:5764f89a27f6 | 37 | float centieme_D = (VD_f-VD_int)*1000; |
GuillaumeCH | 2:5764f89a27f6 | 38 | float centieme_G = (VG_f-VG_int)*1000; |
GuillaumeCH | 2:5764f89a27f6 | 39 | if ((rand()%1000) < centieme_G){ |
GuillaumeCH | 2:5764f89a27f6 | 40 | VG_int+=1; |
GuillaumeCH | 2:5764f89a27f6 | 41 | } |
GuillaumeCH | 2:5764f89a27f6 | 42 | if ((rand()%1000) < centieme_D){ |
GuillaumeCH | 2:5764f89a27f6 | 43 | VD_int+=1; |
GuillaumeCH | 2:5764f89a27f6 | 44 | } |
GuillaumeCH | 3:1dba6eca01ad | 45 | //printf("vitesseG : %f, vitesseD : %f, %d, %d", VG_f, VD_f, VG_int, VD_int); |
GuillaumeCH | 2:5764f89a27f6 | 46 | set_PWM_moteur_G(VD_int);//le branchements des moteurs est à vérifier ( fonctionne dans l'état actuel du robots |
GuillaumeCH | 2:5764f89a27f6 | 47 | set_PWM_moteur_D(VG_int);// |
GuillaumeCH | 2:5764f89a27f6 | 48 | } |
GuillaumeCH | 2:5764f89a27f6 | 49 | void vitesse_nulle_G(int zero){ |
GuillaumeCH | 2:5764f89a27f6 | 50 | if(zero == 0){ |
GuillaumeCH | 2:5764f89a27f6 | 51 | set_PWM_moteur_G(0); |
GuillaumeCH | 2:5764f89a27f6 | 52 | } |
GuillaumeCH | 2:5764f89a27f6 | 53 | } |
GuillaumeCH | 2:5764f89a27f6 | 54 | void vitesse_nulle_D(int zero){ |
GuillaumeCH | 2:5764f89a27f6 | 55 | if(zero == 0){ |
GuillaumeCH | 2:5764f89a27f6 | 56 | set_PWM_moteur_D(0); |
GuillaumeCH | 2:5764f89a27f6 | 57 | } |
GuillaumeCH | 2:5764f89a27f6 | 58 | } |
GuillaumeCH | 2:5764f89a27f6 | 59 | void reculer_un_peu(int distance){ |
GuillaumeCH | 2:5764f89a27f6 | 60 | motors_on(); |
GuillaumeCH | 2:5764f89a27f6 | 61 | long int x_ini = get_x_actuel(); |
GuillaumeCH | 2:5764f89a27f6 | 62 | long int y_ini = get_y_actuel(); |
GuillaumeCH | 2:5764f89a27f6 | 63 | double angle_vise_deg = get_angle(); |
GuillaumeCH | 2:5764f89a27f6 | 64 | double angle_vise=angle_vise_deg*3.142/180; |
GuillaumeCH | 2:5764f89a27f6 | 65 | double angle = get_angle(); |
GuillaumeCH | 2:5764f89a27f6 | 66 | |
GuillaumeCH | 2:5764f89a27f6 | 67 | long int x_local_ini = x_ini*cos(angle_vise) + y_ini*sin(angle_vise); |
GuillaumeCH | 2:5764f89a27f6 | 68 | long int y_local_ini = y_ini*cos(angle_vise) - x_ini*sin(angle_vise); |
GuillaumeCH | 2:5764f89a27f6 | 69 | |
GuillaumeCH | 2:5764f89a27f6 | 70 | long int x_actuel = get_x_actuel(); |
GuillaumeCH | 2:5764f89a27f6 | 71 | long int y_actuel = get_y_actuel(); |
GuillaumeCH | 2:5764f89a27f6 | 72 | long int x_local = x_actuel*cos(angle_vise) + y_actuel*sin(angle_vise)-x_local_ini; |
GuillaumeCH | 2:5764f89a27f6 | 73 | long int y_local = y_actuel*cos(angle_vise) - x_actuel*sin(angle_vise)-y_local_ini; |
GuillaumeCH | 2:5764f89a27f6 | 74 | |
GuillaumeCH | 2:5764f89a27f6 | 75 | float vitesse_G; |
GuillaumeCH | 2:5764f89a27f6 | 76 | float vitesse_D; |
GuillaumeCH | 2:5764f89a27f6 | 77 | |
GuillaumeCH | 2:5764f89a27f6 | 78 | angle = get_angle(); |
GuillaumeCH | 2:5764f89a27f6 | 79 | |
GuillaumeCH | 3:1dba6eca01ad | 80 | //printf("YOOOO\n\n "); |
GuillaumeCH | 2:5764f89a27f6 | 81 | while (distance+x_local>0){ |
GuillaumeCH | 2:5764f89a27f6 | 82 | |
GuillaumeCH | 2:5764f89a27f6 | 83 | vitesse_G = (distance+x_local)/70; |
GuillaumeCH | 2:5764f89a27f6 | 84 | vitesse_D = vitesse_G; |
GuillaumeCH | 2:5764f89a27f6 | 85 | if(vitesse_G >150){ |
GuillaumeCH | 2:5764f89a27f6 | 86 | vitesse_G=150; |
GuillaumeCH | 2:5764f89a27f6 | 87 | vitesse_D=150; |
GuillaumeCH | 2:5764f89a27f6 | 88 | } |
GuillaumeCH | 2:5764f89a27f6 | 89 | if (vitesse_G<-150){ |
GuillaumeCH | 2:5764f89a27f6 | 90 | vitesse_G=-150; |
GuillaumeCH | 2:5764f89a27f6 | 91 | vitesse_D=-150; |
GuillaumeCH | 2:5764f89a27f6 | 92 | } |
GuillaumeCH | 2:5764f89a27f6 | 93 | |
GuillaumeCH | 2:5764f89a27f6 | 94 | angle = get_angle(); |
GuillaumeCH | 2:5764f89a27f6 | 95 | vitesse_G = vitesse_G - 1.5*diff_angle(angle_vise_deg,angle) - 0.015*y_local; // petit asser en angle |
GuillaumeCH | 2:5764f89a27f6 | 96 | vitesse_D = vitesse_D + 1.5*diff_angle(angle_vise_deg,angle) + 0.015*y_local; |
GuillaumeCH | 2:5764f89a27f6 | 97 | |
GuillaumeCH | 2:5764f89a27f6 | 98 | commande_vitesse(-vitesse_G,-vitesse_D); |
GuillaumeCH | 2:5764f89a27f6 | 99 | actualise_position(); |
GuillaumeCH | 2:5764f89a27f6 | 100 | x_actuel = get_x_actuel(); |
GuillaumeCH | 2:5764f89a27f6 | 101 | y_actuel = get_y_actuel(); |
GuillaumeCH | 2:5764f89a27f6 | 102 | x_local = x_actuel*cos(angle_vise) + y_actuel*sin(angle_vise)-x_local_ini; |
GuillaumeCH | 2:5764f89a27f6 | 103 | y_local = y_actuel*cos(angle_vise) - x_actuel*sin(angle_vise)-y_local_ini; |
GuillaumeCH | 2:5764f89a27f6 | 104 | printf(" VG : %f VD : %f ; x_local : %d, y_local : %d, angle_vise : %f",vitesse_G,vitesse_D, x_local,y_local, angle_vise);// sqrt((x_ini - x_actuel)*(x_ini - x_actuel) + (y_ini - y_actuel)*(y_ini - y_actuel)), y_actuel, (x_actuel - x_ini)*(x_actuel - x_ini) + (y_actuel - y_ini)*(y_actuel - y_ini)); |
GuillaumeCH | 2:5764f89a27f6 | 105 | |
GuillaumeCH | 2:5764f89a27f6 | 106 | } |
GuillaumeCH | 2:5764f89a27f6 | 107 | test_rotation_abs(angle_vise_deg); |
GuillaumeCH | 2:5764f89a27f6 | 108 | vitesse_nulle_G(0); |
GuillaumeCH | 2:5764f89a27f6 | 109 | vitesse_nulle_D(0); |
GuillaumeCH | 2:5764f89a27f6 | 110 | wait(0.3); |
GuillaumeCH | 2:5764f89a27f6 | 111 | motors_stop(); |
GuillaumeCH | 2:5764f89a27f6 | 112 | } |
GuillaumeCH | 2:5764f89a27f6 | 113 | |
GuillaumeCH | 2:5764f89a27f6 | 114 | void ligne_droite(long int distance) |
GuillaumeCH | 2:5764f89a27f6 | 115 | { |
GuillaumeCH | 2:5764f89a27f6 | 116 | // le robot avance en ligne droite sur une distance donnée, à la vitesse voulue (entre 0 et 900) |
GuillaumeCH | 2:5764f89a27f6 | 117 | motors_on(); |
GuillaumeCH | 2:5764f89a27f6 | 118 | long int x_ini = get_x_actuel(); |
GuillaumeCH | 2:5764f89a27f6 | 119 | long int y_ini = get_y_actuel(); |
GuillaumeCH | 2:5764f89a27f6 | 120 | double angle_vise_deg = get_angle(); |
GuillaumeCH | 2:5764f89a27f6 | 121 | double angle_vise=angle_vise_deg*3.142/180; |
GuillaumeCH | 2:5764f89a27f6 | 122 | double angle = get_angle(); |
GuillaumeCH | 2:5764f89a27f6 | 123 | |
GuillaumeCH | 2:5764f89a27f6 | 124 | long int x_local_ini = x_ini*cos(angle_vise) + y_ini*sin(angle_vise); |
GuillaumeCH | 2:5764f89a27f6 | 125 | long int y_local_ini = y_ini*cos(angle_vise) - x_ini*sin(angle_vise); |
GuillaumeCH | 2:5764f89a27f6 | 126 | |
GuillaumeCH | 2:5764f89a27f6 | 127 | long int x_actuel = get_x_actuel(); |
GuillaumeCH | 2:5764f89a27f6 | 128 | long int y_actuel = get_y_actuel(); |
GuillaumeCH | 2:5764f89a27f6 | 129 | long int x_local = x_actuel*cos(angle_vise) + y_actuel*sin(angle_vise)-x_local_ini; |
GuillaumeCH | 2:5764f89a27f6 | 130 | long int y_local = y_actuel*cos(angle_vise) - x_actuel*sin(angle_vise)-y_local_ini; |
GuillaumeCH | 2:5764f89a27f6 | 131 | |
GuillaumeCH | 2:5764f89a27f6 | 132 | float vitesse_G; |
GuillaumeCH | 2:5764f89a27f6 | 133 | float vitesse_D; |
GuillaumeCH | 2:5764f89a27f6 | 134 | |
GuillaumeCH | 2:5764f89a27f6 | 135 | angle = get_angle(); |
GuillaumeCH | 2:5764f89a27f6 | 136 | |
GuillaumeCH | 2:5764f89a27f6 | 137 | while (distance-x_local>0){ |
GuillaumeCH | 2:5764f89a27f6 | 138 | |
GuillaumeCH | 2:5764f89a27f6 | 139 | vitesse_G = (distance-x_local)/70; |
GuillaumeCH | 2:5764f89a27f6 | 140 | vitesse_D = vitesse_G; |
GuillaumeCH | 2:5764f89a27f6 | 141 | if(vitesse_G >400){ |
GuillaumeCH | 2:5764f89a27f6 | 142 | vitesse_G=400; |
GuillaumeCH | 2:5764f89a27f6 | 143 | vitesse_D=400; |
GuillaumeCH | 2:5764f89a27f6 | 144 | } |
GuillaumeCH | 2:5764f89a27f6 | 145 | if (vitesse_G<-400){ |
GuillaumeCH | 2:5764f89a27f6 | 146 | vitesse_G=-400; |
GuillaumeCH | 2:5764f89a27f6 | 147 | vitesse_D=-400; |
GuillaumeCH | 2:5764f89a27f6 | 148 | } |
GuillaumeCH | 2:5764f89a27f6 | 149 | |
GuillaumeCH | 2:5764f89a27f6 | 150 | angle = get_angle(); |
GuillaumeCH | 2:5764f89a27f6 | 151 | vitesse_G = vitesse_G + 1.5*diff_angle(angle_vise_deg,angle) + 0.015*y_local; // petit asser en angle |
GuillaumeCH | 2:5764f89a27f6 | 152 | vitesse_D = vitesse_D - 1.5*diff_angle(angle_vise_deg,angle) - 0.015*y_local; |
GuillaumeCH | 2:5764f89a27f6 | 153 | |
GuillaumeCH | 2:5764f89a27f6 | 154 | commande_vitesse(vitesse_G,vitesse_D); |
GuillaumeCH | 2:5764f89a27f6 | 155 | actualise_position(); |
GuillaumeCH | 2:5764f89a27f6 | 156 | x_actuel = get_x_actuel(); |
GuillaumeCH | 2:5764f89a27f6 | 157 | y_actuel = get_y_actuel(); |
GuillaumeCH | 2:5764f89a27f6 | 158 | x_local = x_actuel*cos(angle_vise) + y_actuel*sin(angle_vise)-x_local_ini; |
GuillaumeCH | 2:5764f89a27f6 | 159 | y_local = y_actuel*cos(angle_vise) - x_actuel*sin(angle_vise)-y_local_ini; |
GuillaumeCH | 2:5764f89a27f6 | 160 | printf(" VG : %f VD : %f ; x_local : %d, y_local : %d, angle_vise : %f",vitesse_G,vitesse_D, x_local,y_local, angle_vise);// sqrt((x_ini - x_actuel)*(x_ini - x_actuel) + (y_ini - y_actuel)*(y_ini - y_actuel)), y_actuel, (x_actuel - x_ini)*(x_actuel - x_ini) + (y_actuel - y_ini)*(y_actuel - y_ini)); |
GuillaumeCH | 2:5764f89a27f6 | 161 | |
GuillaumeCH | 2:5764f89a27f6 | 162 | } |
GuillaumeCH | 2:5764f89a27f6 | 163 | test_rotation_abs(angle_vise_deg); |
GuillaumeCH | 2:5764f89a27f6 | 164 | vitesse_nulle_G(0); |
GuillaumeCH | 2:5764f89a27f6 | 165 | vitesse_nulle_D(0); |
GuillaumeCH | 2:5764f89a27f6 | 166 | wait(0.3); |
GuillaumeCH | 2:5764f89a27f6 | 167 | motors_stop(); |
GuillaumeCH | 2:5764f89a27f6 | 168 | } |
GuillaumeCH | 3:1dba6eca01ad | 169 | void ligne_droite_v2(long int distance) |
GuillaumeCH | 3:1dba6eca01ad | 170 | { |
GuillaumeCH | 3:1dba6eca01ad | 171 | // le robot avance en ligne droite sur une distance donnée, à la vitesse voulue (entre 0 et 900) |
GuillaumeCH | 3:1dba6eca01ad | 172 | motors_on(); |
GuillaumeCH | 3:1dba6eca01ad | 173 | long int x_ini = get_x_actuel(); |
GuillaumeCH | 3:1dba6eca01ad | 174 | long int y_ini = get_y_actuel(); |
GuillaumeCH | 3:1dba6eca01ad | 175 | double angle_vise_deg = get_angle(); |
GuillaumeCH | 3:1dba6eca01ad | 176 | double angle_vise=angle_vise_deg*3.142/180; |
GuillaumeCH | 3:1dba6eca01ad | 177 | double angle = get_angle(); |
GuillaumeCH | 3:1dba6eca01ad | 178 | |
GuillaumeCH | 3:1dba6eca01ad | 179 | long int x_local_ini = x_ini*cos(angle_vise) + y_ini*sin(angle_vise); |
GuillaumeCH | 3:1dba6eca01ad | 180 | long int y_local_ini = y_ini*cos(angle_vise) - x_ini*sin(angle_vise); |
GuillaumeCH | 3:1dba6eca01ad | 181 | |
GuillaumeCH | 3:1dba6eca01ad | 182 | long int x_actuel = get_x_actuel(); |
GuillaumeCH | 3:1dba6eca01ad | 183 | long int y_actuel = get_y_actuel(); |
GuillaumeCH | 3:1dba6eca01ad | 184 | |
GuillaumeCH | 3:1dba6eca01ad | 185 | long int x_local = x_actuel*cos(angle_vise) + y_actuel*sin(angle_vise)-x_local_ini; |
GuillaumeCH | 3:1dba6eca01ad | 186 | long int y_local = y_actuel*cos(angle_vise) - x_actuel*sin(angle_vise)-y_local_ini; |
GuillaumeCH | 3:1dba6eca01ad | 187 | |
GuillaumeCH | 3:1dba6eca01ad | 188 | long int y_local_prec = y_local; |
GuillaumeCH | 3:1dba6eca01ad | 189 | |
GuillaumeCH | 3:1dba6eca01ad | 190 | float vitesse_G; |
GuillaumeCH | 3:1dba6eca01ad | 191 | float vitesse_D; |
GuillaumeCH | 3:1dba6eca01ad | 192 | |
GuillaumeCH | 3:1dba6eca01ad | 193 | angle = get_angle(); |
GuillaumeCH | 3:1dba6eca01ad | 194 | |
GuillaumeCH | 3:1dba6eca01ad | 195 | float Ki= 0.00007; |
GuillaumeCH | 3:1dba6eca01ad | 196 | float Kp= 0.03; |
GuillaumeCH | 3:1dba6eca01ad | 197 | while (distance-x_local>0){ |
GuillaumeCH | 3:1dba6eca01ad | 198 | |
GuillaumeCH | 3:1dba6eca01ad | 199 | vitesse_G = (distance-x_local)/70; |
GuillaumeCH | 3:1dba6eca01ad | 200 | vitesse_D = vitesse_G; |
GuillaumeCH | 3:1dba6eca01ad | 201 | if(vitesse_G >400){ |
GuillaumeCH | 3:1dba6eca01ad | 202 | vitesse_G=400; |
GuillaumeCH | 3:1dba6eca01ad | 203 | vitesse_D=400; |
GuillaumeCH | 3:1dba6eca01ad | 204 | } |
GuillaumeCH | 3:1dba6eca01ad | 205 | if (vitesse_G<-400){ |
GuillaumeCH | 3:1dba6eca01ad | 206 | vitesse_G=-400; |
GuillaumeCH | 3:1dba6eca01ad | 207 | vitesse_D=-400; |
GuillaumeCH | 3:1dba6eca01ad | 208 | } |
GuillaumeCH | 3:1dba6eca01ad | 209 | |
GuillaumeCH | 3:1dba6eca01ad | 210 | angle = get_angle(); |
GuillaumeCH | 3:1dba6eca01ad | 211 | //vitesse_G = vitesse_G + (y_local * 0.02) + (y_local - y_local_prec)*2; |
GuillaumeCH | 3:1dba6eca01ad | 212 | //vitesse_D = vitesse_D - (y_local * 0.02) - (y_local - y_local_prec)*2; |
GuillaumeCH | 3:1dba6eca01ad | 213 | vitesse_G = vitesse_G * (1 + Ki*y_local + Kp * diff_angle(angle_vise_deg, angle)); |
GuillaumeCH | 3:1dba6eca01ad | 214 | vitesse_D = vitesse_D * (1 - Ki*y_local - Kp * diff_angle(angle_vise_deg, angle)); |
GuillaumeCH | 3:1dba6eca01ad | 215 | |
GuillaumeCH | 3:1dba6eca01ad | 216 | commande_vitesse(vitesse_G,vitesse_D); |
GuillaumeCH | 3:1dba6eca01ad | 217 | actualise_position(); |
GuillaumeCH | 3:1dba6eca01ad | 218 | x_actuel = get_x_actuel(); |
GuillaumeCH | 3:1dba6eca01ad | 219 | y_actuel = get_y_actuel(); |
GuillaumeCH | 3:1dba6eca01ad | 220 | y_local_prec = y_local; |
GuillaumeCH | 3:1dba6eca01ad | 221 | x_local = x_actuel*cos(angle_vise) + y_actuel*sin(angle_vise)-x_local_ini; |
GuillaumeCH | 3:1dba6eca01ad | 222 | y_local = y_actuel*cos(angle_vise) - x_actuel*sin(angle_vise)-y_local_ini; |
GuillaumeCH | 3:1dba6eca01ad | 223 | |
GuillaumeCH | 4:deef042e9c02 | 224 | //printf(" VG : %f VD : %f ; x_local : %d, y_local : %d, angle_vise : %f",vitesse_G,vitesse_D, x_local,y_local, angle_vise);// sqrt((x_ini - x_actuel)*(x_ini - x_actuel) + (y_ini - y_actuel)*(y_ini - y_actuel)), y_actuel, (x_actuel - x_ini)*(x_actuel - x_ini) + (y_actuel - y_ini)*(y_actuel - y_ini)); |
GuillaumeCH | 3:1dba6eca01ad | 225 | } |
GuillaumeCH | 4:deef042e9c02 | 226 | test_rotation_abs(angle_vise_deg); |
GuillaumeCH | 3:1dba6eca01ad | 227 | vitesse_nulle_G(0); |
GuillaumeCH | 3:1dba6eca01ad | 228 | vitesse_nulle_D(0); |
GuillaumeCH | 3:1dba6eca01ad | 229 | wait(0.3); |
GuillaumeCH | 3:1dba6eca01ad | 230 | motors_stop(); |
GuillaumeCH | 3:1dba6eca01ad | 231 | } |
GuillaumeCH | 2:5764f89a27f6 | 232 | |
GuillaumeCH | 2:5764f89a27f6 | 233 | void test_rotation_rel(double angle_vise) |
GuillaumeCH | 2:5764f89a27f6 | 234 | { |
GuillaumeCH | 2:5764f89a27f6 | 235 | // rotation de angle_vise |
GuillaumeCH | 2:5764f89a27f6 | 236 | motors_on(); |
GuillaumeCH | 2:5764f89a27f6 | 237 | float vitesse; |
GuillaumeCH | 2:5764f89a27f6 | 238 | double angle = get_angle(); |
GuillaumeCH | 2:5764f89a27f6 | 239 | angle_vise+=angle; |
GuillaumeCH | 2:5764f89a27f6 | 240 | borne_angle_d(angle_vise); |
GuillaumeCH | 2:5764f89a27f6 | 241 | |
GuillaumeCH | 3:1dba6eca01ad | 242 | while (abs(diff_angle(angle,angle_vise))>0.05) |
GuillaumeCH | 2:5764f89a27f6 | 243 | { |
GuillaumeCH | 2:5764f89a27f6 | 244 | vitesse=1.3*diff_angle(angle,angle_vise); |
GuillaumeCH | 2:5764f89a27f6 | 245 | commande_vitesse(-vitesse,vitesse); |
GuillaumeCH | 2:5764f89a27f6 | 246 | actualise_position(); |
GuillaumeCH | 2:5764f89a27f6 | 247 | angle = get_angle(); |
GuillaumeCH | 2:5764f89a27f6 | 248 | printf("vitesse : %f", vitesse); |
GuillaumeCH | 2:5764f89a27f6 | 249 | } |
GuillaumeCH | 2:5764f89a27f6 | 250 | |
GuillaumeCH | 2:5764f89a27f6 | 251 | //printf(" x et y recu : %lf, %ld. distance parcourue : %ld ", sqrt((x_ini - x_actuel)*(x_ini - x_actuel) + (y_ini - y_actuel)*(y_ini - y_actuel)), y_actuel, (x_actuel - x_ini)*(x_actuel - x_ini) + (y_actuel - y_ini)*(y_actuel - y_ini)); |
GuillaumeCH | 2:5764f89a27f6 | 252 | |
GuillaumeCH | 2:5764f89a27f6 | 253 | vitesse_nulle_G(0); |
GuillaumeCH | 2:5764f89a27f6 | 254 | vitesse_nulle_D(0); |
GuillaumeCH | 2:5764f89a27f6 | 255 | wait(0.2); |
GuillaumeCH | 2:5764f89a27f6 | 256 | motors_stop(); |
GuillaumeCH | 2:5764f89a27f6 | 257 | } |
GuillaumeCH | 2:5764f89a27f6 | 258 | |
GuillaumeCH | 2:5764f89a27f6 | 259 | |
GuillaumeCH | 2:5764f89a27f6 | 260 | void test_rotation_abs(double angle_vise) |
GuillaumeCH | 2:5764f89a27f6 | 261 | { |
GuillaumeCH | 2:5764f89a27f6 | 262 | double angle_rel = borne_angle_d(angle_vise-get_angle()); |
GuillaumeCH | 2:5764f89a27f6 | 263 | test_rotation_rel(angle_rel); |
GuillaumeCH | 2:5764f89a27f6 | 264 | } |