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)
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.org und die gut eingeführten Publisher- und Subscriber-Tutorials sehen häufig so aus: Ich denke.
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
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()
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)
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.
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