View Single Post
  #2   Spotlight this post!  
Unread 30-11-2009, 22:20
biojae's Avatar
biojae biojae is offline
Likes Omni drives :)
AKA: Justin Stocking
FTC #5011 (BOT SQUAD) && FTC#72(Garage bots)&& FRC#0399 (Eagle Robotics)
Team Role: College Student
 
Join Date: Oct 2008
Rookie Year: 2008
Location: Lancaster
Posts: 276
biojae is a jewel in the roughbiojae is a jewel in the roughbiojae is a jewel in the rough
Re: Gyro Programming

Code:
if (angle<0.5)
{
myRobot->Drive(1.0, 0.0);
Wait(0.0);
}
else
{
myRobot->Drive(0.0, 0.0);
Wait(0.0);
}
if there is any sort of noise, or movement of the robot,
then the angle will be larger then 0.5,
when that happens, the robot will just sit where it is without moving
( like you said)

What I would do is make a PID controller (I don't know how to use WPI's)
sortof like this:
Code:
float desiredHeading = 0;
float speed = 0.5;

const float P = .5; // You will need to tune these values 
const float I  = 0.0; // as they are just made up
const float D = 0.0;

float headingIntegral = 0.0;
float prevHeadingError = 0.0;

void autonomousPeriodic()
{
    float heading = fmod(gyro->GetHeading(), 360.0); // limit to + - 360 // EDIT: forgot the denominator
    float headingError = (desiredHeading - heading);
    headingIntegral += headingError;
    float headPID = (P * headingError) +
                              (I * headingIntegral) +
                                  (D * (headingError - prevHeadingError));
    prevHeadingError = headingError;
    myRobot->TankDrive(speed + headPID, speed - headPID);
}
The speed variable is the forward movement that you want

The real advantage of this method as opposed to the wpi example is that you can set any heading you want
(At least within the range of - 360 to 360)

Just remember to tune the PID
__________________
FTC Team 72 - No site
FRC Team 399 - http://www.team399.org
2010 Rockwell Collins Innovation in Control Award - (Use of the CAN bus, among other reasons) Phoenix, Arizona!

Last edited by biojae : 01-12-2009 at 22:07.