main

Dependents:   00_yotsuba 200_yotsuba_21 200_yotuba_21_uiChange

Revision:
15:da88e62863a1
Parent:
13:d61a64c81c16
Child:
16:e3846421554b
--- a/robot.cpp	Fri Mar 05 06:30:37 2021 +0000
+++ b/robot.cpp	Sat Mar 06 07:26:44 2021 +0000
@@ -2,6 +2,7 @@
 
 Robot::Robot() :
       spin(P, I, D, interval),
+      sgoal(P, I, D, interval),
       pc(USBTX, USBRX, 115200),
       shot(kicker),
       drib(ESCpin)
@@ -16,10 +17,15 @@
     motor[2] = new KohiMD(PA_7);
     motor[3] = new KohiMD(PB_6);
     spin.setInputLimits(-180, 180);
+    sgoal.setInputLimits(-180, 180);
     spin.setOutputLimits(-0.4,0.4);
+    sgoal.setOutputLimits(-0.4,0.4);
     spin.setBias(0);
+    sgoal.setBias(0);
     spin.setMode(1);
+    sgoal.setMode(1);
     spin.setSetPoint(0);
+    sgoal.setSetPoint(0);
     shot.setkickperiod(2.0);
     shot.setoutputtime(0.1);
     drib.setspeed(0.0);
