- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 55

Thema: Anfänger braucht Hilfe

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Filou89
    Registriert seit
    24.12.2010
    Ort
    Thun, Switzerland
    Alter
    35
    Beiträge
    116
    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.

    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;
    }
    Hoffe, bei dir klappts,
    Viel Erfolg,
    MfG
    Filou

  2. #2
    Vielen Dank!

    Jetzt funktioniert es, der HAMMER... Ok, das mit den Bumpern habe ich jetzt auch verstanden....

    Jetzt habe ich ihn durch mein Zimmer fahren lassen, und dann ist er in eine Ecke gefahren, und kam nicht mehr raus....

    Jetzt müsste man doch einen Timer einstellen, für solche Fälle, oder? - Sprich er muss drehen....


    Einfacher wäre es natürlich wenn man ihm hier:
    Code:
    if(obstacle_left && obstacle_right) {
            rotate(50, LEFT, 188, true); // um 180° nach links drehen
    gleich das Rückwärts fahren + Drehung angibt, oder?

    Aber wie bzw. welches Ereignis startet den Timer?
    Ist das zu realisieren?

    Denkansatz:
    Wenn das Hindernis in der Mitte ist und er rechts und links auch nicht weiter kommt, dann soll er nach 5 sec. zurückfahren.

    Ist das vom Ansatz her richtig?

    ABER, nochmal rechtherzlichen Dank. Ich bin einfach noch nicht soweit bzw. hab das Problem nicht erkannt....
    Mit ein bisschen Übung bekomme ich das hoffentlich schon bald gebacken....

    Gruß

    Crystal Eye
    Wer braucht Fenster, um an einem Rechner zu arbeiten?

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.08.2011
    Ort
    Hannover
    Beiträge
    164
    Moin Crystal Eye,

    von Anfänger zu Anfänger:

    > Jetzt habe ich ihn durch mein Zimmer fahren lassen, und dann ist er in eine Ecke gefahren, und kam nicht mehr raus....

    Nur so'ne Idee (weil ich gerade das gleiche Problemchen hatte, und das so demnächst ausprobiere): Bei einem Bumper-Ereignis einfach eine zufällige Strecke zurückfahren und dann eine zufällige Drehung machen - "zufällig" heißt hier natürlich "pseudo-zufällig"

    Die libc hat eine random-Funktion, und wenn Du Spaß haben willst dann google mal nach "knuth random".

    viele Grüße
    Andreas

  4. #4
    Moin danimath,

    Eine gute Idee mit dem Bumper, jedoch wird der Bumper ja nicht aktiviert.... Die Sensoren checken es ja viel früher, so wie es auch sein sollte.

    Im moment bin ich noch beschäftigt mit den Rotationseinstellungen, wie Filou89 geschrieben hat, muss man dan Faktor in Zeile 64 der RP6Config.h - Datein ändern.
    Sie war bei mir auf 688 eingestellt, jetzt habe ich die zahl verändert (nur leicht, sprich 100 dazu usw.) Aber da tut sich gar nix, der dreht nicht weit genug. Probe halber habe ich 1950 eingesetzt, aber auch hier keine Reaktion, wie unverändert...
    Weiß jemand wo dran das liegen kann??

    Das mit dem Radom ist ja eine Lustige angelegenheit, wenn ich es richtig verstanden habe, sieht das wie folgt aus:
    Code:
    int random_number = random () % 200;
    Bedeutet, es wird eine zufällige Zahl zwischen 0 und 199 gesucht (&gefunden = ausgegeben)?

    Gruß

    Crystal Eye
    Wer braucht Fenster, um an einem Rechner zu arbeiten?

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.08.2011
    Ort
    Hannover
    Beiträge
    164
    Statt der Bumper kannst Du bestimmt auch das Kollisionssystem verwenden (wie gesagt - was Roboter angeht bin ich auch noch Anfänger)

    Zitat Zitat von Crystal Eye Beitrag anzeigen
    Code:
    int random_number = random () % 200;
    Bedeutet, es wird eine zufällige Zahl zwischen 0 und 199 gesucht (&gefunden = ausgegeben)?
    Das ist richtig. Im Programm im Initialisierungteil solltest Du allerdings noch "srandom (123456);" (oder eine andere Zahl) aufrufen; ohne das wird immer "1" als Startwert benutzt. Weil ich gerade im Büro sitze, kann ich kein komplettes (getestetes) Programm posten - vielleicht bekomme ich heute abend was hin.

    viele Grüße
    Andreas

  6. #6
    @radbruch:
    ich habe gedacht, die RP6Config.h - Datei wird in der RP6RobotBaseLib.h eingebunden? Muss ich zusätzlich nochmal einbinden?
    Make All habe ich gemacht, da fällt mir noch etwas ein, was ich noch nicht ganz kapiert habe... lt. Anleitung sollte man ja auch eine "Make Clean" erstellen, wofür ist die genau da? - Ich habe sie selber (noch) nicht aufgerufen. Soweit wie ich das verstanden habe, entfernt Sie sachen, die nach dem Compilieren nicht mehr gebraucht werden.... Wenn ich die Make Clean datei nach dem compilieren aufrufe, was bringt mir das? Ändert die was am Code, ne oder?

    @danimath: Kein Streß, jo, wäre prima, wenn Du da noch was finden könntest

    Ich bin sehr interessiert daran, das Prinzip & alles war halt dazu gehört zu (er)-lernen..

    Crystal Eye
    Wer braucht Fenster, um an einem Rechner zu arbeiten?

  7. #7
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    ich habe gedacht, die RP6Config.h - Datei wird in der RP6RobotBaseLib.h eingebunden?
    Vollkommen richtig, daran hatte ich nicht gedacht. Clean räumt nur die Festplatte auf und ändert nichts am Programm.
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Filou89
    Registriert seit
    24.12.2010
    Ort
    Thun, Switzerland
    Alter
    35
    Beiträge
    116
    Also bei mir bleibt er auch stecken.
    Viele Wege führen ins Ziel.
    In der Dokumentation wird gut beschrieben, wie man die Stopwatches einsetzt. Das wäre das, wonach du suchst.
    Ich würde aber eher dazu tendieren, eine überwachung zu machen, ob er jetzt immer nur nach links / rechts ausweicht. Wenn er dann nur links/rechst Bewegungen macht, ist er in einer Ecke.
    Wenn man diese Situation erkennt, müsste man so reagieren, wie wenn beide bumper gedrückt wurden.

    Grüsse,
    Filou

  9. #9
    Stimmt, guter Tipp mit den Stopwatches...

    Hier ma ein Auszug von der RP6Config.h Datei:
    Code:
    /**
     * Defines a Factor for the rotation error. 
     * As you may have read in the Manual, the rotation is unprecise
     * because of wheel/track slippery. This Factor allows you to
     * make it roughly precise. 
     * The Problem is: You need to use different rotation factor
     * for different surfaces, as the Robot behaves different on
     * different surfaces (e.g. carpet vs. wooden floor).
     *
     * You need to do some experiments with this until you get
     * good results. Let the Robot rotate by 90°, 180° and 360°
     * and change the rotation factor depending on if it works
     * good or not. 
     *
     * If you want to make it really precise, you will have to
     * use a Mouse sensor, electronic compass or gyroscope. 
     */
    #define ROTATION_FACTOR 950
    Mache ich da was falsch, oder warum dreht der nicht 90°?

    Crystal Eye
    Wer braucht Fenster, um an einem Rechner zu arbeiten?

  10. #10
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    40
    Beiträge
    1.516
    Du musst bei jeder Änderung in den RP6Lib HEADER Dateien einmal Make clean (und danach natürlich wieder make all) ausführen sonst wird das nicht übernommen!

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Anfänger braucht Hilfe
    Von Tonyy im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 14.12.2010, 07:16
  2. hilfe Anfänger braucht hilfe beim start
    Von thomas3 im Forum Robby RP6
    Antworten: 26
    Letzter Beitrag: 20.09.2010, 21:07
  3. Anfänger braucht Hilfe
    Von vitja09 im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 8
    Letzter Beitrag: 07.10.2006, 13:31
  4. Anfänger braucht hilfe!!!!
    Von mathisdedial im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 22.12.2004, 13:02
  5. Anfänger braucht hilfe
    Von khazad im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 11
    Letzter Beitrag: 25.10.2004, 11:27

Berechtigungen

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

12V Akku bauen