Lors de l'utilisation de ROS, je voulais communiquer les données de mesure en tant que sujet à partir du nœud fonctionnant en tant qu'abonné, mais j'avais des problèmes car je ne trouvais pas de moyen d'écrire l'abonné et l'éditeur dans un seul programme. (Il y a une forte possibilité que la puissance de recherche de Google soit faible), je vais le résumer pour approfondir la compréhension de ROS. Je viens de commencer à l'utiliser récemment, et je pense que c'est peut-être faux, donc si vous le connaissez, veuillez le signaler. informatif.
Middleware qui fournit des bibliothèques et des outils pour prendre en charge la création d'applications robotiques. Plus précisément, la communication entre les robots sera plus facile.
Dans ROS, les exécutables connectés au réseau ROS sont appelés «nœuds», et des messages appelés «sujets» sont échangés entre les nœuds. Le nœud qui remet le message est appelé le serveur de publication et le nœud qui reçoit le message est appelé l'abonné.
talker.py
#!/usr/bin/env python
# license removed for brevity
import rospy
from std_msgs.msg import String #Importez le type de données à utiliser
def talker():
#Créer un éditeur('Nom du sujet',Moule,Taille)
pub = rospy.Publisher('chatter', String, queue_size=10)
#Déclarer le nom du nœud
rospy.init_node('talker', anonymous=True)
#Déclarer le cycle de la boucle
rate = rospy.Rate(10) # 10hz
while not rospy.is_shutdown():
#Remplissez les données à publier
hello_str = "hello world %s" % rospy.get_time()
#Afficher les données à publier dans le terminal
rospy.loginfo(hello_str)
#Publier des données
pub.publish(hello_str)
rate.sleep()
if __name__ == '__main__':
try:
talker()
except rospy.ROSInterruptException:
pass
Cité dans Writing a Simple Publisher and Subscriber (Python), explication supplémentaire
listener.py
#!/usr/bin/env python
import rospy
from std_msgs.msg import String #Importez le type de données à utiliser
def callback(data):
#Afficher les données reçues dans le terminal
#Les données sont des données.Reçu dans les données
rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)
def listener():
#Déclarer le nom du nœud
rospy.init_node('listener', anonymous=True)
#Créer un abonné('Nom du sujet',Moule,fonction de rappel)
rospy.Subscriber("chatter", String, callback)
#Continuez à appeler la fonction de rappel
rospy.spin()
if __name__ == '__main__':
listener()
Cité dans Writing a Simple Publisher and Subscriber (Python), explication supplémentaire
Juste parce que je n'utilise pas rospy.spin () (parce qu'il s'arrête dans l'état de veille de la fonction de rappel), j'ai l'impression de les avoir collés ensemble, mais je m'inquiétais à ce sujet pendant environ deux jours. Lol.
controller.py
#!/usr/bin/env python
# coding: utf-8
import rospy
from std_msgs.msg import String
def callback(data):
#Afficher les données reçues dans le terminal
#Les données sont des données.Reçu dans les données
rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)
def controller():
#Déclarer le nom du nœud
rospy.init_node('controller', anonymous=True)
#Créez un abonné. Chargez le sujet.
sub = rospy.Subscriber('listener', String, callback)
#Créer un éditeur('Nom du sujet',Moule,Taille)
pub = rospy.Publisher('talker', String, queue_size=1)
#Période de boucle.
rate = rospy.Rate(10)
while not rospy.is_shutdown():
#Remplissez les données à publier
hello_str = "hello world %s" % rospy.get_time()
#Afficher les données à publier dans le terminal
rospy.loginfo(hello_str)
#Publier des données
pub.publish(hello_str)
rate.sleep()
if __name__ == '__main__':
try:
controller()
except rospy.ROSInitException:
pass
Recommended Posts