Forum: Mikrocontroller und Digitale Elektronik PI-Regelschleife fuer Geschwindigkeiteit eines autonomen Roboters


von Claude J. (berus)


Angehängte Dateien:

Lesenswert?

Hallo an alle Beitragsleser,

ich moechte einen zweiraedigen autonomen Roboter bauen, der fuer jedes 
Rad einen eigenen Antrieb hat. Ich will dazu einen Arudino Micro oder 
Arduino Uno verwenden.

Da die beiden Raeder von jeweils einem Motor angetrieben werden, will 
ich mit einer PI-Rueckkopplung sicherstellen, dass diese beiden Raeder 
mit der gleichen Geschwindigkeit fahren, wenn der Roboter geradeaus 
fahren soll. Dafuer habe ich einen Code mit der Arduino-IDE geschrieben, 
den ich als notepad diesem Beitrag angehaengt habe.

Ich habe ihn erfolgreich debuggt, das heisst er ist frei von 
syntaktischen Fehlern. Aber ich bin mir nicht sicher, ob er auch 
semantisch richtig ist. Das heisst, ich weiss nicht, ob ich die 
PI-Regelung richtig implementiert habe. Koenntet ihr das bitte 
ueberpruefen. Ich habe den Code kommentiert.

Freundliche Gruesse,
Berus

von S. R. (svenska)


Lesenswert?

Das mag jetzt eine blöde Frage sein, aber warum willst du das überhaupt?

In unserem Roboterprojekt hatten wir Drehencoder an den Rädern, mit 
denen wir Odometrie (dead reckoning) gemacht hatten. Daraus ergab sich 
dann eine Position, und die haben wir geregelt. Schließlich war es uns 
doch scheißegal, wie die Motoren sich drehen - wichtig ist die Position.

von Claude J. (berus)


Lesenswert?

Wenn die Raeder an einer Achse befestigt sind und diese von einem Motor 
angetrieben wird, dann haben die beiden Raeder mit Sicherheit auch die 
gleiche Geschwindigkeit.

Wenn die beiden Raeder unabhaenig voneinander betrieben werden und sich 
der Roboter nach links dreht, dann dreht das rechte Rad schneller als 
das linke. Danach soll der Roboter wieder geradeaus fahren. Wie soll er 
das machen, wenn die Raeder unterschiedlich schnell drehen. Fuer soeinen 
Fall benoetigt man doch ein System, dass die beiden Raeder 
synchronisiert, oder etwa nicht?

Bitte berichtige mich, wenn ich falsch liege.

von Markus (Gast)


Lesenswert?

Claude J. schrieb:
> Wie soll er
> das machen, wenn die Raeder unterschiedlich schnell drehen. Fuer soeinen
> Fall benoetigt man doch ein System, dass die beiden Raeder
> synchronisiert, oder etwa nicht?

genau das will er doch machen.

von Jan H. (jan_h565)


Lesenswert?

Ich siehe in der code dass du keine encoder (pulse/umdrehung) doch einen 
tachogenerator (drehsgeschwindigkeit) verwendet. Damit werden die 
kleinste fehler von tacho /adc mit in die Regelung genommen. Auch ist 
die erzeugte Spannung von diese Tacho sehr niedrig bei kleine 
Drehzahlen. Eine identische Geschwindigkeit ueber das ganse 
Drehzahlbereich kannst du so nicht regelen. Selbst bei perfecte 
Kalibrierung und Code integrieren die Fehler sich. Besser fur eine 
Differential Robot sind wheelencoder. Diese geben X-pulse/umdrehung. 
Damit regelst dus Geschwindigkeit, aber auch odometrie ist dan moglich.

von Reinhard #. (gruebler)


Lesenswert?

S. R. schrieb:
> wichtig ist die Position.

Genau.
Annahme: Beide Antriebsmotoren haben exakt
die gleiche Drehzahl.
Dann läuft der Robi nur dann exakt geradeaus,
wenn alles ideal ist.
Gleicher Raddurchmesser
kein Schlupf der Räder
ebener Untergrund.

von Stefan F. (Gast)


Lesenswert?

Bei diesen Roboterprojekten geht es unter anderem darum, die Grenzen 
dieser Regelung zu erkennen. Schlupf ist jedenfalls der größte 
Störfaktor, wenn der Roboter keine weiteren Anhaltspunkte hat, als nur 
die beiden Odometrie Sensoren.

