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/).
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 à.
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.
--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
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()
$ python mybridge.py 192.168.0.1 80
rospy.init_node('mybridge')
client_id_seed = 0;
protocol = RosbridgeProtocol(client_id_seed)
rospy.init_node
, vous obtiendrez une erreur.
--Je ne suis pas sûr de client_id_seed
, mais 0
semble convenir (le programme serveur inclus utilise également 0
).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.
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 un
message` qui suit ROSBRIDGE_PROTOCOL.md. Le fera.
def outgoing_func(message):
msg = json.loads(message)
socketIO.emit('ws-send', json.dumps(obj))
protocol.outgoing = outgoing_func
est une fonction qui est appelée à chaque fois qu'un message ROS est reçu. --
message` est une chaîne JSON qui suit ROSBRIDGE_PROTOCOL.md.
--Envoyer en tant qu'événement `` ws-send '' depuis SocketIO-Client.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.
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