task_ACS(); oder setACSPwr...(); tut nicht
Hi,
ich wolte einen ACS-Eventhandler schreiben welcher versucht den Hindernissen auszuweichen und die Entfernung zum Hinderniss berücksichtigt und dementsprechend enge Kurven macht indem die ACS-Leistung laufend geändert wird um festzustellen wie nahe das Honderniss ist.
Code:
enum direction {Right, Left, Forwd, Backwd}
void zuruecksetzendrehen (enum direction dir)
{
setLEDs(0b100000);
move (50, BWD, DIST_MM(150), false);
while (!isMovementComplete())
{
task_motionControl();
}
if (dir==Right)
{
rotate (40, RIGHT, 90, false);
while (!isMovementComplete())
{
task_motionControl();
}
};
if (dir==Left)
{
rotate (40, LEFT, 90, false);
while (!isMovementComplete())
{
task_motionControl();
}
}
changeDirection(FWD);
}
void ACSHandler_UmfahrenNahe(void)
{
setLEDs(0b111111);
setACSPwrLow();
task_ACS();
mSleep(100);
while (obstacle_left)
{
if (obstacle_right && obstacle_left)
{
zuruecksetzendrehen(Right);
setLEDs(0b111111);
}
task_ACS();
mSleep(100);
moveAtSpeed(100,30);
task_motionControl();
}
while (obstacle_right)
{
if (obstacle_right && obstacle_left)
{
zuruecksetzendrehen(Right);
setLEDs(0b011011);
}
task_ACS();
mSleep(100);
moveAtSpeed(30,100);
task_motionControl();
}
setLEDs(0b111111);
}
void ACSHandler_UmfahrenMittel (void)
{
setLEDs(0b011011);
setACSPwrMed();
task_RP6System();
mSleep(100);
while (obstacle_left)
{
if (obstacle_right && obstacle_left)
{
zuruecksetzendrehen(Right);
setLEDs(0b011011);
}
setACSPwrLow();
task_ACS();
mSleep(100);
if (obstacle_left || obstacle_right)
ACSHandler_UmfahrenNahe();
setACSPwrMed();
task_ACS();
mSleep(100);
moveAtSpeed(100,50);
task_motionControl();
}
while (obstacle_right)
{
if (obstacle_right && obstacle_left)
{
zuruecksetzendrehen(Right);
setLEDs(0b011011);
}
setACSPwrLow();
task_ACS();
mSleep(100);
if (obstacle_left || obstacle_right)
ACSHandler_UmfahrenNahe();
setACSPwrMed();
task_ACS();
mSleep(100);
moveAtSpeed(50,100);
task_motionControl();
}
setLEDs(0b001001);
}
void ACSHandler_UmfahrenWeit(void)
{
setLEDs(0b001001);
task_ACS();
mSleep(100);
while (obstacle_left)
{
if (obstacle_right)
{
zuruecksetzendrehen(Right);
setLEDs(0b001001);
}
setACSPwrMed();
mSleep(100);
task_ACS();
mSleep(100);
if (obstacle_left || obstacle_right)
ACSHandler_UmfahrenMittel();
setACSPwrHigh();
moveAtSpeed(100,70);
task_motionControl();
task_ACS();
mSleep(100);
}
while (obstacle_right)
{
if (obstacle_right && obstacle_left)
{
zuruecksetzendrehen(Right);
setLEDs(0b001001);
}
setACSPwrMed();
mSleep(100);
task_ACS();
mSleep(100);
if (obstacle_left || obstacle_right)
ACSHandler_UmfahrenMittel();
setACSPwrHigh();
moveAtSpeed(70,100);
task_motionControl();
task_ACS();
mSleep(100);
}
setLEDs(0b000000);
}
ich habe nach jedem Aufruf von task_ACS() mSleep(100) aufgerufen um der Funktion Zeit zu geben sich abzuarbeiten um zu verhindern dass die Funktion noch garnicht fertig ist wenn obstacle_right oder obstacle_left abzufragen.
Der Roboter geht aber sofort nach dem Aufruf von ACSHandler_UmfahrenWeit() in ACSHandler_UmfahrenMittel() und sofort danach in ACSHandler_UmfahrenNahe() wie die LEDs mir sagen.
Kann es sein dass ich auch den Funktionen setACSPwr...() Zeit geben muss bevor ich task_ACS() aufrufen kann?
Gruß Jan Lukas