PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mini Segway via Encoder auf den Anfangsort zurückfahren?



vivaultra
15.06.2010, 10:08
Hallo Leute,
ich hab einen mini Segway gebaut, welcher mit Atmega8ern, Gyros und einem ACC sensor arbeitet. Daraus errechne ich einen Winkel. Wenn er gerade steht Winkel 0. Die Daten kann ich mir via XBEE modul an den PC senden lassen.
Desweiteren hab ich eine Variable 'Sollwinkel'. Wenn ich vorwärts fahren will gebe ich z.B. 1° vor. Dies versucht er dann zu halten und fährt dementsprechend vorwärts.
Aus Winkel und Sollwinkel werden mittels PID Regler die sollreaktion für die Motoren errechnet und via I2C dorthin versendet(8 Bit zahl; -127(rückwärts) bis 128(vorwärts))
Jetzt hab ich gestern noch kurzerhand die Encoder an die Hauptplatine, nicht Motorregler(da dies leider nicht ohne weiteres möglich war) angeschlossen.
Mein Ziel ist es, dass wenn ich gerade stehen will er immer wieder auf den Ursprungsort zurückfahren will. Er zählt auch schon ganz gut. Aber ich habe dabei folgendes Problem:
Und zwar ich habe via P/PD Regler probiert, dass er, wenn er vom Nullpunkt in die eine Richtung abweicht, den Sollwinkel etwas auf die andere Seite zu setzen. Dadurch kommt es ja leider zu einer sehr schnellen Winkeländerung für den PID regler, der die Motorgeschwindigkeit errechnet. Und er schaukelt sich auf, anstatt zu dämpfen. Damit fährt immer weiter vom urprung weg bis die Motoren auf max laufen und kippt dann um. Hat jemand von euch eine bessere idee, anstatt mit dem sollwinkel zu arbeiten? Oder kennt jemand von euch ein projekt, wo dies schoneinmal gemacht wurde??

vielen dank

Andi

mare_crisium
17.06.2010, 06:45
vivaultra,

meiner Meinung nach wäre eine Kaskadenregelung das beste Mittel, um Dein Ziel zu erreichen: Du baust einen zusätzlichen PI-Regler ein, dessen Stellgrösse den Sollwert des vorhandenen Reglers einstellt (Stellbereich -128 bis +127). Der Sollwert des neuen Reglers ist immer Null, der Istwert wird mit der Vorgabe vom PC verbunden; allerdings muss vorher das Vorzeichen der Vorgabe umgekehrt werden. Wenn Du die Vorgabe erhöhst, dann wird der Istwert des neuen Reglers negativer. Sein Stellsignal wird positiver und der vorhandene Regler lässt Dein Fahrzeug schneller vorwärts fahren. Der neue Regler ist also ein Geschwindigkeitsregler. Mit seinen Parametern kannst Du einstellen, wie schnell er auf Änderungen der Vorgabe reagiert. Wenn Du ihn als reinen I-Regler einstellst, verändert sich seine Stellgrösse (d.h. der Sollwert des vorhandenen Reglers) wie eine Rampe. Der vorhandene Regler schaukelt sich nicht mehr auf, weil er nur noch allmähliche Sollwertveränderungen bekommt ;-).

Ciao,

mare_crisium

oberallgeier
17.06.2010, 08:46
Hi vivaultra,

willkommen im Forum. Also ich weiß, dass (m)ein balancierender Roboter (noch) kein Segway ist, weil der nur die Balance hält und nicht auch noch fahren muss. Vielleicht hilft Dir mein Ansatz (klick hier) (https://www.roboternetz.de/phpBB2/viewtopic.php?p=446953#446953&sid=425ccb0f244a64159035966f422014fd) trotzdem: dabei wird aber NUR balanciert, ohne Zusatzfahrt und ohne dass mein Fahrzeug zurück an den Ausgangspunkt muss/soll/fährt. Ansatz ist ein simpler Zweipunkt"reg ler" für die Geschwindigkeitsvorgabe. Die Geschwindigkeit selbst wird aber wie üblich geregelt (klick schon wieder) (https://www.roboternetz.de/phpBB2/viewtopic.php?p=437897&sid=8936eaf8ea4765d1cf9610a3c29f2294#437897), die Regelung war damals noch nicht befriedigend (https://www.roboternetz.de/phpBB2/viewtopic.php?p=435362&sid=8936eaf8ea4765d1cf9610a3c29f2294#435362) parameterisiert, sicherlich würde das mare_crisium mit seinen Rechenkünsten besser hinkriegen.

Wenn Dich Details interessieren bitte PN.

RP6conrad
31.07.2010, 21:00
Bei mein balance bot geht das wiederkeren ziemlich gut. Siehe mal video http://www.youtube.com/watch?v=a1EfgqLcNzc
Um den PWM-wert zu regelen nutze ich die summe von 4 factoren :
1. Winkel
2. Winkelgeschwindigkeit
3. Raddrehzahl
4. Position

void task_balance(void)
{
int16_t distance= (mleft_dist+mright_dist)/8;
if (distance>100) distance=100; //maximale correctie distance = 100*10/8=125 PWM
if (distance<-100) distance=-100; // komt overeen met 0.4*200= +/- 100 mm

speed= mleft_speed+mright_speed-des_speed; //max correctie = 180*10/4= 450 PWM, snelheid instellen
if(speed>5) sollwert++;
if(speed<-5)sollwert--; //offset correctie in geval van grote weerstand en hellingen
pwm=(sollwert-gyro_hoek)*P_balance/4+gyro_d*D_balance/64+distance*P_distance/8+speed*P_speed/4;//speed*P_speed/4;
offset=e_compass/4; //richting korrectie volgens e_compass
if(offset>max_offset) offset=max_offset; // begrenzing draaisnelheid
if(offset<-max_offset)offset=-max_offset;
pwm_L=pwm-offset; //offset voor draaien
pwm_R=pwm+offset;

if (pwm_L>10) pwm_L=pwm_L+100; //correctie aanloopkoppel min PWM = 120
if (pwm_L<-10) pwm_L=pwm_L-100;
//if((pwm_L<=15)&(pwm_L>=-105)) pwm_L=7*pwm_L;
if (pwm_R>10) pwm_R=pwm_R+100; //correctie aanloopkoppel min PWM = 120
if (pwm_R<-10) pwm_R=pwm_R-100;
//if((pwm_R<=15)&(pwm_R>=-15)) pwm_R=7*pwm_R;
setMotorPower(pwm_L,pwm_R); //offset voor draaien robot PWM-L -offset, R+offset

if((sollwert-gyro_hoek)>450) {setMotorPower(0,0);program=0;} //noodstop, robot is omgevallen
if((sollwert-gyro_hoek)<-450) {setMotorPower(0,0); program=0;}
}