View Single Post
  #4   Spotlight this post!  
Unread 04-02-2015, 00:57
King Nerd III's Avatar
King Nerd III King Nerd III is offline
Chief Programmer/Head of Autonomous
AKA: Isaac
FRC #1410 (The Kraken)
Team Role: Programmer
 
Join Date: Jan 2014
Rookie Year: 2014
Location: Denver, CO
Posts: 113
King Nerd III is an unknown quantity at this point
Re: roboRIO Command Based Problems

Quote:
Originally Posted by kylelanman View Post
Code:
 48void DriveBase::AutoDriveTurn(float speed, float angle){
 49         while(drive_gyro->GetAngle() >= angle){
 50                 fl_motor->Set(speed);
 51                 fr_motor->Set(speed);
 52                 bl_motor->Set(speed);
 53                 br_motor->Set(speed);
 54         }
 55 }
This function is going to cause you problems. This is called a "tight loop" and will consume all of your CPU power while blocking your main thread. Because there is no delay the CPU is going to execute the loop as fast as it possibly can. It will likely take the CPU to 100% and then start dropping control packets from the driver station. On top of that while you are in the loop none of your other commands or code in the main thread will be running.

The better way to do this that won't cause you problems is to use a command.

Code:
 32 class AutoDriveTurnCommand() {
 33 private:
 34     double mSpeed;
 35     double mAngle;
 36 public:
 37     AutoDriveTurnCommand(double speed, double angle) {
 38         mSpeed = speed;
 39         mAngle = angle;
 40     }
 41     void Initialize() {
 42         Robot::drivebase->DriveTank(speed, speed);
 43     }
 44     void Execute() {}
 45     bool IsFinished() {
 46         return Robot::drivebase->GetGyroAngle() < mAngle;
 47     }
 48     void End() {
 49         Robot::drivebase->DriveTank(0, 0);
 50     }
 51     void Interrupted() {
 52         End();
 53     }
 54 };
For this to work you will need to define a function in DriveBase called GetGyroAngle that returns the angle of the gyro.
Thanks for the tip, but that couldn't be what's causing the error with not updating fast enough. That method isn't even called in the code yet, plus ita autonomous and we only get the error in teleop. Thanks for the tip, though! I'll probably use that!
Reply With Quote