ftrobopy: Encoder-Motoren synchronisieren

Community-Firmware (cfw), Selbstbaucontroller (TX-Pi, ftduino, usw.), usw.
Forumsregeln
Bitte beachte die Forumsregeln!
Antworten
Benutzeravatar
PHabermehl
Beiträge: 2427
Registriert: 20 Dez 2014, 22:59
Wohnort: Bad Hersfeld

ftrobopy: Encoder-Motoren synchronisieren

Beitrag von PHabermehl » 09 Jun 2017, 00:36

Hallo,
kann man mit ftrobopy zwei Encodermotoren ohne Angabe einer "Distanz" dauerhaft synchron laufen lassen?
Ich möchte einen Fahrroboter so lange geradeaus fahren lassen, bis ich die Motoren aufgrund eines Ereignisses, z.B. Ultraschall-Distanz unterschritten, wieder stoppe.

Also -> Motoren synchron ein -> Ultraschall-Distanzsensor-Auswerteschleife -> Motoren stopp, wenn Hindernis gefunden -> ausweichen oder so...

Gruß
Peter
https://www.MINTronics.de -- der ftDuino & TX-Pi Shop!

viele Grüße
Peter

Torsten
Beiträge: 308
Registriert: 29 Jun 2015, 23:08
Wohnort: Gernsheim (Rhein-Main-Region)

Re: ftrobopy: Encoder-Motoren synchronisieren

Beitrag von Torsten » 10 Jun 2017, 23:45

Hallo Peter,
PHabermehl hat geschrieben: kann man mit ftrobopy zwei Encodermotoren ohne Angabe einer "Distanz" dauerhaft synchron laufen lassen?
Ich möchte einen Fahrroboter so lange geradeaus fahren lassen, bis ich die Motoren aufgrund eines Ereignisses, z.B. Ultraschall-Distanz unterschritten, wieder stoppe.

Also -> Motoren synchron ein -> Ultraschall-Distanzsensor-Auswerteschleife -> Motoren stopp, wenn Hindernis gefunden -> ausweichen oder so...
Ja, das kann man z.B. so machen:

Code: Alles auswählen

import ftrobopy
import time

txt = ftrobopy.ftrobopy('auto')

m1  = txt.motor(1)      # encoder motor 1 an M1 und C1 angeschlossen
m2  = txt.motor(2)      # encoder motor 2 an M2 und C2 angeschlossen
us  = txt.ultrasonic(1) # ultraschallsensor an I1 angeschlossen

m1.setDistance(0, syncto=m2)
m2.setDistance(0, syncto=m1)
m1.setSpeed(512)
m2.setSpeed(512)
while us.distance() > 15:
  time.sleep(0.01)
m1.setSpeed(0)
m2.setSpeed(0)

txt.stopOnline()
time.sleep(0.01)
Viele Grüße
Torsten

Benutzeravatar
PHabermehl
Beiträge: 2427
Registriert: 20 Dez 2014, 22:59
Wohnort: Bad Hersfeld

Re: ftrobopy: Encoder-Motoren synchronisieren

Beitrag von PHabermehl » 11 Jun 2017, 09:27

Hallo Torsten
Vielen Dank, ich hatte in der Doku nichts gefunden und wollte keine 'auf gut Glück '-Lösung, die ggf. Auf ungewollten verhalten der ftrobopy basiert und nach dem nächsten Update dann nicht mehr funktioniert...
Gruß
Peter
https://www.MINTronics.de -- der ftDuino & TX-Pi Shop!

viele Grüße
Peter

Benutzeravatar
ski7777
Beiträge: 870
Registriert: 22 Feb 2014, 14:18
Wohnort: Saarwellingen

Re: ftrobopy: Encoder-Motoren synchronisieren

Beitrag von ski7777 » 11 Jun 2017, 10:10

Normal sollte es reichen die Motoren einseitig zu synchronisieren. D.h. es reicht zu sagen, M1 synchronisiere zu M2 und umgekehrt ist nichts erforderlich.

Raphael

Techum
Beiträge: 84
Registriert: 25 Dez 2014, 20:50
Kontaktdaten:

Re: ftrobopy: Encoder-Motoren synchronisieren

