-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: Asuro fährt im Kreis mit neuem Programm Brauche Hilfe!

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    06.02.2010
    Beiträge
    18

    Asuro fährt im Kreis mit neuem Programm Brauche Hilfe!

    Anzeige

    Der Asuro soll mit diesem Programm gerade fahren das tut er aber nicht er fährt nur im Kreis. Was mache ich falsch?
    #include "asuro.h"

    int main(void)
    {
    Init();
    while(1)
    {
    unsigned int data[2];
    OdometrieData(data);


    if (data [0] > data [1])
    {MotorDir(FWD,FWD);
    MotorSpeed(170,120);
    }
    else
    {MotorDir(FWD,FWD);
    MotorSpeed(120,170);}

    }
    while(1);
    return 0;
    }

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    12.02.2010
    Beiträge
    18
    hallo

    hast du schon mal eine linienverfolgung gemacht?
    schau mal in die asuro anleitung
    du gibst im werte auf die er reagieren soll gibst aber keine ausgangs wert vor
    er soll gerade fahren wenn er das nicht macht dann soll er das machen oder das machen

    fahr vorfährts

    ist die abweichung da dann
    mach das
    oder
    mach das

    gruss
    gego81

  3. #3
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    OdometrieData() zählt nicht die Anzahl der Codescheibenimpulse sondern ermittelt die Helligkeit der Codescheibensegmente die sich gerade vor den Sensoren befinden:
    http://www.roboternetz.de/phpBB2/zei...ag.php?t=46157

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    06.02.2010
    Beiträge
    18
    Ich verstehe, aber warum misst er die Helligkeit nur am Anfang und kontroliert nicht ständig das Ergebnis?

  5. #5
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    Bei jedem Schleifendurchlauf prüfst du "if (data [0] > data [1])" und wenn dabei eine Seite im Durchschnitt der Vergleiche heller als die andere Seite ist (Bauteileschwankungen, Fremdlicht von der Seite, Zufall), dann dreht er eben. Vielleicht kannst du diesen Effekt noch forcieren indem du die Sensoren einer Seite mit einer Taschenlampe anstrahlst.

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    06.02.2010
    Beiträge
    18
    ich habe es bereits mit der taschenlampe getestet. aber er prüft nur zu beginn

  7. #7
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    ich habe es bereits mit der taschenlampe getestet
    ... und er dreht immer auf die selbe Seite, unabhängig davon, auf welcher Seite du dauerhaft den Sensor mit der Taschenlampe "blendest"?

    aber er prüft nur zu beginn
    Woran erkennst du das?

    Bau mal die StatusLED mit ein um zu testen, ob er immer nur in eine Richtung fährt oder gelegentlich auch gegensteuert:

    MotorSpeed(170,120);
    StatusLED(GREEN);
    }

    und

    MotorSpeed(120,170);
    StatusLED(RED);
    }

    Wie eng ist denn die Kurve die er fährt? Ist sie identisch mit einer Programmvariante mit if(1) oder if(0) anstelle von if(data[0] > data[1])?

    Mein "asuro" ist grad nicht betriebsbereit, deshalb kann ich es nicht selbst testen.

    Gruß

    mic

    [Edit]
    Ähm, eigentlich ist das alles völlig unwichtig. Du mußt die hell/dunkel-Wechsel auf jeder Seite erkennen und zählen. Nur so kannst du die Odometry sinnvoll anwenden.

    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 Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.167
    #include "asuro.h"

    int main(void)
    {
    Init();
    while(1)
    {
    unsigned int data[2];
    OdometrieData(data);
    ...
    Variabelen deklarationen sollten im prinzip nicht mehrmals fur dasselbe gemacht werden. Nur wan speicherplatz ein wirklich gross problem ist. Dein "unsigned int data[2];" steht am start von den While-schleife. Dadurch wird es wieder und wieder einen neue speicherplatz eingestellt. Glücklich sind variabelen nur gültig zwisschen den nächste {} klammern, also macht das fur dein program kein problem.Am ende vond den schleife ist es nicht mehr gultig. Net ist es aber nicht.

    Wie schön gesagt, dein program verglicht die helligkeit auf den geberscheiben. Leider haben die beide scheiben nicht immer (oder kwasi-immer nicht) die selbe basis beleuchtung und sensitivität. Im theoretische fall wurde das den beiden rädern synchronisieren. Aber nur wen die beleuchtungs kurven fur ein ganzen radumlauf auch identisch sind. Sind sie aber nicht bei unsere billige Asuros. Schade? Na ja, das ist einfach unsere schmutzige realität.

  9. #9
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Dadurch wird es wieder und wieder einen neue speicherplatz eingestellt. ... Am ende vond den schleife ist es nicht mehr gultig.
    Die While-Schleife wird aber doch nie mehr verlassen.

    Ich hatte das für nicht kritisch eingestuft, weil die nachfolgende if-Abfrage ja immer die aktuelle (möglicherweise zuletzt definierte) Variable verwendet. Wenn aber wirklich bei jedem Schleifendurchlauf 32 Bit zusätzlicher Speicher belegt wird, könnte vielleicht irgendein Überlaufeffekt auftreten. Das würde dann aber sehr schnell geschehen und so vielleicht den Eindruck vermitteln, die Messung würde nur zu Beginn stattfinden. Deshalb besser so:

    #include "asuro.h"

    unsigned int data[2];

    int main(void)
    {...

    (So kann man die Variablen zusätzlich auch in anderen Funktionen verwenden, man nennt das "globale Variable".)

    Sind sie aber nicht bei unsere billige Asuros. Schade? Na ja, das ist einfach unsere schmutzige realität.
    Meiner Meinung nach ist deshalb der asuro immer noch der beste Einsteigerroboter.


    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.167
    Oops, das richtige beispiel vergessen.

    Code:
    #include "asuro.h" 
    
    int main(void) 
    {
    unsigned int data[2]; 
     
    Init(); 
    while(1) 
    { 
    OdometrieData(data); 
    ...

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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