Selbstfahrendes Modellauto - Logikfehler



  • Moin!

    Ich nehme derzeit an einem Projekt teil, indem es darum geht eine selbstfahrendes Auto (für einen Parkour) zu programmieren.

    Leider ist in meinem Code ein Fehler, doch ich verstehe nicht warum dieser passiert. Hierbei hätte ich gerne eure Hilfe, damit ich ihn selbst beheben kann.

    Zum Verständnis, mit der Routine Servoberechnung wird nach einer von einem Professor vorgegebenen Formel der Servovert (also das Einlenken des Autos) berechnet. -10 heißt ganz links und 10 ganz rechts. Durch das Invertieren der Variable m1 wird die gesamte Formel wertmäßig umgedreht und somit das Auto von der ursprünglichen Linksorientierung (negatives Vorzeichen) zur Rechtsorientierung (positives Vorzeichen) und wieder zurück.

    abstandlinks, abstandrechts und abstandvorne geben die Distanz des Autos zu einem möglichen Hinderniss der entsprechenden Seite in cm an.

    Nun zum Problem an sich. Das Auto fährt in einem Gang los, muss also nur geradeaus fahren. Dabei schlingert es jedoch zwischen der linken und rechten Seite hin und her und färt letzten Endes frontal gegen die rechte Wand.

    Durch den Einsatz von Lampen habe ich herausgefunden, dass das Programm immer wieder in die Routine springt, wo auf Rechtsorientierung umgestellt wird. Warum dies geschieht, kann ich mir nicht erklären. Die in der if-Anweisungen angegebenen Bedingungen sind eigentlich nicht erfüllt.

    Ich vermute daher einen Logikfehler und bitte um eure Hilfe. Langsam drängt die Zeit.

    #include <avr/io.h>
    #include <string.h>
    #include <stdlib.h>
    
    #include "uart.h"
    #include "adc.h"
    #include "global.h"
    #include "zyklus.h"
    #include "myFunktions.h"
    #include "df.h"
    #include "cc-lib.h"
    
    int servoberechnung()
    {	
    	int servowert = 0;
    
    	if (m1 = 45)
    	{
    		e = abstandrechts - sollwert;
    		ledPB1(1);
    	}
    	else
    	{
    		e = abstandlinks - sollwert;
    		ledPB1(0);
    	}
    
    	servowert = (m1*e)/m2;	//Idealwert durch Funktion ermitteln
    
    	return servowert;
    }
    
    void fahren1(void)
    {
    	//Meine Fahrroutine :))))))))))
    	//Linksorientiert!!!	
    
    	if (abstandvorne > 25) //Wenn kein Hinderniss unmittelbar in Sicht
    	{
    		if (abstandvorne > 130)	//Wenn kein Hindernis zu sehen
    		{
    			fahr(40);
    			servo(servoberechnung());
    
    			if (abstandlinks < 60)	//Wenn die große Kurve und der große Freiraum überwunden wurden, stelle wieder auf linksorientiert um
    			{
    				m1 = -45;
    			}
    
    		}
    		else if (abstandlinks < 60 && abstandrechts > 100)	//Vorne und linke Bande blockiert, aber rechts frei
    		{
    			fahr(30);
    			m1 = 45;	//UMSTELLUNG AUF RECHTSORIENTIERUNG, DURCH INVERTIERUNG DER SERVOBERCHNUNGSVARIABLE
    			servo(servoberechnung());
    		}
    		else	//Wenn Hinderniss vorne in Sicht, bremse ab und halte dich links
    		{
    			fahr(25);
    
    			if (m1 = 45)	//Wenn Rechtsorientiert, biege links ab wenn Hindernis voraus. Mit Servoberechnung würde er rechts abbiegen und so gegen die Wand fahren
    			{
    				if (abstandvorne < 40)
    				{
    					servo(-10);	//Fahre Links
    				}
    			}
    			else	//Wenn Linksorientiert nutze normal die Servoberechnung
    			{
    				servo(servoberechnung());
    			}
    		}
    
    	}
    	else	//Wenn Hinderniss vorne unmittelbar in Sicht, Vollbremsung					ACHTUNG!!!! DIE SEITEN BEIM ZURÜCK FAHREN SIND GLAUBE ICH VERTAUSCHT, DURCH FALSCHE TESTSTRECKE 31.05.2015
    	{	//ZU TUN!!!!!!		Rückwärtsprüfung auch für diagonale Hindernisse!!!!
    
    		//DIES MUSS AUSGEFÜHRT WERDEN BIS DAS RÜCKWÄRTSFAHREN ABGESCHLOSSEN IST!!!!
    
    		if (abstandvorne < 17)	//Vor Auto ist ein Hinderniss
    		{
    			if (abstandrechts > 13)	//Wenn rechts Platz ist
    			{
    				servo(-10);
    				fahr(-25);
    
    			}
    			else if (abstandlinks > 13)	//Wenn links Platz ist
    			{
    				servo(10);
    				fahr(-25);
    			}
    			else	//Wenn auf beiden Seiten kein Platz ist
    			{
    				servo(0);
    				fahr(-25);
    
    			}
    
    		}
    	}
    }
    

    Danke!


  • Mod

    Da fällt erst einmal auf, dass du if-Schleifen benutzt und teilweise Zuweisungen hast, wo vermutlich Vergleiche angebracht wären.



  • Darf ich deine Antwort als reine Ironie verstehen?

    Streng genommen sind if-Anweisungen weder Schleifen noch Abfragen, sondern Verzweigungen.

    Falls deine Antwort keine pure Ironie war, so verstehe ich nicht worauf du hinaus möchtest. Bitte erklären.



  • Du selbst hast den Begriff 'if-Schleife' verwendet. Konzentriere dich lieber auf den zweiten Teil von Sepps Antwort und schau dir deine Bedingungen in deinen ifs mal genau an.



  • Aktivier die Warnungen in Deinem Compiler!

    Hier z.B. sollte eine Warnung kommen. Siehst Du warum?

    #include <iostream>
    
    int main() {
      int i=0;
      if(i=42)
        std::cout << "komich...";
      std::cout << i << "?!\n";
    }
    


  • Ah, danke.

    Ich habe aufgrund des vorderen Teils der Antwort die ganze Antwort als Ironie gewertet.

    Dann habe ich mich in meinem ersten Post verschrieben - danke für den Hinweis.
    Das korrigiere ich gleich.

    In zweien der if-Anweisungen habe ich stat zwei Gleichheitszeichen nur eines geschrieben. Das korrigiere ich gleich.

    Fällt euch sonst noch etwas auf?
    Ich kann alle Änderungen erst am Montag testen, da ich erst dann wieder Zugang zum Auto und zur Teststrecke habe.



  • Nowaepon schrieb:

    In zweien der if-Anweisungen habe ich stat zwei Gleichheitszeichen nur eines geschrieben. Das korrigiere ich gleich.

    Fällt euch sonst noch etwas auf?

    Mit einem Gelichheitszeichen ist das eine Zuweisung. Die Variable hat dann den Wert, auf den du eigentlicch testen wolltest.
    Das deckt sich doch ganz gut mit deiner Fehlerbeschreibung.

    Schalte den Warnlevel vom Compiler auf Maximum und beachte die Warnungen die dann kommen.
    Behandele diese wie Fehler und beseitige deren Ursache.

    So ein Fehler (nur ein Gleichheitszeichen bei if) erkennt der Compiler, wenn du ihn läßt.

    (Am Besten, du erhöhst den Warnlevel noch bevor du den Fehler beseitigst und schaust dir die Meldung mal an.)



  • Leider kann ich den Warnlevel nicht erhöhen, da es sich bei dem Compiler und ein Plugin für ProgrammersNotepad handelt. Dieses wurde uns ebenfalls vorgegeben und wenn ich da Hand anlege zerstöre ich bei meinem Wissensstand darüber wohl mehr, als ich ausbessern würde.
    Ich spreche aber den Professor mal darauf an, danke.


  • Mod

    Nowaepon schrieb:

    Leider kann ich den Warnlevel nicht erhöhen, da es sich bei dem Compiler und ein Plugin für ProgrammersNotepad handelt. Dieses wurde uns ebenfalls vorgegeben und wenn ich da Hand anlege zerstöre ich bei meinem Wissensstand darüber wohl mehr, als ich ausbessern würde.

    Faule Ausrede.



  • SeppJ schrieb:

    Nowaepon schrieb:

    Leider kann ich den Warnlevel nicht erhöhen, da es sich bei dem Compiler und ein Plugin für ProgrammersNotepad handelt. Dieses wurde uns ebenfalls vorgegeben und wenn ich da Hand anlege zerstöre ich bei meinem Wissensstand darüber wohl mehr, als ich ausbessern würde.

    Faule Ausrede.

    Leider nein.
    Dieses Projekt ist sehr wichtig.
    Das verhaue ich mir nicht, indem ich mir den Compiler zerschiesse.
    Da frage ich lieber den Professor.
    Wenn du sowas direkt beim ersten Mal kannst, ist das ja wunderbar.
    Ich kann es jedenfalls nicht.


  • Mod

    Ich verstehe nicht. Warnungen hindern niemanden daran etwas zu kompilieren, wenn -Werror nicht ebenfalls angegeben wird. Im Zweifelsfall können Warnungen auch als TODO-Liste betrachtet werden, wobei ich diese unmittelbar erledigen würde.



  • Es geht mir nicht um das Kompilieren als solches.
    Sondern um die Konfiguration des Copilers als solches (für einen höheren Warnlevel).


  • Mod

    Was zum Teufel soll denn da nicht klappen!? Einfach -Wall -Wextra mit angeben? Da geht genau gar nichts schief.

    Sorry, aber du bist einfach eine Pussy.



  • Grünschnabel halt. Kannste nichts machen.



  • Und wenn Nowaepon gar nicht auf seinem System arbeitet, sondern auf dem des "Professors"?



  • Arcoth schrieb:

    Sorry, aber du bist einfach eine Pussy.

    Sowas von einem Moderator... 👍 Traurig, Arcoth!

    Ich finde, dass seine Aussage legitim ist.



  • theliquidwave schrieb:

    Arcoth schrieb:

    Sorry, aber du bist einfach eine Pussy.

    Sowas von einem Moderator... 👍 Traurig, Arcoth!

    Dem kann ich mich nur anschließen.
    Beleidigend zu werden hilft niemandem.
    Das zeugt nur von mangelnder Reife.
    Und dabei bist du wahrscheinlich älter als ich.

    Ich bin halt noch unerfahren. Dazu stehe ich auch.
    Ich lerne gerne Neues. Aber wenn so viel auf dem Spiel steht wie hier und die Zeit nunmal sehr knapp bemessen ist, lasse ich (gerade als "Grünschnabel") die Finger davon!
    Hier geht es um einen Teil meines Abschlusses und den werde ich mir gewiss nicht verhauen, nur weil ich beim umstellen des Compilers Mist baue.
    Zudem weist du ja noch nicht einmal was für ein Compiler da benutzt wird (es wird nämlich der Compiler eines anderen Programmes benutzt!) und folglich kann es da leicht zu Komplikationen kommen.


  • Mod

    theliquidwave schrieb:

    Sowas von einem Moderator... 👍 Traurig, Arcoth!

    Nö, finde ich nicht. :p

    Und dabei bist du wahrscheinlich älter als ich.

    Wahrscheinlich nicht, und wenn dann nicht mehr als ein, zwei Jahre. Ich schaff's schon irgendwie meine Unreifheiten zu kompensieren.
    Ich finde es jedoch nicht unreif dich als Angsthasten zu bezeichnen, ich hatte eher gehofft es würde eine Trotzreaktion provozieren. 🙂

    Ist die IDE so undurchdringbar strukturiert dass solche Änderungen einen Bluescreen auslösen können?

    Aber wenn so viel auf dem Spiel steht wie hier und die Zeit nunmal sehr knapp bemessen ist, lasse ich (gerade als "Grünschnabel") die Finger davon!

    Ich habe bereits erwähnt, dass man da wirklich nicht viel falsch machen kann. Das Plugin wird Einstellungen haben: Du schaust wo dort entweder Warnungen, Flags, Optionen etc. angegeben werden können.

    Zudem weist du ja noch nicht einmal was für ein Compiler da benutzt wird (es wird nämlich der Compiler eines anderen Programmes benutzt!) und folglich kann es da leicht zu Komplikationen kommen.

    Nein. Es gibt schlicht und einfach keine Komplikation. Wenn du eine Konfigurations-Änderung ausprobierst und es 'nicht klappt', nimmst du einfach den letzten Schritt zurück.
    Probier' nach diesem Schema rum. Falls es gar nicht klappen will, wäre ich sogar bereit mir das Programm und das Plugin zu holen, nur um dir einen Gefallen zu tun. Bin ich nett, was? 🕶

    Na gut, wenn du's lassen willst, lass es. Es hilft schließlich nur dir.



  • Tja, mit Beleidigungen löst man bei mir nur Abneigung aus.

    Hier ein Foto des Plugins:
    https://www.mediafire.com/convkey/894e/6c9mjlu7dlgx7vc6g.jpg

    Da gibt es keine Einstellungsmöglichkeiten. Der Punkt "Options" ist nur für die Standardeinstellungen des Hauptprogrammes.
    Ich glaube auch nicht, dass du dir die IDE mit Plugin so einfach besorgen kannst.
    Wir haben diese als fertige Datei von besagtem Professor bekommen und dieser hat das Plugin meines Wissens selbst entwickelt.

    Im Programm WinAVR selbst kann man auch nicht umstellen.
    Und wo man nix einfach per Option umstellen kann, muss man in den Code eingreifen. Und ab diesem Punkt wird es gefährlich. 😮



  • mal bei
    tools -> option (-> iwas in richtung compiler)
    geguckt?



  • Zeig mal bitte in "Options" den Menüpunkt "Tools". BTW, der Compiler und die IDE gibts hier: https://sourceforge.net/projects/winavr/files/


Anmelden zum Antworten