Beitrag von Techum » 29 Nov 2021, 14:54

Hallo zusammen,

vielleicht sollte ich lieber eine neue Frage stellen, aber prinzipiell passt es - führt die Frage oben weiter:

Hier hat doch bestimmt auch schon jemand Kurvenfahrt über counter/Zeit programmiert? Also 2 Motoren unbegrenzt laufen lassen - aber eine countergesteuerte Synchron- oder Kurvenfahrt.
Ich denke mir das so, dass permanent die Geschwindigkeit der beiden Motoren upgedated wird über zwei Parameter: Liniengeschwindigkeit und Drehung.
Die Funktion soll dafür sorgen, dass die beiden Rotationsgeschwindigkeiten permanent an die Sollwerte angepasst werden.
Wichtig wäre, dass das kontinuierlich bis zum Abbruch läuft und nicht ruckt.

Viele Grüße
Techum

Torsten
Beiträge: 308
Registriert: 29 Jun 2015, 23:08
Wohnort: Gernsheim (Rhein-Main-Region)

Re: ftrobopy: Encoder-Motoren synchronisieren

Beitrag von Torsten » 29 Nov 2021, 17:24

Hallo Techum,

der TXT hat intern die Fähigkeit auch exakt definierte (ruckelfreie) Kurvenfahrten über "nahezu synchronisierte" Encodermotoren auszuführen, fischertechnik nennt das in der Dokumentation des C-Programming-Kit "sync error injection". Es bedeutet wohl, dass automatisch die Geschwindigkeiten bei unterschiedlich gesetzten Distanzen zweier synchronisierter Motoren so angepasst werden, dass beide Motoren in etwa zur gleichen Zeit fertig werden. Soweit ich weiss, wird das z.B. in ROBOPro auch direkt unterstützt.

In ftrobopy könnte man diese Funktion mit einem Trick zwar auch nutzen, es wäre jedoch derzeit noch etwas umständlich. Ich werde Deine Anregung jedoch aufgreifen und das in der nächsten ftrobopy-Version transparent zur Verfügung stellen (bisher hatte noch niemand danach gefragt, deshalb war es nicht auf meinem Schirm).

Da die Methode darauf basiert, beide Motoren in etwa zur gleichen Zeit anzuhalten, ist es allerdings nicht möglich die Motoren "unendlich" laufen zu lassen (weder in ROBOPro noch in ftrobopy). Das liegt ganz einfach daran, dass mathematisch "unendlich + x" = "unendlich" ist.

Als Workaround müsste man lange Distanzen einsetzen (max ist 32767) und den Vorgang in einer Endlosschleife laufen lassen. Das würde dann bei jeder Wiederholung zu einem leichten Ruckler führen (nach jeweils ca. 500 Achsumdrehungen des Kurvenäußeren Motors). Je nach Anwendung wäre das ja evtl. noch akzeptabel ?

Viele Grüße
Torsten

Techum
Beiträge: 84
Registriert: 25 Dez 2014, 20:50
Kontaktdaten:

Re: ftrobopy: Encoder-Motoren synchronisieren

Beitrag von Techum » 29 Nov 2021, 19:23

Hallo Torsten,

vielen Dank für die schnelle Anwort.
Als Workaround müsste man lange Distanzen einsetzen (max ist 32767) und den Vorgang in einer Endlosschleife laufen lassen. Das würde dann bei jeder Wiederholung zu einem leichten Ruckler führen (nach jeweils ca. 500 Achsumdrehungen des Kurvenäußeren Motors). Je nach Anwendung wäre das ja evtl. noch akzeptabel ?
Selbst wenn der Roboter in der Sporthalle fährt, sollte das kein Problem sein! :D
Klingt vielversprechend!

Viele Grüße
Techum

Benutzeravatar
Dirk Fox
ft:pedia-Herausgeber
Beiträge: 1831
Registriert: 01 Nov 2010, 00:49
Wohnort: Karlsruhe
Kontaktdaten:

Re: ftrobopy: Encoder-Motoren synchronisieren

Beitrag von Dirk Fox » 29 Nov 2021, 19:53

Hallo Torsten,

