Note
Bonjour et bienvenue dans la communauté des passionnés de Raspberry Pi, Arduino et ESP32 de SunFounder sur Facebook ! Plongez dans l’univers du Raspberry Pi, Arduino et ESP32 avec d’autres passionnés.
Pourquoi rejoindre ?
Support d’experts : Résolvez les problèmes après-vente et les défis techniques avec l’aide de notre communauté et de notre équipe.
Apprendre et partager : Échangez des astuces et des tutoriels pour perfectionner vos compétences.
Aperçus exclusifs : Accédez en avant-première aux annonces de nouveaux produits et à des aperçus exclusifs.
Réductions spéciales : Bénéficiez de réductions exclusives sur nos nouveaux produits.
Promotions et concours festifs : Participez à des concours et promotions spéciales pendant les fêtes.
👉 Prêt à explorer et à créer avec nous ? Cliquez sur [here] et rejoignez-nous dès aujourd’hui !
12. Chasse au trésor
Disposez un labyrinthe dans votre pièce et placez six cartes de couleurs différentes dans six coins. Ensuite, contrôlez PiCar-X pour rechercher ces cartes de couleurs une par une !
Note
Vous pouvez télécharger et imprimer les cartes de couleur en PDF
pour la détection de couleur.
Exécuter le code
cd ~/picar-x/example
sudo python3 12.treasure_hunt.py
Voir l’image
Après l’exécution du code, le terminal affichera l’invite suivante :
No desktop !
* Serving Flask app "vilib.vilib" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:9000/ (Press CTRL+C to quit)
Vous pouvez ensuite entrer http://<your IP>:9000/mjpg
dans le navigateur pour voir l’écran vidéo, par exemple : http://192.168.18.113:9000/mjpg
.
Code
from picarx import Picarx
from time import sleep
from robot_hat import Music,TTS
from vilib import Vilib
import readchar
import random
import threading
px = Picarx()
music = Music()
tts = TTS()
manual = '''
Press keys on keyboard to control Picar-X!
w: Forward
a: Turn left
s: Backward
d: Turn right
space: Say the target again
ctrl+c: Quit
'''
color = "red"
color_list=["red","orange","yellow","green","blue","purple"]
def renew_color_detect():
global color
color = random.choice(color_list)
Vilib.color_detect(color)
tts.say("Look for " + color)
key = None
lock = threading.Lock()
def key_scan_thread():
global key
while True:
key_temp = readchar.readkey()
print('\r',end='')
with lock:
key = key_temp.lower()
if key == readchar.key.SPACE:
key = 'space'
elif key == readchar.key.CTRL_C:
key = 'quit'
break
sleep(0.01)
def car_move(key):
if 'w' == key:
px.set_dir_servo_angle(0)
px.forward(80)
elif 's' == key:
px.set_dir_servo_angle(0)
px.backward(80)
elif 'a' == key:
px.set_dir_servo_angle(-30)
px.forward(80)
elif 'd' == key:
px.set_dir_servo_angle(30)
px.forward(80)
def main():
global key
Vilib.camera_start(vflip=False,hflip=False)
Vilib.display(local=False,web=True)
sleep(0.8)
print(manual)
sleep(1)
_key_t = threading.Thread(target=key_scan_thread)
_key_t.setDaemon(True)
_key_t.start()
tts.say("game start")
sleep(0.05)
renew_color_detect()
while True:
if Vilib.detect_obj_parameter['color_n']!=0 and Vilib.detect_obj_parameter['color_w']>100:
tts.say("will done")
sleep(0.05)
renew_color_detect()
with lock:
if key != None and key in ('wsad'):
car_move(key)
sleep(0.5)
px.stop()
key = None
elif key == 'space':
tts.say("Look for " + color)
key = None
elif key == 'quit':
_key_t.join()
print("\n\rQuit")
break
sleep(0.05)
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
pass
except Exception as e:
print(f"ERROR: {e}")
finally:
Vilib.camera_close()
px.stop()
sleep(.2)
Comment ça fonctionne ?
Pour comprendre la logique de base de ce code, vous pouvez vous concentrer sur les parties clés suivantes :
Initialisation et importations : Les instructions d’importation au début du code vous permettent de comprendre les bibliothèques utilisées.
Variables globales : Les définitions des variables globales, telles que
color
etkey
, qui sont utilisées dans tout le code pour suivre la couleur cible et les entrées du clavier.renew_color_detect()
: Cette fonction sélectionne une couleur aléatoire dans une liste et la définit comme couleur cible à détecter. Elle utilise également la synthèse vocale pour annoncer la couleur sélectionnée.key_scan_thread()
: Cette fonction s’exécute dans un thread séparé et scanne continuellement les entrées du clavier, mettant à jour la variablekey
avec la touche pressée. Elle utilise un verrou pour garantir un accès sécurisé aux threads.car_move(key)
: Cette fonction contrôle les mouvements du PiCar-X en fonction des entrées du clavier (key
). Elle définit la direction et la vitesse du déplacement du robot.main()
: La fonction principale qui orchestre la logique générale du code. Elle fait les actions suivantes :Initialise la caméra et démarre l’affichage du flux vidéo.
Crée un thread séparé pour scanner les entrées du clavier.
Annonce le début du jeu avec la synthèse vocale.
Entre dans une boucle continue pour :
Vérifier la détection d’objets colorés et déclencher des actions lorsqu’un objet valide est détecté.
Gérer les entrées du clavier pour contrôler le robot et interagir avec le jeu.
Gère la sortie du jeu et les exceptions comme l’interruption clavier (KeyboardInterrupt).
S’assure que la caméra est fermée et que PiCar-X s’arrête à la sortie.
En comprenant ces parties clés du code, vous pouvez saisir la logique fondamentale de la manière dont le robot PiCar-X réagit aux entrées du clavier et détecte/interagit avec les objets d’une couleur spécifique en utilisant les capacités de la caméra et de la sortie audio.