Spätestens wenn man Kurven fährt, beschleunigt und bremst, muss man 
berücksichtigen, wie gut die Räder am Boden haften. Leider ändert sich 
das je nach Boden und Verschmutzungsgrad. Zwei weitere Faktoren, für die 
man üblicherweise keine Sensoren hat.

Also wenn der Roboter nur mit Odometrie Sensoren vom Wohnzimmer aus ins 
Bad fährt, umdreht und dann in der Kühe vor dem Herd zum stehen kommt, 
kann man schon sehr zufrieden sein.

von Wolfgang (Gast)


Lesenswert?

Stefan U. schrieb:
> Zwei weitere Faktoren, für die man üblicherweise keine Sensoren hat.

Jede Maus auf dem Schreibtisch kann das und hat dafür einen Sensor. 
Unmöglich scheint es nicht zu sein ;-)

von vorticon (Gast)


Lesenswert?

Reinhard #. schrieb:
> Dann läuft der Robi nur dann exakt geradeaus,
> wenn alles ideal ist.

Stefan U. schrieb:
> Schlupf ist jedenfalls der größte
> Störfaktor, wenn der Roboter keine weiteren Anhaltspunkte hat, als nur
> die beiden Odometrie Sensoren.

Mag ja sein, dass alles irgendwo seine Grenzen hat, aber er hatte doch 
gefragt ob die Regelung korrekt implementiert ist. Aus meiner Sicht 
sollte die so funktionieren.

Jan H. schrieb:
> Selbst bei perfecte
> Kalibrierung und Code integrieren die Fehler sich.

Warum sollen sich die Fehler integrieren? Abweichungen der Sensoren 
fuehren zu Abweichungen der Raddrehzahlen, aber ueber die Zeit 
integrieren wird sich da nichts, denke ich. Und da der ADC immer der 
Gleiche ist, sind auch die ADC Fehler R/L gleich.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Wolfgang schrieb:
> Jede Maus auf dem Schreibtisch kann das und hat dafür einen Sensor.
> Unmöglich scheint es nicht zu sein ;-)

 Nein, Maus kann keine Drehung um die eigene Achse detektieren, nur
 die Bewegung. Für so etwas wären 2 Bewegungssensoren notwendig.

von Noch nicht Rentner (Gast)


Lesenswert?

Was spricht denn gegen einmal laufen lassen ? Das Wichtigste ist eine 
Debugschnittstelle, bei der man waehrend dem Betrieb Daten entnehmen 
kann, sich ueber die Parameter informieren, und Parameter aendern kann.
Dagegen ist ein kleiner Regler trivial. Schreib mal ein Interface, das 
ontarget Debugging ermoeglicht. Diesen muss natuerlich ins Konzept 
passen.

Es duerfte klar sein, dass mit Breakpoints nichts ist...

von Claude J. (berus)


Lesenswert?

Zuallererst fuer die vielen wohlgemeinten und konstruktiven Beitraege.

@svenska: dead reckoning/odometrie ist ein anderes Kapitel, dem ich mich 
spaeter widmen will.

@Jan Heynen: ich moechte je einen Wheelencoder an die Raeder befestigen. 
Diese liefern mir ein Spannungssignal, stellvertretend fuer die 
Radgeschwindigkeit, welches in einen Wert von 0 bis 1023 umwandelt. 
Dieses soll von dem PI-Regler verwendet werden, um die Geschwindigkeiten 
zu synchronisieren.

@Reinhard: Schlupf sollte fehlen, und die Raeder haben den gleichen 
Radius. Nur der Boden kann manchmal seine Oberflaechenbeschaffenheit 
aendern. Dies u.a. soll der PI-Regler ausgleichen.

@Stefanus: tatsaechlich geht es mir in erster Linie um die 
Synchronisation der beiden Raeder und nicht um Odometrie. Genau, und 
wenn Schlupf oder durch Schmutz oder eine eisige Oberflaeche entstehen 
sollte, dann soll das der PI-Regler kompensieren. Ehrlich gesagt, soll 
der Roboter mehr koennen als nur die paar Meter vom Wohnzimmer ins 
Badezimmer zu fahren. Er soll auch Hindernisse erkennen und umfahren 
bzw. nicht gegen etwas stossen.

@Wolfgang: da hat Wolfgang vermutlich Recht.

@vorticon: danke fuer die Beantwortung meiner Frage :). Bezueglich der 
Fehler wegen der ADC, denke ich genau so wie du. Aber das hast du mir 
erst begreiflich gemacht bzw. kam diese Angelegenheit als Problem fuer 
mich nicht in Betracht.