das ist ja cool - die Option ist mir in ROBO Pro bisher entgangen... Ich kann also zwei Motoren mit verschiedenen Distanzvorgaben versehen und sie synchronisieren, und dann fährt mein Roboter eine Kurve und stoppt beide Motoren gleichzeitig? Grandios.

Spurfolger einmal anders :-)

Herzliche Grüße,
Dirk

Torsten
Beiträge: 308
Registriert: 29 Jun 2015, 23:08
Wohnort: Gernsheim (Rhein-Main-Region)

Re: ftrobopy: Encoder-Motoren synchronisieren

Beitrag von Torsten » 04 Dez 2021, 20:33

Hallo Techum,

Ich habe mir das mit den synchronen Kurvenfahrten nochmal genau angeschaut und versucht es zu verstehen. Es funktioniert doch nicht ganz so einfach, wie ich es zuerst vermutet hatte. Meine Erste Aussage stimmt jedoch:
der TXT hat intern die Fähigkeit auch exakt definierte (ruckelfreie) Kurvenfahrten über "nahezu synchronisierte" Encodermotoren auszuführen, fischertechnik nennt das in der Dokumentation des C-Programming-Kit "sync error injection".
Ich habe ein kleines Beispiel-Video dazu auf Youtube hochgeladen: https://youtu.be/9_lruUhcWDQ

Man hat damit die Möglichkeit die Motorcounter durch hinzufügen von "(+/-)Deltas" während einer Synchronfahrt zu manipulieren. Durch geschickte Wahl der Deltas und der Zeiten zwischen den Manipulationen, kann man einen Roboter so im Kreis laufen lassen, dass er wieder (nahezu) exakt zum Ausganspunkt zurückkommt. Der TXT passt die Geschwindigkeiten der Motoren automatisch immer wieder an einen Synchronlauf an. (Mathematisch durchfährt man keinen perfekten Kreis, sondern ein Vieleck.) Da das Ganze in einer einzigen "Distanzfahrt" geschieht ist das relativ ruckelfrei. Im Gegensatz zu einer "Vieleckfahrt" bei der man immer wieder eine bestimmte Distanz gerade fährt dann ein bischen dreht und so weiter.

Im Prinzip könnte man natürlich auch zwei Motoren mit leicht unterschiedlichen Geschwindigkeiten laufen lassen. Die Wahrscheinlichkeit, dass man dann nach einer (größeren) Kreisfahrt den Ausgangspunkt wieder trifft ist allerdings geringer als bei synchronisierten Kurvenfahrten.

Diese "Sync Error Injection"-Funktion wird bereits auf der Ebene der Motorplatine des TXT unterstützt und sie wird auch über alle Protokolle nach oben hin bis zu ROBOPro weitergereicht. Leider habe ich in ROBOPro jedoch keine Option gefunden, mit der man diese Funktion aktivieren kann. Vielleicht weiss ja jemand hier im Forum, ob das irgendwo in ROBOPro machbar ist. Es müsste irgendwo bei den Synchronisationsoptionen der Encodermotoren mit dabei sein: anstelle einer Motornummer 1...4, mit dem synchronisiert werden soll, muss man eine Nummer 5...8 zur Synchronisierung angeben. Dann hat man die Möglichkeit die schnellen Counter während einer einzigen Distanzfahrt zu manipulieren.

Ich habe das Ganze mal in ftrobopy (ab Version 1.99) eingebaut und mit einem Beispiel Python-Script versehen. Um die idealen Parameter für eine Kreisfahrt herauszufinden muss man etwas herumprobieren.

Falls es zu diesem Thema weitere Erkenntnisse gibt, währe ich für Rückmeldungen dankbar.

Viele Grüße
Torsten

Techum
Beiträge: 84
Registriert: 25 Dez 2014, 20:50
Kontaktdaten:

Re: ftrobopy: Encoder-Motoren synchronisieren

Beitrag von Techum » 19 Dez 2021, 22:49

Hallo Torsten,

