[PYTHON] [ROS] So schreiben Sie Publisher und Subscriber auf einen Knoten

Einführung

Bei der Verwendung von ROS wollte ich Messdaten als Thema von dem Knoten abonnieren, der als Abonnent fungiert, aber ich hatte Probleme, weil ich keine Möglichkeit fand, Abonnenten und Publisher in einem Programm zu schreiben. (Es besteht eine hohe Wahrscheinlichkeit, dass die Google-Suchleistung gering ist.) Ich werde es zusammenfassen, um das Verständnis von ROS zu vertiefen. Ich habe gerade erst damit begonnen, und ich denke, es könnte falsch sein. Wenn Sie damit vertraut sind, weisen Sie bitte darauf hin. informativ.

Was ist ROS (Robot Operating System)?

Middleware, die Bibliotheken und Tools zur Unterstützung der Erstellung von Roboteranwendungen bereitstellt. Insbesondere wird die Kommunikation zwischen Robotern einfacher.

Pub & Sub Kommunikation

In ROS werden die mit dem ROS-Netzwerk verbundenen ausführbaren Dateien als "Knoten" bezeichnet, und Nachrichten, die als "Themen" bezeichnet werden, werden zwischen den Knoten ausgetauscht. Der Knoten, der die Nachricht übermittelt, wird als Publisher bezeichnet, und der Knoten, der die Nachricht empfängt, wird als Abonnent bezeichnet. PubSub通信.png

Ausführungsumgebung

Publisher-Beispielprogramm

talker.py


#!/usr/bin/env python
# license removed for brevity
import rospy
from std_msgs.msg import String #Importieren Sie den zu verwendenden Datentyp

def talker():
    #Publisher erstellen('Themenname',Schimmel,Größe)
    pub = rospy.Publisher('chatter', String, queue_size=10)
    #Knotennamen deklarieren
    rospy.init_node('talker', anonymous=True)
    #Deklarieren Sie den Zyklus der Schleife
    rate = rospy.Rate(10) # 10hz
    
    while not rospy.is_shutdown():
        #Geben Sie die zu veröffentlichenden Daten ein
        hello_str = "hello world %s" % rospy.get_time()
        #Zeigen Sie die Daten an, die im Terminal veröffentlicht werden sollen
        rospy.loginfo(hello_str)
        #Daten veröffentlichen
        pub.publish(hello_str)
        rate.sleep()

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

Zitiert aus dem Schreiben eines einfachen Herausgebers und Abonnenten (Python), ergänzende Erklärung

Abonnenten-Beispielprogramm

listener.py


#!/usr/bin/env python
import rospy
from std_msgs.msg import String #Importieren Sie den zu verwendenden Datentyp

def callback(data):
    #Zeigen Sie die empfangenen Daten im Terminal an
    #Daten sind Daten.In Daten empfangen
    rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)
     
def listener():
    #Knotennamen deklarieren
    rospy.init_node('listener', anonymous=True)
    #Abonnenten erstellen('Themenname',Schimmel,Rückruffunktion)
    rospy.Subscriber("chatter", String, callback)
    #Rufen Sie die Rückruffunktion weiter auf
    rospy.spin()

 if __name__ == '__main__':
    listener()

Zitiert aus dem Schreiben eines einfachen Herausgebers und Abonnenten (Python), ergänzende Erklärung

Publisher- und Subscriber-Programme

Nur weil ich rospy.spin () nicht verwende (weil es im Standby-Status der Rückruffunktion stoppt), habe ich das Gefühl, dass ich sie nur zusammengeklebt habe, aber ich habe mir darüber ungefähr zwei Tage lang Sorgen gemacht. Lol.

controller.py


#!/usr/bin/env python
# coding: utf-8
import rospy
from std_msgs.msg import String

def callback(data):
    #Zeigen Sie die empfangenen Daten im Terminal an
    #Daten sind Daten.In Daten empfangen
    rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)
      
def controller():
    #Knotennamen deklarieren
    rospy.init_node('controller', anonymous=True)
    #Erstellen Sie einen Abonnenten. Laden Sie das Thema.
    sub = rospy.Subscriber('listener', String, callback)
    #Publisher erstellen('Themenname',Schimmel,Größe)
    pub = rospy.Publisher('talker', String, queue_size=1)
    #Schleifenperiode.
    rate = rospy.Rate(10)
    
    while not rospy.is_shutdown():
        #Geben Sie die zu veröffentlichenden Daten ein
        hello_str = "hello world %s" % rospy.get_time()
        #Zeigen Sie die Daten an, die im Terminal veröffentlicht werden sollen
        rospy.loginfo(hello_str)
        #Daten veröffentlichen
        pub.publish(hello_str)
        rate.sleep()
    
