Gute Nachrichten:
Ich hab dein Programm mal auf meinen RP6 geladen. Hindernisse erkent er ja schon ganz gut. Einfach wie er weiterfahre soll ist ihm nicht ganz klar.
in deiner fahrenFunction() hast du nur gesagt, dass die geschwindigkeit beider Raupen 90 sein soll, nich aber in welche Richtung. Deshalb nimmt er dieselbe Richtung, die er gerade zuletzt hatte.
Folglich dreht er sich immer im Kreis!
mit changeDirection(FWD) kannst du das Problem beheben.
Zudem habe ich dir bei den Bumern noch eine kleine änderung gemacht.
Mir wurde beigebracht, dass man denselben Code möglichst nur einmal verwenden soll.
So bleibt es übersichtlicher.
Hoffe, bei dir klappts,Code:#include "RP6RobotBaseLib.h" void acsStateChanged(void) //ACS { // Hindernis links if(obstacle_left){ rotate(50, RIGHT, 49, true); // um 45° nach rechts drehen } // Hindernis rechts if(obstacle_right){ rotate(50, LEFT, 45, true); // um 45° nach links drehen } // Mitte? if(obstacle_left && obstacle_right) { rotate(50, LEFT, 188, true); // um 180° nach links drehen } statusLEDs.LED6 = obstacle_left && obstacle_right; statusLEDs.LED3 = statusLEDs.LED6; statusLEDs.LED5 = obstacle_left; statusLEDs.LED4 = (!obstacle_left); statusLEDs.LED2 = obstacle_right; statusLEDs.LED1 = (!obstacle_right); updateStatusLEDs(); } //Bumpers void bumpersStateChanged(void) { if(bumper_left || bumper_right){ //Wenn ein Bumper berührt wurde, dann mal das machen, egal welcher. moveAtSpeed(0,0); //Nicht unbedingt nötig, aber ich würde die beiden Zeilen zur Sicherheit schreiben. mSleep(500); move(60, BWD, DIST_CM(25), true); //25 cm Rückwärts } if(bumper_left && bumper_right) rotate(50, LEFT, 188, true); // um 180° nach links drehen else if(bumper_left) rotate(50, RIGHT, 49, true); // um 45° nach rechts drehen else if(bumper_right) rotate(50, LEFT, 45, true); // um 45° nach links drehen } void fahrenFunction(void){ // Geschwindigkeit einstellen !!Richtung nicht vergessen!! changeDirection(FWD); moveAtSpeed(90,90); } int main(void) { initRobotBase(); setLEDs(0b111111); mSleep(2500); setLEDs(0b001001); // ACS Event Handler registrieren: ACS_setStateChangedHandler(acsStateChanged); // Set Bumpers state changed event handler: BUMPERS_setStateChangedHandler(bumpersStateChanged); // ACS Empfänger einschalten (und Encoder etc.) powerON(); // ACS auf mittlere Sendeleistung stellen. setACSPwrMed(); // Main loop while(true){ // Aus der Hauptschleife ständig die motionControl Funktion // aufrufen – sie regelt die Motorgeschwindigkeiten! task_motionControl(); // ADC Wird wegen den Motorstromsensoren aufgerufen! task_ADC(); // Bumper automatisch alle 50ms auswerten task_Bumpers(); // ständig die task_ACS Funktion aufrufen! task_ACS(); //Fahren fahrenFunction(); } return 0; }
Viel Erfolg,
MfG
Filou







Zitieren

Lesezeichen