[PYTHON] Versuche mit EV3 und PC zu kommunizieren! (MQTT)

Ich bin gerade dabei, eine Maschine zu erstellen, die automatisch 2 * 2 * 2 Schmierwürfel mit LEGO ausrichtet, indem sie die Farben mit einem Farbsensor liest.

Einführung

Ich habe versucht, ein Programm auszuführen, das einen 2 * 2 * 2-Rubikwürfel mit dem IDA * -Algorithmus auf EV3 löst. Aufgrund der geringen CPU-Leistung von EV3 (und meines schlechten Verständnisses des Algorithmus) dauerte es jedoch fast 10 Minuten, um den Rubik-Cube zu lösen, der mit 9 Händen gelöst werden kann. Daher habe ich mit MQTT MQTT verwendet.

  1. EV3 liest die Farbe des Rubik Cube und sendet den Status des Rubik Cube an den Computer.
  2. Der Personal Computer fragt nach der Lösung des Rubic Cube und sendet sie an EV3.
  3. EV3 richtet Rubikwürfel basierend auf der Lösung aus

Ich werde versuchen, es in Form von zu machen. In diesem Artikel werden wir sogar sagen: "EV3 sendet den Status des Rubik Cube an einen Computer, löst ihn auf dem Computer und sendet die Lösung an EV3."

Was ist MQTT?

MQTT ist ein leichtes Kommunikationsprotokoll, das auf TCP / IP basiert und von IBM entwickelt wurde. Da es leicht ist, scheint es, dass es häufig für IoT-Geräte verwendet wird. Die Kommunikation ist in drei Rollen unterteilt: Publisher (Absender), Broker (Vermittler) und Abonnent (Empfänger). Zunächst entscheidet der Abonnent über die Überschrift der Informationen, die Sie erhalten möchten, und wartet. Fügen Sie als Nächstes eine Überschrift zu den Informationen hinzu, die Publisher senden möchte, und senden Sie sie einmal an Broker. Der Broker sendet diese Informationen dann an den Abonnenten, der versucht, die Informationen für diese Überschrift zu erhalten.

PC / EV3-Spezifikationen usw.

PC OS : Windows10 CPU : Intel Core i5-8600K @ 3.60GHz RAM : 16GB Python : 3.8.0 (Bitte Pip zur Verfügung haben)

EV3 Betriebssystem: EV3 MicroPython (nicht sicher, ob es der offizielle Name ist) CPU : ARM9 @ 300MHz RAM : 64MB Python : 3.5.3

EV3 MicroPython DL ・ Hauptverwendung ist Von hier Übrigens ist dieses EV3 MicroPython ev3dev mit der Pybricks MicroPython-Laufzeitbibliothek, sodass Sie die Funktionen von ev3dev unverändert nutzen können.

Vorbereitung

Grundsätzlich ist es für die Kommunikation über MQTT erforderlich, das Gerät mit dem Internet zu verbinden. Da der EV3 jedoch überhaupt kein Wi-Fi-Modul besitzt, sind diesmal PC und EV3 direkt mit dem USB-Kabel verbunden. Verbinden und kommunizieren mit. Wenn Sie über das Internet kommunizieren möchten, müssen Sie einen WLAN-Dongle separat erwerben.

SSH-Verbindung

Nachdem Sie EV3 und PC mit einem Kabel verbunden haben, müssen Sie sich im nächsten Schritt vom PC mit SSH bei EV3 anmelden. Wenn Sie Linux oder macOS verwenden, können Sie sich mit dem Befehl ssh vom Terminal aus anmelden (Standardbenutzer-ID ist 'Roboter', Passwort ist 'Hersteller'). Verwenden Sie für Windows eine Software namens TeraTerm (für Windows 10 Version 1903 oder höher können Sie mit der Software "Windows Terminal" eine Verbindung mit dem Befehl ssh herstellen).

Wenn Sie TeraTerm starten, wird das folgende Fenster angezeigt. TeraTerm-新しい接続.JPG Geben Sie "robot @ ev3dev.local" in "Host" ein und klicken Sie auf "OK". Wenn Sie eine Verbindung zum Internet herstellen, können Sie "ev3dev.local" durch die IP-Adresse ersetzen (wie "robot @ 192.168.xx.xx").

Als nächstes wird das Fenster "Sicherheitswarnung" nur angezeigt, wenn Sie zum ersten Mal eine Verbindung herstellen. Wählen Sie einfach "Weiter".

Sie werden nach Ihrem Passwort gefragt, geben'maker 'ein und wählen OK. TeraTerm-SSH認証.JPG

Wenn Folgendes angezeigt wird, ist die SSH-Verbindung abgeschlossen.