@Marc Vesely: leuchtet ein

@Noch nicht Rentner: warte gerade noch auf Bauteile. Deshalb habe ich es 
einfach noch nicht getestet. Und es ist mein erstes Arduino Projekt, 
deshalb wollte ich mal wissen, wie ich mich bei dem Programmcode fuer 
den PI-Regler angestellt habe. Bisher hatte ich meistens Denkfehler 
aufgrund von Verstaendnismaengeln bei solchen technischen Sachen. 
Deshalb bin ich davon ausgegangen, dass es wieder so ist.

Ok, vielen Dank an alle. Ich probier den Code aus sobald ich meine 
Bauteile habe.

Freundliche Gruesse,
Berus

von Jan H. (jan_h565)


Lesenswert?

vorticon schrieb:
>> Selbst bei perfecte
>> Kalibrierung und Code integrieren die Fehler sich.
>
> Warum sollen sich die Fehler integrieren? Abweichungen der Sensoren
> fuehren zu Abweichungen der Raddrehzahlen, aber ueber die Zeit
> integrieren wird sich da nichts, denke ich. Und da der ADC immer der
> Gleiche ist, sind auch die ADC Fehler R/L gleich.

Claude J. schrieb:
> @Reinhard: Schlupf sollte fehlen, und die Raeder haben den gleichen
> Radius. Nur der Boden kann manchmal seine Oberflaechenbeschaffenheit
> aendern. Dies u.a. soll der PI-Regler ausgleichen.

In beide fallen wiest der PI regler ueberhaupt nicht das eine Abweichung 
gibt ! Er bekommt nur die Werte aus den ADC von Geschwindigkeit von 
beide Motoren. Diese Werte hat eine Abweichung von Ist, und bei jedes 
neue Durchlauf wird diese "Integriert" für Position. Position ist der 
Integral von Geschwindigkeit ! Darum sind Wheelencoder besser geignet 
für Gerade Aus zu fahren. Um sie einen Idee zu geven welche Genauigkeit 
errreichbar ist siehe mal diese Video an (robot mit 
Wheelencoder):[link]https://www.youtube.com/watch?v=fp8s_tlwyIY[/link]

von vorticon (Gast)


Lesenswert?

Jan H. schrieb:
> In beide fallen wiest der PI regler ueberhaupt nicht das eine Abweichung
> gibt ! Er bekommt nur die Werte aus den ADC von Geschwindigkeit von
> beide Motoren. Diese Werte hat eine Abweichung von Ist, und bei jedes
> neue Durchlauf wird diese "Integriert" für Position. Position ist der
> Integral von Geschwindigkeit !

Ja, wenn du es so gemeint hast, hast du natuerlich Recht, in der 
Bewegung wird sich ein Fehler integrieren. Ich habe dich so verstanden, 
dass du meinst, der Regler werde einen Fehler aufintegrieren.

von Stefan F. (Gast)


Lesenswert?

Um Schlupf zu kompensieren, brauchst du aber Sensoren, die nicht 
schlupfen.

von S. R. (svenska)


Lesenswert?

Meine Frage bezog sich darauf, dass man am Ende die Position regeln 
möchte und nicht die einzelnen Räder. Wenn die Motoren ungenau arbeiten, 
dann wird die Positionsregelung (evtl. inklusive Blickrichtung) das 
schon richten.

Unser Roboter fuhr jedenfalls ziemlich genau geradeaus, wenn ich beiden 
Motoren die gleichen Werte gegeben habe. Einen fixen Korrekturfaktor für 
eine systematische Abweichung hatte ich auch drin (war unnötig), aber 
einen Sinn für eine Regelung der Geradeausfahrt sehe ich noch immer 
nicht.

Kann man überhaupt von der Spannung zuverlässig auf die 
Drehgeschwindigkeit des Motors schließen? Auch bei verschiedenen Lasten 
(Steigungen) und Batterie-Ladezuständen? Die Reglerparameter ergeben 
sich ja aus einem Modell des Motors, aber wenn schon die Realität da 
schwankt...

Wenn die Motoren so scheiße sind und es keine zuverlässigen Drehencoder 
(oder andere Sensoren) gibt, dann könnte man mit so einer geregelten 
Geradeausfahrt den Roboter möglicherweise kalibrieren (pro Exemplar), 
aber jede Kurvenfahrt versaut einem dem I-Anteil doch wieder...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.