Dependencies:   Sabertooth mbed pixy

main.cpp

Committer:
mitchelljones
Date:
2015-11-11
Revision:
0:1b62d4a3444b

File content as of revision 0:1b62d4a3444b:

#include "mbed.h"
#include "Sabertooth.h"
#include "Pixy.h"
#include <cstdlib>
#include <ros.h>
#include <std_msgs/Int32.h>

#define X_CENTER 160
#define Y_CENTER 100

float kp = 0.2;
float ki = 0.001;
float kd = 0.01;
float leftAngle = 0.026;
float rightAngle = 0.745;

float camAngle;  // camera gimbal angle
float desAngle = 100;  // Center angle
float indx = 0.5;  // angle step
int dir = 1; // direction of travel

float prevError;  // for angle error derivative
float angleError;  // angle error
float ddtAngleError;  // derivative of angle error
float intAngleError = 0;  // integral of angle error
float w;  // motor speed
float camAngle_dot = 0;
float prev_cam_angle = 0;

Ticker loop;
AnalogIn pot(p20);
//DigitalOut myled(LED1);
Serial pc(USBTX, USBRX);
Sabertooth saber(p9,129,9600);
Pixy pixy(Pixy::SPI, D11, D12, D13);


void PID() {
    
    uint16_t blocks;
    blocks = pixy.getBlocks();
    if (blocks) {
        prevError = angleError;  // for derivative term
        angleError =  (float)(pixy.blocks[0].x - X_CENTER);
        ddtAngleError = angleError - prevError;
        /*if( (angleError < 2) && (angleError > -2) )  // dead zone
            {
                angleError = 0;
            }*/
        intAngleError=intAngleError+angleError;
        w = (kp*angleError + ki*intAngleError + kd*ddtAngleError)+ 64 ;
        if (w<10) {
            w=10;
        }
        if (w>117) {
            w=117;
        }
        
        prev_cam_angle = camAngle;
        camAngle = pot.read()*200;
        camAngle_dot = (camAngle-prev_cam_angle)/0.01;
    }
    else{
        w=64;
        }
    
    
  
    /*if (dir>=0) {
        desAngle=desAngle + indx;
    }
    else {
        desAngle=desAngle - indx;
    }
     if ((desAngle>180) || (desAngle<20)) {
        dir=(-1)*dir;
    }
        
    camAngle = pot.read()*200;
    angleError = desAngle- camAngle;
    */
    
        
    //prevAngle=camAngle;
        
    if (intAngleError > 1) {
        intAngleError = 1;
        }   
}


void cmd(const std_msgs::Int32 &cmd_msg) {
     L = cmd_msg.data;
}


ros::NodeHandle nh(USBTX,USBRX);
ros::Subscriber<std_msgs::Int32> sub("camera", cmd);

int main() {
    //wait(2);
    nh.initNode();
    nh.subscribe(sub);
    loop.attach(&PID, 0.01);
    while(1) {
        nh.spinOnce();
        pc.printf("%f\n",camAngle);
        //wait(0.5);
        saber.SetSpeedMotorA(w);  // Between 0 and 127
    }
}