ROS: Best Practices?


14

Ich werde ein kleines Robotersystem bauen , und es sieht so aus, als ob ROS ein nettes Framework zur Steuerung und Programmierung des Systems darstellt.

Ich frage mich jedoch, welche Methode für die Verwaltung der Komponenten meines Roboters am besten geeignet ist.

  • Ist es sinnvoll, alle Sensoren in einem Knoten zu platzieren?

  • Soll ich die Sensoren desselben Typs nur in einem Knoten platzieren oder ist es besser, einen Knoten für einen Sensor zu haben?

  • Ist es eine gute Praxis, einen Handlerknoten zu haben, der Eingaben von Sensoren entgegennimmt und die entsprechenden Aktuatoren steuert, oder sollten die Aktuatorknoten und Sensorknoten direkt kommunizieren?


  1. Mit Handler abgesicherte Sensorknoten und Aktorknoten 1. Sensor- und Aktorknoten mit Handler abgesichert

  2. Einzelne Sensor- und Aktorknoten mit Handler Bildbeschreibung hier eingeben

  3. Direkte Kommunikation Bildbeschreibung hier eingeben

Für mich ist es das Beste, eine Art Handler zu haben, der die Kommunikation zwischen Sensoren und Aktuatoren übernimmt und einen Knoten für jedes Element des Roboters hat (wie in Abbildung 2), da das System auf diese Weise lose gekoppelt ist und kann leicht erweitert werden, aber ich möchte wissen, was Ihre Meinung ist.

Antworten:


15

Sehr kurze Antwort: 2


Sensoren

In Bezug darauf, ob von Sensoren alle in einem Knoten oder jeder separat gelesen wird, sollten Sie sich folgende Frage stellen:

Sind die Sensoren ohne die anderen bedeutungslos?

Bei dieser Frage wird gefragt, ob die Sensoren fest gekoppelt sind oder nicht. Angenommen, Sie haben einen Sensor, der temperaturempfindlich ist (und den Sie ausgleichen müssen). Sie fügen in erster Linie einen Temperatursensor hinzu, um den Wert des anderen Sensors zu bestimmen. In diesem Szenario ist es sinnvoll, beide Werte gleichzeitig zu lesen, da sie eng miteinander gekoppelt sind. In der Tat sind die Messwerte des Originalsensors ohne die Messwerte des Temperatursensors unbrauchbar.

Wenn die Sensoren jedoch individuell nützlich sind, sollten Sie sie auf jeden Fall in getrennten Knoten aufbewahren. Das hat viele Vorteile:

  • Die Knoten können auf separaten Prozessoren ausgeführt werden
  • Die Knoten können in zukünftigen Robotern wiederverwendet werden
  • Ein Ausfall der Kommunikation mit einem Knoten führt nicht zum Ausfall des gesamten Systems
  • Ein Neustart der Erfassung von einer fehlerhaften Sensorplatine kann getrennt von den anderen erfolgen

Wenn Sie einen der oben genannten Vorteile benötigen , müssen Sie sich für separate Knoten entscheiden, auch wenn die Sensoren eng gekoppelt sind. Dies ist jedoch in der Regel nicht der Fall.

Aktoren

Das ist analog.

Sind die Aktoren ohne die anderen bedeutungslos?

Wenn Sie beispielsweise ein Handgelenk mit Robotersehnen konstruieren, bei dem für jede Sehne (aus welchem ​​Grund auch immer) zwei Motoren gleichzeitig arbeiten, um ein Gelenk in die eine oder andere Richtung zu bewegen, bedeutet dies, dass sie im selben Knoten bedient werden Sinn als getrennt.

Auf der anderen Seite ist es sinnvoll, wenn Aktoren unabhängig sind (normaler Fall), einen Knoten für jeden Aktor zu haben. In diesem Fall könnte jeder in einen anderen Knoten gestellt werden. Neben den exakt gleichen Vorteilen wie bei Sensoren gibt es diesen zusätzlichen Vorteil:

  • Wenn ein Aktuator (aus welchem ​​Grund auch immer) blockiert ist, funktionieren die anderen Aktuatoren weiterhin. Wenn es redundante Freiheitsgrade gibt, könnten sie dies sogar vollständig ausgleichen.

Dies hat eine Auswirkung. Wenn Sie möchten, dass die Aktuatoren harmonisch funktionieren, platzieren Sie sie im selben Knoten. Dies liegt nicht nur an Kommunikationsfehlern, sondern auch daran, dass unterschiedliche Knoten unterschiedliche Verzögerungen bedeuten. In einem verteilten System befindet sich jeder Knoten in einem anderen Teil des Netzwerks, und daher gibt es unterschiedliche Verzögerungen. In einem zentralisierten System treten bei hoher CPU-Auslastung unterschiedliche Verzögerungen auf, da die einzelnen Prozesse viel Zeit benötigen.

Sollte es einen Handler geben?

Auch wenn die Antwort "es kommt darauf an" ist, gibt es einen gemeinsamen Ansatz mit vielen Vorteilen. Lassen Sie uns den Namen ändern und "Controller" nennen. Der Ansatz lautet "Ja, es sollte einen Controller geben".

