|
 |
 |
 |
|
|
c't Projekte - c't-Bot und c't-Sim -
Mailinglisten
[Voriger (Datum)]
[Nächster (Datum)]
[Voriger (Thread)]
[Nächster (Thread)]
[Nach Datum][Nach Thread]
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;
|
|
|