PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : rotation fehler



Martin.
28.12.2007, 18:26
Hallo,

mein RP6 ist ziemlich neu. Ich versuch zur Zeit Hindernisse zu erkennen und auszuweichen. Ich hab mir die Beispiele (vor allem MOVE_05) genau angeschaut und hab nach demselben Prinzip ein Alogirthmus zum ausweichen geschrieben. Der roboter sollte dabei, falls Bumper/ACS ein Hindernis melden, ein Stück zurückfahren,sich um einen bestimmten Winkel drehen, ein stück vorfahren und sich dann um denselben Winkel entgegengesetzt drehen. Er sollte dann gerade aus weiter, nur parallel verstetzt am Hindernis vorbeifahren. Des sollte ja nicht so schwer sein.


moveAtSpeed(0,0); //Bremsen
move(BWD_SPEED_FASTER, BWD, DIST_MM(RANGE), BLOCKING); //zurückfahren
rotate(BWD_SPEED_SLOWER, RIGHT, 30, BLOCKING); //Drehen
move(BWD_SPEED_FASTER, FWD, DIST_MM(RANGE*2), BLOCKING);//Vorwärts (am Hindernis vorbei) fahren
rotate(BWD_SPEED_SLOWER, LEFT, 30, BLOCKING); //zurückdrehen
//dann geradeaus weiter


Das erste mal dreht er sich richtig, doch beim zweiten Mal, hält er in der gewünschten Position kurz inne, und dreht sich dann ungewollt weiter (um welchen Winkel hab ich noch nicht herausgefunden). Nachdem ROTATE sonst immer funktioniert, denk ich mal, dass es kein Hardwarefehler ist. Aber wo hab ich einen Fehler gemacht?

SlyD
28.12.2007, 19:42
Hallo Martin,



(um welchen Winkel hab ich noch nicht herausgefunden).


Sind es weniger als 10°?
Die RP6Lib versucht den Roboter kurz bevor die gewünschte Distanz (bzw. Winkel) erreicht wurde abzubremsen. Es könnte sein, dass in diesem Fall das abbremsen etwas zu stark oder schnell passiert und dann die Geschwindigkeitsregelung die Motorleistung zu stark reduziert und die Bewegung so unterbrochen wird.
Das ist auch ein wenig von der Geschwindigkeit, Gewicht, Untergrund etc. abhängig - es wäre noch interresant welche Werte Du für BWD_SPEED_FASTER und BWD_SPEED_SLOWER bisher getestet hast.
Teste es auch mal mit anderen Werten!

Du könntest mal probeweise in der Datei "RP6RobotBaseLib" die Zeilen 616
if(mleft_des_speed < 22) mleft_des_speed = 22;
und 630
if(mright_des_speed < 22) mright_des_speed = 22;

in
if(mleft_des_speed < 30) mleft_des_speed = 30;
und
if(mright_des_speed < 30) mright_des_speed = 30;

ändern (Werte bis 40 kannst Du auch ausprobieren).
Die Zeilennummern gelten für die aktuellste Version der RP6Lib. Diese beiden Zeilen befinden sich in der Funktion "task_motionControl".

Abspeichern und Make clean und make all nicht vergessen!

MfG,
SlyD

Stratege993
28.12.2007, 20:41
Ich klaube ich habe den Fehler,
du sagst den Robby am Ende bestimmt, dass er weiterfahren soll, nämlich mit den Befehl: moveAtSpeed (100,100)
Leider ist noch eingestellt, durch den Vorigen Dreh-befehl, dass die linke Kette rückwärts und die rechte Vorwärts läuft. Das heist das er sich weiterdreht. Um beide Motoren vorwärtsfahren zu lassen musst du noch den Befehl
changeDirection (FWD); hinzufügen.
Also muss es am Ende so aussehen:

moveAtSpeed(0,0); //Bremsen
move(BWD_SPEED_FASTER, BWD, DIST_MM(RANGE), BLOCKING); //zurückfahren
rotate(BWD_SPEED_SLOWER, RIGHT, 30, BLOCKING); //Drehen
move(BWD_SPEED_FASTER, FWD, DIST_MM(RANGE*2), BLOCKING);//Vorwärts (am Hindernis vorbei) fahren
rotate(BWD_SPEED_SLOWER, LEFT, 30, BLOCKING); //zurückdrehen
//dann geradeaus weiter
changeDirection (FWD); //beide Ketten auf vorwärts
moveAtSpeed (100,100); //weiterfahren

Ich hoffe das ich dir helfen konnte,
Stratege993

p.s. Die Rechtschreibfehler einfach ignorieren, habe grade kaum Zeit

SlyD
28.12.2007, 20:45
Oh ;) - klar - wenn der Winkel deutlich größer als 10° sein sollte, ist das was Stratege993 sagt wohl der Grund ;)

Martin.
28.12.2007, 22:55
Hey danke. Das war wirklich der Fehler. Ich hab jetzt "changeDirection" berücksichtigt und es funktioniert ohne probleme.

Vielen dank!

roboterheld
29.12.2007, 10:03
.....changeDirection (FWD);....


warum wir hier die einfachste logik übersehen.
intensiver lesen, sich mehr mit dem programm auseinandersetzen.

es soll alles schnell gehen....dies...das...usw.
daran erkennt man das die programme nicht durchdacht werden und sich mit dem problem nicht auseinandersetzt wird. ich habe das gefülhl, das der rp6 mit einem ferngelenkten rc-auto verwechselt wird, vom vernünfigen proggen will keiner was wissen. schade eigentlich.

mfg
copy/paste

