-         

Ergebnis 1 bis 2 von 2

Thema: Probleme: Linienverfolgung, Odometrie, Ausweichen bei Kolis.

  1. #1

    Probleme: Linienverfolgung, Odometrie, Ausweichen bei Kolis.

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo,
    bin ganz neu auf dem Gebiet "Asuro". Derzeit arbeite ich für ein Schulprojekt an einem Asuro. Abgeben muss ich morgen
    Leider klappt das Programm noch nicht 100%ig wie ich mir das Vorstelle.
    Bislang habe ich nur fleißig im Forum gelesen, jedoch komm ich wirklich nicht weiter.

    Der Roboter soll nur mit der asuro.h lib einer Linie folgen, einen Gegenstand bemerken und ausweichen, sowie bei ähnlichen Werten der Sensoren (gerade Linie oder normaler Untergrund) mithilfe der Odometrie geradeaus fahren.

    Hier mein Quelltext:
    Code:
    //////////////////////////////////////////////////////////////////////////////////////
    ------------------aktuellste----------------------------------------------------------
    //////////////////////////////////////////////////////////////////////////////////////
    
    
    #include "asuro.h"    //Sebastians ultra kram
    
    int main(void)
    {
    
       unsigned int data[2];
       unsigned int a,v;
       unsigned char taste;
       unsigned int ododata[2];
      Init();
       
       FrontLED(ON);
    
       while(1){
    if(PollSwitch()>0)
    {
    	if(PollSwitch()>0)
    	{
    		a=0;
    		taste=PollSwitch();
    		if(taste==1)
    		{
    			while(a<=300)
    			{
    				a++;
    				Sleep(255);
    				MotorDir(RWD,RWD);
    				MotorSpeed(120,80);
    			}
    			do
    			{
    	  			LineData(data);
          				MotorDir(FWD,FWD);
          				MotorSpeed(80,80);
          				StatusLED(YELLOW);
          				BackLED(ON,ON);
    	  
          			}while((data[0]-6<data[1])&&(data[0]>data[1]-27));
    			//mögliche Änderung:}while((data[0]-15 < data[1])&&(data[0] > data[1]-45));
    		}
    		else if(taste==32)
    		{
    			while(a<=300)
    			{
    				a++;
    				Sleep(255);
    				MotorDir(RWD,RWD);
    				MotorSpeed(80,120);
    			}
     			
    			do
    			{
    	  			LineData(data);
          				MotorDir(FWD,FWD);
          				MotorSpeed(80,80);
          				StatusLED(YELLOW);
          				BackLED(ON,ON);
         
          			}while((data[0]-6<data[1])&&(data[0]>data[1]-27));
    			//mögliche Änderung:}while((data[0]-15 < data[1])&&(data[0] > data[1]-45));
    		}
    		else if((taste>1)&&(taste!=32))
    		{
    			while(a<=300)
    			{
    				a++;
    				Sleep(255);
    				MotorDir(RWD,RWD);
    				MotorSpeed(160,80);
    			}
    			
    			do
    			{
    	  			LineData(data);
    			        MotorDir(FWD,FWD);
          				MotorSpeed(80,80);
          				StatusLED(YELLOW);
          				BackLED(ON,ON);
         				data[0];
    	 			data[1];
         			}while((data[0]-6<data[1])&&(data[0]>data[1]-27));
    			//mögliche Änderung:}while((data[0]-15 < data[1])&&(data[0] > data[1]-45));
    		}
    
    	}
    }
    else
    {
        	LineData(data);
          	if((data[0]-5 > data[1])&&(data[0]-15 < data[1]))
    	{
            	MotorDir(FWD,FREE);
          		MotorSpeed(130,220);
          		StatusLED(RED);
          		BackLED(OFF,ON);
          	}
    
          	if(data[0]-15 > data[1])
    	{
           		MotorDir(FWD,FREE);
          		MotorSpeed(160,220);
          		StatusLED(RED);
          		BackLED(OFF,ON);
          	}
    	  
    
          	if((data[0] < data[1]-25)&&(data[0] > data[1]-45))
    	{
           		MotorDir(FREE,FWD);
          		MotorSpeed(220,130);
          		StatusLED(GREEN);
          		BackLED(ON,OFF);
          	}
     
          	if(data[0] < data[1]-45)
    	{
           		MotorDir(FREE,FWD);
          		MotorSpeed(220,160);
          		StatusLED(GREEN);
          		BackLED(ON,OFF);
          	}
     
          	if((data[0]-5 < data[1])&&(data[0] > data[1]-25))
    	{
    	  	v=120;
          
          		OdometrieData(ododata);
    	  	if(ododata[0]>=ododata[1])
    	  		{v=v+5;}
    	  	else 
    	  		{v=v-5;}
    	  	MotorDir(FWD,FWD);
           		MotorSpeed(120,v);
          		StatusLED(YELLOW);
          		BackLED(ON,ON);
    	}
    
    
    	else;
    
    
    }
    }
    return 0; 
    }
    Was sagt ihr zu dem Quelltext?
    Wo könnte der Fehler liegen?
    Das "maken" udn flashen klappt., aber irgendwie bockt der Asuro. Aber spielt es auf, bzw. schaut es euch an

    Freue mich auf euere Antworten.
    Vielen dank schonmal!

    Auch wenn man das Programm nicht optimal ist und es bessere gibt, wäre ich froh, wenn ich dieses Pagramm auf dem Asuro zum laufen bekäme. Das ist dann wenigstens das eigene


    Gruß

  2. #2
    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

    Die Schrägstriche am Programmanfang hättest du besser für Kommentare im Programm verwendet. Das hier funzt so nicht:

    Code:
                OdometrieData(ododata);
            if(ododata[0]>=ododata[1])
               {v=v+5;}
            else
               {v=v-5;}
    Die Werte kann man nicht direkt vergleichen denn sie stehen für das an den Codescheiben reflektierte Licht das die Sensoren einfangen.

    Für das Fahren ohne Strich würde ich eine Zeitfunktion verwenden weil die Odometrie nicht einfach zu programieren ist und die Genauigkeit unter Umständen nicht merklich besser als bei Zeitfunktionen ist. Wichtig bei Zeitfunktionen ist aber die richtige Wahl der MotorSpeed()-Parameter.

    Hier würde ich umformulieren:
    Code:
             while(a<=300)
             {
                a++;
                Sleep(255);
                MotorDir(RWD,RWD);
                MotorSpeed(160,80);
             }
    in
    Code:
                MotorDir(RWD,RWD);
                MotorSpeed(160,80);
             while(a<=300)
             {
                a++;
                Sleep(255);
             }
    Das hier ist vielleicht auch kritisch:
    Code:
    if(PollSwitch()>0)
    {
       if(PollSwitch()>0)
       {
          a=0;
          taste=PollSwitch();
    Obwohl zweimal auf PollSwitch() > 0 geprüft wird könnte taste trotzdem 0 sein!

    Testen kann ich leider nicht, vielleicht könnest du die Fehlfunktion genauer beschreiben.

    Gruß

    mic

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

Berechtigungen

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