-
        

Ergebnis 1 bis 4 von 4

Thema: Mini Segway via Encoder auf den Anfangsort zurückfahren?

  1. #1

    Mini Segway via Encoder auf den Anfangsort zurückfahren?

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    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

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2005
    Beiträge
    535
    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

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551
    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) 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"regler" für die Geschwindigkeitsvorgabe. Die Geschwindigkeit selbst wird aber wie üblich geregelt (klick schon wieder), die Regelung war damals noch nicht befriedigend parameterisiert, sicherlich würde das mare_crisium mit seinen Rechenkünsten besser hinkriegen.

    Wenn Dich Details interessieren bitte PN.
    Ciao sagt der JoeamBerg

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    375
    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
    Code:
    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;}		
    }

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •