- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 52

Thema: "Hindernisfahrt"

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Geistesblitz
    Registriert seit
    15.03.2011
    Ort
    Dresden
    Alter
    37
    Beiträge
    1.937
    Ich hab gerade mal versucht, deinen Code zu entziffern, aber die Einrückungen machen es wirklich sehr unleserlich. Wenn eine geschweifte Klammer aufgeht, sollte alles darunter eine Stufe weiter rechts stehen, wenn eine geschweifte Klammer zu geht, weiter nach links. Oder wird dein Code durch die Code-Tags übern Haufen geworfen?

    Jedenfalls vermute ich auch mal, dass deine Probleme in der Verschachtelung liegen, hab mindestens eine Stelle gesehen, wo ein elseif oder zumindest ein else angebracht wäre.

    Edit: warum wird eigentlich eine LCD_Bibliothek eingebunden, wenn kein LCD vorhanden ist? Muss ich das verstehen?

    nochmal Edit: ist abstand der Wert, den du vom Entfernungssensor ausliest, um ein Hinternis zu detektieren? Der wird nämlich einmal am Anfang vor der while-Schleife ausgelesen und dann nie wieder...das heißt, der Wert ändert sich nie. Du musst den Sensor bei jedem Schleifendurchlauf auslesen mit
    Code:
    abstand = robot.analog(1);
    sonst kann das gar nix werden...
    Geändert von Geistesblitz (06.01.2014 um 15:23 Uhr)

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.091
    Und wieder "int infrarot = robot.analog(3);" in der while Schleife.

    MfG Hannes

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    28.12.2013
    Beiträge
    25
    Danke, hab dass aber schon irgedwann heute morgen reingeschrieben. Soweit passt das jetzt auch. Jetzt brauch ich nur noch dieses blöde Infrarot. Hier der Code der Linksdrehung:


    Code:
    if( drehrichtung == linksDrehung )
            {
    		    robot.motors(-255, 255); // nach links drehen
    			
    			
                if( abstand >= freieSicht )
                {
                    robot.motors(200,200);
                    schonNachLinksAusgewichen = True;
    				//if( infrarot > 180){
    				//robot.motors(100,-100);
    				//msleep(500);
    				//}
    				
                }
    Das Infrarot ist grad noch auskommentiert, da es nicht klappt. Wie bekomm ich es hin, dass:

    - Der Robo nach der Linksdrehung eben wieder geradeaus in waagrechte Richtung fährt, aber währenddessen per Infrarot den Boden prüft und bei > 180 (das ist der Wert, hab ich über die LEDs geprüft) sich wieder dreht (hier nach rechts)? Wenn ich das nicht habe, komm ich gar nicht weiter und ich weiß leider nicht, was ich da noch verändern könnte, so dass er das macht. Habt ihr ne Ahnung, wie ich das hinbekommen könnte?

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.091
    Was funktioniert nicht? Was macht der Roboter?
    Mach einfach eine Skizze wie und wo der Roboter auf was reagieren soll. Das dein Roboter waagrechter Richtung fährt ist eigentlich logisch.

    Du könntest dich auch weiter informieren (es gibt nicht nur if Schleifen) z.B. der Link den ich oben gepostet habe. Es gibt auch fußgesteuerte Schleifen, if und while sind kopfgesteuerte Schleifen da diese am Anfang überprüft werden.

    Für die Skizze kannst du ein CAD Programm herunterladen oder du verwendest einfach Paint.

    MfG Hannes

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    28.12.2013
    Beiträge
    25
    Hab ich gemacht, zumindest so halbwegs.

    Ich glaube es ist logisch: Am ersten weißen Kreis soll sich der Robo(das Quadrat) links drehen, dann ab dann per Infrarot den Boden scannen und sich am schwarzen Kreis(Wert >180) rechts drehen, damit er auf das nächste Hindernis zu fahren kann. Danach dasselbe in grün nur umgekehrt, also erst rechts drehen, dann links. Wie gesagt, ich hab was für das Infrarot geschrieben, nur will es nicht. Wie kann ich das anders machen?

    Und noch eine Frage: Wie kann ich es machen, dass sich der Robo genau 90° dreht? Irgendwie macht der das nur manchmal...

    So sieht das Programm derzeit aus:

    Code:
     while(1)
        {
            int abstand   = robot.analog(1);
    		//int infrarot  = robot.analog(3);
            if( drehrichtung == geradeaus)
            {
    		robot.motors(25,25); //geradeaus fahren
                if( abstand < hindernis)
                {
                    if(schonNachLinksAusgewichen == False)
                        drehrichtung = linksDrehung;
                    else
                        drehrichtung = rechtsDrehung;
                }
            }
            if( drehrichtung == linksDrehung )
            {
    			
    		    robot.motors(-255, 255); // nach links drehen
    			
                if( abstand >= freieSicht )
                {
                    robot.motors(125,125);
                    schonNachLinksAusgewichen = True;
    				//if( infrarot > 180){
    				//robot.motors(100,-100);
    				//msleep(500);
    				//}
    				
                }
            }
            if( drehrichtung == rechtsDrehung )
            {
                robot.motors(200, -200); // nach rechts drehen
                if( abstand >= freieSicht )
                {
                    robot.motors(100,100);
                    schonNachLinksAusgewichen = False; 
    				//msleep(500);
    				//if( infrarot > 180){
    				//robot.motors(-100,100);
    				//}
    	
    			// Er ist zwar schon mal nach links ausgewichen, aber inzwischen auch schon rechtsrum, also wieder von vorne
    			
    			
    			
    			
    			
    			}  
    		}		  
    	}
    }
    ____

    Leider habe ich im Alltag nicht all zu viel Zeit dafür, mich einzulesen und jetzt ist zu spät, Ferienende. Zudem sollte das Ding eigentlich bis Mittwoch fertig sein, werd ich aber wohl nicht schaffen. Nun gut, kann man nix machen...
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken Umriss.png  

  6. #6
    Erfahrener Benutzer Roboter-Spezialist Avatar von -schumi-
    Registriert seit
    30.12.2009
    Ort
    Wasserburg am Inn / Bayern
    Alter
    31
    Beiträge
    449
    Gut, dass du endlich eine Skizze lieferst. Das mit den Hindernissen habe ich erst nicht so verstanden, erst wie du das Infrarot erklärt hast. Dafür habe ich dann das Infrarot nicht kapiert. So sieht man gleich was Sache ist, und es ist ganz klar, dass das vorherige Programm hierfür nicht geeignet ist.

    Da du es zumindest versucht hast gibts auch als Belohnung (auch im Anhang nochmal als tmp.c, damit die Einrückungen korrekt erhalten bleiben):
    Code:
    #include "qfixMiniBoard.h"
    #include "qfixLCD.h"
    MiniBoard robot;
    
    
    // Müssen evtl. angepasst werden:
    #define HindernisAbstand    85
    #define Schwarzwert            180
    #define Drehgeschwindigkeit 25
    #define Drehzeit            3000    // in ms
    #define Fahrgeschwindigkeit    25
    
    
    // Feste Konstanten:
    #define SensorAbstand        1
    #define SensorInfrarot        3
    
    #define Links                1
    #define Rechts                2
    
    int main() 
    {
        // Es wird davon ausgegangen, dass der Robo so los fährt wie auf deiner Skizze, also auf der rechten Seite (und somit als erstes nach links muss):
        unsigned char naechsteAbbiegungNach = Links
        
        while(1)
        {
            
            robot.motors(Fahrgeschwindigkeit,Fahrgeschwindigkeit);            // Zuerst mal geradeaus fahren
            while(robot.analog(SensorAbstand)>HindernisAbstand);            // Und so lange kein Hindernis in sicht nichts anderes tun
            robot.motors(0,0);                                                // Jetzt muss ein Hindernis da sein, also erst mal stehen bleiben
            
            if(naechsteAbbiegungNach == Links)                                // Wenn wir jetzt als nächstes nach links müssen...
                robot.motors(-Drehgeschwindigkeit, Drehgeschwindigkeit);    // ..drehen wir mal nach links
            else if(naechsteAbbiegungNach == Rechts)
                robot.motors(Drehgeschwindigkeit, -Drehgeschwindigkeit);
            
            msleep(Drehzeit);                                    // Da es keinen Anhaltspunkt gibt, wie weit nach links, einfach mal eine bestimmte Zeit lang...
            robot.motors(Fahrgeschwindigkeit,Fahrgeschwindigkeit);            // Und wenn fertig gedreht wieder geradeaus fahren (jetzt bewegt sich der Robo von einer Seite zur anderen)
            while(robot.analog(SensorInfrarot)<Schwarzwert);                // Solange der Infrarotwert nicht "schwarz" bedeuted, nichts weiter machen
            robot.motors(0,0);                                                // Jetzt muss der schwarze Punkt da sein, also erst mal stehen bleiben
            
            // Bsp. für Linksabbiegung: Um die Linksabbiegung abzuschließen muss der Robo sich jetzt wieder nach rechts drehen, damit er wieder gerade steht.
            if(naechsteAbbiegungNach == Links)
                robot.motors(Drehgeschwindigkeit, -Drehgeschwindigkeit);
            else if(naechsteAbbiegungNach == Rechts)                        // Und um die Rechtsabbiegung abzuschließen nach links drehen
                robot.motors(-Drehgeschwindigkeit, Drehgeschwindigkeit);
            msleep(Drehzeit);                                    // Da es keinen Anhaltspunkt gibt, wie weit nach links, einfach mal eine bestimmte Zeit lang...
            robot.motors(0,0);                                                // fertig gedreht
            
            // So, jetzt hat der Roboter entweder von der rechten auf die linke Seite gewechselt (Linksabbiegung) oder anders herum. Da er durch das zweite Drehen in die andere Richtung
            // jetzt auch wieder gerade steht und auf das nächste Hindernis zufahren kann, geht das ganze wieder von vorne losgehen. Nur müssen wir vorher noch die nächste Abbiegung bestimmen,
            // die logischerweise genau das Gegenteil von der letzten Abbiegung ist:
            if(naechsteAbbiegungNach == Links)
                naechsteAbbiegungNach == Rechts;
            else if(naechsteAbbiegungNach == Rechts)
                naechsteAbbiegungNach == Links;
        }
        
        return 0;    // Keine Relevanz für den Programmablauf, gehört sich aber für ein sauberes C-Programm
    }
    Auch wenn du deine Hausaufgabe jetz (zumindest zum Großteil hast), musst du noch an deinen Fähigkeiten in Sachen Programmierung arbeiten. Denn wenn ihr darüber auch Prüfungen schreibt, wirst du da mit Ach und Krach durchrasseln.. (Ich würde vorschlagen, du übst weiter mit dem Robo, aber mit einfacheren Aufgabenstellungen)

    Viele Grüße
    schumi

    PS: das #define ist einfach nur Textersetzung, die vom sogenannten Preprozessor durchgeführt wird. Der entfernt auch alle Kommentare usw. und bereitet so den Quellcode zum kompilieren (übersetzen in Maschinensprache) vor. Wie das Programm mit den Ersetzungen aussieht kannst du auch im Anhang sehen (ich habe nur die #include weggelassen, weil die auch der Preprozessor behandelt, die aber nicht auf meinem Computer installiert sind)

    [EDIT]
    Habe noch Fehler gefunden:
    Bei den msleep muss es natürlich nicht Drehgeschwindigkeit sondern Drehzeit heißen! Kann ich aber in den Anhängen anscheinend nicht mehr ändern.. Und das #define True/False ist jetzt auch überflüssig
    Angehängte Dateien Angehängte Dateien
    Geändert von -schumi- (06.01.2014 um 20:24 Uhr)

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Geistesblitz
    Registriert seit
    15.03.2011
    Ort
    Dresden
    Alter
    37
    Beiträge
    1.937
    Für koordiniertes Drehen bräuchtest du entweder Schrittmotore oder eine Winkelrückmeldung von den Rädern, ansonsten wirst du immer Abweichungen drin haben.

    Was funktioniert an den schwarzen Kreisen nicht?
    Hab ich das richtig verstanden, dass der Roboter an der Unterseite irgendwo (?) einen Infrarotsensor hat, der Schwarz von nicht-Schwarz unterscheiden kann? Das wär dann doch genauso zu lösen, wie die Detektion vom Hindernis, nur, dass er sich nicht zwingend nochmal zurück bewegen muss.

    Um den schwarzen Kreis sicher zu treffen, wäre wirklich gut, wenn der Roboter seine Orientierung bestimmen könne. Das Einfachste wäre wohl ein Kompasssensor, ansonsten lässt sich das wohl nur über die Radstellungen gewinnen. Gibt auch noch andere Verfahren, die dann aber meist mit zusätzlichen Raumpunkten, zB. Infrarotmarkern, arbeiten, aber das wird eben immer aufwändiger. Wenn sowas nicht zur Verfügung steht, musst du wohl oder übel hoffen, dass er beim Drehen nicht zu weit von den 90° abweicht. Gegebenenfalls die Wartezeit beim Drehen noch anpassen, sind ja noch ziemlich runde Werte. Vielleicht bringt es ja schon was, beim Drehen mit der Geschwindigkeit ein wenig runter zu gehen.

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    28.12.2013
    Beiträge
    25
    Soviel hab ich jetzt gar nicht erwartet.
    Aber danke!

    Nun, es gibt dennoch nen kleinen Fehler:
    Er dreht sich ständig im Kreis(hatte das Problem schonmal, als ich den Infrarotsensor einsetzte). Könnt mir also vorstellen, dass das wieder am Infrarotsensor(?!) liegt. Er fährt nämlich solange geradeaus, bis er die Stelle gefunden hat, die über 180 ist. Wie kann man das ändern, dass der den Infrarotsensor erst nach dem ersten Drehen benutzt, also erstmal ganz normal auf das Hindernis zu fährt, sich dann dreht und dann die Stelle sucht, die über dem Wert 180 liegt? Vielleicht kann man den Infrarotsensor ja "schlafen" lassen bis zu ner bestimmten Zeit.

Ähnliche Themen

  1. Antworten: 10
    Letzter Beitrag: 01.11.2017, 12:53
  2. Antworten: 2
    Letzter Beitrag: 15.06.2011, 21:18
  3. LPC1114 (Cortex M0): "sei()" und "cli()"
    Von Jaecko im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 1
    Letzter Beitrag: 02.07.2010, 12:25
  4. "Soft-Reset?" und "Finger-Interrupt?"
    Von trapperjohn im Forum Asuro
    Antworten: 8
    Letzter Beitrag: 10.06.2008, 23:02
  5. ASM: was machen "swap" und "cbr" genau?
    Von RHS im Forum AVR Hardwarethemen
    Antworten: 3
    Letzter Beitrag: 18.08.2004, 17:16

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen