Note
Bonjour, bienvenue dans la communauté des passionnés de SunFounder Raspberry Pi, Arduino & ESP32 sur Facebook ! Explorez plus en profondeur l’univers de Raspberry Pi, Arduino et ESP32 avec d’autres passionnés.
Pourquoi nous rejoindre ?
Support d’experts : Résolvez les problèmes après-vente et surmontez les défis techniques grâce à l’aide de notre communauté et de notre équipe.
Apprenez & Partagez : É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 aux avant-goûts.
Réductions exclusives : Profitez de remises spéciales sur nos nouveaux produits.
Promotions festives et concours : Participez à des concours et à des promotions pendant les fêtes.
👉 Prêt à explorer et à créer avec nous ? Cliquez sur [here] et rejoignez-nous dès aujourd’hui !
10. Combat de Taureau
Transformez le PiCar-X en un taureau enragé ! Utilisez sa caméra pour suivre et charger vers un tissu rouge !
Exécution du code
cd ~/picar-x/example
sudo python3 10.bull_fight.py
Visualisation de 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 alors entrer http://<your IP>:9000/mjpg
dans le navigateur pour visualiser le flux vidéo. Par exemple : https://192.168.18.113:9000/mjpg
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 chemin du code source tel que picar-x\examples
. Après modification, exécutez directement pour observer les résultats.
from picarx import Picarx
from time import sleep
from vilib import Vilib
px = Picarx()
def clamp_number(num,a,b):
return max(min(num, max(a, b)), min(a, b))
def main():
Vilib.camera_start()
Vilib.display()
Vilib.color_detect("red")
speed = 50
dir_angle=0
x_angle =0
y_angle =0
while True:
if Vilib.detect_obj_parameter['color_n']!=0:
coordinate_x = Vilib.detect_obj_parameter['color_x']
coordinate_y = Vilib.detect_obj_parameter['color_y']
# ajuster l'angle de la caméra pour suivre l'objet
x_angle +=(coordinate_x*10/640)-5
x_angle = clamp_number(x_angle,-35,35)
px.set_cam_pan_angle(x_angle)
y_angle -=(coordinate_y*10/480)-5
y_angle = clamp_number(y_angle,-35,35)
px.set_cam_tilt_angle(y_angle)
# mouvement
# La direction du mouvement change plus lentement que celle de la caméra
# pour éviter la confusion lors de changements rapides.
if dir_angle > x_angle:
dir_angle -= 1
elif dir_angle < x_angle:
dir_angle += 1
px.set_dir_servo_angle(x_angle)
px.forward(speed)
sleep(0.05)
else :
px.forward(0)
sleep(0.05)
if __name__ == "__main__":
try:
main()
finally:
px.stop()
print("stop and exit")
sleep(0.1)
Comment ça fonctionne ?
Vous devez prêter attention aux trois parties suivantes de cet exemple :
Définir la fonction principale :
Démarrer la caméra avec
Vilib.camera_start()
.Afficher le flux vidéo avec
Vilib.display()
.Activer la détection de couleur et spécifier la couleur cible comme « rouge » avec
Vilib.color_detect("red")
.Initialiser les variables :
speed
pour la vitesse de déplacement du véhicule,dir_angle
pour l’angle de direction du mouvement,x_angle
pour l’angle de rotation de la caméra, ety_angle
pour l’angle d’inclinaison de la caméra.
Entrer dans une boucle continue (while True) pour suivre l’objet de couleur rouge :
Vérifier s’il y a un objet rouge détecté (
Vilib.detect_obj_parameter['color_n'] != 0
).Si un objet rouge est détecté, obtenir ses coordonnées (
coordinate_x
etcoordinate_y
).Calculer de nouveaux angles de rotation et d’inclinaison (
x_angle
ety_angle
) en fonction de la position de l’objet détecté et les ajuster pour suivre l’objet.Limiter les angles de rotation et d’inclinaison dans une plage spécifiée avec la fonction
clamp_number
.Régler les angles de rotation et d’inclinaison de la caméra avec
px.set_cam_pan_angle()
etpx.set_cam_tilt_angle()
pour garder l’objet en vue.
Contrôler le mouvement du véhicule en fonction de la différence entre
dir_angle
etx_angle
:Si
dir_angle
est supérieur àx_angle
, décrémenterdir_angle
de 1 pour changer progressivement la direction.Si
dir_angle
est inférieur àx_angle
, incrémenterdir_angle
de 1.Régler l’angle du servo de direction avec
px.set_dir_servo_angle()
pour ajuster les roues du véhicule en conséquence.Faire avancer le véhicule à la vitesse spécifiée avec
px.forward(speed)
.