Carter Sharer / Mbed 2 deprecated BroBot_RTOS_ESE350

Dependencies:   MPU6050_V3 mbed-rtos mbed

Fork of BroBot_RTOS_Development by Arvind Ramesh

Files at this revision

API Documentation at this revision

Comitter:
csharer
Date:
Wed Mar 22 21:41:07 2017 +0000
Parent:
18:ee252b8f7430
Commit message:
Further Clean up for ESE350 (FULL IMPLEMENTATION)

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
waypoint.h Show diff for this revision Revisions of this file
--- a/main.cpp	Wed Mar 22 21:01:07 2017 +0000
+++ b/main.cpp	Wed Mar 22 21:41:07 2017 +0000
@@ -3,16 +3,11 @@
     Authors: Arvind Ramesh and Carter Sharer
 */
 
-//Added communication protocol v1 (no type selection)
-//Knob1 39.898 Knob2 44.381 Knob3 10.55 Knob4 18.67
-//Knob1 13.418 Knob2 28.848 Knob3 9.45  Knob4 42.29 Good
-//Knob1 15.373 Knob2 28.261 Knob3 10.42 Knob4 40.97 Smoother
-
 /******************************* README USAGE *******************************
 * This robot must be powered on while it is laying down flat on a still table
 * This allows the robot to calibrate the IMU (~5 seconds)
 * The motors are DISABLED when the robot tilts more then +-45 degrees from
-* vertical.  To ENABLE the motors you must lift the robot to < +- 45 degres and
+* vertical.  To ENABLE the motors you must lift the robot to 0 degres and
 * press the joystick button.
 * To reset the motor positions you must press the josystick button anytime.
 ******************************************************************************/
@@ -35,29 +30,15 @@
 #include "stepper_motors.h"
 #include "MRF24J40.h"
 #include "communication.h"
-#include "waypoint.h"
 
 //Angle Offset is used to set the natural balance point of your robot.
 //You should adjust this offset so that your robots balance point is near 0
-#define ANGLE_OFFSET 107
-#define THETA_OFFSET 0//165
+#define ANGLE_OFFSET 107 //THIS NEEDS TO BE CHANGED FOR YOUR ROBOT
+#define THETA_OFFSET 0
 
 //Set Channel to (Group Number - 1). Possible Channels are 0-15
 #define MRF_CHANNEL 2
 
-//For RF Communication
-#define JSTICK_H 8
-#define JSTICK_V 9
-#define SPACE 10
-#define KNOB1 11
-#define KNOB2 12
-#define KNOB3 13
-#define KNOB4 14
-#define ANGLE 15
-#define BUTTON 16
-#define JSTICK_OFFSET 100
-#define TX_BUFFER_LEN 18
-#define TX_ANGLE_OFFSET 100
 //Knobs
 #define POT1 p17
 #define POT2 p18
@@ -70,16 +51,11 @@
 //PID
 #define MAX_THROTTLE 580
 #define MAX_STEERING 150
-#define MAX_TARGET_ANGLE 12
-#define KP 0.19
-#define KD 28
-#define KP_THROTTLE 0.01 //0.07    
-#define KI_THROTTLE 0//0.04
-#define ITERM_MAX_ERROR 25   // Iterm windup constants for PI control //40
-#define ITERM_MAX 8000       // 5000
+#define MAX_TARGET_ANGLE 12     
 
-#define THROTTLE_DAMPNER 100
-#define STREEING_DAMPNER 10000
+//Joystick Control
+#define THROTTLE_DAMPNER 30
+#define STREEING_DAMPNER 10
 #define VELOCITY_SAMPLES 10
 
 //*********** Local Function Definations BEGIN **************//
@@ -107,8 +83,6 @@
 DigitalOut led3(LED3);
 DigitalOut led4(LED4);
 
-//Blue = IMU Intr
-
 //Used to set angle upon startup
 bool initilizeAngle;
 bool initilizeTheta;
@@ -127,7 +101,6 @@
     pc.printf("Starting IMU Thread..\r\n");
     while (1) {
         osSignalWait(IMU_UPDATE_SIGNAL,osWaitForever);
-        pin_30 = 1;
         if(mpuInterrupt) {
             mpuInterrupt = false;
             led3 = !led3;
@@ -200,7 +173,6 @@
             else{
                 pc.printf("\t\t\t IMU Error. MPU Status: %d!!\r\n",mpuIntStatus);
             }
-            pin_30 = 0;
             /********************* All IMU Handling DO NOT MODIFY *****************/
         }//End of if(mpuInterrupt) loop
         osSignalClear(imu_update_thread_ID,IMU_UPDATE_SIGNAL);
@@ -227,7 +199,6 @@
     float kd_term = 0;
     float throttle = 0;
     float steering = 0;
-    float steering_output = 0;
     float control_output = 0;
     int robot_pos = 0;
     //int loop_counter = 0;
@@ -245,15 +216,9 @@
     // -- For Velocity Controller --- //
     float target_pos_old = 0;
     float target_velocity = 0;
-    float velocity_error = 0;
-    float change_in_velocity = 0;
-    float d_velocity = 0;
     float runningSumReplaceVal = 0;
     float newVelocity = 0;
-    float angle_old = 0;
     float velocitySum = 0;
-    float theta_error = 0;
-    float target_theta = 0;
     memset(velocitySamples,0,sizeof(velocitySamples));
     
     pc.printf("Starting PID Thread..\r\n");
@@ -268,9 +233,6 @@
             motor1 = 0;
             motor2 = 0;
             control_output = 0;
-            totalTheta = 0;
-            target_theta = 0;
-            steering_output = 0;
             fallen = false;
         }
         
