-         

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

Thema: Linienfindung. Problem :(

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    18.12.2006
    Beiträge
    6

    Linienfindung. Problem :(

    Anzeige

    Hi,
    ich hab ein Programm geschrieben welches eine Linie finden und einfangen soll, aber der Roboter fährt nur grade aus, anstatt sich zu drehen und dann stehen zu bleiben auf der Linie. Erst soll ein Phototransistor ausgelesen werden, wenn er über einer schwarzen linie ist, und ab dann die zeit, bis der nächste über einer schwarzen ist per gettime() befehl. Dann soll später der Winkel ausgerechnet werden den der Roboter sich drehen soll per Turn() befehl.
    Zur winkelberechnung hab ich erst den Tangens berechnet und den später umgewandelt per atan() befehl, welcher aus der math.h kommt (M_PIl kommt auch daher und ist die Zahl Pi). Für den Tangens hab ich hab ich aber Geschwindigkeit und Zeit benötigt um die Strecke auszurechnen die der Asuro fährt bis der zweite Phototransistor auf der schwarzen Linie ist. Zeit wurde schon vorher ausgerechnet und die Geschwindigkeit ist nur sehr ungefähr ausgerechnet.
    Die Geschwindigkeit wird ja in den Werten von 0-255 angegeben. Ein Freund hat mal eine ungefähre Rechnung aufgestellt über Durchschnittswerte etc. und is zum Ergebnis Geschwindigkeit/818 gekommen. Dann hat man aus den 0-255 Werten einen Geschwindigkeitswert in m/s.
    Jetzt kann man theoretisch über die Strecke a (Abstand zwischen Phototransistor 1 und 2) durch Strecke b (ausgerechnet über Geschwindigkeit mal Zeit) den Tangens ausrechnen: tan=a/(v*time)
    Irgendwie fährt mein Roboter aber nur grade aus. Kann mir jemand helfen?
    Hoffe das war jetz gut genug erklärt. Schaut einfach ma in den Code oder fragt nochma falls es Probleme geben sollte .

    Code:
    #include "asuro.h"
    #include "math.h" 								//dient der späteren Tangensumrechnung
    
    int main(void)
    {
    	double const a=1.5;							// Abstand der beiden Phototransistoren: 1,5cm
    	double time;
    	double tan;
    	double time1;
    	double time2;
    	double v;
    	int arc;
    	int x;
    	double arc2;
    	unsigned int data[2];
    	unsigned char tmp[2] = {OFF,OFF}; 
    	Init();
    	while(1)
    	{
    	MotorDir(FWD,FWD);
    	MotorSpeed(120,120); 						// Geschwindigkeitsberechnung. 120/818 ist ein 
    	v = 120/818; 								//ungefairer! Geschwindigkeitswert in meter pro sekunde.
    	LineData(data);  		
    	if (data[0] > 400) {  						//Überprüfung welcher Phototransistor an ist. 
    		tmp[0] = ON;
    		time1 = Gettime();	} 					//Erste Zeit
    	if (data[1] > 400) {
    		tmp[1] = ON;
    		time1 = Gettime();	}
    	while(tmp[0]==ON)
    	{
    	        if (data[1] > 400) 					//Überprüfung bis zweite Phototransistor an ist.
    		tmp[1] = ON;
    		if(tmp[1]==ON)
    			{
    				time2 = Gettime(); 				//Zweite Zeit
    				time = (time2 - time1)/1000; 	//Zeitabstand in sekunden
    				tan=a/(v*time); 				//Tangensberechnung über a(1.5)/b(v*time)
    				arc2 = atan(tan) * 180 / M_PIl; //Tangensumrechnung in Winkel
    				arc = (int)arc2; 				//double Wert wird in int Wert geändert
    				MotorDir(BREAK,BREAK);
    				MotorSpeed(0,0);
    				Turn (arc, v);  				//Drehung
    				tmp[1] = OFF; 					//Reset der Phototransistoren auf 0
    				tmp[0] = OFF;
    			}
    	}
    	while(tmp[1]==ON) 
    	{
    		time1 = Gettime();	
    		if (data[0] > 400) 
    		tmp[0] = ON;
    		else{}
    		if(tmp[0]==ON)
    			{
    				time2 = Gettime();
    				time = (time2 - time1)/1000;
    				tmp[1]==OFF;
    				tan=a/(v*time);
    				arc2 = atan(tan) * 180 / M_PIl;  
    				arc = (int)arc2;
    				MotorDir(BREAK,BREAK);
    				MotorSpeed(0,0);
    				Turn (arc, v); 
    				tmp[1] = OFF;
    				tmp[0] = OFF;
    			}	
    	}
    	}
    	
    	return 0;
    }

  2. #2
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    vielleicht solltest du erstmal mit was einfacherem anfangen wir der linienverfolgung... ausserdem: wenn er mit der schnauze auf der linie steht, und sich dann dreht, dann ist die schnauze wieder weg von der linie. er muss also erst noch ein gutes stück vor fahren.
    kleinschreibung ist cool!

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hi,

    du überprüfst in den beiden while Schleifen while (tmp[x] == ON)
    weiter die Daten der Liniensensoren auf Änderung. Diese können sich aber nicht ändern, wenn du nicht auch innerhalb der while Schleifen die Fotosensoren abfragst, mit der Funktion LineData(data).

    Gruß m.ar.v.i.n

  4. #4
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    jo genau das habe ich auch gerade gesehn. versuch mal, LineData(data) mit in der schleife laufen zu lassen.

    wenn der zweitee fototransistor dann "dunkel" findet, muss der asuro genau eine asurolänge vorwärts fahren, und sich dann mit beiden rädern recht gleichmäßig drehen.

    leider geht das dann nur, wenn die linie gerade ist, weil der "gefundene" punkt dann unter dem asuro-hintern liegt und die schnauze nict unbedingt mehr auf der linie liegt, wenn diese krumm ist.
    kleinschreibung ist cool!

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    18.12.2006
    Beiträge
    6
    Linienverfolgung ist es ja nicht. er soll ja am Ende grade auf der Strecke stehen damit man Linienverfolgung ausführen kann (das Programm is auch bissl einfacher ).


    Danke für den Tip mit LineData werde es gleich ausprobieren. Ich frage ja nur die alten Werte nach nicht neue . Hab ich garnicht gemerkt. Dann dürfte es eigentlich wirklich klappen.

  6. #6
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    oder du lässt ihn einfach losfahren und lässt dann das linienFOLGER programm laufen. mit ein bissl glück findet er die linie und "rastet darauf ein" und fährt ihr nach.
    kleinschreibung ist cool!

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    18.12.2006
    Beiträge
    6
    Die Wahrscheinlichkeit dass der Asuro die Linie findet ist mir aber zu gering. und wenn er in einem ~90° Winkel auf die Linie zukommt wird er sicherlich nicht auf der Linie weiterfahren.
    Habe nun mal LineData mit eingebaut. Auch dass sich die StatusLED farbe ändert. Aber noch nichteinmal die Farbe ändert sich.

    Code:
    #include "asuro.h"
    #include "math.h"
    
    int main(void)
    {
    	double const a=1.5;
    	double time;
    	double tan;
    	double time1;
    	double time2;
    	double v;
    	int arc;
    	int x;
    	double arc2;
    	unsigned int data[2];
    	unsigned char tmp[2] = {OFF,OFF}; 
    	Init();
    	while(1)
    	{
    	MotorDir(FWD,FWD);
    	MotorSpeed(120,120);
    	v = 120/818;
    	LineData(data);  
    	if (data[0] > 400) {
    		tmp[0] = ON;
    		time1 = Gettime();	
    		StatusLED(RED);
    		}
    	else{}
    	if (data[1] > 400) {
    		tmp[1] = ON;
    		time1 = Gettime();	
    		StatusLED(RED);
    		}
    	else{}
    		
    	while(tmp[0]==ON)			
    	{
    		LineData(data);  
    	    if (data[1] > 400) 
    		tmp[1] = ON;
    		else{}
    		if(tmp[1]==ON)
    			{	StatusLED(YELLOW);
    				time2 = Gettime();
    				time = (time2 - time1)/1000;
    				tan=a/(v*time);
    				arc2 = atan(tan) * 180 / M_PIl; 
    				arc = (int)arc2;
    				MotorDir(BREAK,BREAK);
    				MotorSpeed(0,0);
    				Turn (arc, v); 		
    				tmp[1] = OFF;
    				tmp[0] = OFF;
    			}
    			else{}
    	}
    	while(tmp[1]==ON) 
    	{
    		LineData(data);  
    		if (data[0] > 400) 
    		tmp[0] = ON;
    		else{}
    		if(tmp[0]==ON)
    			{	StatusLED(YELLOW);
    				time2 = Gettime();
    				time = (time2 - time1)/1000;
    				tmp[1]==OFF;
    				tan=a/(v*time);
    				arc2 = atan(tan) * 180 / M_PIl;  
    				arc = (int)arc2;
    				MotorDir(BREAK,BREAK);
    				MotorSpeed(0,0);
    				Turn (arc, v); 
    				tmp[1] = OFF;
    				tmp[0] = OFF;
    			}	
    		else{}
    	}
    	}
    	
    	return 0;
    }

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    21.03.2004
    Ort
    73061 Ebersbach
    Alter
    48
    Beiträge
    52
    hast du dir die werte von linedata mal ausgeben lassen?

    kommen die überhaupt über 400?
    Das, was immer von jedermann und überall als richtig akzeptiert wurde, ist mit ziemlicher Gewißheit das Falsche.
    Paul Valéry (1871-1945), frz. Dichter

  9. #9
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    also 400 ist eigentlich ein recht mittlerer wert... allerdings ist der wert für ganz HELL 1023, der wert für ganz DUNKEL ist 0 (idealerweise). aber wenn ich das recht sehe, dann vergleichst du in deinem programm doch ob der wert über 400 ist, also ob es heller als 400 ist. sollte das evtl mal umgekehrt sein?

    versuch mal, dir die linedata werte ausgeben zu lassen, dann hast du ungefähr ein verhältnis dazu welcher vergleichswert der richtige sein könnte
    kleinschreibung ist cool!

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    18.12.2006
    Beiträge
    6
    sehr gute beobachtung Hab das ausm selftest und ich hab gedacht der schaut dabei nach obs schwarz ist, wäre aufjedenfall eine gute erklärung, da der roboter bisher ja noch garnichts gemacht hat. werds nachher mal ausprobieren.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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