Die Vorteile eines Controllers sind (unter vielen):

  • Entkoppelte Verarbeitung: Jeder Knoten ist für eine Sache verantwortlich, was bedeutet:
    • Einfachheit: was impliziert
      • Einfachere Entwicklung
      • Einfacheres Debuggen
      • Weniger Fehler
      • Geringere Ausfallwahrscheinlichkeit
    • Wiederverwendbarkeit: Da derselbe Controller mit verschiedenen Sensorknoten verwendet werden kann, wenn diese die gleiche Funktionalität haben (dh Nachrichten- und Dienstformate).
  • Ausführung auf separater Hardware: Jeder Knoten kann im Netzwerk verschoben werden. Zum Beispiel können Sensor- und Aktorknoten auf einen dedizierten Mikrocontroller ( zum Beispiel Arduino (nicht von mir empfohlen)) und den Controller auf einem PC verschoben werden .
  • Vermeiden Sie extreme Hässlichkeiten: Wenn die Sensoren die Aktoren direkt beeinflussen wollten, ist das Ergebnis einfach ein Chaos. Angenommen, kein Controller, sehen wir uns jeden Fall an:
    • Ein Sensorknoten: Im Grunde bedeutet dies, dass der Sensorknoten und die Steuerung in demselben Knoten zusammengefasst sind. Nicht schlecht, aber sehr unnötig.
    • Viele Sensorknoten: Das ist das Chaos. Dies bedeutet, dass die Steuerung auf die Sensorknoten verteilt ist . Daher müssen alle Sensorknoten miteinander sprechen, um zu wissen, wie die zugehörigen Aktuatoren gesteuert werden. Stellen Sie sich einen Kommunikationsfehler oder verschiedene Arten von Verzögerungen vor und Sie werden sehen, wie schwierig es wird. Da dies absolut unnötig ist, gibt es keinen Grund, dies zu tun!

Diese sagten, es gibt auch Nachteile. Mehr Knoten zu haben (alle Knoten, nicht nur der Controller) bedeutet:

  • Verschwendetere Kommunikation: Die Daten müssen in Standardformaten (also serialisiert und deserialisiert) über das Netzwerk oder den gemeinsam genutzten Speicher übertragen werden. Der ROS-Kern muss sie überprüfen und entscheiden, an wen sie zu liefern sind. Kurz gesagt, einige Systemressourcen werden verschwendet in Kommunikation. Wenn alle Knoten in einem waren, könnten diese Kosten Null gewesen sein.
  • Höhere Ausfallwahrscheinlichkeit: Wenn aus irgendeinem Grund eine Netzwerkverbindung unterbrochen wird oder ein Knoten ausfällt, liegt ein Systemausfall vor. Wenn Sie nicht darauf vorbereitet sind, kann das gesamte System heruntergefahren werden. Nun ist dies im Allgemeinen eine gute Sache, um einen Teil des Systems zu verlieren, aber nicht das gesamte System ( sanfte Verschlechterung ), aber es gibt auch Anwendungen, bei denen dies so weit wie möglich vermieden werden sollte. Wenn Sie die Kommunikation unterbrechen und den gesamten Code in einem Knoten ablegen, trägt dies zur Systemstabilität bei. Der Nachteil ist natürlich, dass das System entweder einwandfrei funktioniert oder plötzlich komplett abstirbt.
  • Chaotische Zeiten: Jeder Knoten läuft für sich. Die Zeit, die es dauert, bis die Nachrichten bei anderen ankommen, ist nicht deterministisch und variiert von Lauf zu Lauf. Sofern der Zeitstempel Ihrer Knoten nicht für jede Nachricht gilt (als Randnotiz: Sie müssen die Uhren in einem guten Maße synchronisiert haben, was ROS nicht tut) und es sei denn, jeder empfangende Knoten kann die Verzögerung berücksichtigen und entsprechend steuern (was eine sehr schwierige Aufgabe ist) allein) dann bedeutet das Vorhandensein mehrerer Knoten eine hohe Unsicherheit über das Alter der Daten. Dies ist einer der Gründe (unter vielen), warum sich die meisten Roboter so langsam bewegen. Ihr Regelkreis muss langsam genug sein, um sicherzustellen, dass alle Daten dem aktuellen Zeitraum entsprechen. Je größer die Verzögerungen sind, desto langsamer ist der Regelkreis.

Bei allen obigen Nachteilen besteht die Lösung darin, die Anzahl der Knoten zu verringern, vorzugsweise auf einen einzelnen Knoten. Warten Sie eine Minute, das ist nicht mehr mit ROS! Genau.

Zusammenfassen:

  • Verwenden Sie ROS für Nicht-Echtzeitsysteme, bei denen Verzögerungen gelegentlich hoch werden können. In diesem Fall können Sie beliebig viele ROS-Knoten haben. Tatsächlich ist es eine sehr gute Praxis, dass jeder ROS-Knoten nur eines tut. Auf diese Weise werden sie sehr einfach und können in hohem Maße wiederverwendet werden.
  • Auf der anderen Seite sollten Sie bei Echtzeitsystemen auf jeden Fall ROS vermeiden. Dafür gibt es Orocos und Technologien wie EtherCAT und meistens Ad-hoc-Lösungen.

Als letztes Wort, in der Praxis geht es ROS gut. Nicht großartig, aber gut. Sehr oft ist das System nicht kritisch und die Ausfallwahrscheinlichkeit ist so gering, dass ein gelegentlicher Neustart keine große Sache ist. Dies ist der Strauß-Algorithmus !


1
Wow, sehr nette und ausführliche Antwort! Vielen Dank für Ihre Zeit;)
Manf
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.