vielen Dank für Deine schnelle Lieferung.
Ich habe mir beeindruckt Deine Kreisfahrten angesehen. Das sieht sehr vielverprechend aus. Ich erkläre mal mein Problem. Man sieht es eigentlich ganz gut beim losfahren auf den Teddybär. https://www.youtube.com/watch?v=llnVXh4ysPs&t=60s etwa Sekunde 37 im Video. Wenn der Robotor aus der Drehbewegung kommt, fährt er nicht gerade los (ich mache das inzwischen mit einem Synchron-Start - ist aber irgendwie "gefummelt").
Außerdem habe ich mir Drehzahl und Drehgeschwindigkeit der beiden Encodermotoren ermittelt und einen sehr deutlichen Unterschied festgestellt.
Beide weisen im relevanten Bereich zwischen 150 und 512 zwar etwa eine lineare Beziehung zwischen setSpeed() und counter/Zeit auf, die Kennlinien sind aber sehr unterschiedlich. Bei mir (im eingebauten Zustand):

* M1: counter/t = 3.64 * speed + 94.5
* M2: counter/t = 4.25 * speed - 303.9

Fest steht aber, wenn der Roboter auf relativ kurze Distanz deutlichere Kurskorrekturen machen muss, dann reicht dieser Ansatz ohne Feedback nicht mehr aus. Das, was Du da machst, ist also genau das, wonach ich suche.
Wenn ich es recht verstehe, bestimmt man durch den Wert von Inject den Radius. Syncherror ist die Schrittweite. Mit Flip=False oder True bestimmt man die Drehrichtung.

Was mir noch fehlt, ist die Trimmung. Bei gleicher Parametrisierung unterscheiden sich die Kurvenradien (Rechtskurve/Linkskurve) gravierend.
Müsste man hier auf die gesetzen Geschwindigkeiten zurückgreifen?
Ich habe versucht, Dein Programm mit einem sich ändernden Radius zu speisen, das will aber noch nicht recht. Ich gebe für heute mal auf.

Schönen Abend noch!
Techum

Techum
Beiträge: 84
Registriert: 25 Dez 2014, 20:50
Kontaktdaten:

Re: ftrobopy: Encoder-Motoren synchronisieren

Beitrag von Techum » 20 Dez 2021, 08:23

Hallo Torsten,

noch ergänzend: Wenn ich die inject-Routine erstmals aufrufe, kann ich quasi jeden beliebigen kontrollierten Kreisbogen nach links oder rechts setzen. Mit Geschwindigkeitsanpassung s.o. kommen auch vergleichbare Radien heraus.
Wenn ich aber die Anzahl der Durchläufe der Endlosschleife aus Deinem Beispiel begrenze und die Routine mit einem anderen Radius neu aufrufe, dann bekomme ich nur noch Geradeausfahrten. Muss man die Synchronisationsbits zuerst wieder zurücksetzen? Z.B. kurz einen klassischen Synch-Befehl senden?

Viele Grüße und eine schöne
Vorweihnachtszeit
Techum

Techum
Beiträge: 84
Registriert: 25 Dez 2014, 20:50
Kontaktdaten:

Re: ftrobopy: Encoder-Motoren synchronisieren

Beitrag von Techum » 20 Dez 2021, 20:33

Hallo Torsten,

erstes Ziel: Schlangenlinien. Also Bogen links, Bogen rechts und immer so fort. Gleicher Bogenradius.
Wenn ich vor jedem Bogenwechsel einen Motor Synch sende, also:

txt.SyncDataBegin()
m1.setDistance(0, syncto=mr)
m2.setDistance(0, syncto=ml)
txt.SyncDataEnd()
txt.updateWait()

dann geht es schön im Wechsel nach links und rechts. Mit vorheriger Trimmung (Anpassung der Geschwindigkeit gemäß Kennlinie) kommt eine gerade Schlangenlinie heraus.
Allerdings wird "erratisch" immer mal ein Bogen ausgelassen. Das ist mir nicht klar, da vor jedem Bogen die gleichen Bedingungen herrschen sollten.
Stattdessen geht es dann geradeaus. Ggf. kommt da einer der

mr1.setDistance(0, sn=6)
m2.setDistance(0, sn=5)
"nicht an"? Kann ich das überprüfen?

Da das nicht so oft passiert (alle 10-15 Bögen vielleicht, hintereinander habe ich es noch nicht gesehen), wird der Roboter sein Ziel vermutlich trotzdem erreichen.

