Absender: Achim Pankalla
Datum: Mi, 08.11.2006 20:11:26
hallo,mir ist ein merkwuerdiges verhalten beim realen ct-bot mit Regler (SPEED_CONTROL_AVAILABLE) aufgefallen. ich denke, das das bei jeden bot auftreten muesste und waere dankbar, wenns mal jemand ausprobiert. es ist bei mir ganz einfach zu reproduzieren. man fährt einfach mit der taste 2 der fb ein stueck vor und laesst ihn dann auf der stelle mit zb. 4 oder 9 drehen. beim ersten drehen, wird der bot dann um ein rad herumfahren und nicht mit beiden raedern auf der stelle drehen. ersten beim zweiten mal drehen macht er dies. anders rum. dreht man erst den bot und faehrt dann vorwaerts, so faehrt der bot einen leichten bogen und beim zweiten mal gerade aus. ich habe etwas im code gewurstelt und denke es liegt an den variablen, die sich die letzten encoder impulse merken. ich habe ein patch beigefuegt, mit dem dies "fehl"-verhalten korregiert ist. es stellt für mich persoenlich keine optimale loesung da, zeigt aber wirkung. rein subjektiv ist das fahrverhalten nun genauer und mein getestetes solve_maze verhalten arbeitet nun zuverlaessiger.
allen weiterhin viel spass achim pankalla
### Eclipse Workspace Patch 1.0 #P ct-Bot Index: motor.c =================================================================== RCS file: /ctbot/ct-Bot/motor.c,v retrieving revision 1.12 diff -u -r1.12 motor.c --- motor.c 8 Jun 2006 16:36:39 -0000 1.12 +++ motor.c 8 Nov 2006 19:01:07 -0000 @@ -55,7 +55,7 @@ * Querkopplung der Motoren verbessert Gleichlauf, beispielsweise x*(sensEncL - sensEncR) * in jeden Regler einbauen */ - void speed_control(void){ + void speed_control(int8 com/*void*/){ int8 Kp=0; int8 Ki=0; @@ -73,6 +73,13 @@ int16 err=0; // aktuelle Abweichung vom Soll-Wert int16 encoderRate=0; // IST-Wert [Encoder-ticks/Aufruf] + if(com == 1){ //speed_control variablen loeschen + lastEncoderL=sensEncL; + lastErrL=last2ErrL=0; + lastEncoderR=sensEncR; + lastErrR=last2ErrR=0; + return; + } // Wir arbeiten mit verschiedenen PID-Parametern fuer verschiedene Geschwindigkeitsabschnitte if (encoderTargetRateL <= PID_LOW_RATE){ @@ -197,13 +204,20 @@ // Hier sitzt die eigentliche Regelung #ifdef SPEED_CONTROL_AVAILABLE if (timer_get_ms_since(old_mot_time_s,old_mot_time_ms) > SPEED_CONTROL_INTERVAL) { - speed_control(); + speed_control(0); old_mot_time_s= timer_get_s(); old_mot_time_ms= timer_get_ms(); } #endif return; // Keine Aenderung? Dann zuerueck } + + // Reglervariablen loeschen, wenn bot steht. + // Damit wird nachrucken, bei naechster Bewegung verhindert + #ifdef SPEED_CONTROL_AVAILABLE + if(!speed_l && !speed_r) + speed_control(1); + #endif if (abs(left) > BOT_SPEED_MAX) // Nicht schneller fahren als moeglich speed_l = BOT_SPEED_MAX;