aaa

Fork of Move by 涼太郎 中村

Revision:
1:405e28b64fdb
Parent:
0:d7ff86f25eaa
Child:
2:f25a09c5e113
--- a/move.cpp	Fri Sep 02 12:40:45 2016 +0000
+++ b/move.cpp	Sat Sep 03 10:53:20 2016 +0000
@@ -12,7 +12,9 @@
 const int rightspeed=29*2;
 const int leftspeed=31*2;
 const int turnspeed=15*2;
-
+const float k_x = 0.9;
+const float k_y = 0.9;//P制御の係数。大きくすれば動きが大きくなる、小さくするとあまり変化しない。要はkはP制御の感度を表す係数です。
+const int k_theta = 500;
 //const float PIfact=2.89;
 
 
@@ -86,15 +88,13 @@
 
 void turncw()
 {
-    float pt;
-    move((-1)*turnspeed,turnspeed);
-
     update();
-    pt=coordinateTheta();
+    float pt = coordinateTheta();;
+    move(-turnspeed, turnspeed);
 
     while(1) {
         update();
-        if(pt-coordinateTheta()>PI/2) {
+        if(coordinateTheta() - pt > -PI/2) {
             move(0,0);
             break;
         }
@@ -103,15 +103,13 @@
 
 void turnccw()
 {
-    float pt;
-    move(turnspeed,(-1)*turnspeed);
-
     update();
-    pt=coordinateTheta();
+    float pt = coordinateTheta();;
+    move(turnspeed, -turnspeed);
 
     while(1) {
         update();
-        if(pt-coordinateTheta()<(-1)*PI/2) {
+        if(coordinateTheta() - pt < PI/2) {
             move(0,0);
             break;
         }
@@ -120,40 +118,36 @@
 
 void turn_cw()
 {
-    float pt;
-    move((-1)*turnspeed,turnspeed);
-
     update();
-    pt=coordinateTheta();
+    float pt = coordinateTheta();;
+    move(-turnspeed, turnspeed);
 
     while(1) {
         update();
-        if(pt-coordinateTheta()>PI/2) {
+        if(coordinateTheta() - pt < -PI/2) {
             move(0,0);
             break;
         }
     }
 
-    hosei_turn(pt, true, PI/2);
+    hosei_turn(pt, CW, PI/2);
 }
 
 void turn_ccw()
 {
-    float pt;
-    move(turnspeed,(-1)*turnspeed);
-
     update();
-    pt=coordinateTheta();
+    float pt = coordinateTheta();;
+    move(turnspeed, -turnspeed);
 
     while(1) {
         update();
-        if(pt-coordinateTheta()<(-1)*PI/2) {
+        if(coordinateTheta() - pt > PI/2) {
             move(0,0);
             break;
         }
     }
 
-    hosei_turn(pt, false, PI/2);
+    hosei_turn(pt, CCW, PI/2);
 }
 
 void hosei_turn(float pt, bool cw, float rad)
@@ -174,23 +168,217 @@
     }
 }
 
-void turn_direction(int rad)
+
+void turn_abs_rad(float rad)
 {
-    move(turnspeed, (-1)*turnspeed);
+    update();
 
-    update();
+    int np;
+    if(coordinateTheta() > rad) np = 1;
+    else if(coordinateTheta() < rad) np = -1;
+    else return;
+
+    move((-np)*turnspeed, (np)*turnspeed);
 
     while(1) {
         update();
-        if(coordinateTheta() < rad + 0.1 && coordinateTheta() > rad - 0.1) {
+        if(coordinateTheta() < rad + 0.1 && rad - 0.1 < coordinateTheta()) {
             move(0,0);
             break;
         }
     }
 
-    hosei_turn(0, false, rad);        
+    hosei_turn(0, false, rad);
+}
+
+
+void pmovex(int length)
+{
+    int px,py,ptheta,dx,dy,dtheta;
+
+    update();
+    px=coordinateX();
+    py=coordinateY();
+    ptheta=coordinateTheta();
+    move(rightspeed,leftspeed);
+
+    while(1) {
+        update();
+        dx=coordinateX()-px;
+        dy=coordinateY()-py;
+        dtheta=coordinateTheta()-ptheta;
+        if(dy>3) {
+            dy=3;
+        } else if(dy<-3) {
+            dy=-3;
+        }
+        move(rightspeed - k_y * dy - k_theta * dtheta,leftspeed + k_y *dy + k_theta * dtheta);
+
+        if(dx>length) {
+            move(0,0);
+            break;
+        }
+    }
+}
+
+void pmovey(int length)
+{
+    int px,py,ptheta,dx,dy,dtheta;
+
+    update();
+    px=coordinateX();
+    py=coordinateY();
+    ptheta=coordinateTheta();
+    move(rightspeed,leftspeed);
+
+    while(1) {
+        update();
+        dx=coordinateX()-px;
+        dy=coordinateY()-py;
+        dtheta=coordinateTheta()-ptheta;
+
+        if(dx>7) {
+            dx=7;
+        } else if(dx<-7) {
+            dx=-7;
+        }
+        move(rightspeed-k_x*dx-k_theta*dtheta,leftspeed+k_x*dx+k_theta*dtheta);
+
+        if(dy>length) {
+            move(0,0);
+            break;
+        }
+    }
+}
+
+/*
+void pmovex_minus(int length)
+{
+    int px,py,ptheta,dx,dy,dtheta;
+
+    update();
+    px=coordinateX();
+    py=coordinateY();
+    ptheta=coordinateTheta();
+    move(rightspeed,leftspeed);
+
+    while(1) {
+        update();
+        dx=coordinateX()-px;
+        dy=coordinateY()-py;
+        dtheta=coordinateTheta()-ptheta;
+
+        if(dy>7) {
+            dy=7;
+        }
+        if(dy<-7) {
+            dy=-7;
+        }
+        move(rightspeed - k_y * dy - k_theta * dtheta, leftspeed + k_y *dy + k_theta * dtheta);
+
+        if(dx < length) {
+            move(0,0);
+            break;
+        }
+    }
 }
-void pmovex(int length)
+
+void pmovey_minus()
+{
+    int px,py,ptheta,dx,dy,dtheta;
+    int k_x=0.7;//P制御の係数。大きくすれば動きが大きくなる、小さくするとあまり変化しない。要はkはP制御の感度を表す係数です。
+    int k_theta=10;//P制御の係数。大きくすれば動きが大きくなる、小さくするとあまり変化しない。要はkはP制御の感度を表す係数です。
+
+    update();
+    px=coordinateX();
+    py=coordinateY();
+    ptheta=coordinateTheta();
+    move(rightspeed,leftspeed);
+
+    while(1) {
+        update();
+        dx=coordinateX()-px;
+        dy=coordinateY()-py;
+        dtheta=coordinateTheta()-ptheta;
+
+        if(dx>7) {
+            dx=7;
+        }
+        if(dx<-7) {
+            dx=-7;
+        }
+        move(rightspeed - k_x * dx - k_theta * dtheta,leftspeed + k_x *dx + k_theta * dtheta);
+
+        if(dy<length) {
+            move(0,0);
+            break;
+        }
+    }
+}
+*/
+
+void pmovex_to(int x, int y)
+{
+    int px,py,ptheta,dx,dy,dtheta;
+
+    if(x <= coordinateX()) return;
+    update();
+    py=y;
+    ptheta=coordinateTheta();
+    move(rightspeed,leftspeed);
+
+    while(1) {
+        update();
+        dy=coordinateY()-py;
+        dtheta=coordinateTheta()-ptheta;
+        if(dy>3) {
+            dy=3;
+        } else if(dy<-3) {
+            dy=-3;
+        }
+        move(rightspeed - k_y * dy - k_theta * dtheta,leftspeed + k_y *dy + k_theta * dtheta);
+
+        if(coordinateX() > x) {
+            move(0,0);
+            break;
+        }
+    }
+}
+
+/*
+void pmovey_to(int x, int y)
+{
+    int px,py,ptheta,dx,dy,dtheta;
+    int k_x=0.7;//P制御の係数。大きくすれば動きが大きくなる、小さくするとあまり変化しない。要はkはP制御の感度を表す係数です。
+    int k_theta=10;//P制御の係数。大きくすれば動きが大きくなる、小さくするとあまり変化しない。要はkはP制御の感度を表す係数です。
+
+    update();
+    px=coordinateX();
+    py=coordinateY();
+    ptheta=coordinateTheta();
+    move(rightspeed,leftspeed);
+
+    while(1) {
+        update();
+        dx=coordinateX()-px;
+        dy=coordinateY()-py;
+        dtheta=coordinateTheta()-ptheta;
+
+        if(dx>7) {
+            dx=7;
+        } else if(dx<-7) {
+            dx=-7;
+        }
+        move(rightspeed-k_x*dx-k_theta*dtheta,leftspeed+k_x*dx+k_theta*dtheta);
+
+        if(dy>length) {
+            move(0,0);
+            break;
+        }
+    }
+}
+
+void pmovex_minus_to(int x, int y)
 {
     int px,py,ptheta,dx,dy,dtheta;
     int k_y=0.7;//P制御の係数。大きくすれば動きが大きくなる、小さくするとあまり変化しない。要はkはP制御の感度を表す係数です。
@@ -214,16 +402,16 @@
         if(dy<-7) {
             dy=-7;
         }
-        move(rightspeed-k_y*dy-k_theta*dtheta,leftspeed+k_y*dy+k_theta*dtheta);
+        move(rightspeed - k_y * dy - k_theta * dtheta, leftspeed + k_y *dy + k_theta * dtheta);
 
-        if(dx>length) {
+        if(dx < length) {
             move(0,0);
             break;
         }
     }
 }
 
-void pmovey(int length)
+void pmovey_minus_to(int x, int y)
 {
     int px,py,ptheta,dx,dy,dtheta;
     int k_x=0.7;//P制御の係数。大きくすれば動きが大きくなる、小さくするとあまり変化しない。要はkはP制御の感度を表す係数です。
@@ -247,11 +435,12 @@
         if(dx<-7) {
             dx=-7;
         }
-        move(rightspeed-k_x*dx-k_theta*dtheta,leftspeed+k_x*dx+k_theta*dtheta);
+        move(rightspeed - k_x * dx - k_theta * dtheta,leftspeed + k_x *dx + k_theta * dtheta);
 
-        if(dy>length) {
+        if(dy<length) {
             move(0,0);
             break;
         }
     }
 }
+*/
\ No newline at end of file