PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kurven fahren (=> Feineinstellungen)



teamohnename
23.12.2011, 14:34
Hallo an alle,
wie kann man mit dem RP6 (über die M32 Platine als Master, aber das tut ja nichts zur Sache) mit einem Motor z.B. mit der Geschwindigkeit 100 vorwärts fahren und mit dem anderen Motor gleichzeitig mit der Geschwindigkeit 50 rückwärts fahren, sodass man also eine Kurve fährt?
Vielen Dank,
Viele Grüße und schon mal frohe Weihnachten
teamohnename

fulltime
23.12.2011, 16:11
Wieso willst du die eine Seite rückwärts fahren lassen? Es reicht doch die äußere Seite in der Kruve schneller zu machen.

Torrentula
23.12.2011, 16:35
Es reicht doch die äußere Seite in der Kruve schneller zu machen.

Eigentlich schon. Dasselbe Fahrgestell verwende ich auch und bei mir muss die eine Seite deutlich schneller sein damit er eine ausreichend enge kurve fährt. Wenn dein Code z.B. so aussähe (8bit PWM): MotorRechts = 100 MotorLinks = 50 wird sich da kaum was tun (zummindest war es bei mir so) deshalb bin ich dann auch dazu übergegangen eine rückwarts laufen zu lassen.

Allerdings muss man aufpassen, dass man nicht erst die linke Kette mit z.B. 50 rückwärts laufen lässt und wenn die Kurve zu Ende ist auf Vorwärtslauf umschaltet und gleich Vollgas (255) gibt, sonst gibts Probleme mit dem Motortreiber.

Ich kenne die Lib des RP6 jetzt nicht aber es müsste da eigentlich getrennte Funktionen zum Einstellen der Laufrichtung jedes Motors geben.

MfG

Torrentula

teamohnename
23.12.2011, 16:42
Wenn man eine vorwärts und eine rückwärts fahren lässt, werden die Kurven eben noch enger, als wenn man eine aus und eine voll vorwärts laufen lässt.
Meine Frage war nun, wie man das macht.
Ich habe einen Wallfollower Algorithmus, der mir zum Schluss zwei Variablen von jeweils -200 bis 200 ausgibt, dann für jeden Motor eben eine. Wenn ich in moveAtSpeed -200 eingebe, fährt er mit 200 vorwärts. Manchmal ist es eben so, dass eine Variable im Bereich >0 und eine <0 ist. Deshalb muss ich es irgendwie hinkriegen, dass ich gleichzeitig einen Motor vorwärts und einen gleichzeitig rückwärts laufen lassen kann.
Wie machst Du das denn, Torrentula? Könntest Du eventuell einen Codeausschnitt posten? Oder verwendest Du gar nicht die original RP6 Platine, sondern wirklich nur das Gestell?
Danke!

Torrentula
23.12.2011, 16:47
Ich verwende nur das Fahrgestell, deshalb kann ich auch keinen Code posten :(

Ich bin aber trotzdem der festen Überzeugung, dass man beide Motoren getrennt voneinander laufen lassen kann, da genau das ja der große Vorteil von Kettenfahrzeugen ist, der kleine Wendekreis.
Es gibt bestimmt einen RP6 Besitzer der dir genau sagen kann, welche Funktion das ist.

Allerdings hast du mein Interesse and dem Wall-follower Algorithmus geweckt :). Benutzt du den RP6 um aus einem Labyrinth zu kommen also einen "Left hand on the wall"-Algorithmus?

MfG

Torrentula

teamohnename
23.12.2011, 17:00
Genau. Ich habe zwei Sharp IR Entfernungssensoren und habe den Code hier in C umgeschrieben:
http://www.hitechnic.com/blog/eopd-sensor/wallbot-nxc-version/
Wir werden mit dem Roboter beim RoboCup Junior Rescue B mitmachen.

EDIT: Oder ich frage mal anders: Gibt es eine Funktion, mit der man einen Motor einzeln steuern kann? Also einen Motor sagen, welche Geschwindigkeit und ob FWD oder BWD?

radbruch
23.12.2011, 19:03
Hallo

move() kennt nicht nur FWD und BWD sondern auch LEFT und RIGHT:

//Direction:
#define FWD 0
#define BWD 1
#define LEFT 2
#define RIGHT 3

Gefolgt von einem MoveAtSpeed() drehen dann die Antriebe in unterschiedlichen Richtungen mit unterschiedlichen Drehzahlen. Ist aber ungetestet. Move und MoveAtSpeed sind ja schon im orginalen Slaveprogramm definiert:

// Commands:
#define CMD_POWER_OFF 0
#define CMD_POWER_ON 1
#define CMD_CONFIG 2
#define CMD_SETLEDS 3
#define CMD_STOP 4
#define CMD_MOVE_AT_SPEED 5
#define CMD_CHANGE_DIR 6
#define CMD_MOVE 7
#define CMD_ROTATE 8
#define CMD_SET_ACS_POWER 9
#define CMD_SEND_RC5 10
#define CMD_SET_WDT 11
#define CMD_SET_WDT_RQ 12


Beispiele:

// weite Kurve:
Move(100, FWD, 1000, 0);
MoveAtSpeed(100,200);
while(1) task_RP6System();

// Pirouette:
Move(100, LEFT, 1000, 0);
MoveAtSpeed(150,200);
while(1) task_RP6System();

Passt auch gut zumThema:
https://www.roboternetz.de/community/threads/55202-RP6-Ein-Motor-rückwärts?


Gruß

mic

teamohnename
23.12.2011, 19:09
SUPER, funktioniert! Ich habe statt move aber changeDirection verwendet.
Vielen Dank!

EDIT: Leider doch nicht so ganz wie gewünscht. Für jedes RIGHT oder LEFT braucht der Roboter eine kurze Zeit zum Umschalten. Das geht natürlich nicht.
Werde ich die Lib doch umschreiben müssen?