Es scheint, dass Sie an der Spitze der japanischen Informationen stehen, die bei der Suche nach "Rosbridge" herauskommen. Machen Sie also bitte ein wenig Werbung.
Das Unternehmen, zu dem ich gehöre, aptpod, ist ein Unternehmen, das einen PubSub-Broker mithilfe von WebSocket im eigenen Haus entwickelt (für eine etwas ausführlichere Erklärung Adventskalender. Ich schrieb in 551f5ad60d8c4cd14588)), der folgende Artikel war eigentlich der Inhalt, den ich nach der Verbindung zum PubSub-Broker meines Unternehmens suchte (obwohl es sich im Artikel um die Verbindung zu Socket.io handelt).
In letzter Zeit scheinen einige Kunden die ROS-Daten von Robotern aus der Ferne visualisieren zu wollen. Wenn Sie also Probleme bei der Übertragung und Visualisierung großer Datenmengen haben (nicht auf ROS beschränkt), zögern Sie bitte nicht, uns zu kontaktieren. Bitte kontaktieren Sie uns unter (https://www.aptpod.co.jp/).
Es gibt ein ROS-Modul namens Rosbridge, das ROS-Nachrichten mit anderen Protokollen verbindet. Der im Paket enthaltene rosbridge_server verfügt über ein Serverprogramm, das UDP, TCP und WebSocket als Transportprotokolle verwendet. Insbesondere für WebSocket können Sie Ihren Browser mithilfe der js-Bibliothek roslibjs ganz einfach ROS-fähig machen. Sie können teilnehmen.
Um Rosbridge mit einem anderen Protokoll als dem im Paket enthaltenen Protokoll (diesmal Socket.io) wie UDP, TCP, WebSocket zu verbinden, betrachten wir dieses Mal eine Methode zur direkten Verwendung des Rosbridge-Protokolls (rosbridge_library). Wenn Sie das Rosbridge-Protokoll verwenden, müssen Sie es nicht für jeden Operationstyp wie pubsidh / subscribe / service ... implementieren, und Sie müssen nicht das Modul jeder Nachricht importieren, damit Sie sehr einfach eine Brücke schlagen können. Ich werde.
Es gibt immer noch wenige japanische Materialien über ROS, daher hoffe ich, dass es jemandem hilft.
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
nicht ausführen, erhalten Sie eine Fehlermeldung.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)
Initialisierung von SocketIO-Client. Ich habe nichts Besonderes gemacht.
def on_message(*args):
message = json.loads(args[0])
protocol.incoming(message)
socketIO.on('ws-receive', on_message)
def outgoing_func(message):
msg = json.loads(message)
socketIO.emit('ws-send', json.dumps(obj))
protocol.outgoing = outgoing_func
outgoing
ist eine Funktion, die jedes Mal aufgerufen wird, wenn eine ROS-Nachricht empfangen wird.
--message
ist eine JSON-Zeichenfolge, die auf [ROSBRIDGE_PROTOCOL.md] folgt (https://github.com/RobotWebTools/rosbridge_suite/blob/groovy-devel/ROSBRIDGE_PROTOCOL.md).
--Senden Sie als "ws-send" -Ereignis vom SocketIO-Client.socketIO.wait()
Warten Sie, bis der SocketIO-Client empfangen wurde. Für das Rosbridge-Protokoll muss keine Funktion zum Warten ausgeführt werden.
Grundsätzlich ist es in Ordnung, wenn Sie eine Nachricht gemäß [ROSBRIDGE_PROTOCOL.md] senden (https://github.com/RobotWebTools/rosbridge_suite/blob/groovy-devel/ROSBRIDGE_PROTOCOL.md). Ein Beispiel ist unten dargestellt. Detaillierte Optionen finden Sie in der Linkquelle.
publish Wenn Sie veröffentlichen möchten, senden Sie die folgende "Nachricht" von der Serverseite. Das folgende Beispiel ist ein Beispiel für ein Thema "/ cmd_vel" vom Typ "Geometrie_msgs / Twist".
{
"op": "publish",
"topic": "/cmd_vel",
"msg": {
"linear" : { "x" : 0, "y" : 0, "z" : 0 },
"angular" : { "x" : 0, "y" : 0, "z" : 0 },
},
}
subscribe Wenn Sie sich anmelden möchten, senden Sie die folgende "Nachricht" von der Serverseite, um die Überbrückung der Nachricht zu starten. Unten finden Sie ein Beispiel für das Thema "/ odom". Nur der Themenname ist in Ordnung.
{
"op": "subscribe",
"topic": "/odom",
}
Gehen Sie wie folgt vor, um eine abonnierte Nachricht abzubestellen.
{
"op": "unsubscribe",
"topic": "/odom",
}
Recommended Posts