@@ -28,45 +34,108 @@
 
 void Robot::start(uint8_t Team, uint8_t Algorithm)
 {
-    
-    while (1) {
-        startb=1;
-        spin.setProcessValue(sensor_.angleLimit);
-        theta = sensor_.ballAngle * ballExtra * PI / 180.0;
+    while(1){
+        printf("%d %d ", (int)sensor_.irVal ,(int)sensor_.ballKeep);
+        spin.setProcessValue(sensor_.angleLimit/*-sensor_.ballAngle*/);
         spin_power = spin.compute();
-        if (/*sensor_.ballKeep*/0) {
-            /*ボールをつかんでるなら*/
-//            drib.setspeed(0.5);
-            if(Team)
-            {
-                /*あおに向かうよ*/
-//                /*if(!sensor.bluex)*/ omni.computeCircular(1,0,0/* spin_power*/);
-//                omni.computeCircular(sensor_.blueRange,PI / 180.0 * sensor_.blueAngle, spin_power);
-        
-            }
-            else
-            {
-                /*きいろに向かうよ*/
-//                /*if(!sensor.yellowx)*/ omni.computeCircular(1,0,0/* spin_power*/);
-            }
+
+//        theta = sensor_.ballAngle * ballExtra * PI / 180.0 * ((120-sensor_.ballRange)/240.0) * (fabs(sensor_.ballAngle) > 25.0) ;
+//        theta =30 * sensor_.ballAngle*sensor_.ballAngle * 0.5 * PI / 180.0 / (1.5*sensor_.ballRange + 1);
+//        theta = (sensor_.ballAngle / 180.0) * (sensor_.ballAngle / 180.0) * (100 / (100 + sensor_.ballRange) - 0.5) * PI * 1.2;
+        theta = ((sensor_.ballAngle>0) - (sensor_.ballAngle<0)) * (2.0/(2-fabs(sensor_.ballAngle)/180) - 1) * (100 / (100 + sensor_.ballRange) - 0.5) * PI * 1.2;
+        printf("%3d %3d %3d %3d\r\n",(int)sensor_.ballRange, (int)sensor_.ballAngle, (int)(theta * 180/PI), (int)(spin_power * 100));
+        omni.computeCircular(/*0*/1.1*sensor_.ballRange / 100.0,/*0*/PI / 180.0 * sensor_.ballAngle + theta, spin_power);
+        for (int i=0; i<4; i++) {
+            thisSpeed[i] = omni.wheel[i];
         }
-        else
-            /*つかんでないなら*/
-        {
-//            for(int i=0; i<6; i++) pc.printf("%d ",sensor.line[i]);
-//            pc.printf("\r\n");
-            drib.setspeed(0.0);
-//            omni.computeCircular(sensor_.ballRange, (PI / 180.0) * sensor_.ballAngle + theta, spin_power);
-            omni.computeCircular(sensor_.ballRange, sensor_.ballAngle, spin_power);
-        }
-//        printf("%d ",(int)sensor.ballKeep);
+        if((fabs(sensor_.ballAngle) < 50 && sensor_.ballRange) || sensor_.ballKeep) dribbleCheck(0.6);
+        else dribbleCheck(0.0);
+        motor[0]->setSpeed(thisSpeed[0]);
+        motor[1]->setSpeed(thisSpeed[1]);
+        motor[2]->setSpeed(-1*thisSpeed[2]);
+        motor[3]->setSpeed(-1*thisSpeed[3]);
+    }
+//    昔
+//    while (1) {
+//        startb=1;
+//        spin.setProcessValue(sensor_.angleLimit);
+//        theta = sensor_.ballAngle * ballExtra * PI / 180.0;
+//        spin_power = spin.compute();
+//        if (/*sensor_.ballKeep*/0) {
+//            /*ボールをつかんでるなら*/
+////            drib.setspeed(0.5);
+//            if(Team)
+//            {
+//                /*あおに向かうよ*/
+////                /*if(!sensor.bluex)*/ omni.computeCircular(1,0,0/* spin_power*/);
+////                omni.computeCircular(sensor_.blueRange,PI / 180.0 * sensor_.blueAngle, spin_power);
+//        
+//            }
+//            else
+//            {
+//                /*きいろに向かうよ*/
+////                /*if(!sensor.yellowx)*/ omni.computeCircular(1,0,0/* spin_power*/);
+//            }
+//        }
+//        else
+//            /*つかんでないなら*/
+//        {
+////            for(int i=0; i<6; i++) pc.printf("%d ",sensor.line[i]);
+////            pc.printf("\r\n");
+//            drib.setspeed(0.0);
+////            omni.computeCircular(sensor_.ballRange, (PI / 180.0) * sensor_.ballAngle + theta, spin_power);
+//            omni.computeCircular(sensor_.ballRange, sensor_.ballAngle, spin_power);
+//        }
+////        printf("%d ",(int)sensor.ballKeep);
+//        if(sensor_.line[0] || sensor_.line[1])
+//        {
+//            omni.computeCircular(1,-1*PI/2.0,spin_power);
+//        }
+//        if(sensor_.line[2] || sensor_.line[3]) 
+//        {
+//            omni.computeCircular(1,PI/2.0,spin_power);
+//        }
+//        if(sensor_.line[4])
+//        {
+//             omni.computeCircular(1,0,spin_power);
+//        }
+//        if(sensor_.line[5])
+//        {
+//             omni.computeCircular(1,PI,spin_power);
+//        }
+//        
+//        if (startb) {
+//            omni2wheel = omni.wheel[2];
+//            omni3wheel = omni.wheel[3];
+////            motor[0]->setSpeed(omni.wheel[0]);
+////            motor[1]->setSpeed(omni.wheel[1]);
+////            motor[2]->setSpeed(omni.wheel[2]);
+////            motor[3]->setSpeed(omni.wheel[3]);
+////            motor[3]->setSpeed(-omni3wheel);
+//            shot.outPut();
+//
+//        } else {
+//            motor[0]->setSpeed(0);
+//            motor[1]->setSpeed(0);
+//            motor[2]->setSpeed(0);
+//            motor[3]->setSpeed(0);
+//        }
+//    }
+}
+
+void Robot::pidtest()
+{
+    while(1){
+        spin.setProcessValue(sensor_.angleLimit);
+        spin_power = spin.compute();
+        omni.computeCircular(0,0,spin_power);
         if(sensor_.line[0] || sensor_.line[1])
         {
-            omni.computeCircular(1,-1*PI/2.0,spin_power);
+            omni.computeCircular(1,PI/2.0,spin_power);
         }
         if(sensor_.line[2] || sensor_.line[3]) 
         {
-            omni.computeCircular(1,PI/2.0,spin_power);
+            omni.computeCircular(1,-1*PI/2.0,spin_power);
         }
         if(sensor_.line[4])
         {
@@ -76,32 +145,6 @@
         {
              omni.computeCircular(1,PI,spin_power);
         }
-        
-        if (startb) {
-            omni2wheel = omni.wheel[2];
-            omni3wheel = omni.wheel[3];
-//            motor[0]->setSpeed(omni.wheel[0]);
-//            motor[1]->setSpeed(omni.wheel[1]);
-//            motor[2]->setSpeed(omni.wheel[2]);
-//            motor[3]->setSpeed(omni.wheel[3]);
-//            motor[3]->setSpeed(-omni3wheel);
-            shot.outPut();
-
-        } else {
-            motor[0]->setSpeed(0);
-            motor[1]->setSpeed(0);
-            motor[2]->setSpeed(0);
-            motor[3]->setSpeed(0);
-        }
-    }
-}
-
-void Robot::pidtest()
-{
-    while(1){
-        spin.setProcessValue(sensor_.angleLimit);
-        spin_power = spin.compute();
-        omni.computeCircular(0,0,spin_power);
         for (int i=0; i<4; i++) {
             thisSpeed[i] = omni.wheel[i];
         }
@@ -142,18 +185,66 @@
 void Robot::moveTest()
 {
     while(1){
-        spin.setProcessValue(sensor_.angleLimit);
+//        printf("%d %d ", (int)sensor_.irVal ,(int)sensor_.ballKeep);
+        spin.setProcessValue(sensor_.angleLimit/*-sensor_.ballAngle*/);
+        if(sensor_.team) sgoal.setProcessValue(-sensor_.blueAngle/*-sensor_.ballAngle*/);
+        else sgoal.setProcessValue(-sensor_.yellowAngle/*-sensor_.ballAngle*/);
         spin_power = spin.compute();
 
-        theta = sensor_.ballAngle * ballExtra * PI / 180.0;
-        printf("%3d %3d %3d %3d\r\n",(int)sensor_.ballRange, (int)sensor_.ballAngle, (int)(theta * 180/PI), (int)(spin_power * 10));
-        omni.computeCircular(sensor_.ballRange / 100.0,PI / 180.0 * sensor_.ballAngle + theta, spin_power);
+//        theta = sensor_.ballAngle * ballExtra * PI / 180.0 * ((120-sensor_.ballRange)/240.0) * (fabs(sensor_.ballAngle) > 25.0) ;
+//        theta =30 * sensor_.ballAngle*sensor_.ballAngle * 0.5 * PI / 180.0 / (1.5*sensor_.ballRange + 1);
+//        theta = (sensor_.ballAngle / 180.0) * (sensor_.ballAngle / 180.0) * (100 / (100 + sensor_.ballRange) - 0.5) * PI * 1.2;
+        //        printf("%3d %3d %3d %3d\r\n",(int)sensor_.ballRange, (int)sensor_.ballAngle, (int)(theta * 180/PI), (int)(spin_power * 100));
+        if(sensor_.line[0] || sensor_.line[1])
+        {
+            omni.computeCircular(1,PI/2.0,spin_power);
+            lineflag = 1;
+        }
+        if(sensor_.line[2] || sensor_.line[3]) 
+        {
+            omni.computeCircular(1,-1*PI/2.0,spin_power);
+            lineflag = 1;
+        }
+        if(sensor_.line[4])
+        {
+             omni.computeCircular(1,0,spin_power);
+            lineflag = 1;
+        }
+        if(sensor_.line[5])
+        {
+             omni.computeCircular(1,PI,spin_power);
+             lineflag = 1;
+        }
+        if(lineflag == 0 && !sensor_.ballkeepcount){
+            theta = ((sensor_.ballAngle>0) - (sensor_.ballAngle<0)) * (2.0/(2-fabs(sensor_.ballAngle)/180) - 1) * (100 / (100 + sensor_.ballRange) - 0.5) * PI * 1.2;
+            omni.computeCircular(/*0*/1.1*sensor_.ballRange / 100.0,/*0*/PI / 180.0 * sensor_.ballAngle + theta, spin_power);
+        }
+        else if(sensor_.ballkeepcount)
+        {
+        spin_power = sgoal.compute();
+            if(sensor_.team)
+            {
+                omni.computeCircular(sensor_.blueRange / 100.0/*0.6*/,sensor_.blueAngle,spin_power);
+            }
+            else
+            {
+                omni.computeCircular(sensor_.yellowRange / 100.0/*0.6*/,sensor_.yellowAngle,spin_power);
+            }
+            if(lineflag) kickCheck();
+        }
+        lineflag = 0;
+//        printf("r:%d %d l:%d %d b:%d f:%d\r\n",sensor_.line[0],sensor_.line[1],sensor_.line[2],sensor_.line[3],sensor_.line[4],sensor_.line[5]);
+//        printf("%d %d %d %d\r\n",(int)(sensor_.b0),(int)sensor_.tgl1,(int)sensor_.tgl2,(int)sensor_.tgl3);
         for (int i=0; i<4; i++) {
             thisSpeed[i] = omni.wheel[i];
         }
+        if(sensor_.b0) sensor_.jy.yawcalibrate();
+        if((fabs(sensor_.ballAngle) < 50 && sensor_.ballRange) || sensor_.ballKeep) dribbleCheck(0.6);
+        else dribbleCheck(0.0);
         motor[0]->setSpeed(thisSpeed[0]);
         motor[1]->setSpeed(thisSpeed[1]);
         motor[2]->setSpeed(-1*thisSpeed[2]);
         motor[3]->setSpeed(-1*thisSpeed[3]);
+//        thread_sleep_for(40);
     }
 }
\ No newline at end of file