Je suis en train de créer une machine qui aligne automatiquement 2 * 2 * 2 cubes de lubook avec LEGO en lisant les couleurs avec un capteur de couleur.
J'ai essayé d'exécuter un programme qui résout un cube rubic 2 * 2 * 2 avec l'algorithme IDA * sur EV3. Cependant, en raison des faibles performances du processeur d'EV3 (et de ma mauvaise compréhension de l'algorithme), il a fallu près de 10 minutes pour résoudre le cube Rubik qui peut être résolu avec 9 mains, donc en utilisant MQTT, j'ai utilisé MQTT.
Je vais essayer de le faire sous la forme de. Dans cet article, nous dirons même: «EV3 envoie l'état du Rubik Cube à un ordinateur, le résout sur l'ordinateur et envoie la solution à EV3».
MQTT est un protocole de communication léger basé sur TCP / IP développé par IBM. Parce qu'il est léger, il semble qu'il soit souvent utilisé pour les appareils IoT. La communication est divisée en trois rôles: éditeur (expéditeur), courtier (intermédiaire) et abonné (destinataire). Tout d'abord, l'Abonné décide de l'en-tête des informations que vous souhaitez recevoir et attend. Ensuite, ajoutez un en-tête aux informations que Publisher souhaite envoyer et envoyez-le une fois à Broker. Le courtier envoie ensuite ces informations à l'abonné qui tente de recevoir les informations pour cette rubrique.
PC OS : Windows10 CPU : Intel Core i5-8600K @ 3.60GHz RAM : 16GB Python : 3.8.0 (Veuillez avoir le pip disponible)
EV3 OS: EV3 MicroPython (je ne sais pas si c'est le nom officiel) CPU : ARM9 @ 300MHz RAM : 64MB Python : 3.5.3
EV3 MicroPython DL ・ L'utilisation principale est À partir d'ici À propos, cet EV3 MicroPython est ev3dev avec la bibliothèque d'exécution Pybricks MicroPython, vous pouvez donc utiliser les fonctions d'ev3dev telles quelles.
Fondamentalement, pour communiquer entre eux à l'aide de MQTT, il est nécessaire de connecter l'appareil à Internet, mais comme l'EV3 n'a pas de module Wi-Fi en premier lieu, cette fois le PC et EV3 sont directement connectés au câble USB. Connectez-vous et communiquez avec. Si vous souhaitez communiquer via Internet, vous devez acheter un dongle Wi-Fi séparément.
Après avoir connecté EV3 et PC avec un câble, l'étape suivante consiste à vous connecter à EV3 à partir d'un PC avec SSH. Si vous utilisez Linux ou macOS, vous pouvez vous connecter depuis le terminal avec la commande ssh (l'ID utilisateur par défaut est «robot», le mot de passe est «créateur»). Pour Windows, utilisez un logiciel appelé TeraTerm (pour Windows 10 version 1903 ou ultérieure, vous pouvez vous connecter avec la commande ssh à l'aide du logiciel appelé «Windows Terminal»).
Lorsque vous lancez TeraTerm, la fenêtre suivante apparaît.
Entrez robot @ ev3dev.local
dans" Host "et cliquez sur" OK ". Si vous vous connectez à Internet, vous pouvez utiliser l'adresse IP dans ʻev3dev.local(comme
robot @ 192.168.xx.xx`).
Ensuite, la fenêtre "Avertissement de sécurité" n'apparaîtra que lorsque vous vous connectez pour la première fois, alors sélectionnez simplement "Continuer".
Il vous sera demandé votre mot de passe, tapez «créateur» et sélectionnez OK.
Si ce qui suit s'affiche, la connexion SSH est terminée.
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!
Dernière connexion: (date et heure) du ...
robot@ev3dev:~$
Installez un courtier pour la communication MQTT entre EV3 et PC. Utilisez des moustiques. Vous pouvez le mettre sur PC ou EV3, mais cette fois, nous l'installerons dans EV3. Exécutez la commande suivante.
robot@ev3dev:~$ sudo apt-get update
robot@ev3dev:~$ sudo apt-get install mosquitto
Après l'installation, vérifiez si le courtier est en cours d'exécution avec la commande suivante.
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)
Actif: actif (en cours) depuis (date et heure)
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
(Date et heure) ev3dev systemd [1]: Démarrage de LSB: mosquitto MQTT v3.1 message broker ...
(Date et heure) ev3dev mosquitto [1282]: Démarrage du démon réseau :: mosquitto.
(Date et heure) ev3dev systemd [1]: LSB démarré: Mosquitto MQTT v3.1 message broker.
● Si la partie «active (en cours)» est verte, elle a démarré correctement. Le numéro de port par défaut est 1883
Si vous voyez ce qui suit, cela signifie qu'il n'a pas démarré.
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)
Alors, exécutez la commande suivante et vérifiez si elle est redémarrée.
robot@ev3dev:~$ sudo service mosquitto start
Ensuite, installez la bibliothèque pour gérer MQTT à partir de Python. Exécutez la commande suivante sur EV3.
robot@ev3dev:~$ sudo pip3 install paho-mqtt
Installez-le également sur votre PC de la même manière.
#### **`\Users\(Nom d'utilisateur)>pip install paho-mqtt`**
```c
Vous êtes maintenant prêt.
main.py
#!/usr/bin/env python3
import paho.mqtt.client as mqtt #Importer la bibliothèque MQTT
import subprocess
from time import sleep
get_way = False
def on_connect(client, userdata, flags, rc): #Définition de la fonction de rappel à exécuter lors de la connexion à Broker
print("Connected with result code "+str(rc)) #Si la connexion réussit, rc vaut 0
client.subscribe("pc/solve_way") # "pc/solve_way"Lire la rubrique
def on_message(client, userdata, message): #Définition d'une fonction de rappel à exécuter lors de la réception d'un message
print(message.topic + " " + str(message.payload)) #Le sujet est le nom de l'en-tête et la charge utile est le message.
global get_way
get_way = True
def main():
client = mqtt.Client() #Générer une instance du client MQTT
client.on_connect = on_connect #Passer la fonction de rappel de connexion définie ci-dessus
client.on_message = on_message #Passer la fonction de rappel entrant définie ci-dessus
client.connect("localhost", 1883, 60) # Broker(moi même)Connectez-vous au port 1883(Keep Alive dure 60 secondes)
client.publish("ev3/cube_state", "5,2,6,3,4,7,1,0:0,0,0,0,0,1,2,0") #Trouvez dans le premier argument et prenez des informations dans le deuxième argument
# "5,2,6,3,4,7,1,0:0,0,0,0,0,1,2,0"L'énumération des nombres représente l'état du Rubik Cube
print("published")
client.loop_start() #Démarrer la boucle de réception des messages
while not get_way:
sleep(0.01)
client.loop_stop() #Arrêter la boucle de réception
client.disconnect() #Déconnecter
if __name__ == '__main__':
main()
pc-main.py
import paho.mqtt.client as mqtt #Importer la bibliothèque MQTT
from time import sleep
import rcSolver as solver # 2*2*2 Programme pour résoudre Rubik Cube
get_state = False
solve_way = ""
def on_connect(client, userdata, flags, rc): #Définition de la fonction de rappel à exécuter lors de la connexion à Broker
print("Connected with result code "+str(rc)) #Si la connexion réussit, rc vaut 0
client.subscribe("ev3/cube_state") # "ev3/cube_state"Lire la rubrique
def on_message(client, userdata, message): #Définition d'une fonction de rappel à exécuter lors de la réception d'un message
print(message.topic + " " + str(message.payload)) #Le sujet est le nom de l'en-tête et la charge utile est le message.
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) #Stocke l'état du Rubik Cube
global solve_way
solve_way = solver.solve(cube_state) #Résolvez le Rubik Cube et stockez la solution
print("solve way:", solve_way)
global get_state
get_state = True
def main():
client = mqtt.Client() #Générer une instance du client MQTT
client.on_connect = on_connect #Passer la fonction de rappel de connexion définie ci-dessus
client.on_message = on_message #Passer la fonction de rappel entrant définie ci-dessus
client.connect("ev3dev.local", 1883, 60) # Broker(EV3)Connectez-vous au port 1883(Keep Alive dure 60 secondes)
client.loop_start() #Démarrer la boucle de réception des messages
while not get_state:
sleep(0.01)
client.loop_stop() #Arrêter la boucle de réception
sleep(0.5) #Attendez un moment pendant que le programme du côté EV3 se connecte à Broker
client.publish("pc/solve_way", solve_way) #Trouvez dans le premier argument et prenez des informations dans le deuxième argument
print("published")
client.disconnect() #Déconnecter
if __name__ == '__main__':
main()
Tout d'abord, exécutez pc-main.py
du côté PC.
#### **`\Users\(Nom d'utilisateur)>python pc-main.py`**
```c
Connected with result code 0
Si «Connecté avec le code de résultat 0» est affiché, exécutez également «main.py» du côté EV3.
robot@ev3dev:~$ ./main.py
#### **`\Users\(Nom d'utilisateur)>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'"
Si vous utilisez un PC, vous pouvez résoudre le Rubik Cube qui peut être résolu avec 9 mains en moins de 4 secondes, et le résultat s'affiche fermement sur l'EV3!
EV3 - Introduction à la robotique
Pour savoir comment exprimer l'état du Rubik Cube, je me suis référé ici. [Series] Écrivons un programme pour résoudre le Rubik Cube (Partie 1)
Recommended Posts