2015_robocon_bteam / Mbed 2 deprecated 2015robot_main

Dependencies:   PID QEI mbed

Fork of 2015robot_main by Naoto Deguchi

Committer:
unicore32
Date:
Sat Oct 10 09:53:52 2015 +0000
Revision:
78:abb760e0a935
Parent:
69:bf094811b4a9
Parent:
77:7dd154b5ace3
Child:
79:7f86e18f40ef
????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DeguNaoto 21:79b94cb922f0 1 #ifndef AUTOMODE_H
DeguNaoto 21:79b94cb922f0 2 #define AUTOMODE_H
DeguNaoto 21:79b94cb922f0 3
DeguNaoto 21:79b94cb922f0 4 /***PID Controller***/
DeguNaoto 66:14df82661dfa 5 //PID velocity_controller(36.0,5274.0 ,0.0,RATE);
DeguNaoto 66:14df82661dfa 6 //PID direction_controller(36.0,3.0,0.0,RATE);
DeguNaoto 66:14df82661dfa 7 PID velocity_controller(9.0,5274.0 ,0.0,RATE);
DeguNaoto 34:f9ef622f4376 8 PID direction_controller(36.0,3.0,0.0,RATE);
DeguNaoto 21:79b94cb922f0 9
unicore32 69:bf094811b4a9 10 #define MAX_VALUE 93
unicore32 69:bf094811b4a9 11
DeguNaoto 57:3fbd487e055e 12 #ifdef IM920
DeguNaoto 52:d9e1629da852 13 /***IM920 correspondence***/
DeguNaoto 52:d9e1629da852 14 void autoIM920() {
DeguNaoto 52:d9e1629da852 15 if(b==7){ /*mode change*/
unicore32 69:bf094811b4a9 16 if(edge7)
DeguNaoto 52:d9e1629da852 17 edge7=0;
DeguNaoto 52:d9e1629da852 18 autoflag=0;
DeguNaoto 52:d9e1629da852 19 Indicator4=0;
DeguNaoto 52:d9e1629da852 20 IndicatorAuto=1;
DeguNaoto 52:d9e1629da852 21 }
DeguNaoto 52:d9e1629da852 22 }
DeguNaoto 52:d9e1629da852 23 else if(b==6){ /*start*/
DeguNaoto 73:86b7b82ba997 24 resetState();
DeguNaoto 64:a98fe602c26d 25 flagf=1;
DeguNaoto 52:d9e1629da852 26 targ_velocity=speed;
DeguNaoto 66:14df82661dfa 27 sendData(7,defoR);
DeguNaoto 52:d9e1629da852 28 stateR = defoR;
DeguNaoto 52:d9e1629da852 29 stateL = defoL;
DeguNaoto 61:e018207ae860 30 step = 0;
DeguNaoto 61:e018207ae860 31 CMode = 0;
DeguNaoto 52:d9e1629da852 32 }
DeguNaoto 61:e018207ae860 33 else if(b==8){ /*middle start*/
DeguNaoto 73:86b7b82ba997 34 resetState();
DeguNaoto 64:a98fe602c26d 35 flagf=1;
DeguNaoto 61:e018207ae860 36 targ_velocity=speed;
unicore32 68:2b2b88ecdcce 37 sendData(7,57);
DeguNaoto 65:cebdfc0184d7 38 stateR = 17;
DeguNaoto 65:cebdfc0184d7 39 stateL = 17;
DeguNaoto 61:e018207ae860 40 step = 4;
DeguNaoto 61:e018207ae860 41 CMode = 6;
DeguNaoto 61:e018207ae860 42 }
DeguNaoto 52:d9e1629da852 43 else if(b==5){ /*reset*/
unicore32 68:2b2b88ecdcce 44 sendData(7,255);
DeguNaoto 52:d9e1629da852 45 }
DeguNaoto 52:d9e1629da852 46 else if(b==9){ /*stop*/
DeguNaoto 29:03bb1ddbe456 47 Motor_swing=0;
DeguNaoto 22:3996c3f41922 48 sita=PI/4.0,x=0.0,y=0.0;
DeguNaoto 22:3996c3f41922 49 targ_velocity=0.0;
DeguNaoto 22:3996c3f41922 50 targ_sita=PI/4.0;
DeguNaoto 22:3996c3f41922 51 velocity_controller.reset();
DeguNaoto 22:3996c3f41922 52 direction_controller.reset();
DeguNaoto 52:d9e1629da852 53 }
DeguNaoto 52:d9e1629da852 54 else if(b==1){ /*L down*/
DeguNaoto 52:d9e1629da852 55 if(edge1){
DeguNaoto 52:d9e1629da852 56 edge1=0;
DeguNaoto 52:d9e1629da852 57 if(stateL!=1) stateL--;
DeguNaoto 57:3fbd487e055e 58 sendData(4,stateL);
DeguNaoto 52:d9e1629da852 59 }
DeguNaoto 52:d9e1629da852 60 }
DeguNaoto 52:d9e1629da852 61 else if(b==2){ /*L up*/
DeguNaoto 52:d9e1629da852 62 if(edge2){
DeguNaoto 52:d9e1629da852 63 edge2=0;
unicore32 69:bf094811b4a9 64 if(stateL!=MAX_VALUE) stateL++;
DeguNaoto 57:3fbd487e055e 65 sendData(4,stateL);
DeguNaoto 22:3996c3f41922 66 }
DeguNaoto 52:d9e1629da852 67 }
DeguNaoto 52:d9e1629da852 68 else if(b==3){ /*R down*/
DeguNaoto 52:d9e1629da852 69 if(edge3){
DeguNaoto 52:d9e1629da852 70 edge3=0;
DeguNaoto 52:d9e1629da852 71 if(stateR!=1) stateR--;
DeguNaoto 57:3fbd487e055e 72 sendData(5,stateR);
DeguNaoto 52:d9e1629da852 73 }
DeguNaoto 52:d9e1629da852 74 }
DeguNaoto 52:d9e1629da852 75 else if(b==4){ /*R up*/
DeguNaoto 52:d9e1629da852 76 if(edge4){
DeguNaoto 52:d9e1629da852 77 edge4=0;
unicore32 69:bf094811b4a9 78 if(stateR!=MAX_VALUE) stateR++;
DeguNaoto 57:3fbd487e055e 79 sendData(5,stateR);
DeguNaoto 52:d9e1629da852 80 }
DeguNaoto 52:d9e1629da852 81 }
DeguNaoto 75:4cdcd50ee666 82 if(a2){
DeguNaoto 75:4cdcd50ee666 83 skip = 1;
DeguNaoto 75:4cdcd50ee666 84 }
DeguNaoto 75:4cdcd50ee666 85 else if(!a2){
DeguNaoto 75:4cdcd50ee666 86 skip = 0;
DeguNaoto 75:4cdcd50ee666 87 }
DeguNaoto 52:d9e1629da852 88 if(b!=7) edge7=1;
DeguNaoto 52:d9e1629da852 89 if(b!=1) edge1=1;
DeguNaoto 52:d9e1629da852 90 if(b!=2) edge2=1;
DeguNaoto 52:d9e1629da852 91 if(b!=3) edge3=1;
DeguNaoto 52:d9e1629da852 92 if(b!=4) edge4=1;
DeguNaoto 22:3996c3f41922 93 }
DeguNaoto 57:3fbd487e055e 94 #else
DeguNaoto 57:3fbd487e055e 95 void autoPS3(){
DeguNaoto 57:3fbd487e055e 96 if(circle){ /*mode change*/
DeguNaoto 57:3fbd487e055e 97 if(edge_circle){
DeguNaoto 57:3fbd487e055e 98 edge_circle=0;
DeguNaoto 57:3fbd487e055e 99 autoflag=0;
DeguNaoto 57:3fbd487e055e 100 Indicator4=0;
DeguNaoto 57:3fbd487e055e 101 IndicatorAuto=1;
DeguNaoto 57:3fbd487e055e 102 }
DeguNaoto 57:3fbd487e055e 103 }
DeguNaoto 57:3fbd487e055e 104 else if(up){ /*start*/
DeguNaoto 73:86b7b82ba997 105 resetState();
DeguNaoto 64:a98fe602c26d 106 flagf=1;
DeguNaoto 57:3fbd487e055e 107 targ_velocity=speed;
DeguNaoto 66:14df82661dfa 108 sendData(7,defoR);
DeguNaoto 57:3fbd487e055e 109 stateR = defoR;
DeguNaoto 57:3fbd487e055e 110 stateL = defoL;
DeguNaoto 61:e018207ae860 111 step = 0;
DeguNaoto 61:e018207ae860 112 CStep = 1;
DeguNaoto 61:e018207ae860 113 }
DeguNaoto 61:e018207ae860 114 else if(right){ /*middle start*/
DeguNaoto 73:86b7b82ba997 115 resetState();
DeguNaoto 64:a98fe602c26d 116 flagf = 1;
DeguNaoto 61:e018207ae860 117 targ_velocity=speed;
unicore32 68:2b2b88ecdcce 118 sendData(7,57);
DeguNaoto 65:cebdfc0184d7 119 stateR = 17;
DeguNaoto 65:cebdfc0184d7 120 stateL = 17;
DeguNaoto 61:e018207ae860 121 step = 4;
DeguNaoto 77:7dd154b5ace3 122 medge = 1;
DeguNaoto 77:7dd154b5ace3 123 }
DeguNaoto 77:7dd154b5ace3 124 else if(down){ /*opponents start*/
DeguNaoto 77:7dd154b5ace3 125 resetState();
DeguNaoto 77:7dd154b5ace3 126 flagf = 1;
DeguNaoto 77:7dd154b5ace3 127 targ_velocity = speed;
DeguNaoto 77:7dd154b5ace3 128 targ_sita = 0.0;
DeguNaoto 77:7dd154b5ace3 129 sendData(7,17);
DeguNaoto 77:7dd154b5ace3 130 stateR = 17;
DeguNaoto 77:7dd154b5ace3 131 stateL = 17;
DeguNaoto 77:7dd154b5ace3 132 step = 8;
DeguNaoto 57:3fbd487e055e 133 }
DeguNaoto 57:3fbd487e055e 134 else if(square){ /*reset*/
unicore32 68:2b2b88ecdcce 135 sendData(7,255);
DeguNaoto 57:3fbd487e055e 136 }
DeguNaoto 57:3fbd487e055e 137 else if(cross){ /*stop*/
DeguNaoto 57:3fbd487e055e 138 Motor_swing=0;
DeguNaoto 64:a98fe602c26d 139 // sita=PI/4.0,x=0.0,y=0.0;
DeguNaoto 57:3fbd487e055e 140 targ_velocity=0.0;
DeguNaoto 57:3fbd487e055e 141 targ_sita=PI/4.0;
DeguNaoto 57:3fbd487e055e 142 velocity_controller.reset();
DeguNaoto 57:3fbd487e055e 143 direction_controller.reset();
DeguNaoto 57:3fbd487e055e 144 }
DeguNaoto 57:3fbd487e055e 145 else if(l1){ /*L up*/
DeguNaoto 57:3fbd487e055e 146 if(edge_l1){
DeguNaoto 57:3fbd487e055e 147 edge_l1=0;
DeguNaoto 61:e018207ae860 148 if(stateL!=1) stateL--;
DeguNaoto 57:3fbd487e055e 149 sendData(4,stateL);
DeguNaoto 57:3fbd487e055e 150 }
DeguNaoto 57:3fbd487e055e 151 }
DeguNaoto 57:3fbd487e055e 152 else if(l2){ /*L down*/
DeguNaoto 57:3fbd487e055e 153 if(edge_l2){
DeguNaoto 57:3fbd487e055e 154 edge_l2=0;
unicore32 69:bf094811b4a9 155 if(stateL!=MAX_VALUE) stateL++;
DeguNaoto 57:3fbd487e055e 156 sendData(4,stateL);
DeguNaoto 57:3fbd487e055e 157 }
DeguNaoto 57:3fbd487e055e 158 }
DeguNaoto 57:3fbd487e055e 159 else if(r1){ /*R up*/
DeguNaoto 57:3fbd487e055e 160 if(edge_r1){
DeguNaoto 57:3fbd487e055e 161 edge_r1=0;
DeguNaoto 61:e018207ae860 162 if(stateR!=1) stateR--;
DeguNaoto 57:3fbd487e055e 163 sendData(5,stateR);
DeguNaoto 57:3fbd487e055e 164 }
DeguNaoto 57:3fbd487e055e 165 }
DeguNaoto 57:3fbd487e055e 166 else if(r2){ /*R down*/
DeguNaoto 57:3fbd487e055e 167 if(edge_r2){
DeguNaoto 57:3fbd487e055e 168 edge_r2=0;
unicore32 69:bf094811b4a9 169 if(stateR!=MAX_VALUE) stateR++;
DeguNaoto 57:3fbd487e055e 170 sendData(5,stateR);
DeguNaoto 57:3fbd487e055e 171 }
DeguNaoto 57:3fbd487e055e 172 }
DeguNaoto 75:4cdcd50ee666 173 if(triangle){
DeguNaoto 75:4cdcd50ee666 174 skip = 1;
DeguNaoto 75:4cdcd50ee666 175 }
DeguNaoto 75:4cdcd50ee666 176 else if(!triangle){
DeguNaoto 75:4cdcd50ee666 177 skip = 0;
DeguNaoto 75:4cdcd50ee666 178 }
DeguNaoto 57:3fbd487e055e 179 }
DeguNaoto 57:3fbd487e055e 180 #endif
DeguNaoto 21:79b94cb922f0 181 /***The function is PID controller initialize.***/
DeguNaoto 21:79b94cb922f0 182 inline void initializeControllers()
DeguNaoto 21:79b94cb922f0 183 {
DeguNaoto 66:14df82661dfa 184 // velocity_controller.setInputLimits(-200000.0, 200000.0); //x1
DeguNaoto 66:14df82661dfa 185 velocity_controller.setInputLimits(-20000.0, 20000.0); //x1
DeguNaoto 21:79b94cb922f0 186 direction_controller.setInputLimits(-10.0, 10.0); //x2
DeguNaoto 21:79b94cb922f0 187
DeguNaoto 21:79b94cb922f0 188 //Pwm output from MOVE_OUTPUT_LIMIT_BOTTOM to MOVE_OUTPUT_LIMIT_TOP
DeguNaoto 21:79b94cb922f0 189 velocity_controller.setOutputLimits(-1.0, 1.0);
DeguNaoto 21:79b94cb922f0 190 direction_controller.setOutputLimits(-1.0, 1.0);
DeguNaoto 31:74e77ef0831c 191
DeguNaoto 21:79b94cb922f0 192 //set bias. 初期値
DeguNaoto 21:79b94cb922f0 193 velocity_controller.setBias(0.0);
DeguNaoto 21:79b94cb922f0 194 direction_controller.setBias(0.0);
DeguNaoto 21:79b94cb922f0 195
DeguNaoto 21:79b94cb922f0 196 //set mode.
DeguNaoto 21:79b94cb922f0 197 velocity_controller.setMode(AUTO_MODE);
DeguNaoto 21:79b94cb922f0 198 direction_controller.setMode(AUTO_MODE);
DeguNaoto 21:79b94cb922f0 199 }
DeguNaoto 21:79b94cb922f0 200
DeguNaoto 21:79b94cb922f0 201 /***The function is following move speed.***/
DeguNaoto 21:79b94cb922f0 202 inline void velocity_following()
DeguNaoto 21:79b94cb922f0 203 {
DeguNaoto 21:79b94cb922f0 204 velocity_controller.setSetPoint((float)targ_velocity);
DeguNaoto 21:79b94cb922f0 205 velocity_controller.setProcessValue((float)velocity);
DeguNaoto 21:79b94cb922f0 206 x1 = (double)velocity_controller.compute();
DeguNaoto 21:79b94cb922f0 207 }
DeguNaoto 21:79b94cb922f0 208
DeguNaoto 21:79b94cb922f0 209 inline void sita_following()
DeguNaoto 21:79b94cb922f0 210 {
DeguNaoto 21:79b94cb922f0 211 direction_controller.setSetPoint((float)targ_sita);
DeguNaoto 21:79b94cb922f0 212 direction_controller.setProcessValue((float)sita);
DeguNaoto 55:db1797ac6cb1 213 //direction_controller.setSetPoint(0.0); /*目標値とのずれをなくす*/
DeguNaoto 21:79b94cb922f0 214 //direction_controller.setProcessValue(-y);
DeguNaoto 21:79b94cb922f0 215 x2 = (double)direction_controller.compute();
DeguNaoto 21:79b94cb922f0 216 }
DeguNaoto 21:79b94cb922f0 217
DeguNaoto 21:79b94cb922f0 218 inline void move_following()
DeguNaoto 21:79b94cb922f0 219 {
DeguNaoto 21:79b94cb922f0 220 velocity_following();
DeguNaoto 21:79b94cb922f0 221 sita_following();
DeguNaoto 64:a98fe602c26d 222
DeguNaoto 64:a98fe602c26d 223 if(flagf==0){
DeguNaoto 64:a98fe602c26d 224 Vr = ( x1 + x2 ) / 2.0;
DeguNaoto 64:a98fe602c26d 225 Vl = ( x1 - x2 ) / 2.0;
DeguNaoto 63:dad3f4e5e99c 226 }
DeguNaoto 64:a98fe602c26d 227 else if(flagf==1){
DeguNaoto 64:a98fe602c26d 228 if(x2>0){
DeguNaoto 64:a98fe602c26d 229 Vr = x1;
DeguNaoto 64:a98fe602c26d 230 Vl = x1 - x2;
DeguNaoto 64:a98fe602c26d 231 }
DeguNaoto 64:a98fe602c26d 232 else{
DeguNaoto 64:a98fe602c26d 233 Vr = x1 + x2;
DeguNaoto 64:a98fe602c26d 234 Vl = x1;
DeguNaoto 64:a98fe602c26d 235 }
DeguNaoto 63:dad3f4e5e99c 236 }
DeguNaoto 63:dad3f4e5e99c 237
DeguNaoto 64:a98fe602c26d 238 if( abs(Vr) < 0.2 ) Vr = 0.0;
DeguNaoto 64:a98fe602c26d 239 if( abs(Vl) < 0.2 ) Vl = 0.0;
DeguNaoto 21:79b94cb922f0 240 Move_r( ( float ) Vr );
DeguNaoto 21:79b94cb922f0 241 Move_l( ( float ) Vl );
DeguNaoto 21:79b94cb922f0 242 }
DeguNaoto 21:79b94cb922f0 243
DeguNaoto 21:79b94cb922f0 244 #endif /*autoMode.h*/