Martin.
29.12.2007, 10:24
Ich programmiere seit Jahren. Erst in TurboPascal dann in Delphi und seitdem in C++. Dabei war mein Lieblingsgebiet IndyClients. Ich habe mich sehr lange mit dem Fischertechnik Interface beschäftigt und bin deshalb der Robotik nicht sooo fern. Copy und Paste ist bei mir nicht das Programm, sondern eher nervige Forenuser auf die Ignorierliste setzen.

Es mag ja eine Anfängerfrage sein, aber das hier ist ja immerhin auch kein Forum nur für Profis.

roboterheld
29.12.2007, 18:46
....Fischertechnik Interface beschäftigt .....

ist mit dem atmega und deren programmverhalten nicht zu vergleichen.

mit dem interface von fischertechnik konnte man nur über die parallele schnittstelle arbeiten und eine handvoll logo-ähnlichen befehlen das ausführen beibringen.

carlitoco
29.12.2007, 21:14
hey habe da ne ähnlich frage!
undzwar soll der roboter 2m vorwärts fahren sich um 90° deren 10cm fahren, sich um 90° derehen und dann wieder 2m forwärts auf mich zu... zu zeit färt er immer eine schleife die zwar auch ganz nett ist, aber nicht gewollt :)

#include "RP6RobotBaseLib.h"



#define MOVE_SPEED 110

#define TURN_SPEED 65



int main(void)

{

initRobotBase();



mSleep(2500);



powerON();



uint8_t move_count = 0;

uint8_t turn_direction = LEFT;



while(true)

{



move(MOVE_SPEED, FWD, DIST_MM(2000), BLOCKING);



rotate(TURN_SPEED, turn_direction, 101, BLOCKING);


move(MOVE_SPEED, FWD, DIST_MM(100), BLOCKING);

rotate(TURN_SPEED, turn_direction, 101, BLOCKING);

move(MOVE_SPEED, FWD, DIST_MM(2000), BLOCKING);


if(move_count =1 )

{

mSleep(1000);



rotate(TURN_SPEED, turn_direction, 103, BLOCKING);



if(turn_direction == LEFT)

turn_direction = RIGHT;

else

turn_direction = LEFT;


move(MOVE_SPEED, FWD, DIST_MM(100), BLOCKING);

rotate(TURN_SPEED, turn_direction, 101, BLOCKING);



if(turn_direction == LEFT)

turn_direction = RIGHT;

else

turn_direction = LEFT;


move_count = 0;

}

else

move_count++;

}

return 0;

}
zudem scheinen meine encoder noch nicht ganz perfekt zu sein, deshalb habe ich 101 als winkel angegeben, da er auf dielen fährt sollte er nicht zu sehr wegrutschen...
:) MfG carlitoco

roboterheld
30.12.2007, 15:34
...zu... zu zeit färt er immer eine schleife die zwar auch ganz nett ist, aber nicht gewollt....

ganz einfach. auf der hochachse rotieren lassen( eine kette vorwärts und eine kette rückwärts)

carlitoco
30.12.2007, 16:38
macht er ja ! kannste ja mal ausprobieren !

MFG

carlitoco
30.12.2007, 17:10
hier noch ein blid zur verdeutlichung

carlitoco
30.12.2007, 17:30
Ok langsam habe auch es bergiffen - habe es viel zu kompliziert angestellt :) -so lernt man

#include "RP6RobotBaseLib.h"



#define MOVE_SPEED 110

#define TURN_SPEED 65



int main(void)

{

initRobotBase();



mSleep(2500);



powerON();



uint8_t move_count = 0;

uint8_t turn_direction = LEFT;



while(true)

{

move(MOVE_SPEED, FWD, DIST_MM(500), BLOCKING);

rotate(TURN_SPEED, turn_direction, 102, BLOCKING);

move(MOVE_SPEED, FWD, DIST_MM(100), BLOCKING);
rotate(TURN_SPEED, turn_direction, 102, BLOCKING);
move(MOVE_SPEED, FWD, DIST_MM(500), BLOCKING);

rotate(TURN_SPEED, RIGHT, 102, BLOCKING);
move(MOVE_SPEED, FWD, DIST_MM(100), BLOCKING);
rotate(TURN_SPEED, RIGHT, 102, BLOCKING);

}

return 0;

}

SlyD
30.12.2007, 17:33
Hallo carlitoco,

kompliziert ist ja nicht unbedingt schlimm - das trainiert ja auch ;)


Hier mal ein paar allgemeine Fehler in dem alten C Code von oben:

> if(move_count =1 )

In If Bedingungen musst Du immer == verwenden. Sonst wäre es eine normale Zuweisung und kein Vergleich!
Der Compiler meckert hier nicht, da das Ergebnis der kompletten Zuweisung ausgewertet wird (und das ist immer 1, also wahr).


Hier bin ich mir nicht sicher ob die Einrückung so gewollt ist oder ob das Forum das nur anders formatiert hat:


if(turn_direction == LEFT)
turn_direction = RIGHT;
else // { Soll der Code als ein Block ausgeführt werden??
turn_direction = LEFT;
move(MOVE_SPEED, FWD, DIST_MM(100), BLOCKING);
rotate(TURN_SPEED, turn_direction, 101, BLOCKING);
// }



aber mach mal lieber { Klammern } um den Code der bei if und else ausgeführt werden soll....
(Einfach nur einrücken reicht nicht sofern die drei Befehle nach dem else auch nur dann ausgeführt werden sollen wenn die Bedingung nicht erfüllt ist! )

Wenn Du Dir nicht 100%ig sicher bist wo Du Klammern weglassen kannst, mach lieber zwei Klammern zuviel als zuwenig :)

MfG,
SlyD

roboterheld
30.12.2007, 18:16
da ich meinen rp6 mit bascom laufen lasse, macht er was ich möchte ohne fehler.