[PYTHON] Überbrücken Sie ROS mit Ihrem eigenen Protokoll

Postskriptum 2019/02/11

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/).

Einführung

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.

rosbridge_suite - ROS Wiki

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.

Annahme

Implementierung

Überblick

Quellcode

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()

Lauf

$ python mybridge.py 192.168.0.1 80

Codekommentar

Initialisierung des Rosbridge-Protokolls

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

SocketIO-Client-Initialisierung

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.

Führen Sie "eingehend" im Empfangsrückruf von SocketIO-Client aus

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

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

Führen Sie die SocketIO-Client-Sendefunktion in "ausgehend" aus

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

protocol.outgoing = outgoing_func
socketIO.wait()

Warten Sie, bis der SocketIO-Client empfangen wurde. Für das Rosbridge-Protokoll muss keine Funktion zum Warten ausgeführt werden.

Rosbridge-Protokoll

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

Überbrücken Sie ROS mit Ihrem eigenen Protokoll
Fügen Sie mitmproxy Ihre eigene Inhaltsansicht hinzu
Wenn Sie dasselbe wie zuvor verwenden, können Sie dies visualisieren, indem Sie Japan, China und Südkorea ausschließen, in denen viele Menschen infiziert sind. In diesem Fall lauten die Daten für "2020/02/21" wie folgt. Besonders auffällig sind Südostasien, Europa und Nordamerika. Ich hoffe es konvergiert so schnell wie möglich. .. .. Migrieren Sie Python, Pandas, Python3, Zeitreihendaten und eigene CMS-Daten nach WordPress
So importieren Sie Ihr eigenes Modul mit jupyter
So installieren Sie Ihre eigene (Root-) Zertifizierungsstelle
Versuchen Sie, Ihr eigenes AWS-SDK mit bash zu erstellen
So definieren Sie Ihr eigenes Ziel in Sage
Kommentieren Sie Ihre eigenen Daten, um Mask R-CNN zu trainieren
Schritte zum Installieren Ihrer eigenen Bibliothek mit pip
Erstellen Sie Ihre eigene Ausnahme
Memo zum Erstellen einer eigenen Box mit Peppers Python
[Einführung in die Udemy Python3 + -Anwendung] 66. Erstellen einer eigenen Ausnahme
Versuchen Sie, Ihr eigenes Intro-Quiz mit Python zu verbessern
Versuchen Sie, die LED in Ihren eigenen PC einzubauen (leicht)
[Road to Intermediate Python] Definieren Sie in Ihrer eigenen Klasse
Rufen Sie Ihr eigenes Python-Modul aus dem ROS-Paket auf
Wie Sie pyenv und pyenv-virtualenv auf Ihre eigene Weise verwenden
(Hinweis) So übergeben Sie den Pfad Ihres eigenen Moduls
Erstellen Sie Ihre eigene Django-Middleware
Erstellen Sie das Thema von Pythonista 3 wie Monokai (wie Sie Ihr eigenes Thema erstellen)
Wechseln Sie von der Ubuntu-Installation zur Chainer-Installation, indem Sie Ihren eigenen PC erstellen
[Einführung in Style GAN] Einzigartiges Lernen von Animation mit Ihrer eigenen Maschine ♬
So erstellen Sie Ihre eigene Domain-Site mit Heroku (kostenloser Plan)
Einführung in Deep Learning (2) - Versuchen Sie Ihre eigene nichtlineare Regression mit Chainer-
[Blender] Weisen Sie Ihren eigenen Funktionen im Skript Tastenkombinationen zu