[Python] Il était très pratique d'utiliser la classe Python pour le programme ROS.

introduction

J'ai commencé à toucher ROS petit à petit récemment, et lors de l'implémentation d'un nœud en Python, j'aimerais introduire un problème avec ** l'implémentation d'un éditeur et d'un abonné dans un nœud **. J'ai pu le nettoyer en utilisant une classe Python. On suppose que vous avez suffisamment de connaissances ROS et un peu de connaissances orientées objet pour créer vos propres packages.

Un exemple d'implémentation est [ici](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)

Ce que je voulais faire

Je souhaite m'abonner aux données sur ce sujet, les traiter et les publier sur ce sujet

Je pense qu'il y a quelque chose comme ça. Ai-je découvert une erreur ** Que dois-je faire lorsque j'utilise un abonné et un éditeur en même temps sur un nœud **? J'étais assez accro.

Éditeur et abonné ROS implémentés en Python

ROS.org et les didacticiels bien présentés pour les éditeurs et les abonnés ressemblent souvent à ceci: Je pense.

Éditeur (également appelé talker)

Spécifiez le nom du sujet et le type de message avec rospy.Publisher et publiez avec pub.publish ().

talker.py


#importation de rospy et de messages
import rospy
import std_msgs.msg import String

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

    #Le traitement continue
    
    pub.publish(data)

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

Abonné (également appelé auditeur)

Dans rospy.Subscriber, spécifiez le nom de la rubrique, le type de données et spécifiez la fonction de rappel, et effectuez le traitement post-abonnement avec la fonction de rappel.

listener.py


#importation de rospy et de messages
import rospy
from std_msgs.msg import String

def callback(data):
    #abonnement fonction de rappel
    
def listener():
    rospy.init_node('listener', anonymous=True)

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

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

Publiez et abonnez-vous sur un nœud à la fois

Après le tutoriel, j'ai compris le mécanisme de Publish and Subscribe. Ensuite, créons un nouveau nœud et faisons Publier et S'abonner en même temps. J'ai pensé, et quand je l'ai implémenté, devrais-je le publier dans la fonction de rappel de rospy.Subscriber? J'étais inquiet car je ne pouvais pas nettoyer le code.

À ce moment-là, je regardais cet article et j'ai également vu le code /main.py#L10) Au fait, c'était très beau, donc je l'ai utilisé comme référence. Je n'ai pas utilisé de classes Python dans le didacticiel ci-dessus, mais elles peuvent être bien implémentées.

Créez un éditeur et un abonné avec __init__ () et traitez-les dans le flux de la fonction de rappel et de la fonction de publication. Lorsque vous l'exécutez, créez une classe dans la partie principale et vous avez terminé!

test.py


import rospy
from std_msgs.msg import String

class testNode():
    def __init__(self):
        #Créer un abonné
        self.sub = rospy.Subscriber('topic name', String, self.callback)
        #Créer un éditeur
        self.pub = rospy.Publisher('topic name', String, queue_size=1)

    def callback(self, data):
        #Ecrire le traitement de la fonction de rappel

        Publisher(data)

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

    def function(self, data):
        #Écrivez s'il y a un autre traitement

        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)

en conclusion

Personnellement, j'ai pensé qu'il était difficile de commencer avec l'orientation objet, mais j'ai pu l'écrire de manière pratique et ordonnée. Certaines personnes ont créé des modèles avec comme celui-ci!

Je n'avais pas les informations que je voulais rechercher pour "ros python publish subscribe même nœud". .. .. Je suis trop nouveau sur ROS, est-ce que je fais quelque chose de mal? Veuillez me faire savoir si quelque chose ne va pas.

référence

Pour l'apprentissage automatique de ROS, j'ai créé un package pour faire passer l'angle de joint avec Topic d'OpenPose Cours ROS 31 principes de base de python Modèle de programme ROS Ecrire un éditeur et un abonné simples (Python)

Recommended Posts