Ich benutze 1:1 Deinen Code. Statt "while True" immer 100 Durchläufe. Flip setze ich je nach Richtung True oder False.
Die Korrekturen zur Geschwindigkeitsanpassung sind recht gravierend, das dürfte Verwackler bei Fahrten mit Kamera geben :D

Ich baue es so mal ein.
Nochmals vielen Dank!

Techum

Torsten
Beiträge: 308
Registriert: 29 Jun 2015, 23:08
Wohnort: Gernsheim (Rhein-Main-Region)

Re: ftrobopy: Encoder-Motoren synchronisieren

Beitrag von Torsten » 20 Dez 2021, 21:39

Hallo Techum,

die Aussetzer, die Du beschreibst, habe ich bisher noch nicht beobachtet. Verwendest Du das Script im Online oder im Offline Modus ?

Viele Grüße
Torsten

Techum
Beiträge: 84
Registriert: 25 Dez 2014, 20:50
Kontaktdaten:

Re: ftrobopy: Encoder-Motoren synchronisieren

Beitrag von Techum » 21 Dez 2021, 20:04

Hallo Torsten,

online, wobei das neue Projekt auch offline laufen müsste. Muss mal probieren, ob es offline auch auftritt. Melde mich.

Techum

hypnotoad
Beiträge: 119
Registriert: 16 Feb 2019, 12:43
Wohnort: 30559 Hannover
Kontaktdaten:

Re: ftrobopy: Encoder-Motoren synchronisieren

Beitrag von hypnotoad » 24 Mai 2023, 21:12

Hallo,

ich nutze synchronisierte Encoder-Motoren für meinen Plotter mit ftrobopy. Soweit ich das verstehe muss man eine Regelschleife aufbauen, die schaut, wie weit der Hauptmotor ist, um dann den Fehler vom Nebenmotor so einzustellen, dass er langsamer fährt. Das funktioniert relativ gut in den meisten Fällen. Es gibt aber Probleme beim anfahren und beim bremsen, da der Hauptmotor sanft startet und stoppt, aber der Nebenmotor durch die Regelschleife zu schnell anfängt und zu spät aufhört.

Hat sich hiermit schon jemand beschäftigt? Soweit ich das sehe ist es ganz normale Regelungstechnik.

lg,
Ralf

Benutzeravatar
ski7777
Beiträge: 870
Registriert: 22 Feb 2014, 14:18
Wohnort: Saarwellingen

Re: ftrobopy: Encoder-Motoren synchronisieren

Beitrag von ski7777 » 06 Jun 2023, 09:44

Schon zu Zeiten des TX, aber auch im TXT liegt diese Regelschleife voll in der integrierten Motorsteuerung, die von ftrobopy (aber genauso auch beim TX mit fttxpy) nicht verändert wird.

Die Doku von ftrobopy beschreibt das wie folgt:

Code: Alles auswählen

Motor_links=ftrob.motor(1)
Motor_rechts=ftrob.motor(2)
Motor_links.setDistance(100, syncto=Motor_rechts)
Motor_rechts.setDistance(100, syncto=Motor_links)
Dann kann man die Motoren starten und sich sicher sein, dass beide synchron bei 100 stoppen. Das kann man mit finished() auf beiden Objekten abfragen.

Ein paar Anmerkungen von mir:
setDistance(distance, syncto=None, sn=None) macht viele Dinge intern, die vielleicht nicht sofort verständlich sind. Ich verweise hier Mal auf meinen ft:pedia-Artikel bezüglich fttxpy. Der TX macht das nämlich alles ziemlich ähnlich.
Man kann auch nur syncen ohne Zieldistanz. Dazu setzt man die Distanz einfach auf 0.
Generell sollte man nachdem finished() auf True wechselt für alle beteiligten Motoren stop() aufrufen. Damit wird der Motor gestoppt sowie die Synchronisierung und Distanz zurückgesetzt.
Es gibt beim Sync immer einen Master mit n[1-3] Slaves. Jeder Motor ist standardmäßig ein Master. Jedem Motor kann man einen anderen als Master setzen und ihn selbst zum Slave machen. Extrembeispiel:

Code: Alles auswählen

