Vielen Dank für die viele Information. Ihr seit echt SPITZE!! Ich werde das mir jetzt erstmal alles durchlesen, und dann sehe ich weiter. Evtl. schildere ich Euch dann noch wie ich es vor habe zu bewerkstelligen.
Ich habe heute mal probiert, mein Programm zum Ausweichen von Hindernissen zu optimieren. (Das Video, welches ich weiter oben gepostet habe, war schon gut, jedoch war da einprogrammiert, dass er sich um 45° drehen soll usw.) Jetzt versuche ich es so zu basteln, dass er solange z.B. nach links fährt/rotiert, bis der Gegenstand nicht mehr im Wege ist. Das habe ich auch schon zum Teil recht gut gemacht, wie ich meine. Das Problem ist, dass wenn er in einer Ecke ist, bekommt er Probleme.. Er weiß einfach nicht wie er da raus kommen soll & ich weiß nicht, wie ich es ihm am besten beibringen kann.... Die Beispielcodes verstehe ich nicht ganz, somit hänge ich da gerade.
Wenn Ihr Euch den Code evtl. mal anschauen wollt(?) Bei der Gelegenheit hätte ich noch eine Frage: Warum leuchten die LED´s (die Roten Standard) nicht auf, wenn er ein Hinderniss erkennt? - Habe ich doch ins Programm geschrieben... (Anders machen sie es ja auch nicht in den Beispielen)
Hier der Code:
Ist der Code so einigermaßen in Ordnung? Ich hoffe, dass Ihr mir helfen könnt. Könnte mir jemand nochmal auf die Sprünge helfen, wie das mit den prioritäten war? Obwohl ich diese hier nicht beachtet habe, reagiert er trotzdem auf die "Bumper" & die "Obstacles"Code:#include "RP6RobotBaseLib.h" void acsStateChanged(void) //ACS { // Hindernis links if(obstacle_left){ rotate(50, RIGHT, (obstacle_left = false), true); // dreht sich so lange bis der linke Sensor kein Hinderniss mehr hat } // Hindernis rechts if(obstacle_right){ rotate(50, LEFT, (obstacle_right = false), true); // dreht sich so lange bis der rechte Sensor kein Hinderniss mehr hat } // Mitte? if(obstacle_left && obstacle_right ){ move(60, BWD, DIST_CM(10), true); //10 cm Rückwärts rotate(50, LEFT, 180, true); // um 180° nach links drehen } //if(getDirection() == LEFT && getDirection() == RIGHT){ //startStopwatch1(); // Stopwatch1 starten //} } //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){ mSleep(500); move(60, BWD, DIST_CM(10), true); //10 cm Rückwärts rotate(50, LEFT, 188, true); // um 180° nach links drehen } else if(bumper_left){ mSleep(500); move(60, BWD, DIST_CM(5), true); //5 cm Rückwärts rotate(50, RIGHT, 49, true); // um 45° nach rechts drehen } else if(bumper_right){ mSleep(500); move(60, BWD, DIST_CM(5), true); //5 cm Rückwärts rotate(50, LEFT, 45, true); // um 45° nach links drehen } } void fahrenFunction(void){ // Geschwindigkeit einstellen !!Richtung nicht vergessen!! changeDirection(FWD); moveAtSpeed(90,90); if(getStopwatch1() > 3500) // Sind 3500ms (= 3,5s) vergangen? { // Bewegungsrichtung ändern: if(getDirection() == FWD) // Fahren wir vorwärts... changeDirection(BWD); // dann Rückwärts einstellen! else if(getDirection() == BWD) //... oder Rückwärts? changeDirection(FWD); // dann Vorwärts einstellen! setStopwatch1(0); // Stopwatch1 auf 0 zurücksetzen } } 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(); task_RP6System(); //Fahren fahrenFunction(); /////////////////////////Bumper////////////////////////// statusLEDs.LED6 = bumper_left; // Bumper links gedrückt statusLEDs.LED4 = !bumper_left; // links nicht gedrückt statusLEDs.LED3 = bumper_right; // Bumper rechts gedrückt statusLEDs.LED1 = !bumper_right; // rechts nicht gedrückt // Beide Bumper gedrückt: statusLEDs.LED2 = (bumper_left && bumper_right); statusLEDs.LED5 = statusLEDs.LED2; updateStatusLEDs(); // LEDs aktualisieren... /////////////////////////Obstacle//////////////////////////// statusLEDs.LED6 = obstacle_left && obstacle_right; // Mitte? statusLEDs.LED3 = statusLEDs.LED6; statusLEDs.LED5 = obstacle_left; // Hindernis links statusLEDs.LED4 = (!obstacle_left); // LED5 invertiert! statusLEDs.LED2 = obstacle_right; // Hindernis rechts statusLEDs.LED1 = (!obstacle_right); // LED2 invertiert! updateStatusLEDs(); } return 0; }![]()
Beste Grüße
Crystal Eye







Zitieren


Lesezeichen