Takujyou_Ishii / Mbed 2 deprecated isiiken

Dependencies:   mbed SpeedController passfollowing

Committer:
aoikoizumi
Date:
Sat Feb 27 07:38:58 2021 +0000
Revision:
0:d56593bc83cc
Child:
1:3639b161473e
a

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aoikoizumi 0:d56593bc83cc 1 //CAN通信で受け取った(double)rotate‗1~rotate‗3に対し、実際に回転数制御を行う
aoikoizumi 0:d56593bc83cc 2 #include "mbed.h"
aoikoizumi 0:d56593bc83cc 3 #include "EC.h" //Encoderライブラリをインクルード
aoikoizumi 0:d56593bc83cc 4 #include "SpeedController.h" //SpeedControlライブラリをインクルード
aoikoizumi 0:d56593bc83cc 5 #include "math.h"
aoikoizumi 0:d56593bc83cc 6 #define RESOLUTION 400 //分解能
aoikoizumi 0:d56593bc83cc 7 #define BASIC_SPEED 40 //動確用
aoikoizumi 0:d56593bc83cc 8
aoikoizumi 0:d56593bc83cc 9 //#define TEST_DUTY 0.3 //動確用
aoikoizumi 0:d56593bc83cc 10
aoikoizumi 0:d56593bc83cc 11
aoikoizumi 0:d56593bc83cc 12 Ec4multi EC_1(PA_8,PA_11,RESOLUTION);
aoikoizumi 0:d56593bc83cc 13 Ec4multi EC_2(PB_5,PB_4,RESOLUTION);
aoikoizumi 0:d56593bc83cc 14 //Ec4multi EC_1(p15,p16,RESOLUTION);
aoikoizumi 0:d56593bc83cc 15 //Ec4multi EC_2(p17,p18,RESOLUTION);
aoikoizumi 0:d56593bc83cc 16 SpeedControl motor_1(PA_10,PB_7,50,EC_1);
aoikoizumi 0:d56593bc83cc 17 SpeedControl motor_2(PA_12,PB_6,50,EC_2);
aoikoizumi 0:d56593bc83cc 18 PwmOut pump(PA_7);
aoikoizumi 0:d56593bc83cc 19 AnalogIn a_in(PA_4);
aoikoizumi 0:d56593bc83cc 20 AnalogIn b_in(PA_3);
aoikoizumi 0:d56593bc83cc 21 AnalogIn c_in(PA_1);
aoikoizumi 0:d56593bc83cc 22 AnalogIn d_in(PA_0);
aoikoizumi 0:d56593bc83cc 23
aoikoizumi 0:d56593bc83cc 24 //SpeedControl motor_1(p21,p22,50,EC_1);
aoikoizumi 0:d56593bc83cc 25 //SpeedControl motor_2(p24,p23,50,EC_2);
aoikoizumi 0:d56593bc83cc 26
aoikoizumi 0:d56593bc83cc 27 Ticker motor_tick; //角速度計算用ticker
aoikoizumi 0:d56593bc83cc 28 Serial pc(USBTX,USBRX);
aoikoizumi 0:d56593bc83cc 29
aoikoizumi 0:d56593bc83cc 30 Timer timer;
aoikoizumi 0:d56593bc83cc 31
aoikoizumi 0:d56593bc83cc 32 int j=0;
aoikoizumi 0:d56593bc83cc 33 int k = 0;
aoikoizumi 0:d56593bc83cc 34 double rotate_1=0,rotate_2=0;
aoikoizumi 0:d56593bc83cc 35 double mt_out1=0,mt_out2=0;
aoikoizumi 0:d56593bc83cc 36 double tire_fai_mm=88;//タイヤ径
aoikoizumi 0:d56593bc83cc 37 double machine_width=90.6;//機体の横幅
aoikoizumi 0:d56593bc83cc 38 double odm_x=0;
aoikoizumi 0:d56593bc83cc 39 double odm_y=0;
aoikoizumi 0:d56593bc83cc 40 double odm_theta=0;
aoikoizumi 0:d56593bc83cc 41 double odm_righttire=0;
aoikoizumi 0:d56593bc83cc 42 double odm_lefttire=0;
aoikoizumi 0:d56593bc83cc 43 double old_rightrad=0;
aoikoizumi 0:d56593bc83cc 44 double old_leftrad=0;
aoikoizumi 0:d56593bc83cc 45 double old_theta=0;
aoikoizumi 0:d56593bc83cc 46 void passfollowing(double start_x,double start_y,double tgt_x,double tgt_y,double tgt_theta);
aoikoizumi 0:d56593bc83cc 47 //double motor1_omega[1000]= {},motor2_omega[1000]= {},time_when[1000];
aoikoizumi 0:d56593bc83cc 48 //int motor1_count[1000]= {},motor2_count[1000]= {};
aoikoizumi 0:d56593bc83cc 49
aoikoizumi 0:d56593bc83cc 50 void CalOmega()
aoikoizumi 0:d56593bc83cc 51 {
aoikoizumi 0:d56593bc83cc 52
aoikoizumi 0:d56593bc83cc 53 EC_1.calOmega();
aoikoizumi 0:d56593bc83cc 54 EC_2.calOmega();
aoikoizumi 0:d56593bc83cc 55 odm_righttire=tire_fai_mm*(EC_1.getRad()-old_rightrad)/2;
aoikoizumi 0:d56593bc83cc 56 odm_lefttire=tire_fai_mm*(EC_2.getRad()-old_leftrad)/2;//÷2するのが正しいが切ると正しくなる()
aoikoizumi 0:d56593bc83cc 57 odm_theta+=atan(odm_righttire-odm_lefttire)/machine_width;
aoikoizumi 0:d56593bc83cc 58 odm_x+=-(odm_righttire+odm_lefttire)*sin((odm_theta+old_theta)/2)/2;
aoikoizumi 0:d56593bc83cc 59 odm_y+=(odm_righttire+odm_lefttire)*cos((odm_theta+old_theta)/2)/2;
aoikoizumi 0:d56593bc83cc 60 if(rotate_1==0) motor_1.stop();
aoikoizumi 0:d56593bc83cc 61 else motor_1.Sc(rotate_1);
aoikoizumi 0:d56593bc83cc 62 if(rotate_2==0) motor_2.stop();
aoikoizumi 0:d56593bc83cc 63 else motor_2.Sc(rotate_2);
aoikoizumi 0:d56593bc83cc 64 old_rightrad=EC_1.getRad();
aoikoizumi 0:d56593bc83cc 65 old_leftrad=EC_2.getRad();
aoikoizumi 0:d56593bc83cc 66 old_theta=odm_theta;
aoikoizumi 0:d56593bc83cc 67 j++;
aoikoizumi 0:d56593bc83cc 68 //printf("%d ",k%100);
aoikoizumi 0:d56593bc83cc 69 //printf("%f,%f/r/n",rotate_1,rotate_1);
aoikoizumi 0:d56593bc83cc 70 }
aoikoizumi 0:d56593bc83cc 71 double calcdif(double start_x,double start_y,double tgt_x,double tgt_y,double tgt_theta,int separation);
aoikoizumi 0:d56593bc83cc 72 void sensor_run(int form_or_back,double max_speed);
aoikoizumi 0:d56593bc83cc 73 void gogogo_straight(double start_x,double start_y,double tgt_x,double tgt_y,double tgt_theta,double max_speed);
aoikoizumi 0:d56593bc83cc 74 void turnAtThePoint( double start_theta, double tgt_theta, double max_speed);
aoikoizumi 0:d56593bc83cc 75
aoikoizumi 0:d56593bc83cc 76
aoikoizumi 0:d56593bc83cc 77 int main()
aoikoizumi 0:d56593bc83cc 78 {
aoikoizumi 0:d56593bc83cc 79 //UserLoopSetting_can();
aoikoizumi 0:d56593bc83cc 80
aoikoizumi 0:d56593bc83cc 81
aoikoizumi 0:d56593bc83cc 82 motor_1.period_us(50);
aoikoizumi 0:d56593bc83cc 83 motor_2.period_us(50);
aoikoizumi 0:d56593bc83cc 84 pump.period_us(50);
aoikoizumi 0:d56593bc83cc 85 //motor_1.setEquation(0.0429,0,0.0429,0); //求めたC,Dの値を設定
aoikoizumi 0:d56593bc83cc 86 //motor_2.setEquation(0.0369,0,0.0429,0); //求めたC,Dの値を設定
aoikoizumi 0:d56593bc83cc 87 motor_1.setEquation(0.04,0.4,0.04,0.4); //求めたC,Dの値を設定
aoikoizumi 0:d56593bc83cc 88 motor_2.setEquation(0.04,0.4,0.04,0.4); //求めたC,Dの値を設定
aoikoizumi 0:d56593bc83cc 89 motor_1.setPDparam(0.05,0.0); //PIDの係数を設定
aoikoizumi 0:d56593bc83cc 90 motor_2.setPDparam(0.05,0.0); //PIDの係数を設定
aoikoizumi 0:d56593bc83cc 91 motor_1.setDutyLimit(0.95);
aoikoizumi 0:d56593bc83cc 92 motor_2.setDutyLimit(0.95);
aoikoizumi 0:d56593bc83cc 93 motor_tick.attach(&CalOmega,0.005);
aoikoizumi 0:d56593bc83cc 94
aoikoizumi 0:d56593bc83cc 95 rotate_1=0;
aoikoizumi 0:d56593bc83cc 96 rotate_2=0;
aoikoizumi 0:d56593bc83cc 97 //printf("gs,%.3lf,%.3lf,%.3lf ,%.3lf,%.3lf,%.3lf,%.3lf,%.3lf,z=%.3lf\r\n",EC_1.getOmega(),EC_1.getRad(),rotate_1,EC_2.getOmega(),EC_2.getRad(),rotate_2,odm_x,odm_y,odm_theta*180/3.141592);
aoikoizumi 0:d56593bc83cc 98
aoikoizumi 0:d56593bc83cc 99 wait(1);
aoikoizumi 0:d56593bc83cc 100 //printf("gs,%.3lf %.3lf %.3lf ,%.3lf %.3lf %.3lf,%.3lf,%.3lf,z=%.3lf\r\n",EC_1.getOmega(),EC_1.getRad(),rotate_1,EC_2.getOmega(),EC_2.getRad(),rotate_2,odm_x,odm_y,odm_theta*180/3.141592);
aoikoizumi 0:d56593bc83cc 101 //gogogo_straight(0,0,0,200,0,5);//起点X起点Y終点X終点Y角度速度
aoikoizumi 0:d56593bc83cc 102 turnAtThePoint(0,90,4);
aoikoizumi 0:d56593bc83cc 103 //sensor_run(0,1);//前後,最高速
aoikoizumi 0:d56593bc83cc 104 rotate_1=0;
aoikoizumi 0:d56593bc83cc 105 rotate_2=0;
aoikoizumi 0:d56593bc83cc 106 wait(1);
aoikoizumi 0:d56593bc83cc 107 while(1) {
aoikoizumi 0:d56593bc83cc 108 //pump=1;
aoikoizumi 0:d56593bc83cc 109 //printf("done");
aoikoizumi 0:d56593bc83cc 110 //rotate_1 = mt_out1;
aoikoizumi 0:d56593bc83cc 111 //rotate_2 = mt_out2;
aoikoizumi 0:d56593bc83cc 112
aoikoizumi 0:d56593bc83cc 113 if(pc.readable()) {
aoikoizumi 0:d56593bc83cc 114 char sel=pc.getc();
aoikoizumi 0:d56593bc83cc 115 if(sel=='s') {
aoikoizumi 0:d56593bc83cc 116 motor_1.stop();
aoikoizumi 0:d56593bc83cc 117 motor_2.stop();
aoikoizumi 0:d56593bc83cc 118 rotate_1=0;
aoikoizumi 0:d56593bc83cc 119 rotate_2=0;
aoikoizumi 0:d56593bc83cc 120 } else if(sel=='j') {
aoikoizumi 0:d56593bc83cc 121 rotate_1+=1; //eを押すとduty比がo.o2ずつあがる
aoikoizumi 0:d56593bc83cc 122 pc.printf("tgt=%f\r\n",rotate_1);
aoikoizumi 0:d56593bc83cc 123 } else if(sel=='u') {
aoikoizumi 0:d56593bc83cc 124 rotate_2+=1; //eを押すとduty比がo.o2ずつあがる
aoikoizumi 0:d56593bc83cc 125 pc.printf("tgt=%f\r\n",rotate_2);
aoikoizumi 0:d56593bc83cc 126 } else if(sel=='k') {
aoikoizumi 0:d56593bc83cc 127 rotate_1-=1; //dを押すとduty比がo.o2ずつさがる
aoikoizumi 0:d56593bc83cc 128 pc.printf("tgt=%f\r\n",rotate_1);
aoikoizumi 0:d56593bc83cc 129 } else if(sel=='i') {
aoikoizumi 0:d56593bc83cc 130 rotate_2-=1; //dを押すとduty比がo.o2ずつさがる
aoikoizumi 0:d56593bc83cc 131 pc.printf("tgt=%f\r\n",rotate_2);
aoikoizumi 0:d56593bc83cc 132 //else if(sel=='p'){
aoikoizumi 0:d56593bc83cc 133 // print=!print; //pを押すと表示を停止/再開する
aoikoizumi 0:d56593bc83cc 134 //}
aoikoizumi 0:d56593bc83cc 135 }
aoikoizumi 0:d56593bc83cc 136 }
aoikoizumi 0:d56593bc83cc 137
aoikoizumi 0:d56593bc83cc 138
aoikoizumi 0:d56593bc83cc 139 if(k>100000) {
aoikoizumi 0:d56593bc83cc 140 printf("%.3lf %.3lf %.3lf ,%.3lf %.3lf %.3lf////x=%.3lf,y=%.3lf,z=%.3lf\r\n",EC_1.getOmega(),EC_1.getRad(),rotate_1,EC_2.getOmega(),EC_2.getRad(),rotate_2,odm_x,odm_y,odm_theta*180/3.141592);
aoikoizumi 0:d56593bc83cc 141 //printf("\nloop\n\n\r");
aoikoizumi 0:d56593bc83cc 142 //printf("%.3lf,%.3lf",motor_1.Sc.duty,motor_2.Sc.duty);
aoikoizumi 0:d56593bc83cc 143 k=0;
aoikoizumi 0:d56593bc83cc 144 }
aoikoizumi 0:d56593bc83cc 145 k++;
aoikoizumi 0:d56593bc83cc 146
aoikoizumi 0:d56593bc83cc 147 //printf("%d",k);
aoikoizumi 0:d56593bc83cc 148 }
aoikoizumi 0:d56593bc83cc 149 //printf("finish\n\r");
aoikoizumi 0:d56593bc83cc 150 }
aoikoizumi 0:d56593bc83cc 151 double start()
aoikoizumi 0:d56593bc83cc 152 {
aoikoizumi 0:d56593bc83cc 153 while(1) {
aoikoizumi 0:d56593bc83cc 154
aoikoizumi 0:d56593bc83cc 155 }
aoikoizumi 0:d56593bc83cc 156 }
aoikoizumi 0:d56593bc83cc 157 bool goal=false;
aoikoizumi 0:d56593bc83cc 158 double calcdif(double start_x,double start_y,double tgt_x,double tgt_y,double tgt_theta)
aoikoizumi 0:d56593bc83cc 159 {
aoikoizumi 0:d56593bc83cc 160 goal=false;
aoikoizumi 0:d56593bc83cc 161 double Vector_ab[2] = {(tgt_x - start_x), (tgt_y - start_y)}; //ベクトルAB
aoikoizumi 0:d56593bc83cc 162 double ab_Vector_size = hypot(Vector_ab[0], Vector_ab[1]); //ベクトルABの大きさ(hypot(a,b)で√(a^2+b^2)を計算できる <math.h>))
aoikoizumi 0:d56593bc83cc 163 double UnitVector_ab[2] = {Vector_ab[0]/ab_Vector_size, Vector_ab[1]/ab_Vector_size}; //ベクトルABの単位ベクトル
aoikoizumi 0:d56593bc83cc 164 double UnitVector_ch[2] = {UnitVector_ab[1], -UnitVector_ab[0]}; //ベクトルCHの単位ベクトル
aoikoizumi 0:d56593bc83cc 165 double Vector_ac[2] = {(odm_x - start_x), (odm_y - start_y)}; //ベクトルAC
aoikoizumi 0:d56593bc83cc 166 double Vector_bc[2] = {(odm_x - tgt_x), (odm_y - tgt_y)}; //ベクトルBC
aoikoizumi 0:d56593bc83cc 167 double diff = UnitVector_ab[0]*Vector_ac[1] - UnitVector_ab[1]*Vector_ac[0]; //機体位置と直線ABの距離(外積を用いて計算)
aoikoizumi 0:d56593bc83cc 168 //printf("%f\r\n",Vector_ac[0]*Vector_bc[0]+Vector_ac[1]*Vector_bc[1]);
aoikoizumi 0:d56593bc83cc 169 if(Vector_ac[0]*Vector_bc[0]+Vector_ac[1]*Vector_bc[1]>0.01) {
aoikoizumi 0:d56593bc83cc 170 goal=true;
aoikoizumi 0:d56593bc83cc 171 }
aoikoizumi 0:d56593bc83cc 172 return(diff);
aoikoizumi 0:d56593bc83cc 173 }
aoikoizumi 0:d56593bc83cc 174 void gogogo_straight(double start_x,double start_y,double tgt_x,double tgt_y,double tgt_theta,double max_speed)
aoikoizumi 0:d56593bc83cc 175 {
aoikoizumi 0:d56593bc83cc 176 double path_p=0.001,path_d=0;
aoikoizumi 0:d56593bc83cc 177 //double angle_p=0.1,angle_d=0;
aoikoizumi 0:d56593bc83cc 178 double diff,diff_angle;
aoikoizumi 0:d56593bc83cc 179 double old_gggst;
aoikoizumi 0:d56593bc83cc 180 double old_diff;
aoikoizumi 0:d56593bc83cc 181 Timer gggst_timer;
aoikoizumi 0:d56593bc83cc 182 gggst_timer.start();
aoikoizumi 0:d56593bc83cc 183 while(1) {
aoikoizumi 0:d56593bc83cc 184 if(k>1000) {
aoikoizumi 0:d56593bc83cc 185
aoikoizumi 0:d56593bc83cc 186 printf("gs,%.3lf,%.3lf,%.3lf ,%.3lf,%.3lf,%.3lf,%.3lf,%.3lf,%.3lf\r\n",EC_1.getOmega(),EC_1.getRad(),rotate_1,EC_2.getOmega(),EC_2.getRad(),rotate_2,odm_x,odm_y,odm_theta*180/3.141592);
aoikoizumi 0:d56593bc83cc 187 //printf("\nloop\n\n\r");
aoikoizumi 0:d56593bc83cc 188 k=0;
aoikoizumi 0:d56593bc83cc 189 }
aoikoizumi 0:d56593bc83cc 190 k++;
aoikoizumi 0:d56593bc83cc 191 diff_angle=odm_theta*180/3.141592-tgt_theta;
aoikoizumi 0:d56593bc83cc 192 diff=calcdif(start_x,start_y,tgt_x,tgt_y,tgt_theta);
aoikoizumi 0:d56593bc83cc 193 if(goal==true) {
aoikoizumi 0:d56593bc83cc 194 gggst_timer.stop();
aoikoizumi 0:d56593bc83cc 195 gggst_timer.reset();
aoikoizumi 0:d56593bc83cc 196 break;
aoikoizumi 0:d56593bc83cc 197 }//21
aoikoizumi 0:d56593bc83cc 198 /*
aoikoizumi 0:d56593bc83cc 199 if(diff>=5) {//右側、位置制御(粗い)
aoikoizumi 0:d56593bc83cc 200 rotate_1=max_speed-path_p*(diff);
aoikoizumi 0:d56593bc83cc 201 rotate_2=max_speed;
aoikoizumi 0:d56593bc83cc 202 //rotate_2=max_speed-path_d*(old_diff-diff)/(old_gggst-gggst_timer.read());
aoikoizumi 0:d56593bc83cc 203 } else if(diff>=0) {//右側、角度制御(細)
aoikoizumi 0:d56593bc83cc 204 rotate_1=max_speed+angle_p*(diff_angle);
aoikoizumi 0:d56593bc83cc 205 rotate_2=max_speed;
aoikoizumi 0:d56593bc83cc 206 //rotate_2=max_speed-path_d*(old_diff-diff)/(old_gggst-gggst_timer.read());
aoikoizumi 0:d56593bc83cc 207 } else if(diff>=-5){//左側、角度制御(細)
aoikoizumi 0:d56593bc83cc 208 //rotate_1=max_speed-path_d*(old_diff-diff)/(old_gggst-gggst_timer.read());
aoikoizumi 0:d56593bc83cc 209 rotate_1=max_speed;
aoikoizumi 0:d56593bc83cc 210 rotate_2=max_speed-angle_p*(diff_angle);
aoikoizumi 0:d56593bc83cc 211 }else {//左側、位置制御(粗い)
aoikoizumi 0:d56593bc83cc 212 //rotate_1=max_speed-path_d*(old_diff-diff)/(old_gggst-gggst_timer.read());
aoikoizumi 0:d56593bc83cc 213 rotate_1=max_speed;
aoikoizumi 0:d56593bc83cc 214 rotate_2=max_speed+path_p*(diff);
aoikoizumi 0:d56593bc83cc 215 }
aoikoizumi 0:d56593bc83cc 216 */
aoikoizumi 0:d56593bc83cc 217 if(diff*diff_angle<0) {
aoikoizumi 0:d56593bc83cc 218 rotate_1=max_speed-path_p*(diff)/2;
aoikoizumi 0:d56593bc83cc 219 rotate_2=max_speed+path_p*(diff)/2;
aoikoizumi 0:d56593bc83cc 220 } else {
aoikoizumi 0:d56593bc83cc 221 rotate_1=max_speed-path_p*(diff)*5;
aoikoizumi 0:d56593bc83cc 222 rotate_2=max_speed+path_p*(diff)*5;
aoikoizumi 0:d56593bc83cc 223 }
aoikoizumi 0:d56593bc83cc 224
aoikoizumi 0:d56593bc83cc 225 old_diff=diff;
aoikoizumi 0:d56593bc83cc 226 old_gggst=gggst_timer.read();
aoikoizumi 0:d56593bc83cc 227 }
aoikoizumi 0:d56593bc83cc 228 }
aoikoizumi 0:d56593bc83cc 229 void turnAtThePoint(double start_theta, double tgt_theta, double max_speed)
aoikoizumi 0:d56593bc83cc 230 {
aoikoizumi 0:d56593bc83cc 231 while(1) {
aoikoizumi 0:d56593bc83cc 232 double speed=(tgt_theta-odm_theta*180/3.141592)/20;
aoikoizumi 0:d56593bc83cc 233 if(speed<0) {
aoikoizumi 0:d56593bc83cc 234 speed=-speed;
aoikoizumi 0:d56593bc83cc 235 }
aoikoizumi 0:d56593bc83cc 236 if(speed>max_speed) {
aoikoizumi 0:d56593bc83cc 237 speed=max_speed;
aoikoizumi 0:d56593bc83cc 238 }
aoikoizumi 0:d56593bc83cc 239 if(odm_theta*180/3.141592>tgt_theta) {
aoikoizumi 0:d56593bc83cc 240 rotate_1=-speed;
aoikoizumi 0:d56593bc83cc 241 rotate_2=speed;
aoikoizumi 0:d56593bc83cc 242 } else {
aoikoizumi 0:d56593bc83cc 243 rotate_1=speed;
aoikoizumi 0:d56593bc83cc 244 rotate_2=-speed;
aoikoizumi 0:d56593bc83cc 245 }
aoikoizumi 0:d56593bc83cc 246 printf("%f,%f,%f,%f,\r\n",tgt_theta,odm_theta*180/3.141592,odm_x,odm_y);
aoikoizumi 0:d56593bc83cc 247 if(odm_theta*180/3.141592+2>tgt_theta&&odm_theta*180/3.141592-2<tgt_theta) {
aoikoizumi 0:d56593bc83cc 248 rotate_1=0;
aoikoizumi 0:d56593bc83cc 249 rotate_2=0;
aoikoizumi 0:d56593bc83cc 250 wait(0.5);
aoikoizumi 0:d56593bc83cc 251 if(odm_theta*180/3.141592+2>tgt_theta&&odm_theta*180/3.141592-2<tgt_theta) {
aoikoizumi 0:d56593bc83cc 252 break;
aoikoizumi 0:d56593bc83cc 253 }
aoikoizumi 0:d56593bc83cc 254 }
aoikoizumi 0:d56593bc83cc 255 }
aoikoizumi 0:d56593bc83cc 256 }
aoikoizumi 0:d56593bc83cc 257 void sensor_run(int form_or_back,double max_speed)
aoikoizumi 0:d56593bc83cc 258 {
aoikoizumi 0:d56593bc83cc 259
aoikoizumi 0:d56593bc83cc 260 Timer gggst_timer;
aoikoizumi 0:d56593bc83cc 261 gggst_timer.start();
aoikoizumi 0:d56593bc83cc 262 while(1) {
aoikoizumi 0:d56593bc83cc 263 if(form_or_back==0) {
aoikoizumi 0:d56593bc83cc 264 if((float)a_in<=(float)0.95) {
aoikoizumi 0:d56593bc83cc 265 rotate_2=max_speed;
aoikoizumi 0:d56593bc83cc 266 } else {
aoikoizumi 0:d56593bc83cc 267 rotate_2=0;
aoikoizumi 0:d56593bc83cc 268 }
aoikoizumi 0:d56593bc83cc 269 if((float)b_in<=(float)0.95) {
aoikoizumi 0:d56593bc83cc 270 rotate_1=max_speed;
aoikoizumi 0:d56593bc83cc 271 } else {
aoikoizumi 0:d56593bc83cc 272 rotate_1=0;
aoikoizumi 0:d56593bc83cc 273 }
aoikoizumi 0:d56593bc83cc 274 } else {
aoikoizumi 0:d56593bc83cc 275 if((float)c_in<=(float)0.95) {
aoikoizumi 0:d56593bc83cc 276 rotate_1=-max_speed;
aoikoizumi 0:d56593bc83cc 277 } else {
aoikoizumi 0:d56593bc83cc 278 rotate_1=0;
aoikoizumi 0:d56593bc83cc 279 }
aoikoizumi 0:d56593bc83cc 280 if((float)d_in<=(float)0.95) {
aoikoizumi 0:d56593bc83cc 281 rotate_2=-max_speed;
aoikoizumi 0:d56593bc83cc 282 } else {
aoikoizumi 0:d56593bc83cc 283 rotate_2=0;
aoikoizumi 0:d56593bc83cc 284 }
aoikoizumi 0:d56593bc83cc 285 }
aoikoizumi 0:d56593bc83cc 286 if(k>1000) {
aoikoizumi 0:d56593bc83cc 287 //printf("gs,%.3lf,%.3lf,%.3lf ,%.3lf,%.3lf,%.3lf,%.3lf,%.3lf,%.3lf\r\n",EC_1.getOmega(),EC_1.getRad(),rotate_1,EC_2.getOmega(),EC_2.getRad(),rotate_2,odm_x,odm_y,odm_theta*180/3.141592);
aoikoizumi 0:d56593bc83cc 288 printf("loop\n\r");
aoikoizumi 0:d56593bc83cc 289 printf("%f,%f,%f,%f,%lf,%lf",(float)a_in,(float)b_in,(float)c_in,(float)d_in,rotate_1,rotate_2);
aoikoizumi 0:d56593bc83cc 290 k=0;
aoikoizumi 0:d56593bc83cc 291 }
aoikoizumi 0:d56593bc83cc 292 k++;
aoikoizumi 0:d56593bc83cc 293 if(rotate_1==0&&rotate_2==0) {
aoikoizumi 0:d56593bc83cc 294 break;
aoikoizumi 0:d56593bc83cc 295 }//21
aoikoizumi 0:d56593bc83cc 296 }
aoikoizumi 0:d56593bc83cc 297 }