[Python] Es war sehr praktisch, die Python-Klasse für das ROS-Programm zu verwenden.

Einführung

Vor kurzem habe ich begonnen, ROS nach und nach zu berühren, und bei der Implementierung eines Knotens in Python möchte ich ein Problem mit der ** Implementierung eines Herausgebers und Abonnenten innerhalb eines Knotens ** einführen. Ich konnte es mit einer Python-Klasse bereinigen. Es wird davon ausgegangen, dass Sie über genügend ROS-Kenntnisse und ein wenig objektorientiertes Wissen verfügen, um selbst ein Paket zu erstellen.

Ein Implementierungsbeispiel ist [hier](https://qiita.com/drafts/d15d52856188120647f4/edit#publish-%E3%81%A8-subscribe%E3%82%92%E5%90%8C%E6%99%82% E3% 81% AB1% E3% 81% A4% E3% 81% AE% E3% 83% 8E% E3% 83% BC% E3% 83% 89% E3% 81% A7% E3% 82% 84% E3% 82% 8B)

Was ich machen wollte

Ich möchte die Daten zu diesem Thema abonnieren, verarbeiten und in diesem Thema veröffentlichen

Ich denke, da ist so etwas. Habe ich falsch herausgefunden ** Was soll ich tun, wenn ich Abonnent und Herausgeber gleichzeitig auf einem Knoten verwende **? Ich war ziemlich süchtig danach.

ROS Publisher und Subscriber in Python implementiert

ROS.org und die gut eingeführten Publisher- und Subscriber-Tutorials sehen häufig so aus: Ich denke.

Herausgeber (auch als Sprecher bekannt)

Geben Sie den Themennamen und den Nachrichtentyp mit "rospy.Publisher" an und veröffentlichen Sie mit "pub.publish ()".

talker.py


#Rospy- und Nachrichtenimport
import rospy
import std_msgs.msg import String

def talker():
    pub = rospy.Publisher('chatter', String, queue_size=10)
    rospy.init_node('talker', anonymous=True)

    #Die Verarbeitung wird fortgesetzt
    
    pub.publish(data)

if __name__ == '__main__':
    try:
         talker()
    except rospy.ROSInterruptException: pass

Abonnent (auch als Hörer bekannt)

Geben Sie in rospy.Subscriber den Themennamen, den Datentyp und die Rückruffunktion an und führen Sie die Nachabonnementverarbeitung mit der Rückruffunktion durch.

listener.py


#Rospy- und Nachrichtenimport
import rospy
from std_msgs.msg import String

def callback(data):
    #Rückruffunktion abonnieren
    
def listener():
    rospy.init_node('listener', anonymous=True)

    rospy.Subscriber("chatter", String, callback)

    rospy.spin()
        
if __name__ == '__main__':
    listener()

Veröffentlichen und abonnieren Sie gleichzeitig auf einem Knoten

Nach dem Tutorial habe ich den Mechanismus von Publish and Subscribe verstanden. Erstellen wir dann einen neuen Knoten und veröffentlichen und abonnieren gleichzeitig. Ich dachte, und wenn ich es implementierte, sollte ich es in der Rückruffunktion von rospy.Subscriber veröffentlichen? Ich war besorgt, weil ich den Code nicht bereinigen konnte.

Zu dieser Zeit habe ich mir diesen Artikel und ich habe auch den Code gesehen angesehen. /main.py#L10) Übrigens war es sehr schön, also habe ich es als Referenz verwendet. Ich habe im obigen Tutorial keine Python-Klassen verwendet, aber sie können gut implementiert werden.

Erstellen Sie Publisher und Subscriber mit __init__ () und verarbeiten Sie sie im Ablauf der Rückruffunktion und der Publish-Funktion. Wenn Sie es ausführen, erstellen Sie eine Klasse im Hauptteil und Sie sind fertig!

test.py


import rospy
from std_msgs.msg import String

class testNode():
    def __init__(self):
        #Abonnenten erstellen
        self.sub = rospy.Subscriber('topic name', String, self.callback)
        #Erstellen eines Publishers
        self.pub = rospy.Publisher('topic name', String, queue_size=1)

    def callback(self, data):
        #Schreiben Sie die Verarbeitung der Rückruffunktion

        Publisher(data)

    def Publisher(self, data):
        self.pub.publish(data)

    def function(self, data):
        #Schreiben Sie, wenn es eine andere Verarbeitung gibt

        return data

if __name__ == '__main__':
    rospy.init_node('test_node')

    time.sleep(3.0)
    node = testNode()

    while not rospy.is_shutdown():
        rospy.sleep(0.1)

abschließend

Persönlich dachte ich, es sei schwierig, mit der Objektorientierung zu beginnen, aber ich konnte sie bequem und ordentlich schreiben. Einige Leute haben Vorlagen mit [wie diesem] erstellt (https://qiita.com/MENDY/items/e842e3c3ad7fe98c12a0)!

Ich hatte nicht die Informationen, nach denen ich suchen wollte "Ros Python Publish Subscribe Same Node". .. .. Ich bin zu neu bei ROS, mache ich also etwas falsch? Bitte lassen Sie mich wissen, wenn etwas nicht stimmt.

Referenz

Für das maschinelle Lernen von ROS habe ich ein Paket erstellt, um den Gelenkwinkel mit Topic von Topic zu fließen ROS-Kurs 31 Python-Grundlagen ROS-Programmvorlage Schreiben Sie einen einfachen Publisher und Abonnenten (Python)

Recommended Posts

[Python] Es war sehr praktisch, die Python-Klasse für das ROS-Programm zu verwenden.
Praktisch, um Matplotlib-Unterzeichnungen in for-Anweisungen zu verwenden
Verwendung der Methode __call__ in der Python-Klasse
Verwenden Sie eine Skriptsprache für ein komfortables C ++ - Leben - OpenCV-Port Python zu C ++ -
[Einführung in Python] Wie verwende ich den Operator in in der for-Anweisung?
[Einführung in Python] Wie verwende ich eine Klasse in Python?
[Python] Wie man eine Klasse iterierbar macht
[Python] Organisieren der Verwendung für Anweisungen
Verwendung von __slots__ in der Python-Klasse
Verwendung von "deque" für Python-Daten
Ich habe einen Docker-Container erstellt, um JUMAN ++, KNP, Python (für pyKNP) zu verwenden.
Verwenden Sie Python aus Java mit Jython. Ich war auch süchtig danach.
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 3 Schreiben Sie in eine Datei
[Python] Ich war eine Stunde lang begeistert, als ich versuchte, die Listeneinschlussnotation zu verwenden
Bequem zum Verwenden von Ebenen beim Laden von Bibliotheken auf Lambda
Es ist bequemer, csv-table zu verwenden, wenn Sie eine Tabelle mit Python-Sphinx schreiben
Erstellen eines Python-Tools zur Dokumentgenerierung, da die Verwendung von Sphinx schwierig ist
Schreiben wir ein Python-Programm und führen es aus
Python: Verwenden Sie Ihre eigene Klasse für Numpy Ndarray
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 7 Erstellen eines Moduls
Verwendung von pip, einem Paketverwaltungssystem, das für die Verwendung von Python unverzichtbar ist
[Python] Ich möchte nur den Index verwenden, wenn ich eine Liste mit einer for-Anweisung schleife
Ein Programm, das ein paar Kilogramm BMI und Standardgewicht verlangt [Python]
Ein Python-Skript, das die Start- / Endzeit des Mac für die Anwesenheitsverwaltung verwenden möchte
Verwendung der Python-Multiprocessing (Fortsetzung 3) apply_async in einer Klasse mit Pool als Mitglied
Erstellen Sie einen Datensatz mit Bildern, die für das Training verwendet werden sollen
[BigQuery] Verwendung der BigQuery-API für die Python-Tabellenerstellung-
[Für Anfänger] Wie man den Befehl say mit Python benutzt!
[Einführung in Python] Hochgeschwindigkeits-Einführung in Python für vielbeschäftigte C ++ - Programmierer
Vom Kauf eines Computers bis zur Ausführung eines Programms auf Python
[Python] Eine praktische Bibliothek, die Kanji in Hiragana konvertiert
Python: Kann in Lambda wiederholt werden
Es war eine schmerzhafte Erinnerung, als mir TypeError gesagt wurde: Muss type sein, nicht class obj, wenn versucht wird, mit Python zu erben
Ich habe eine Funktion zum Trimmen des Bildes von Python openCV erstellt. Verwenden Sie sie daher bitte.
Erstellt ein Tool, mit dem Sie bequem Parameter für Modelle des maschinellen Lernens festlegen können
[Python] Was ist ein Tupel? Erklärt, wie man es benutzt und wie man es benutzt, ohne zu tippen.
Es kann ein Problem sein, Japanisch für Ordnernamen und Notizbuchnamen in Databricks zu verwenden
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 4 Verwenden Sie die GUI
Experimentieren Sie, um Tweets für eine lange Zeit zu sammeln (Programmvorbereitung (1))
[Python] Verwendung von Matplotlib, einer Bibliothek zum Zeichnen von Diagrammen
So führen Sie ein Python-Programm in einem Shell-Skript aus
Experimentieren Sie mit Python, um ein PDF für Selbstversorger für Kindle zu erstellen
Eine einfache Möglichkeit, mehrere for-Schleifen in Python zu vermeiden
Wie erstelle ich ein Python-Paket (geschrieben für Praktikanten)
Wie nutzt man maschinelles Lernen für die Arbeit? 03_Python-Codierungsverfahren
Experimentieren Sie, um Tweets für eine lange Zeit zu sammeln (Programmvorbereitung (2))
Experimentieren Sie, um Tweets für eine lange Zeit zu sammeln (Programmvorbereitung (5))
Ich wusste nicht, wie ich die [Python] für die Anweisung verwenden sollte
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden
Eine sehr bequeme Möglichkeit, mit Jupyter Notebook zu präsentieren
Python-Anfänger versuchte, bei einem IT-Unternehmen zu praktizieren
Erstellen einer virtuellen Umgebung für Python auf dem Mac [Sehr einfach]
[Python] Was ist ein Slice? Eine leicht verständliche Erklärung zur Verwendung anhand eines konkreten Beispiels
Verwenden wir eine Skriptsprache für ein komfortables C ++ - Leben. 6-Wie wäre es mit der Entwicklung eines Programms als Bibliothek für Python?
[Python] Verwendung der for-Anweisung. Eine Methode zum Extrahieren durch Angabe eines Bereichs oder von Bedingungen.
python3: Verwendung der Flasche (2)
Ein Weg zum mittleren Python
[Python] Verwendung von Liste 1
Wie benutzt man Python Argparse?