-         

Ergebnis 1 bis 10 von 10

Thema: anfang einer kollisions-routine

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.12.2008
    Ort
    Dresden
    Alter
    30
    Beiträge
    100

    anfang einer kollisions-routine

    Anzeige

    nabend allerseits,

    ich bin schon seit einiger zeit dabei, ein programm zu schreiben, mit dem der asuro kollisionen auswertet und dann wendet o.ä.

    dazu hab ich angefangen, eine funktion zum wenden zu schreiben, in der ich nur gradzahl und richtung übergebe.

    hier mein quelltext (nur von der funktion, rest folgt):

    Code:
    void wenden(int grad, char richtung)									//funktion zum wenden
    {
    	int degree=0;														//variablen deklarieren, die ich brauche
    	char dir;
    	
    	degree=grad;														//übergabe der parameter an die internen variablen
    	dir=richtung;
    	
    	if ((degree>=0)&&(degree<120)) { degree=degree*0,85; }			//das hier hab ich nur für die anpassung gemacht,
    	else if ((degree>120)&&(degree<240)) { degree=degree*0,9; }		//da mein asuro immer zu große winkel gefahren ist.
    	else if ((degree>240)&&(degree<=360)) { degree=degree*0,95; }		//die werte hab ich experimentell ermittelt
    	
    	if (dir=='r') {}													//rechtskurve, alles wie gehabt
    	else if (dir=='l') { degree=degree*(-1); }							//linkskurve, gradzahl mit -1 multiplizieren
    	
    	Go(-80,200);														//stück zurücksetzen
    	Turn(degree,200);													//drehen
    }
    
    
    
    //aufruf der funktion sollte dann beispielsweise so aussehen:
    wenden(90,'r');
    mein problem ist jetzt, dass asuro zwar das stück rückwärts fährt, sich aber nicht wie gewollt dreht. er dreht sich gar nicht.
    ich hab meinen fehler nicht finden können. vielleicht kann mir ja wer helfen.

    danke schonmal,

    grüße, malediction.

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    37
    Beiträge
    1.269
    Hi!
    Ich habe noch nie mit C gearbeitet, aber ist das Dezimalzeichen wirklich ein Komma...?
    degree=degree*0,85
    sollte das nicht heissen
    degree=degree*0.85 ...?
    Viele Grüße, William
    -> http://william.thielicke.org/

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.03.2006
    Ort
    Darmstadt
    Alter
    26
    Beiträge
    522
    Wie mein Vorredner schon schrieb muss das ein Punkt und kein Komma in der Dezimalzahl sein, da sonst mit 0 multipliziert wird. Ausserdem ist degree ein integer, also ganzzahlig. Nimm entweder float als Datentyp oder multiplizier es zuerst mit 9 und teile dann durch 10, das ist dasselbe wie * 0.9.

    MfG Mark

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.12.2008
    Ort
    Dresden
    Alter
    30
    Beiträge
    100
    danke für die antworten. wer das mal ausprobieren.

    das mit dem komma ist ja ma wieder ein schön blöder fehler

    und wenn ich den integer mit 0,9 multipliziere, rechnet er das doch normal und schneidet dann einfach den nachkommeterm ab oder nicht?!

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.12.2008
    Ort
    Dresden
    Alter
    30
    Beiträge
    100
    so, hi nochmal.

    also vielen dank für die tipps.
    das klappt jetzt so, wie gewollt.

    hier der code des gesamten programms:

    Code:
    #include "asuro.h"
    
    int main(void)
    {
      Init();
      EncoderInit();
    		
      		
    	while(1){
    		if (taster()!=0) {
    			BackLED(ON,ON);
    			StatusLED(RED);
    			wenden(90,'r');
    		} else {
    			BackLED(OFF,OFF);
    			StatusLED(GREEN);
    			fahren();
    		}
    	}
    		
    		
      while (1);
      return 0;
    }
    
    int taster(void)
    {
    	int t1,t2;
    	
    	while(1) {
    		t1=PollSwitch();
    		t2=PollSwitch();
    		
    		if ((t1==t2)&&(t1==0b000001)) { return 6; }
    		else if ((t1==t2)&&(t1==0b000010)) { return 5; }
    		else if ((t1==t2)&&(t1==0b000100)) { return 4; }
    		else if ((t1==t2)&&(t1==0b001000)) { return 3; }
    		else if ((t1==t2)&&(t1==0b010000)) { return 2; }
    		else if ((t1==t2)&&(t1==0b100000)) { return 1; }
    		
    		else if ((t1==t2)&&(t1!=0b000001)&&(t1!=0b000010)&&(t1!=0b000100)&&(t1!=0b001000)&&(t1!=0b010000)&&(t1!=0b100000)&&(t1!=0b000000)) { return 7; }
    		
    		else { return 0; }
    	
    	}
    }
    
    void wenden(int grad, char richtung)
    {
    	int degree=0;
    	char dir;
    	
    	degree=grad;
    	dir=richtung;
    	
    	if ((degree>=0)&&(degree<120)) { 
    	degree=degree*84;
    	degree=degree/100; 
    	}
    	else if ((degree>120)&&(degree<240)) {
    	degree=degree*92;
    	degree=degree/100; 
    	}
    	else if ((degree>240)&&(degree<=360)) {
    	degree=degree*98;
    	degree=degree/100; 
    	}
    	
    	if (dir=='r') { BackLED(OFF,ON); }
    	else if (dir=='l') {
    	BackLED(ON,OFF); 
    	degree=degree*(-1);
    	}
    	
    	Go(-80,200);
    	Turn(degree,200);
    	BackLED(OFF,OFF);
    }
    
    void fahren(void)
    {
    	Go(10,120);
    }

    jetzt ist es allerdings so, dass asuro immer ein kleines stückchen fährt (halt die 10, die ich bei fahren() angegeben hab) und dann aber kurz pausiert.
    ich dachte eigentlich nicht, dass das abfragen der taster und was da noch dazwischen passiert so lang dauert, dass keine flüssige fahrt zustande kommt...

    was allerdings noch ein viel größeres problem ist, ist dass wenn ein taster gedrückt ist, er nur anfängt rückwärts zu fahren. er fährt und fährt und fährt rückwärts aber er bleibt nicht mehr stehen und wendet auch nciht.
    und das obwohl meine wenden() funktion jetzt hinhaut. (hab sie mit verschiedensten fällen getestet.

    ich kann mir nicht erklären woran das liegt...
    kann mir wer helfen?!

    danke schonmal.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.167
    Einfach, naja, wenn du die schaltung zeichnung versteht... odometrie messungen und backleds anschalten gehen nicht zusammen. Die leiterbahnen sind miteinander verknupft. Hmm, vieleicht wirken die messungen schon ein bisschen (kompliziertere spannungsteiler), aber die odoleds sind sicher ausgeschalted, und dan wird kein licht auf die scheiben schienen. Du sollte mit etwas anderes 'richtung signalen' geben.

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.12.2008
    Ort
    Dresden
    Alter
    30
    Beiträge
    100
    achsooooooooooooooooooooooooooo...

    das werde ich mirgen mal probieren... danke!
    Der Optimist: \"Das Glas ist halb voll.\"
    Der Pessimist: \"Das Glas ist halb leer.\"
    Der Ingenieur: \"Das Glas ist doppelt so groß wie es sein müßte.\"

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.167
    Bitte lies meinen post nochmal. Habe etwas da bei geschrieben.

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.12.2008
    Ort
    Dresden
    Alter
    30
    Beiträge
    100
    ja das macht schon sinn.

    hab mir den schaltplan nicht bis ins letzte detail angeschaut.
    danke noch mal
    Der Optimist: \"Das Glas ist halb voll.\"
    Der Pessimist: \"Das Glas ist halb leer.\"
    Der Ingenieur: \"Das Glas ist doppelt so groß wie es sein müßte.\"

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.12.2008
    Ort
    Dresden
    Alter
    30
    Beiträge
    100
    danke valen, für deinen tipp.
    jetzt funktioniert es so wie gewünscht. es lad wirklich an den backleds.

    hab mich da auch reingefuchst und wenn man sich den schaltplan einfach mal anschaut macht das auch voll sinn.
    Der Optimist: \"Das Glas ist halb voll.\"
    Der Pessimist: \"Das Glas ist halb leer.\"
    Der Ingenieur: \"Das Glas ist doppelt so groß wie es sein müßte.\"

Berechtigungen

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