|
|
|
![]() |
|
|||||||
|
||||||||
![]() |
|
|
Thread Tools |
Rating:
|
Display Modes |
|
|
|
#1
|
||||
|
||||
|
Wait/Pause function?
While working out some of the kinks in our code, i stumbled upon a problem. That problem being that I could not have the robot wait for a certain period of time before continuing with its code. So now my question is this: Is there any function that can be used to pause the robot for a certain amount of time?
Thanks. Last edited by thecakeisalie : 24-03-2012 at 21:46. |
|
#2
|
||||
|
||||
|
Re: Wait/Pause function?
Quote:
|
|
#3
|
||||
|
||||
|
Re: Wait/Pause function?
I tried to do it with a simple for loop:
for (int x= 0; x< 500; x++) this was made in autonomous periodic, which I believed would count up one every 20 miliseconds, which should equal around 5 seconds. But this did not work and did not delay the robot at all. |
|
#4
|
|||
|
|||
|
Re: Wait/Pause function?
You can try Wait(double) in Timer.h
And that's just a simple two instruction loop. It won't occupy the processor for long (though it will waste computing power when compared to a yield AFAIK), it won't be reliable (timing could change very easily based on process scheduling), and it may be optimized out by the compiler. Last edited by rbmj : 24-03-2012 at 22:07. |
|
#5
|
||||
|
||||
|
Re: Wait/Pause function?
Quote:
![]() |
|
#6
|
||||
|
||||
|
Re: Wait/Pause function?
Something like this maybe useful for pausing. This example is directed towards auton, but can be applied in any instance of pausing
Code:
m_autoPeriodicLoops++;
//Make sure in your init you set m_autonomousCase = 1;
switch(m_autonomousCase)
{
case 1:
{
//Reset auto counter
m_autoPeriodicLoops = 0;
m_autonomousCase = 2;
}
case 2:
{
if(m_autoPeriodicLoops < 50)
{
//Wait for 50 loops 50 * ~20ms = ~1 second
robotDrive->TankDrive(0.0 , 0.0);
}
else
{
//Robot will drive after the 50 loops have completed
robotDrive->TankDrive(0.5 , 0.5);
}
}
By using this method you can have other things in the background running in your loops but you are not "stopping" the cRio completely by using a Wait function. |
|
#7
|
||||||
|
||||||
|
Re: Wait/Pause function?
We use a timer to implement delays. Here is our bread and butter 2-ball front of key autonomous code - this is called from AutonomousPeriodic:
Code:
void XM15::AutoThree1(void)
{
//printf("3-PT 1 - Front of Key\n");
#define TH1_READYDWELL 4.0 //Dwell time to permit to move to shot position
#define TH1_SHOTDELAY 0.5 //Short pause between oktoshoot signal and feeding ball
#define TH1_SHOT1DWELL 0.4 //0.5 OK - Feed time for first ball
#define TH1_SHOT2DWELL 1.0 //Feed time for second ball
#define TH1_REGENDWELL 1.5 //Wait for shooter to regain speed = originally 2.0
switch (autonStep)
{
case 1: //Select Front Key Three Arm Position & Spin Up Shooter
{
autofrontkeythree_sw = 1;
shooterstate = ON;
if (delaytimer->Get() < delayset) //Wait until the timer times past the preset delay
{
//Waiting...
}
else
{
delaytimer->Stop();
autotimer->Reset();
autonStep = 2;
}
break;
}
case 2: //Wait for arm and shooter to be ready (or watchdog timeout), then fire a ball
{
if ( (oktoshoot == 1) || (autotimer->Get() > TH1_READYDWELL) )
{
autotimer->Reset();
autonStep = 3;
}
break;
}
case 3: //Wait for a short moment after arm in position before firing a ball
{
if (autotimer->Get() > TH1_SHOTDELAY)
{
autocagefeed_sw = 1;
autotimer->Reset();
autonStep = 4;
}
break;
}
case 4: //Stop firing after timeout
{
if (autotimer->Get() > TH1_SHOT1DWELL)
{
autocagefeed_sw = 0;
autotimer->Reset();
autonStep = 5;
//autonStep = 7; //Debug - permits tuning of initial shot timing
}
break;
}
case 5: //Wait for shooter to regain speed, then fire again
{
if (autotimer->Get() > TH1_REGENDWELL)
{
if (speedok == 1)
{
autocagefeed_sw = 1;
autotimer->Reset();
autonStep = 6;
}
}
break;
}
case 6: //Turn shooter off after 2nd ball is fired
{
if (autotimer->Get() > TH1_SHOT2DWELL)
{
autocagefeed_sw = 0;
autotimer->Reset();
autonStep = 7;
}
break;
}
case 7: //Program is done - turn off the shooter, place arm in load position
{
shooterstate = OFF;
//autofrontkeythree_sw = 0;
//autoloadball_sw = 1;
break;
}
}
}
|
|
#8
|
|||
|
|||
|
Re: Wait/Pause function?
I use a state system and a Timer object inside of an 'iterable' function. The function returns false until the operation is complete. This works well if you use the 'Iterable' robot template that comes with WindRiver.
The state variable 'state_' must be set to kPhase1 before the function is called the first time (make sure you don't keep setting the state to kPhase1 each time through the control loop). The timer will have a resolution equal to the duration of the calling control loop. Code:
bool TechnoJays::SomeFunction() {
double time_left = 0.0;
// Get the timer value since the last event
double elapsed_time = timer_->Get();
switch (state_) {
// Start the timer and move to phase 2
case kPhase1:
timer_->Stop();
timer_->Reset();
timer_->Start();
elapsed_time = timer_->Get();
state_ = kPhase2;
// Fall through into kPhase2
// Do nothing until the time has elapsed
case kPhase2:
// Calculate time left
time_left = delay_time_ - elapsed_time;
// If enough time has passed, continue
if (time_left <= 0.0) {
timer_->Stop();
state_ = kPhase3;
// Fall through to kPhase3
} else {
break;
}
// The time delay is finished, continue on
case kPhase3:
// Return true indicating that the function is complete
state_ = kNotRunning;
return true;
default:
state_ = kNotRunning;
return true;
}
return false;
}
|
|
#9
|
||||
|
||||
|
Re: Wait/Pause function?
Quote:
|
![]() |
| Thread Tools | |
| Display Modes | Rate This Thread |
|
|