m1=ftrob.motor(1)
m2=ftrob.motor(2)
m3=ftrob.motor(3)
m4=ftrob.motor(4)
m1.setDistance(100)
m2.setDistance(100, m1)
m3.setDistance(100, m1)
m4.setDistance(100, m1)
Danach einfach die Motoren starten.


Jetzt ist mir im Code von Torsten aber da ein kleines Problem aufgefallen:
@Torsten: Du rufst in setDistance() setMotorSyncMaster() immer 2 Mal auf. Hier müssten wir das eigentlich auf 1 reduzieren. Es sollte ausreichen

Code: Alles auswählen

self._outer.setMotorSyncMaster(self._output-1, 4*self._ext + syncto._output, self._ext)
zu benutzen.


Ich hoffe, dass ich etwas aufklären konnte. Bei Fragen, einfach nochmal schreiben :)

Viele Grüße
Raphael

Torsten
Beiträge: 308
Registriert: 29 Jun 2015, 23:08
Wohnort: Gernsheim (Rhein-Main-Region)

Re: ftrobopy: Encoder-Motoren synchronisieren

Beitrag von Torsten » 06 Jun 2023, 15:25

Hallo Raphael,

ich stimme Dir da voll und ganz zu. Ich bin zur Zeit unterwegs, werde mich aber damit befassen, wenn ich wieder etwas Zeit und Zugriff auf einen TXT habe.

Viele Grüße
Torsten

hypnotoad
Beiträge: 119
Registriert: 16 Feb 2019, 12:43
Wohnort: 30559 Hannover
Kontaktdaten:

Re: ftrobopy: Encoder-Motoren synchronisieren

Beitrag von hypnotoad » 07 Jun 2023, 22:35

Hallo Raphael,
ich schaue mir das in der FTPedia nochmal an. Es geht mir darum, über Error Injection einen Motor gezielt langsamer laufen zu lassen. Soweit ich es verstanden habe, kann man für jeden Motor _entweder_ einen Master vorgeben _oder_ die Distanz setzen.

Vereinfacht sieht meine Regelschleife so aus:

Code: Alles auswählen

#goal_m1 < goal_m2
m1.setDistance(0, sn=5)
m2.setDistance(goal_m2)
while True:
        c1 = m1.getCurrentDistance()
        c2 = m2.getCurrentDistance()
        correction = round(c1 / goal_m1 * goal_m2 - c2)
        if correction > 0:
                m1.setDistance(correction, sn=5)
Bzgl. `isFinished()` bin ich über dieses Problem hier gestolpert, aber man kann ja auch einfach schauen, ob die Anzahl der Schritte soweit ist, dass man fertig ist https://github.com/ftrobopy/ftrobopy/issues/34

Ralf

Benutzeravatar
ski7777
Beiträge: 870
Registriert: 22 Feb 2014, 14:18
Wohnort: Saarwellingen

Re: ftrobopy: Encoder-Motoren synchronisieren

Beitrag von ski7777 » 09 Jun 2023, 10:23

Also auf Hardware-Ebene ist es auf jeden Fall möglich Distanz und Sync zusammen zu machen. Afaik sogar mit verschiedenen Distanzen in einer Sync-Gruppe zum Kurvenfahren.

hypnotoad
Beiträge: 119
Registriert: 16 Feb 2019, 12:43
Wohnort: 30559 Hannover
Kontaktdaten:

Re: ftrobopy: Encoder-Motoren synchronisieren

Beitrag von hypnotoad » 11 Jun 2023, 17:39

Ich habe mir den ftrobopy-Code angeschaut. Soweit ich es sehe, ist der Regler in einem anderen Modus, wenn _motor_sync nicht 1-4, sondern 5-8 ist. In diesem Modus wir nicht Distanz vorgegeben, sondern Counter-Differenzen. Jedenfalls wird über dem Regler direkt dies übermittelt

Code: Alles auswählen

uncbuf += self._txt._pwm[:8]
uncbuf += self._txt._motor_sync[:4]
uncbuf += self._txt._motor_dist[:4]
uncbuf += self._txt._motor_cmd_id[:4]
uncbuf += self._txt._counter[:4]
.

Antworten