Eurobot2012_Primary

Dependencies:   mbed Eurobot_2012_Primary

Revision:
16:b3dd4e0b3100
Parent:
15:acae5c0e9ca8
Child:
17:bafcef1c3579
--- a/Eurobot_shared/Motion/motion.cpp	Sat Apr 28 22:21:03 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,166 +0,0 @@
-#include "motion.h"
-#include "geometryfuncs.h"
-#include "system.h"
-
-
-Motion::Motion(Motors &motorsin, AI &aiin, Kalman &kalmanin):
-        thr_motion(mtwrapper,this,osPriorityNormal,1024),
-        motors(motorsin),
-        ai(aiin),
-        kalman(kalmanin) { }
-
-// motion control thread ------------------------
-void Motion::motion_thread() {
-    motors.resetEncoders();
-    motors.stop();
-    Thread::wait(1500);
-    ai.thr_AI.signal_set(0x01);
-
-    //PID declare
-    PID PIDControllerMotorTheta2(FWD_MOVE_P, 0, 0, MOTION_UPDATE_PERIOD/1000.0f);     //Going forward
-    PID PIDControllerMotorTheta(SPIN_MOVE_P, 0, 0, MOTION_UPDATE_PERIOD/1000.0f);    //Spinning on the spot
-
-    //PID Initialisation
-    PIDControllerMotorTheta2.setMode(MANUAL_MODE);
-    PIDControllerMotorTheta.setMode(MANUAL_MODE);
-
-    PIDControllerMotorTheta2.setBias(0);
-    PIDControllerMotorTheta.setBias(0);
-
-    PIDControllerMotorTheta2.setOutputLimits(-1, 1);
-    PIDControllerMotorTheta.setOutputLimits(-1, 1);
-
-    PIDControllerMotorTheta2.setInputLimits(-PI, PI);
-    PIDControllerMotorTheta.setInputLimits(-PI, PI);
-
-    PIDControllerMotorTheta.setSetPoint(0);
-    PIDControllerMotorTheta2.setSetPoint(0);
-
-    float currX, currY,currTheta;
-    float speedL,speedR;
-    float diffDir;
-    int atTargetFlag = 0;
-
-    while (1) {
-        kalman.statelock.lock();
-        if (ai.flag_terminate) {
-            terminate();
-        }
-
-        // get kalman localization estimate ------------------------
-        //kalman.statelock.lock();
-        currX = kalman.X(0)*1000.0f;
-        currY = kalman.X(1)*1000.0f;
-        currTheta = kalman.X(2);
-        //kalman.statelock.unlock();
-        
-        AI::Target loctarget = ai.gettarget();
-
-        /*
-        //PID Tuning Code
-        if (pc.readable() == 1) {
-            float cmd;
-            pc.scanf("%f", &cmd);
-            //Tune PID referece
-            PIDControllerMotorTheta2.setTunings(cmd, 0, 0);
-        }
-        */
-        
-        // check if target reached ----------------------------------
-        if (atTargetFlag || hypot(currX - loctarget.x, currY - loctarget.y) < POSITION_TOR) {
-                
-            atTargetFlag = loctarget.reached;
-            OLED4 = 1;
-            
-            diffDir = rectifyAng(currTheta - loctarget.theta);
-            //diffSpeed = diffDir / PI;
-
-            PIDControllerMotorTheta.setProcessValue(diffDir);
-            float tempPidVar = PIDControllerMotorTheta.compute();
-            motors.setSpeed( -int(tempPidVar*MOVE_SPEED),  int(tempPidVar*MOVE_SPEED));
-
-            if (abs(diffDir) < ANGLE_TOR) {
-
-                if (!loctarget.reached) {
-                    static int counter = 10;
-                    if (counter-- == 0){
-                    counter = 10;
-                    ai.target.reached = true;
-                    ai.thr_AI.signal_set(0x01);
-                    
-                    }
-                }
-            }
-        }
-
-        // adjust motion to reach target ----------------------------
-        else {
-        
-            OLED4 = 0;
-
-            // calc direction to target
-            float targetDir = atan2(loctarget.y - currY, loctarget.x - currX);
-            if (!loctarget.facing) targetDir =  targetDir + PI;
-
-            //Angle differene in -PI to PI
-            diffDir = rectifyAng(currTheta - targetDir);
-
-            //Set PID process variable
-            PIDControllerMotorTheta.setProcessValue(diffDir);
-            PIDControllerMotorTheta2.setProcessValue(diffDir);
-
-            //if diffDIr is neg, spin right
-            //if diffDir is pos, spin left
-
-            if (abs(diffDir) > ANGLE_TOR*4) {   //roughly 32 degrees
-                //ANGLE_TOR*4
-                float tempPidVar = PIDControllerMotorTheta.compute();
-                motors.setSpeed( -int(tempPidVar*MOVE_SPEED),  int(tempPidVar*MOVE_SPEED));
-                //pc.printf("spin,%f\n",diffDir);
-
-            } else {
-
-                float tempPidVar = PIDControllerMotorTheta2.compute();
-                float MoveSpeedLimiter = 1;
-                //pc.printf("turn,%f\n",diffDir);
-
-                float distanceToX = (float)abs(currX - loctarget.x);
-                float distanceToY = (float)abs(currY - loctarget.y);
-
-                float distanceToTarget = hypot(distanceToX, distanceToY);
-
-                if ((distanceToTarget < 400) && (distanceToTarget > 100)) {
-                    MoveSpeedLimiter = (distanceToTarget)/400;
-                }
-                else if((distanceToTarget < 400) && (distanceToTarget > 100)) {
-                    MoveSpeedLimiter  = 0.25;
-                }
-                
-                
-                
-
-                // calculte the motor speeds
-                if (tempPidVar >= 0) {
-                    //turn left
-                    speedL = (1-abs(tempPidVar))*MOVE_SPEED*MoveSpeedLimiter;
-                    speedR = MOVE_SPEED*MoveSpeedLimiter;
-
-                } else {
-                    //turn right
-                    speedR = (1-abs(tempPidVar))*MOVE_SPEED*MoveSpeedLimiter;
-                    speedL = MOVE_SPEED*MoveSpeedLimiter;
-                }
-
-
-
-
-                if (loctarget.facing) motors.setSpeed( int(speedL),  int(speedR));
-                else motors.setSpeed( -int(speedR),  -int(speedL));
-
-            }
-        }
-        kalman.statelock.unlock();
-        // wait
-        Thread::wait(MOTION_UPDATE_PERIOD);
-    }
-}
\ No newline at end of file