- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 13

Thema: RP6 Neuling erste Fragen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    13.09.2014
    Beiträge
    23

    RP6 Neuling erste Fragen

    Guten Tag,
    ich bin neu hier im Forum, erst mal was zu mir bin Stephan, 24 Jahre und gelernter Mechatroniker. Mit dem Programmieren hatte ich bisher nicht wirklich viel zu tun, also kompletter Neuling.
    Da ich Interesse an Robotik und dem Programmieren habe und bei Conrad großen gefallen an dem RP6 gefunden habe, habe ich mir diesen mal bestellt. Nun habe ich mir erst mal die Anleitung durchgelesen und mir die ersten Beispiel Programme angesehen. Die Grundfunktionen sind mit soweit erst mal kla und ich habe schon kleine Programme geschrieben (LEDs ansteuern, Bumper und ACS auswerten, bestimmte wege/ winkel fahren) das funktioniert schon mal relativ gut. Nun bin ich bei dem Beispiel Move 04 angekommen und da gibt es so die ersten Verständnis Probleme.

    1. ich verstehe die Funktion blocking nicht richtig.
    wenn blocking true ist wird so lange gefahren bis der weg abgefahren ist, es kann nicht z.B. auf die Bumper reagiert werden
    wenn blocking false ist kann während er fährt z.B. auf Bumper reagiert werden und das Programm Fahren verlassen werden
    Ist das so richtig oder habe ich das Falsch verstanden?


    2. dann verstehe ich Folgenden Abschnitt nicht:

    Code:
    void moveCommand(behaviour_command_t * cmd)
    {
    	if(cmd->move_value > 0)
    	{
    		if(cmd->rotate) 
    			rotate(cmd->speed_left, cmd->dir, cmd->move_value, false); 
    		else if(cmd->move) 
    			move(cmd->speed_left, cmd->dir, DIST_MM(cmd->move_value), false); 
    		cmd->move_value = 0; 
    	}
    	else if(!(cmd->move || cmd->rotate)) 
    	{
    		changeDirection(cmd->dir);
    		moveAtSpeed(cmd->speed_left,cmd->speed_right);
    	}
    	else if(isMovementComplete())
    	{
    		cmd->rotate = false;
    		cmd->move = false;
    	}
    }
    
    behaviour_command_t STOP = {0, 0, FWD, false, false, 0, IDLE};
    
    void behaviourController(void)
    {
    	behaviour_cruise();
    	behaviour_escape();
    
    	if(escape.state != IDLE)
    		moveCommand(&escape);
    	else if(cruise.state != IDLE)
    		moveCommand(&cruise); 
    	else                   
    		moveCommand(&STOP); 
    }
    Was bedeutet hier das cmd? Und was wird in diesem abschnitt genau gemacht/ festgelegt? Der Rest ist mir soweit ganz kla.

    Danke schon mal im Voraus
    MfG

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Thorben W
    Registriert seit
    17.02.2012
    Ort
    Niedersachsen
    Beiträge
    108
    @StGla90: bei Blocking kann ich dir leider nicht helfen
    cmd ist ein struckt (eine Struktur) nach dem Muster behaviour_command_t
    Der Abschnitt übergibt die Fahrbefehle. Liest sie aus dem Struckt cmd aus und übergibt sie an die Funktionen, die die Motoren ansprechen. behaviourController übergibt übergibt moveCommand die struckt, entweder escape wenn kollison erfolgt ist oder cruise wenn gefahren werden darf und sonst stop

    Ich hoffe ich konnte dir helfen.

    Thorben

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hi,

    zu 1.
    Beim "blocking" geht es darum, ob die Funktion (z.B. rotate) sofort verlassen wird (blocking = false) oder erst dann, wenn die jeweilige Bewegung beendet ist (blocking = true).

    Ob z.B. Bumper gleichzeitig ausgewertet werden können, hängt davon ab, wie man den Rest des Programms gestaltet.
    Auf jeden Fall muss man entscheiden, ob das eigene Programm in einer Funktion (z.B. rotate) hängen bleiben darf, bis der Befehl abgearbeitet ist, oder ob man während der Bewegung noch etwas anderes machen muss.
    Gruß
    Dirk

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    13.09.2014
    Beiträge
    23
    Danke erst mal für die Antworten.
    ich kann jetzt soweit nachvollziehen wie das funktioniert. Ich hoffe mein Gedankengang ist so richtig:
    Also wird jetzt in dem "behaviourController" abgefragt ob cruise oder escape aktiv ist? Wenn jetzt z.B. escape (wenn bumper gedrückt wird) aktiv ist ist, wird in der Funktion "moveCommand(behaviour_command_t * cmd)" im Prinzip escape eingesetzt also das sieht dann für mich gedanklich so aus: "moveCommand(escape)".

    Wenn ich jetzt die Situation habe das beide Bumper gedrückt werden:
    1. in dem behaviour_escape startet die Funktion ESCAPE_FRONT_START, hier werden die werte für Geschwindigkeit, Richtung etc. festgelegt und in der typdef Struct "eingetragen".
    2. da ja in dem Fall "moveCommand(escape)" aktiv ist und in ESCAPE_FRONT_START die entsprechenden werte Festgelegt sind kann die Funktion "moveCommand" hier die werte auslesen und in
    die bekannte Funktion "move" einsetzen, es wird gefahren.

    Habe ich das bis dahin richtig verstanden?

    1.Jetzt gab es aber doch noch Fragen:
    Wenn jetzt move und rotate aktiv waren soll er ja wieder gerade aus fahren, das heißt "else if(!(cmd->move || cmd->rotate))" ist ja gegeben wenn move bzw. rotate fertig ausgeführt wurde(da diese ja nach Ausführung auf false gesetzt werden) also wird "MoveAtSpeed" aktiv gleichzeitig wird ja auch die Funktion cruise aktiv (da escape NICHT != IDLE ist) und die werte werden dann ja von "moveCommand(cruise)" aus "behaviour_command_t cruise" ausgelesen.

    --> Ist da nicht die Funktion "else if(!(cmd->move || cmd->rotate))" überflüssig?

    2. Dann nochmal zur Funktion cmd --> cmd ist also einfach eine Funktion um Daten auszulesen? In dem fall aus der vorher definierten typdef struct? Konnte zu cmd nichts in der Anleitung finden.

    Ich hoffe ihr könnt das so nachvollziehen wie ich es geschrieben habe.
    Danke im voraus

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Zu 2.
    cmd (als Abkürzung für command) ist eine komplexe Variable vom Typ behaviour_command_t, der im Programm als struct so definiert ist, dass cmd aus einem "Satz" von Variablen besteht, die zusammen den "Befehl" (und gleichzeitig auch den Status) für die Bewegungen darstellen. Da drin sind move und rotate Einzelbits (flags).
    Da das ganze Programm recht schnell durchlaufen wird, kommt es an die Abfrage "if(!(cmd->move || cmd->rotate))" öfter, bevor die Bewegung abgeschlossen ist. Damit ist diese Abfrage natürlich erforderlich, damit nicht VOR Ablauf einer move oder rotate Bewegung ein anderer Fahrbefehl (moveAtSpeed) oder eine Änderung der Bewegungsrichtung (changeDirection) erlaubt wird.
    Letztlich wird danach erst dann, wenn die move/rotate Bewegung abgeschlossen ist (isMovementComplete()), das move- und rotate- Flag im cmd struct gelöscht.
    Danach sind dann auch wieder Änderungen der Bewegungsrichtung oder Geradeausfahrten möglich.
    Gruß
    Dirk

Ähnliche Themen

  1. C Neuling - erste Frage
    Von Blue72 im Forum C - Programmierung (GCC u.a.)
    Antworten: 16
    Letzter Beitrag: 19.02.2013, 19:23
  2. Neuling fragen zum Setup
    Von tils09 im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 2
    Letzter Beitrag: 05.08.2011, 19:09
  3. Pro Bot 128 Neuling bräuchte Hilfe für erste Schritte.
    Von muntz im Forum Sonstige Roboter- und artverwandte Modelle
    Antworten: 4
    Letzter Beitrag: 03.12.2009, 15:32
  4. Neuling hat Fragen zu den Ausgängen beim RP6!?!
    Von -andi_007- im Forum Robby RP6
    Antworten: 32
    Letzter Beitrag: 23.03.2008, 19:46
  5. Ein paar Fragen [Neuling]
    Von BlackFog im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 8
    Letzter Beitrag: 21.01.2008, 02:29

Berechtigungen

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

12V Akku bauen