Linux ev3dev 4.14.96-ev3dev-2.3.2-ev3 #1 PREEMPT Sun Jan 27 21:27:35 CST 2019 armv5tejl```
             _____     _
   _____   _|___ /  __| | _____   __
  / _ \ \ / / |_ \ / _` |/ _ \ \ / /
 |  __/\ V / ___) | (_| |  __/\ V /
  \___| \_/ |____/ \__,_|\___| \_/
```
Debian stretch on LEGO MINDSTORMS EV3!
 Letzter Login: (Datum und Uhrzeit) von ...
robot@ev3dev:~$ 

Broker installieren

Installieren Sie einen Broker für die MQTT-Kommunikation zwischen EV3 und PC. Verwenden Sie Mücke. Sie können es entweder in PC oder EV3 einbauen, aber dieses Mal werden wir es in EV3 installieren. Führen Sie den folgenden Befehl aus.


robot@ev3dev:~$ sudo apt-get update
robot@ev3dev:~$ sudo apt-get install mosquitto

Überprüfen Sie nach der Installation, ob der Broker mit dem folgenden Befehl ausgeführt wird.


robot@ev3dev:~$ sudo service mosquitto status
● mosquitto.service - LSB: mosquitto MQTT v3.1 message broker
   Loaded: loaded (/etc/init.d/mosquitto; generated; vendor preset: enabled)
 Aktiv: aktiv (läuft) seit (Datum und Uhrzeit)
     Docs: man:systemd-sysv-generator(8)
  Process: 1282 ExecStart=/etc/init.d/mosquitto start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/mosquitto.service
           mq1289 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

 (Datum und Uhrzeit) ev3dev systemd [1]: Starten von LSB: Moskito MQTT v3.1 Message Broker ...
 (Datum und Uhrzeit) ev3dev mosquitto [1282]: Starten des Netzwerkdämons :: mosquitto.
 (Datum und Uhrzeit) ev3dev systemd [1]: Started LSB: Moskito MQTT v3.1 Message Broker.

● Wenn der Teil von und active (running ) grün ist, wurde er korrekt gestartet. Die Standardportnummer ist 1883

Wenn Sie Folgendes sehen, wurde es nicht gestartet.