@@ -292,7 +254,7 @@
         //Calculate the delta time
         dt = (timer_value - timer_old);
         timer_old = timer_value;
-        angle_old = angle;
+        //angle_old = angle;
         
         // STANDING: Motor Control Enabled
         //******************** PID Control BEGIN ********************** //
@@ -300,7 +262,9 @@
 
             //Robot Position
             robot_pos = (pos_M1 + pos_M2) / 2;
-            target_pos += throttle/2;
+            
+            //Target Position Incremented with Joystick
+            target_pos += throttle;
     
             //*************** Velocity Computation **********************
             velocitySamplesCounter++;
@@ -313,67 +277,55 @@
             velocitySum = velocitySum - runningSumReplaceVal + newVelocity;
             velocity = velocitySum/VELOCITY_SAMPLES;
             
-            // ***************** Angular Controller *********************
-            float Kp1A = 0;//Kp1/100;
-            target_theta += steering;
-            theta_error =  totalTheta - target_theta;
-            steering_output = -Kp1A * theta_error;
+            // ***************** Position Controller *********************
+            //Inputs: robot_position, target_pos 
+            //Error: distance from target position 
+            //Output: target_angle
             
-            // ***************** Position Controller *********************
             float Kp1P = Kp2/1000;
             float Kd1P = Kd2/100;
-            //Kp1P = ;//5.73/100;
-            //target_pos = 0;
+            
+            //Calculate the Position Error using robot_pos and target_pos
             pos_error = robot_pos - target_pos; //robot_pos - target_pos;
 
-            //KP Term
+            //Calculate the Proportional Term (P Term) Using The Error
             kp_pos_term = Kp1P * pos_error;
 
-            //KD Term
+            //Calculate the Derivative Term (D Term) Using The Error
             change_in_target_pos = target_pos - target_pos_old;
-            //kd_pos_term = ((-Kd2 * change_in_target_pos) + (-Kd2*change_in_pos)) /dt;
             kd_pos_term = ((Kd1P * change_in_target_pos) + (Kd1P*velocity));
             target_velocity = kp_pos_term + -kd_pos_term;
             target_velocity = CAP(target_velocity, 100);
             target_angle = -target_velocity;
+         
+            //************ PD Stability CONTROLLER HERE ****************
+            //Inputs: angle, target_angle
+            //Error: distance from target_angle
+            //Output: control_output (motor speed) 
             
-            //***************** Velocity Controller *********************
-            /*
-            float Kp2V = Kp2/100;
-            float Kd2V = Kd2;
-            Kp2V = 31.81/100;
-            Kd2V = 17.5;
-            //target_velocity = throttle;
-            velocity_error = target_velocity - velocity;
-            change_in_velocity = velocity - velocitySamples[(velocitySamplesCounter + 2)%VELOCITY_SAMPLES];
-            d_velocity = (Kd2V * change_in_velocity)/dt;
+            //Scale the Knob Values;
+            float Kp1S = Kp1/100; 
+            float Kd1S = Kd1*100; 
             
-            target_angle = (-velocity_error * Kp2V)+ d_velocity;    
-            */
+            //Calculate the Angle Error Using target_angle and angle 
+            error = target_angle - angle;
             
-            //************ PD Stability CONTROLLER HERE ****************
-            float Kp1S = Kp1/10; //7.373/1000.0;
-            float Kd1S = Kd1*100; //50.986/1.0;
-           // Kp1S = 3.48/1000;
-            //Kd1S = 44.5;
-            
-            error = target_angle - angle;
+            //Calculate the Proportional Term (P term) Using the Error
             kp_term = Kp1S * error;
 
+            //Calculate the Derivatve Term (D term)
             change_in_target_angle = target_angle - target_angle_old; //add
             change_in_angle = angle - angle_old2; //add
             kd_term = ((Kd1S * change_in_target_angle) - (Kd1S*change_in_angle)) / dt;
             //kd_term = ((Kd1 * change_in_target_angle) - (Kd1*velocity));
 
-            // Control Output
+            //Calculate the Control Output
             control_output += kp_term + kd_term; //-100 to 100
             control_output = CAP(control_output, MAX_CONTROL_OUTPUT); // Limit max output from control
             
-            //pc.printf("dAngle:%f\r\n", angle-angle_old1);
-
             //*************** Set Motor Speed *************************
-            motor1 = (int16_t)(control_output + (steering_output));
-            motor2 = (int16_t)(control_output - (steering_output));
+            motor1 = (int16_t)(control_output + (steering));
+            motor2 = (int16_t)(control_output - (steering));
             motor1 = CAP(motor1, MAX_CONTROL_OUTPUT);
             motor2 = CAP(motor2, MAX_CONTROL_OUTPUT);
             setMotor1Speed(-motor1);
--- a/waypoint.h	Wed Mar 22 21:01:07 2017 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-#ifndef _WAYPOINT_H
-#define _WAYPOINT_H
-
-typedef struct waypoints {
-    float targetPosition;
-    float targetAngle;
-}WAYPOINTS;
-
-#endif
\ No newline at end of file