- Akku Tests und Balkonkraftwerk Speicher         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: linienfolger

  1. #11
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Anzeige

    Praxistest und DIY Projekte
    Hi inka,
    bist Du sicher, dass es sinnvoll ist anstelle der asuro-funktion:
    ...
    die RP6-funktion:
    ...
    zu verwenden, statt das "moveAtSpeed()" direkt (und sichrere) zu verwenden?
    Die RP6-Lib Funktionen sind auf jeden Fall sicherer.
    Leider haben sie den Nachteil beim Linienfolgen, dass die Reaktion auf Änderungen der Richtung oder Geschwindigkeit etwas verzögert kommt.
    Da ist man dann manchmal schon über die Linie hinaus geschossen.
    Das ist sicher auch der Grund, warum in dem Asuro-Programm der direkte Weg gewählt wurde.
    Gruß
    Dirk

  2. #12
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    hallo allerseits,

    auch hier kleine fortschritte. Habe das programm für den asuro mit PID-regler doch für den RP6 "umgeschrieben". Um es von der M32 betreiben zu können waren in der "RP6Control_I2CMasterLib.c", der "RP6Control_I2CMasterLib..h" und der "RP6Base_I2CSlave.c" folgende änderungen notwendig:

    Code:
    set_motor_power_in_base_slave...
    
    
    
    in der RP6Control_I2CMasterLib.c einfügen:
    ------------------------------------------
    
    // Speed
    uint8_t left_power;
    uint8_t right_power;
    
    
    /**
     * Set Motor power function
     */
    
    
    void setMotorPower(uint8_t left_power, uint8_t right_power)
    {
    I2CTWI_transmit4Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_MOTOR_POWER, left_power, right_power );
    while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();
    }
    
    in der RP6Control_I2CMasterLib.h einfügen:
    ------------------------------------------
    
    #define CMD_SET_MOTOR_POWER        14
    
    void setMotorPower(uint8_t left_power, uint8_t right_power);
    
    // Speed
    extern uint8_t left_power;
    extern uint8_t right_power;
    
    
    in der RP6Base_I2CSlave.c einfügen:
    ----------------------------------
    
    #define CMD_SET_MOTOR_POWER        14
    
    in der Funktion "void task_commandProcessor(void)" einfügen:
    
    case CMD_SET_MOTOR_POWER: setMotorPower(param1, param2); break;
    und

    Code:
    set_motor_dir_in_base_slave...
    
    
    
    in der RP6Control_I2CMasterLib.c einfügen:
    ------------------------------------------
    
    // Direction
    uint8_t left_dir;
    uint8_t right_dir;
    
    
    /**
     * Set Motor dir function
     */
    
    
    void setMotorDir(uint8_t left_dir, uint8_t right_dir)
    {
    I2CTWI_transmit4Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_MOTOR_DIR, left_dir, right_dir );
    while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();
    }
    
    in der RP6Control_I2CMasterLib.h einfügen:
    ------------------------------------------
    
    #define CMD_SET_MOTOR_DIR        13
    
    void setMotorDir(uint8_t left_dir, uint8_t right_dir);
    
    // Direction
    extern uint8_t left_dir;
    extern uint8_t right_dir;
    
    
    in der RP6Base_I2CSlave.c einfügen:
    ----------------------------------
    
    #define CMD_SET_MOTOR_DIR        13
    
    in der Funktion "void task_commandProcessor(void)" einfügen:
    
    case CMD_SET_MOTOR_DIR: setMotorDir(param1, param2); break;
    der eigentlicher
    Code:
    /*******************************************************************************
    *
    * Description: Asuro Linienverfolgung mit PID-Regler
    * Version 1: Korrektur auf beide Motoren verteilt
    * Author: Waste   26.8.05
    *
    * Version 2: initialization of parameters in Main, measurement with LED off in Main
    * Author: irobot22587 11.03.2007
    * überarbeitet für RP6 inka / 2014_03_10
    *****************************************************************************/
    #include "RP6ControlLib.h"
    #include "RP6I2CmasterTWI.h"
    #include "RP6Control_MultiIOLib.h"
    #include "RP6Control_I2CMasterLib.h"
    #include "RP6Control_LFSBumperLib.h"
    #include "RP6ControlServoLib.h"
    #include "standard.h"
    
    #define I2C_RP6_BASE_ADR 10
    
    
    unsigned char speed;
    int speedLeft,speedRight;
    unsigned int lineData[2];
    int x, xalt, don, doff, kp, kd, ki, yp, yd, yi, drest, y, y2, isum;
    
    void FollowLine (void)
    {
        unsigned char leftDir = FWD, rightDir = FWD;
        lineData[0] = getLFS(CH_LFS_L);
        lineData[1] = getLFS(CH_LFS_R);
        x = (lineData[0] - lineData[1]);
        isum += x;
        if (isum > 16000) isum =16000;         //Begrenzung um Überlauf zu vermeiden
        if (isum < -16000) isum =-16000;
        yi = isum/625 * ki;               //I-Anteil berechnen //625
        yd = (x - xalt)*kd;               // D-Anteil berechnen und mit
        yd += drest;                     // nicht berücksichtigtem Rest addieren
        if (yd > 255) drest = yd - 255;      // merke Rest
        else if (yd < -255) drest = yd + 255;
        else drest = 0;
        yp = x*kp;                        // P-Anteil berechnen
        y = yp + yi + yd;                  // Gesamtkorrektur
        y2 = y/2;                        // Aufteilung auf beide Motoren
        xalt = x;                        // x merken
        speedLeft = speedRight = speed;
        setMotorDir(FWD,FWD);
        if ( y > 0)
        {
            // nach rechts
            setbumperLEDL(1);
            setbumperLEDR(0);
    
            speedLeft = speed + y2;         // links beschleunigen
            if (speedLeft > 120) //255,155,100
            {
                speedLeft = 80;      //155,105,50      // falls Begrenzung
                y2 = speedLeft - speed;      // dann Rest rechts berücksichtigen
            }
            y = y - y2;
            speedRight = speed - y;         // rechts abbremsen
            if (speedRight < 0)
            {
                speedRight = 0;
            }
        }
        if ( y < 0)
        {
            // nach links
            setbumperLEDR(1);
            setbumperLEDL(0);
    
            speedRight = speed - y2;         // rechts beschleunigen !!!was speed - y2!!
            if (speedRight > 120) //255,105,100
            {
                speedRight = 80;   //155,105,50         // falls Begrenzung
                y2 = speed - speedRight;      // dann Rest links berücksichtigen !!was speed - speedRight!!
            }
            y = y - y2;
            speedLeft = speed + y;            // links abbremsen  !! was speed + y!!!
            if (speedLeft < 0)
            {
                speedLeft = 0;
            }
        }
        leftDir = rightDir = FWD;
        if (speedLeft < 20)  mleft_speed = 0;
        if (speedRight < 20) mright_speed = 0;
        setMotorDir(leftDir,rightDir);
        setMotorPower(abs(speedLeft),abs(speedRight));
    }
    
    int main(void)
    {
    
        initRP6Control();
        multiio_init();
        initLCD();
        lfsbumper_init();
    
        I2CTWI_initMaster(100);
        I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
    
        setLEDs(0b1111);
        clearLCD();
        setCursorPosLCD(0, 0);
        writeStringLCD("irobot_linie");
        mSleep(1500);
        clearLCD();
    
        accuspannung();
        clearLCD();
    
        setMotorDir(FWD,FWD);
        speed = 80;
        kp = 1; //3
        ki = 6; //10
        kd =  40; //70      // Regler Parameter kd enthält bereits Division durch dt
        drest=0;
        isum=0;
        xalt=0;
        while(1)
        {
            FollowLine();
        }
        return 0;
    }
    und das ergebnis ist hier,
    die eigentliche "asuro-testarena" schafft der RP6 (zumindest mit diesem code) nicht, er sucht sich seinen eigenen weg, bricht öfters aus, findet aber immer wieder zu linie zurück...
    gruß inka

  3. #13
    Erfahrener Benutzer Roboter-Spezialist Avatar von RolfD
    Registriert seit
    07.02.2011
    Beiträge
    414
    @Inka
    Wenn ich das richtig sehe, postet ihr da verschiedenen Quellcode.. der eine was von der Base/I2C-Slave, der andere was von der I2C-Master lib?
    Grundsätzlich gilt, es gibt Funktionen die die IO-Ports direkt steuern (böse/schnell) und es gibt welche die Rampensteuerung erledigen (gut/lahm). Letztere laufen auch als Task. Die Rampensteuerung auf der Base ist auf Grund des Trägheitsmomentes von Zahnrädern notwendig damit es kein Getriebesalat gibt.
    Die I2C-Master Lib muss sich um die Details wie Rampen jedoch eigentlich nicht kümmern wenn sie Fahranweisungen gibt... da sich schon die Base/Slave darum kümmert. Die I2C-Master lib kann eh kein Port der Base direkt ansteuern. Baut man sich ein Linienfolger, lässt man die Software dafür besser auf der Base laufen - schon wegen der trägen Laufzeiten auf dem I2C Bus sammt en/decodierung der Motorbefehle und Übertragungsfehler... und verwendet die Base ports ADC0/1 für den Sensorabgriff. Alles andere ist von hinten durch die Brust ins Auge...
    Gruß
    Geändert von RolfD (10.03.2014 um 18:42 Uhr)
    Sind Sie auch ambivalent?

  4. #14
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    @RolfD

    keine grundsätze ohne ausnahmen

    danke für die erklärung, ich bin mir der problematik mit dem getriebe durchaus bewusst, es kommt mir nicht auf schnelligkeit beim folgen der linie an, es hat sich aber gezeigt, dass der lauf bei diesem code sehr viel gleimäßiger als bei anderen meinen versuchen ist...

    der linienfolger hier läuft später nicht allein, sondern ist bestandteil meiner induktiven ladestation und der Suche danach. Die Suche beginnt mit der groben orientierung nach einer IR-bake und der annäherung ans ziel, dann übernimmt der linienfolger und es geht wohl nicht - zumindest meines wissens nach - , dass innerhalb eines programms zwischen m32 und der base ohne weiteres gewechselt wird wo was läuft und wer den hut auf hat, oder?
    gruß inka

  5. #15
    Erfahrener Benutzer Roboter-Spezialist Avatar von RolfD
    Registriert seit
    07.02.2011
    Beiträge
    414
    Hallo Inka,
    türlich geht das mit dem Hut wechseln... nur müsste die m32 ständig die Messwerte der Sensoren per I2C an die Base geben und die Base daraus Fahrbefehle basteln.
    Es wäre auch denkbar, das man (die m32) der Base per I2C Modus Befehl sagt "fahr du die nächsten Meter aber achte auf die Sensorwerte auf dem I2C Bus".
    Dazu müsste einiges an der base lib bzw. I2C slave umgeschrieben werden aber letztendlich bestimmst doch du, was die beiden miteinander aushandeln.
    Immerhin sind das 2 unabhängige Prozessoren, und das verhalten dazwischen ist umsetzbar von master/slave über preemptiver Prozess und Steuerungskontrolle und noch komplizierteren Verfahren.
    Da z.B. die m32 nichts von den Bumpern mitkriegt, diese aber mit in das Fahrmodel mit einfließen.. bzw. die Bumper die Fahrsteuerung beeinflussen, hast du eh schon eine Art "verteilte Intelligenz".
    Das lässt sich auch gescheit ausbauen.
    Gruß
    Sind Sie auch ambivalent?

  6. #16
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    hallo RolfD,

    dann habe ich es falsch verstanden...
    ich habe mich schon gewundert dass in der base nur das slave programm läuft und sonst nix. Durch verschiedene änderungen die ich im laufe dieses projekts an der "RP6Base_I2CSlave.c" und den I2C dateien machen musste bröckelt diese "mauer" etwas.

    Momentan möchte ich beim linien-folger aber erstmal alles so lassen wie es ist, es funktioniert immerhin...

    Ich habe mich mit verschiedenen sachen sowieso schon ziemlich verzettelt, jetzt sollte das projekt fertig werden. Da habe ich noch die baustelle mit der IR-bake, das einmal (eigentlich mehrmals) gelungene und gefilmte auffinden der bake war wohl mehr oder weniger zufall. Zumindest gelingt es jetzt nicht mehr das zu wiederholen, es gibt dort zeit- bzw. koordinationsprobleme zwischen dem senden der bake und dem empfang bei RP6...
    gruß inka

  7. #17
    Erfahrener Benutzer Roboter-Spezialist Avatar von RolfD
    Registriert seit
    07.02.2011
    Beiträge
    414
    Das master/slave bezieht sich nur auf das I2C Protokoll... es steht nirgends, das ein (i2c)Slave strohdumm sein muss oder der Master alles erledigt. Natürlich kann (und soll) der Slave um funktionen erweitert werden die der Master z.B. nur "anstubst" oder die beiden sich sonst wie koordinieren.
    Das is wie beim Menschen... das Großhirn ist auch nicht für Puls, Refelxe und körperinterne Abläufe zuständig. Das macht das Kleinhirn und noch kleinteiliger das Rückenmark. Aber es gibt auch da definierte Aufgaben und Protokolle dazwischen, welche den Ablauf steuern. In beide Richtungen und je nach Situation auch autark. Wenn Du mit dem Dicken Zeh wacklen willst, musst du dich nicht damit beschäftigen welche Muskeln dafür notwendig sind.. du wackelst einfach..den Rest macht dein Rückenmark. Und dein Gehirn bestimmt auch nicht den Neigungswinkel des Zehs wenn du gegen den Bettpfosten läufst... es tut einfach nur weh! Das sind alles einfache Signale welche dezentralisiert verarbeitet werden. Das kannst du auch mit der Base und einem m32 nachstellen. Wichtig dabei ist nur, das du auf beiden CPUs die Multitaskineigenschaften nicht blockierst. Auch da ein Beispiel: Wenn du einen im Tee hast, läufst du auch nicht mehr gradeaus
    Deswegen muss man aber halt auch Laufzeitprobleme beachten, denn wenn der Slave nur wie blöde den I2C Bus oder ein Sensor bewacht und man selbst noch eigene Funktionen einbaut die nicht Task-konform sind, kann er kaum noch andere Aufgaben umzusetzen. Ich weis jetzt nicht im Detail wo das bei Dir der Fall sein könnte aber wenn der Bot irgendwo in einer Schleife hängt, werden Fahrbefehle zeitlich falsch abgearbeitet. Das sind eben keine Programmierfehler in dem Sinn, sondern eher logische oder konzeptionelle Fehler. Meiner Erfahrung nach am ehesten die Quelle für so Probleme wie "der bot macht nicht mehr was er soll obwohl ich an der Stelle nichts verändert habe."
    Aber das mit dem verzetteln kenn ich auch zu gut.. ich drück mal weiter Däumchen für dein Projekt.
    Gruß
    Sind Sie auch ambivalent?

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Linienfolger ADC
    Von peewee im Forum Robby RP6
    Antworten: 0
    Letzter Beitrag: 16.05.2013, 08:10
  2. linienfolger deluxe
    Von neo98 im Forum Asuro
    Antworten: 5
    Letzter Beitrag: 19.02.2011, 11:10
  3. Linienfolger Problem
    Von Double_A im Forum Asuro
    Antworten: 9
    Letzter Beitrag: 10.05.2010, 23:41
  4. Linienfolger
    Von . . . . . im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 2
    Letzter Beitrag: 20.02.2008, 15:22
  5. Ein Linienfolger
    Von L u k a s im Forum Vorstellungen+Bilder von fertigen Projekten/Bots
    Antworten: 16
    Letzter Beitrag: 01.03.2004, 14:49

Berechtigungen

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

12V Akku bauen