robot@ev3dev:~$ sudo service mosquitto status
● mosquitto.service - LSB: mosquitto MQTT v3.1 message broker
   Loaded: loaded (/etc/init.d/mosquitto; generated; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:systemd-sysv-generator(8)

Führen Sie also den folgenden Befehl aus und prüfen Sie, ob er erneut gestartet wird.


robot@ev3dev:~$ sudo service mosquitto start

Bibliotheksinstallation

Installieren Sie als Nächstes die Bibliothek, um MQTT aus Python zu verarbeiten. Führen Sie den folgenden Befehl auf EV3 aus.


robot@ev3dev:~$ sudo pip3 install paho-mqtt

Installieren Sie es auf die gleiche Weise auf Ihrem PC.



#### **`\Users\(Nutzername)>pip install paho-mqtt`**
```c

Sie sind jetzt bereit.

EV3-Nebenprogramm

main.py


#!/usr/bin/env python3

import paho.mqtt.client as mqtt  #MQTT-Bibliothek importieren
import subprocess
from time import sleep

get_way = False

def on_connect(client, userdata, flags, rc):     #Definition der Rückruffunktion, die beim Herstellen einer Verbindung zum Broker ausgeführt werden soll
	print("Connected with result code "+str(rc)) #Wenn die Verbindung erfolgreich ist, ist rc 0
	client.subscribe("pc/solve_way")             # "pc/solve_way"Lesen Sie die Überschrift

def on_message(client, userdata, message):       #Definition einer Rückruffunktion, die ausgeführt werden soll, wenn eine Nachricht empfangen wird
	print(message.topic + " " + str(message.payload))  #Das Thema ist der Überschriftenname und die Nutzlast ist die Nachricht.
	global get_way
	get_way = True

def main():
	client = mqtt.Client()                #Generieren Sie eine Instanz des MQTT-Clients
	client.on_connect = on_connect        #Übergeben Sie die oben definierte Verbindungsrückruffunktion
	client.on_message = on_message        #Übergeben Sie die oben definierte Rückruffunktion

	client.connect("localhost", 1883, 60) # Broker(mich selber)Stellen Sie eine Verbindung zu Port 1883 her(Keep Alive ist 60 Sekunden)
	
	client.publish("ev3/cube_state", "5,2,6,3,4,7,1,0:0,0,0,0,0,1,2,0") #Suchen Sie im ersten Argument und nehmen Sie Informationen im zweiten Argument
	# "5,2,6,3,4,7,1,0:0,0,0,0,0,1,2,0"Die Aufzählung der Zahlen repräsentiert den Zustand des Zauberwürfels
	
	print("published")
	client.loop_start()       #Starten Sie die Nachrichtenempfangsschleife

	while not get_way:
		sleep(0.01)

	client.loop_stop()        #Stoppen Sie die Empfangsschleife
	client.disconnect()       #Trennen

if __name__ == '__main__':
	main()

Programm auf der PC-Seite

pc-main.py


import paho.mqtt.client as mqtt  #MQTT-Bibliothek importieren
from time import sleep
import rcSolver as solver        # 2*2*2 Programm zum Lösen des Zauberwürfels

get_state = False
solve_way = ""

def on_connect(client, userdata, flags, rc):     #Definition der Rückruffunktion, die beim Herstellen einer Verbindung zum Broker ausgeführt werden soll
	print("Connected with result code "+str(rc)) #Wenn die Verbindung erfolgreich ist, ist rc 0
	client.subscribe("ev3/cube_state")           # "ev3/cube_state"Lesen Sie die Überschrift

def on_message(client, userdata, message):       #Definition einer Rückruffunktion, die ausgeführt werden soll, wenn eine Nachricht empfangen wird
	print(message.topic + " " + str(message.payload))  #Das Thema ist der Überschriftenname und die Nutzlast ist die Nachricht.
	cpco_s = message.payload.decode("utf-8").split(":")
	cp_s = cpco_s[0].split(",")
	co_s = cpco_s[1].split(",")
	cp = [int(s) for s in cp_s]
	co = [int(s) for s in co_s]
	cube_state = solver.State(cp, co)            #Speichert den Status des Rubik-Würfels
	global solve_way
	solve_way = solver.solve(cube_state)         #Löse den Zauberwürfel und bewahre die Lösung auf
	print("solve way:", solve_way)
	global get_state
	get_state = True

def main():
	client = mqtt.Client()                   #Generieren Sie eine Instanz des MQTT-Clients
	client.on_connect = on_connect           #Übergeben Sie die oben definierte Verbindungsrückruffunktion
	client.on_message = on_message           #Übergeben Sie die oben definierte Rückruffunktion

	client.connect("ev3dev.local", 1883, 60) # Broker(EV3)Stellen Sie eine Verbindung zu Port 1883 her(Keep Alive ist 60 Sekunden)
	client.loop_start()       #Starten Sie die Nachrichtenempfangsschleife

	while not get_state:
		sleep(0.01)

	client.loop_stop()        #Stoppen Sie die Empfangsschleife
	sleep(0.5)                #Warten Sie eine Weile, während das Programm auf der EV3-Seite eine Verbindung zu Broker herstellt
	
	client.publish("pc/solve_way", solve_way) #Suchen Sie im ersten Argument und nehmen Sie Informationen im zweiten Argument
	
	print("published")
	client.disconnect()       #Trennen

if __name__ == '__main__':
	main()

Versuche zu rennen

Führen Sie zuerst pc-main.py von der PC-Seite aus.



#### **`\Users\(Nutzername)>python pc-main.py`**
```c

Connected with result code 0

Wenn "Verbunden mit Ergebniscode 0" angezeigt wird, führen Sie auch "main.py" auf der EV3-Seite aus.


robot@ev3dev:~$ ./main.py

Ergebniszusammenfassung

PC-Seite



#### **`\Users\(Nutzername)>python pc-main.py`**
```c

Connected with result code 0
ev3/cube_state b'5,2,6,3,4,7,1,0:0,0,0,0,0,1,2,0'
solve time: 3.744987964630127
solve way: U2 R2 U R' U2 R' F2 U2 R'
published

EV3 Seite


robot@ev3dev:~$ ./main.py
published
Connected with result code 0
pc/solve_way b"U2 R2 U R' U2 R' F2 U2 R'"

Wenn Sie einen PC verwenden, können Sie den Rubik Cube lösen, der mit 9 Händen in weniger als 4 Sekunden gelöst werden kann, und das Ergebnis wird fest auf dem EV3 angezeigt!

Verweise

EV3 - Einführung in die Robotik

Ich habe hier darauf hingewiesen, wie man den Zustand des Zauberwürfels ausdrückt. [Serie] Schreiben wir ein Programm zur Lösung des Rubik-Würfels (Teil 1)

Recommended Posts

Versuche mit EV3 und PC zu kommunizieren! (MQTT)
Versuchen Sie, iTunes und Hue of Collection Case mit MQTT zu verknüpfen
Probieren Sie die DB-Operation mit Python aus und visualisieren Sie sie mit d3
Versuchen Sie, den Boden durch Rekursion herauszufordern
Versuchen Sie, ein Unterfenster mit PyQt5 und Python zu öffnen
Kommunizieren Sie mit FX-5204PS mit Python und PyUSB
Versuchen Sie, sich mit ONNX Runtime zu profilieren
Versuchen Sie, Audio mit M5 STACK auszugeben
Versuchen Sie, Google Map und Geography Map mit Python anzuzeigen
[Python] Versuchen Sie, Zeichen aus Bildern mit OpenCV und pyocr zu erkennen
Kommunizieren Sie mit gRPC zwischen Elixir und Python
Versuchen Sie, Farbfilme mit Python zu reproduzieren
Versuchen Sie, sich mit Python bei qiita anzumelden
Setzen Sie Cabocha 0.68 in Windows ein und versuchen Sie, die Abhängigkeit mit Python zu analysieren
Versuchen Sie, Breiten- / Längen- und Weltkoordinaten mit Python ineinander umzuwandeln
Fraktal zum Erstellen und Spielen mit Python
Versuchen Sie, Foldl und Foldr mit Python: Lambda zu machen. Auch Zeitmessung
Versuchen wir es mit gRPC mit Go und Docker
Versuchen Sie, Kirschblüten mit xg Boost vorherzusagen
Versuchen Sie, mit Pandas in ordentliche Daten umzuwandeln
Versuchen Sie schnell, Ihren Datensatz mit Pandas zu visualisieren
Erster Versuch von YDK mit Cisco IOS-XE
Versuchen Sie, ein Bild mit Entfremdung zu erzeugen
Versuchen Sie, den Hintergrund und das sich bewegende Objekt des Videos mit OpenCV zu trennen
WEB Scraping mit Python und versuchen, aus Bewertungen eine Wortwolke zu machen
Versuchen Sie, Ihr eigenes AWS-SDK mit bash zu erstellen
Versuchen Sie, das Fizzbuzz-Problem mit Keras zu lösen
Kratzen Sie das Essen mit Python und geben Sie es an CSV aus
Versuchen Sie, Google Chrome mit Python und Selenium auszuführen
Versuchen Sie, das Mensch-Maschine-Diagramm mit Python zu lösen
Versuchen Sie, das Dokument der Azure-Dokumentdatenbank mit pydocumentdb zu extrahieren
Versuchen Sie, mit Python eine Lebenskurve zu zeichnen
So testen Sie den Friends-of-Friends-Algorithmus mit pyfof
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
Asynchrone Kommunikation nur mit Touch Designer
Verwalten Sie Statusübergänge und kommunizieren Sie mit intelligenten Zählern
Versuchen Sie, Python-Dokumente automatisch mit Sphinx zu generieren
MQTT Radicon Car mit Arduino und Himbeere
Skript zum Twittern mit Vielfachen von 3 und Zahlen mit 3 !!
Lassen Sie uns EV3-Motoren und -Sensoren mit Python steuern
Versuchen Sie, mit Python eine Diedergruppe zu bilden
[Telewa gewidmet! ] Ich betreibe einen PC mit einer Webkamera.
Versuchen Sie, Client-FTP mit Pythonista am schnellsten zu machen
Versuchen Sie, Fische mit Python + OpenCV2.4 (unvollendet) zu erkennen.
Einführung in MQTT (Einführung)
Führen Sie eine Twitter-Suche in Python durch und versuchen Sie, Sätze mit der Markov-Kette zu generieren.
Verbinden Sie realsense D435 mit einem PC, auf dem Ubuntu 16.04 installiert ist, und speichern Sie das Tiefenvideo mit Python
Versuchen Sie, eine einfache Website mit Responder und sqlite3 zu erstellen
Prozedur zum Laden von MNIST mit Python und zur Ausgabe an png
Versuchen Sie, das Programmier-Herausforderungsbuch mit Python3 zu lösen
Ich habe versucht, mit VOICEROID2 2 automatisch zu lesen und zu speichern
Einfaches IoT, um mit Raspeye und MESH zu beginnen
Lassen Sie uns ein Befehls-Standby-Tool mit Python erstellen
Ich habe versucht, DCGAN mit PyTorch zu implementieren und zu lernen
Ich möchte die Optimierung mit Python und CPlex behandeln
Versuchen Sie, mit Tkinter in Python dynamisch einen Checkbutton zu erstellen
Stellen wir uns den Raum mit Raspeltorte vor, Teil 1
Versuchen Sie, das Problem der Zuweisung von Schulungsärzten mit Python zu lösen