[Python] Il était très pratique d'utiliser la classe Python pour le programme ROS.
Pratique pour utiliser les sous-graphiques matplotlib dans l'instruction for
Comment utiliser la méthode __call__ dans la classe Python
Utilisez un langage de script pour une vie C ++ confortable-OpenCV-Port Python vers C ++ -
[Introduction à Python] Comment utiliser l'opérateur in dans l'instruction for?
[Introduction à Python] Comment utiliser la classe en Python?
[Python] Comment rendre une classe itérable
[Python] Organisation de l'utilisation des instructions
Comment utiliser __slots__ dans la classe Python
Comment utiliser "deque" pour les données Python
J'ai créé un conteneur Docker pour utiliser JUMAN ++, KNP, python (pour pyKNP).
Utilisez Python de Java avec Jython. J'étais aussi accro.
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image pour eux-mêmes 3 Écrire dans un fichier
[Python] J'ai été accro pendant une heure à essayer d'utiliser la notation d'inclusion de liste
Utilisation pratique des couches lors du chargement de bibliothèques sur Lambda
Il est plus pratique d'utiliser csv-table lors de l'écriture d'une table avec python-sphinx
Créer un outil de génération de documents Python car il est difficile d'utiliser sphinx
Écrivons un programme Python et exécutons-le
python: utilisez votre propre classe pour numpy ndarray
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image pour eux-mêmes 7 Comment créer un module
Comment utiliser pip, un système de gestion de paquets indispensable pour utiliser Python
[Python] Je souhaite utiliser uniquement l'index lors de la mise en boucle d'une liste avec une instruction for
Un programme qui demande quelques kilogrammes pour atteindre l'IMC et le poids standard [Python]
Un script python qui souhaite utiliser l'heure de démarrage / fin de Mac pour la gestion des présences
Comment utiliser le multitraitement python (suite 3) apply_async en classe avec Pool en tant que membre
Créer un ensemble de données d'images à utiliser pour la formation
[BigQuery] Comment utiliser l'API de BigQuery pour Python -Création de table-
[Pour les débutants] Comment utiliser la commande say avec python!
[Introduction à python] Introduction rapide à Python pour les programmeurs C ++ occupés
De l'achat d'un ordinateur à l'exécution d'un programme sur python
[Python] Une bibliothèque pratique qui convertit les kanji en hiragana
Python: peut être répété en lambda
C'était un souvenir douloureux quand on m'a dit TypeError: doit être de type, pas de classe obj en essayant d'hériter avec Python
J'ai créé une fonction pour découper l'image de python openCV, alors veuillez l'utiliser.
Création d'un outil qui facilite la définition des paramètres des modèles d'apprentissage automatique
[Python] Qu'est-ce qu'un tuple? Explique comment utiliser sans toucher et comment l'utiliser avec des exemples.
L'utilisation du japonais pour les noms de dossier et les noms de bloc-notes dans Databricks peut poser problème
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image pour eux-mêmes 4 Utiliser l'interface graphique
Expérience pour collecter des tweets pendant une longue période (préparation du programme (1))
[python] Comment utiliser Matplotlib, une bibliothèque pour dessiner des graphiques
Comment exécuter un programme Python à partir d'un script shell
Expérimentez pour créer un PDF indépendant pour Kindle avec Python
Un moyen simple d'éviter plusieurs boucles for en Python
Comment créer un package Python (écrit pour un stagiaire)
Comment utiliser l'apprentissage automatique pour le travail? 03_Procédure de codage Python
Expérience pour collecter des tweets pendant une longue période (préparation du programme (2))
Expérience pour collecter des tweets pendant une longue période (préparation du programme (5))
Je ne savais pas comment utiliser l'instruction [python] for
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image par eux-mêmes
Un moyen très pratique de présenter avec Jupyter Notebook
Un débutant en python a essayé de faire un stage dans une entreprise informatique
Créer un environnement virtuel pour python sur mac [Très facile]
[Python] Qu'est-ce qu'une tranche? Une explication facile à comprendre de son utilisation avec un exemple concret
Utilisons un langage de script pour une vie confortable en C ++ 6-Que diriez-vous de développer un programme en tant que bibliothèque pour Python?
[Python] Comment utiliser l'instruction for. Une méthode d'extraction en spécifiant une plage ou des conditions.
python3: Comment utiliser la bouteille (2)
Une route vers Python intermédiaire
[Python] Comment utiliser la liste 1
Comment utiliser Python Argparse