if __name__ == '__main__':
    try:
        controller()
    except rospy.ROSInitException:
        pass

Referenz

Recommended Posts

[ROS] So schreiben Sie Publisher und Subscriber auf einen Knoten
Wie schreibe ich pydoc und mehrzeilige Kommentare
So schreiben Sie einen Komponententest für den URL-Abruf in GAE / P.
So definieren Sie Decorator und Decomaker mit einer Funktion
So installieren Sie Git GUI und Gitk unter CentOS
XPath-Grundlagen (2) - So schreiben Sie XPath
So teilen Sie die Vim-Zwischenablage mit dem Betriebssystem unter Ubuntu 18.04.3 LTS
[Python] Wie schreibe ich eine if-Anweisung in einen Satz?
So integrieren Sie Apache httpd 2.4 und Tomcat 9 unter Cent OS 8
So registrieren Sie sich bei pypi
So installieren Sie OpenCV in Cloud9 und führen es in Python aus
Repeated @ app.callback in Dash So schreiben Sie Input und State ordentlich
So schreiben Sie Code für den Zugriff auf Python dashDB auf Bluemix oder lokal
So führen Sie Jupyter und Spark auf einem Mac mit minimalen Einstellungen aus
So installieren Sie Pandas auf EC2 (Umgang mit MemoryError und PermissionError)
So zeigen Sie PDF-Auflösung und detaillierte Informationen unter Linux an (pdfinfo)
So blockieren Sie Anzeigen kostenlos auf iPhone- und iPad-Apps
[ROS2] Beschreibung der Neuzuordnung und der Parameter beim Start des Python-Formats
Richten Sie mit Tensorflow einen Knoten für MNIST auf ROS ein
[FSL] Wie man Atlas einzeln abzieht und trennt
So installieren Sie mysql-connector-python auf einem Mac
So installieren und verwenden Sie Tesseract-OCR
Wie man nüchtern mit Pandas schreibt
Verwendung von Dataiku unter Windows
Wiederverwendung von Flaschen Wie schreibe ich HTML?
Hinweise zur Verwendung von Pywinauto
So installieren Sie das Graph-Tool unter macOS
So installieren Sie VMware-Tools unter Linux
Hinweise zur Verwendung von featuretools
So installieren Sie OpenCV auf einem Mac
Wie man Matplotlib auf Heroku ausführt
So konvertieren Sie 0,5 in 1056964608 auf einmal
So installieren Sie PyPy unter CentOS
Wie benutzt man Homebrew in Debian?
Missverständnisse beim Verbinden von cnn
So installieren Sie TensorFlow unter CentOS 7
So installieren und konfigurieren Sie Amsel
So installieren und verwenden Sie Graphviz
So schreiben Sie ein Docker-Basis-Image
Wie schreibe ich Django1.9 umweltunabhängig wsgi.py
So installieren Sie Maven unter CentOS
So installieren Sie Musik 21 unter Windows
Lösen von Folienrätseln und 15 Rätseln
So schreiben Sie den richtigen Shebang in Perl-, Python- und Ruby-Skripten
Installieren Sie das ROS- und ROS-Modul für Roomba auf Raspberry Pi 3 und versuchen Sie, es auszuführen
Versuchen Sie, Python-Code zu schreiben, um Go-Code zu generieren. - Versuchen Sie, JSON-to-Go usw. zu portieren
So registrieren Sie nur eine Daten auf dem Django-Verwaltungsbildschirm
[Linux] Unterteilen von Dateien und Ordnern
So verpacken und verteilen Sie Python-Skripte
So installieren Sie das aws-session-manager-Plugin unter Manajro Linux
Qiita (1) Wie schreibe ich einen Codenamen?
Wie man pydoc auf Python Interpreter liest
So installieren Sie drobertadams / toggl-cli auf einem Mac
Wie man optuna einstellt (wie man einen Suchraum schreibt)
[Kivy] So installieren Sie Kivy unter Windows [Python]