-
        

Ergebnis 1 bis 3 von 3

Thema: ASURO dreht bei Odometrie durch!

  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    02.11.2005
    Ort
    Dortmund
    Alter
    24
    Beiträge
    1.641

    ASURO dreht bei Odometrie durch!

    Anzeige

    Habs jetzt endlich mal geschafft, die Odometrie zu programmieren - und ASURO dreht durch!
    Das läuft ungefähr so: Ein Rad läuft vorwärts- wird langsamer - andres rad läuft - wird langsamer - aus - bumm - alle laufen - es surrt - es fängt an zu "puckern" (Wie bei Starwars Epi 1 die Podracer) - Die Räder werden immer schneller - sie wackeln ordentlich - ich mach aus, weil ich Angst habe, dass das Ding sich durch Hyperaktivität aufhängt. Was ist hier los?

    Code:
    	int Rmin=1023;
    	int Rmax=0;
    	int Rhell=0;
    	int Rdunkel=0;
    	int RZaehler;
    	int UebergaengeR=0;
    	int RSpeed=100;
    
    	int Lmin=1023;
    	int Lmax=0;
    	int Lhell=0;
    	int Ldunkel=0;
    	int MittelwertR;
    	int MittelwertL;
    	int LZaehler;
    	int UebergaengeL=0;
    	int LSpeed=100;
    	
    
    	long Zaehler=0;
    	
    	BackLED(ON,ON);
    	
    	while(1)
    	{
    		MotorDir(FWD,FWD);
    		MotorSpeed(LSpeed,RSpeed);
    	
    		for (Zaehler=0; Zaehler<100;Zaehler++)
    		{
    			unsigned int data[2];
    	
    			OdometrieData(data);
    	
    			if (data[0] > Lmax)
    				Lmax=data[0];
    	
    			if (data[0] < Lmin)
    				Lmin=data[0];
    	
    			if (data[1] > Rmax)
    				Rmax=data[1];
    			
    			if (data[1] < Rmin)
    				Rmin=data[1];
    	
    	
    			MittelwertL=(Lmin+Lmax)/2;
    			MittelwertR=(Rmin+Rmax)/2;
    			
    			LongSleep(1);
    				
    		}
    
    		unsigned int data[2];
    
    		OdometrieData(data);
    		
    		if (data[0] < MittelwertL)
    		{
    			Lhell = data[0];
    			LZaehler = HELL;
    		}
    		else
    		{
    			Ldunkel = data[0];
    			LZaehler = DUNKEL;
    		}	
    		if (data[1] < MittelwertR)
    		{
    			Rhell = data[1];
    			RZaehler = HELL;
    		}
    		else
    		{
    			Rdunkel = data[1];
    			RZaehler = DUNKEL;
    		}	
    		
    		int i;
    		
    		for (i = 0; i< 100; i++)
    		{
    			OdometrieData(data);
    		
    			if (data[0] < MittelwertL && LZaehler == DUNKEL)
    				UebergaengeL = UebergaengeL + 1;
    			else if (data[0] > MittelwertL && LZaehler == HELL)
    				UebergaengeL = UebergaengeL + 1;
    			
    			if (data[1] < MittelwertR && RZaehler == DUNKEL)
    				UebergaengeR = UebergaengeR + 1;
    			else if (data[1] > MittelwertR && RZaehler == HELL)
    				UebergaengeR = UebergaengeR + 1;	
    		}
    		
    		if (UebergaengeR < UebergaengeL)
    		{
    			RSpeed = RSpeed + 1;
    			LSpeed = LSpeed - 1;
    			StatusLED(RED);
    		}	
    		else if (UebergaengeR > UebergaengeL)
    		{
    			RSpeed = RSpeed - 1;
    			LSpeed = LSpeed + 1;
    			StatusLED(GREEN);
    		}
    		else if (UebergaengeR == UebergaengeL)
    			StatusLED(YELLOW);
    	}
    Ich hab keine Ahnung, was das soll!

    Tschüß,
    Lunarman
    o
    L_
    OL
    This is Schäuble. Copy Schäuble into your signature to help him on his way to Überwachungsstaat!

    http://de.youtube.com/watch?v=qV1cZ6jUeGE

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    08.05.2005
    Ort
    München
    Alter
    45
    Beiträge
    59
    Hi,

    das liegt vielleicht daran, das du deinem Asuro nicht deutlich genug sagst, was er eigentlich tun soll

    Sorry aber dein Programm tut alles mögliche nur nicht, das der Asuro gerade aus fährt.

    Ich verstehe so einige passagen in deinem Programm nicht.
    1. Warum zählst du bei jedem Funktionsabschnitt immer von 0-100?
    2. Du wiederhost das gesamte Programm immer (while-schleife). Ich vermute jedoch, du willst das gar nicht, da mir der erste Funktionsblock eher wie eine Kalibrierung deiner Odometrie aussieht.
    3. Am Ende erhöhst bzw. erniedrigst du die Laufgeschwindigkeit deiner Motoren bei einem Farbwechsel der Odometriescheiben. Wodzu? Möchtest du nicht lieber die Motoren so regeln, das links und rechts in der gleichen Zeitieinheit gleich viele Übergänge stattfinden. Dann fährt er nämlich gerade aus.

    Kurz gesagt. Suche noch mal im Forum, wie man das mit der Odometrie macht.

    Martin

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    02.11.2005
    Ort
    Dortmund
    Alter
    24
    Beiträge
    1.641
    Okay, hab es jetzt mal ein bisschen abgeändert. So fährt er geradeaus. Okay, ein bisschen lenkt er hin und her - aber egal.

    Code:
    	int RZaehler;
    	int UebergaengeR=0;
    	
    	int MittelwertR;
    	int MittelwertL;
    	
    	int LZaehler;
    	int UebergaengeL=0;
    	
    	long Zaehler=0;
    	
    	int Lmin=1023;
    	int Lmax=0;
    
    	int Rmin=1023;
    	int Rmax=0;
    		
    	MotorDir(FWD,FWD);
    	MotorSpeed(LSpeed,RSpeed);
    	
    	for (Zaehler=0; Zaehler<100; Zaehler++)
    	{
    		unsigned int data[2];
    	
    		OdometrieData(data);
    	
    		if (data[0] > Lmax)
    			Lmax=data[0];
    	
    		if (data[0] < Lmin)
    			Lmin=data[0];
    	
    		if (data[1] > Rmax)
    			Rmax=data[1];
    			
    		if (data[1] < Rmin)
    			Rmin=data[1];
    				
    		LongSleep(1);				
    	}
    
    	MittelwertL=(Lmin+Lmax)/2;
    	MittelwertR=(Rmin+Rmax)/2;
    
    	int i;
    		
    	UebergaengeL = UebergaengeR = 0;
    		
    	LZaehler = HELL;
    	RZaehler = HELL;
    		
    	for (i = 0; i< 500; i++)
    	{
    		unsigned int data[2];
    
    		OdometrieData(data);
    		
    		if (data[0] < MittelwertL && LZaehler == DUNKEL)
    		{
    			UebergaengeL = UebergaengeL + 1;
    			LZaehler = HELL;
    		}
    		else if (data[0] > MittelwertL && LZaehler == HELL)
    		{	
    			UebergaengeL = UebergaengeL + 1;
    			LZaehler = DUNKEL;
    		}
    			
    		if (data[1] < MittelwertR && RZaehler == DUNKEL)
    		{
    			UebergaengeR = UebergaengeR + 1;
    			RZaehler = HELL;
    		}
    		else if (data[1] > MittelwertR && RZaehler == HELL)
    		{
    			UebergaengeR = UebergaengeR + 1;	
    			RZaehler = DUNKEL;
    		}
    			
    		LongSleep(1);
    	}
    		
    	if (UebergaengeR < UebergaengeL)
    	{
    		RSpeed = RSpeed + 1;
    		LSpeed = LSpeed - 1;
    		StatusLED(RED);
    	}	
    	else if (UebergaengeR > UebergaengeL)
    	{
    		RSpeed = RSpeed - 1;
    		LSpeed = LSpeed + 1;
    		StatusLED(GREEN);
    	}
    	else if (UebergaengeR == UebergaengeL)
    	{
    		StatusLED(YELLOW);
    	}
    Übrigens: Die Kalibrierung wiederhol ich, falls plötzlich ne Lampe angeht und dann die gesamten Daten falsch sind.
    o
    L_
    OL
    This is Schäuble. Copy Schäuble into your signature to help him on his way to Überwachungsstaat!

    http://de.youtube.com/watch?v=qV1cZ6jUeGE

Berechtigungen

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