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.
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.
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."
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 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.
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.
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. 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.
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:~$
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
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.
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()
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()
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
#### **`\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
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!
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)