Note

Bonjour, bienvenue dans la communauté des passionnés de Raspberry Pi, Arduino et ESP32 sur Facebook ! Plongez plus profondément dans l’univers du Raspberry Pi, Arduino et ESP32 avec d’autres passionnés.

Pourquoi rejoindre ?

  • Support d’experts : Résolvez vos problèmes après-vente et défis techniques grâce à l’aide de notre communauté et de notre équipe.

  • Apprendre et partager : Échangez des astuces et des tutoriels pour améliorer vos compétences.

  • Aperçus exclusifs : Accédez en avant-première aux annonces de nouveaux produits et obtenez des aperçus exclusifs.

  • Réductions spéciales : Profitez de réductions exclusives sur nos produits les plus récents.

  • Promotions et concours festifs : Participez à des concours et à des promotions spéciales pendant les fêtes.

👉 Prêt à explorer et à créer avec nous ? Cliquez sur [ici] et rejoignez-nous dès aujourd’hui !

7. Le Combat de Taureaux

Transformez PiCrawler en un taureau enragé ! Utilisez sa caméra pour suivre et foncer sur le drap rouge !

Exécuter le Code

cd ~/picrawler/examples
sudo python3 7_bull_fight.py

Voir l’Image

Après l’exécution du code, le terminal affichera le message suivant :

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://<votre IP>:9000/mjpg dans votre navigateur pour afficher l’écran vidéo. Par exemple : https://192.168.18.113:9000/mjpg

../_images/display.png

Code

Note

Vous pouvez Modifier/Réinitialiser/Copier/Exécuter/Arrêter le code ci-dessous. Mais avant cela, vous devez vous rendre dans le répertoire du code source, comme picrawler\examples. Après avoir modifié le code, vous pouvez l’exécuter directement pour voir l’effet.

from picrawler import Picrawler
from time import sleep, time
from robot_hat import Music
from vilib import Vilib

# Create robot and audio controller objects
crawler = Picrawler()
music = Music()

def main():
    # Start camera and enable preview window
    Vilib.camera_start(vflip=False, hflip=False)
    Vilib.display(local=False, web=True)

    # Enable red color detection
    Vilib.color_detect("red")

    speed = 80                  # Movement speed
    last_seen = False           # Indicates whether the red target was detected in previous loop
    last_beep = 0               # Timestamp of last sound playback
    BEEP_COOLDOWN = 1.0         # Minimum interval between sound effects (seconds)

    # Stand once before starting tracking
    crawler.do_step('stand', 40)
    sleep(1.0)

    try:
        while True:
            # Read detection result
            if Vilib.detect_obj_parameter.get('color_n', 0) != 0:

                # Get horizontal coordinate of detected red object
                coordinate_x = Vilib.detect_obj_parameter.get('color_x', 0)

                # Play sound effect with cooldown to avoid spamming
                now = time()
                if now - last_beep >= BEEP_COOLDOWN:
                    try:
                        music.sound_play_threading('./sounds/talk1.wav')
                    except Exception:
                        pass
                    last_beep = now

                # Steering logic based on horizontal position
                # Left side of image
                if coordinate_x < 100:
                    crawler.do_action('turn left', 1, speed)

                # Right side of image
                elif coordinate_x > 220:
                    crawler.do_action('turn right', 1, speed)

                # Center area → move forward
                else:
                    crawler.do_action('forward', 2, speed)

                last_seen = True
                sleep(0.05)

            else:
                # No red target detected

                # Stop movement only once when target is lost
                # This prevents repeated stand() calls that cause "push-up" effect
                if last_seen:
                    crawler.do_step('stand', 40)
                    last_seen = False

                sleep(0.15)

    except KeyboardInterrupt:
        # Stop program safely when Ctrl+C is pressed
        print("\nStop.")

    finally:
        # Cleanup section to avoid exit errors

        # Disable color detection
        try:
            Vilib.color_detect("close")
        except Exception:
            pass

        # Close camera safely
        try:
            Vilib.camera_close()
        except Exception:
            pass

        # Make the robot sit before exit
        try:
            crawler.do_step('sit', 40)
            sleep(1.0)
        except Exception:
            pass

if __name__ == "__main__":
    main()

Comment ça fonctionne ?

  1. Initialisation de la caméra

    Vilib.camera_start(vflip=False, hflip=False)
    Vilib.display(local=False, web=True)
    Vilib.color_detect("red")
    

    La caméra est démarrée et l’aperçu web est activé. La détection de la couleur rouge est activée. Vilib traite continuellement les images en arrière-plan et stocke les résultats de détection dans detect_obj_parameter.

  2. Préparation du robot

    crawler.do_step('stand', 40)
    sleep(1.0)
    

    Le robot exécute une action de mise en position debout avant de commencer le suivi. Un court délai garantit que la posture est stable.

  3. Détection de la cible

    if Vilib.detect_obj_parameter.get('color_n', 0) != 0:
        coordinate_x = Vilib.detect_obj_parameter.get('color_x', 0)
    

    Le programme vérifie si un objet rouge est détecté. Si c’est le cas, il lit la coordonnée horizontale centrale (position x) de l’objet rouge dans l’image.

  4. Logique de décision de direction

    if coordinate_x < 100:
        crawler.do_action('turn left', 1, speed)
    elif coordinate_x > 220:
        crawler.do_action('turn right', 1, speed)
    else:
        crawler.do_action('forward', 2, speed)
    

    L’image est divisée en trois zones horizontales : gauche, centre et droite.

    • Zone gauche → tourner à gauche

    • Zone droite → tourner à droite

    • Zone centrale → avancer

    Cela permet au robot de suivre l’objet rouge.

  5. Mécanisme de temporisation du son

    now = time()
    if now - last_beep >= BEEP_COOLDOWN:
        music.sound_play_threading('./sounds/talk1.wav')
        last_beep = now
    

    Un minuteur empêche la lecture répétée du son. L’effet sonore est joué au maximum une fois par seconde, même si l’objet reste détecté.

  6. Gestion de la perte de la cible

    if last_seen:
        crawler.do_step('stand', 40)
        last_seen = False
    

    Lorsque l’objet rouge disparaît, le robot s’arrête et revient à une position debout stable.

    Le drapeau last_seen garantit que stand() est appelé une seule fois. Cela évite une réinitialisation répétée de la posture qui pourrait provoquer des tremblements.

  7. Sortie sécurisée et nettoyage

    finally:
        Vilib.color_detect("close")
        Vilib.camera_close()
        crawler.do_step('sit', 40)
    

    Lorsque le programme se termine (par exemple avec Ctrl+C), la détection de couleur est désactivée, la caméra est fermée correctement, et le robot exécute une action de position assise.

    Cela évite les erreurs de caméra et les arrêts instables du programme.