[PYTHON] Reliez ROS à votre propre protocole

PostScript 2019/02/11

Il semble que vous soyez au sommet des informations japonaises qui sortent en recherchant rosbridge, alors faites-en un peu plus.

La société à laquelle j'appartiens, aptpod, est une société qui développe un courtier PubSub en utilisant WebSocket en interne (pour une explication un peu plus détaillée, Advent Calendar J'ai écrit dans 551f5ad60d8c4cd14588)), l'article suivant était en fait le contenu que j'ai recherché pour la connexion au courtier PubSub de mon entreprise (bien que ce soit la connexion à Socket.io dans l'article).

Récemment, il semble que certains clients souhaitent visualiser les données ROS des robots à distance, donc si vous rencontrez des problèmes pour transmettre et visualiser de gros volumes de données (non limité à ROS), n'hésitez pas à nous contacter. Veuillez nous contacter à l'adresse (https://www.aptpod.co.jp/).

introduction

Il existe un module ROS appelé Rosbridge qui relie les messages ROS à d'autres protocoles. Le rosbridge_server inclus dans le package a un programme serveur qui utilise UDP, TCP et WebSocket comme protocoles de transport. En particulier pour WebSocket, vous pouvez ROS votre navigateur très facilement en utilisant la bibliothèque js roslibjs. Vous pouvez participer à.

rosbridge_suite - ROS Wiki

Cette fois, afin de relier Rosbridge à un protocole autre que le protocole inclus dans le package (Socket.io cette fois) tel que UDP, TCP, WebSocket, considérons une méthode d'utilisation directe du protocole Rosbridge (rosbridge_library). En utilisant le protocole Rosbridge, vous n'avez pas à l'implémenter pour chaque type d'opération tel que pubsidh / subscribe / service ..., et vous n'avez pas besoin d'importer le module de chaque message, vous pouvez donc faire le pont très facilement. Je vais.

Il y a encore peu de documents japonais sur ROS, donc j'espère que cela aidera quelqu'un.

supposition

la mise en oeuvre

Aperçu

--Instaurer le protocole Rosbridge --Exécuter RosbridgeProtocol.incoming dans la fonction de rappel entrant du protocole externe --Exécute la fonction d'envoi du protocole externe dans RosbridgeProtocol.outgoing

Code source

mybridge.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import json
import rospy
import socketIO_client
from rosbridge_library.rosbridge_protocol import RosbridgeProtocol

# ############################
# arguments
# ############################
host = sys.argv[1]
port = int(sys.argv[2])


# ############################
# init RosBridgeProtocol
# ############################
rospy.init_node('mybridge')
client_id_seed = 0;
protocol = RosbridgeProtocol(client_id_seed)


# ############################
# init Socket.io
# ############################
socketIO = socketIO_client.SocketIO(host, port)

def on_connect(*args):
    rospy.loginfo('socket.io connected.')

def on_disconnect(*args):
    rospy.loginfo('socket.io disconnected.')

socketIO.on('connect',    on_connect)
socketIO.on('disconnect', on_disconnect)


# ############################
# on websocket message
# ############################
def on_message(*args):
    message = json.loads(args[0])
    protocol.incoming(message)

socketIO.on('ws-receive', on_message)


# ############################
# on ros message
# ############################
def outgoing_func(message):
    msg = json.loads(message)
    socketIO.emit('ws-send', json.dumps(msg))

protocol.outgoing = outgoing_func


# ############################
# start Socket.io
# ############################
socketIO.wait()

Courir

$ python mybridge.py 192.168.0.1 80

Commentaire de code

Initialisation du protocole Rosbridge

rospy.init_node('mybridge')
client_id_seed = 0;
protocol = RosbridgeProtocol(client_id_seed)

Initialisation de SocketIO-Client

socketIO = socketIO_client.SocketIO(host, port)

def on_connect(*args):
    rospy.loginfo('socket.io connected.')

def on_disconnect(*args):
    rospy.loginfo('socket.io disconnected.')

socketIO.on('connect', on_connect)
socketIO.on('disconnect', on_disconnect)

Initialisation de SocketIO-Client. Je n'ai rien fait de spécial.

Exécutez ʻincoming` dans le rappel de réception de SocketIO-Client

def on_message(*args):
    message = json.loads(args[0])
    protocol.incoming(message)

socketIO.on('ws-receive', on_message)

--Appeler ʻincoming dans le callback ʻon_message lorsque l'événement'ws-receive' est reçu par SocketIO-Client. --'Incomingpeut être converti en un message ROS et envoyé en passant unmessage` qui suit ROSBRIDGE_PROTOCOL.md. Le fera.

ʻExécuter la fonction d'envoi de SocketIO-Client en sortie`

def outgoing_func(message):
    msg = json.loads(message)
    socketIO.emit('ws-send', json.dumps(obj))

protocol.outgoing = outgoing_func
socketIO.wait()

Attendez que SocketIO-Client reçoive. Pour le protocole Rosbridge, il n'est pas nécessaire d'exécuter une fonction d'attente.

Protocole de Rosbridge

En gros, c'est OK si vous envoyez un message selon ROSBRIDGE_PROTOCOL.md. Un exemple est montré ci-dessous, mais veuillez vous référer à la source du lien pour des options détaillées.

publish Si vous souhaitez publier, envoyez le message suivant du côté serveur. L'exemple ci-dessous est un exemple de topic / cmd_vel de type geometry_msgs / Twist.

{
  "op": "publish",
  "topic": "/cmd_vel",
  "msg": {
    "linear"  : { "x" : 0, "y" : 0, "z" : 0 },
    "angular" : { "x" : 0, "y" : 0, "z" : 0 },
  }, 
}

subscribe Si vous souhaitez vous abonner, envoyez le message suivant du côté serveur pour commencer à relier le message. Voici un exemple du sujet / odom. Seul le nom du sujet est correct.

{
  "op": "subscribe",
  "topic": "/odom",
}

Pour désinscrire un message une fois abonné, procédez comme suit.

{
  "op": "unsubscribe",
  "topic": "/odom",
}

Recommended Posts

Reliez ROS à votre propre protocole
Ajoutez votre propre vue de contenu à mitmproxy
Migrez vos propres données CMS vers WordPress
Pour importer votre propre module avec jupyter
Comment installer votre propre autorité de certification (racine)
Essayez de créer votre propre AWS-SDK avec bash
Comment définir votre propre cible dans Sage
Annotez vos propres données pour entraîner Mask R-CNN
Étapes pour installer votre propre bibliothèque avec pip
Créez votre propre exception
Mémo pour créer votre propre Box avec le Python de Pepper
[Introduction à l'application Udemy Python3 +] 66. Création de votre propre exception
Essayez d'améliorer votre propre quiz d'introduction avec Python
Essayez de mettre des LED dans votre propre PC (légèrement)
[Road to Intermediate Python] Définissez dans votre propre classe
Appelez votre propre module python à partir du package ROS
Comment utiliser pyenv et pyenv-virtualenv à votre manière
(Note) Comment passer le chemin de votre propre module
Créez votre propre middleware Django
Créez le thème de Pythonista 3 comme Monokai (comment créer votre propre thème)
Passez de l'installation d'Ubuntu à l'installation du chainer en créant votre propre ordinateur personnel
[Introduction au style GAN] Apprentissage unique de l'animation avec votre propre machine ♬
Comment créer votre propre site de domaine avec heroku (plan gratuit)
Introduction au Deep Learning (2) - Essayez votre propre régression non linéaire avec Chainer-
[Blender] Attribuez des touches de raccourci à vos propres fonctions dans le script