.. note:: Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten. **Warum beitreten?** - **Expertenunterstützung**: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams. - **Lernen & Teilen**: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern. - **Exklusive Vorschauen**: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken. - **Spezialrabatte**: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte. - **Festliche Aktionen und Gewinnspiele**: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil. 👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [|link_sf_facebook|] und treten Sie heute bei! .. _py_bull_fight: 10. Stierkampf ============================= Mache PiCar-X zu einem wütenden Stier! Verwende seine Kamera, um das rote Tuch zu verfolgen und darauf zuzurasen! **Code ausführen** .. raw:: html .. code-block:: cd ~/picar-x/example sudo python3 10.bull_fight.py **Das Bild ansehen** Nachdem der Code ausgeführt wurde, zeigt das Terminal folgende Aufforderung an: .. code-block:: 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) Anschließend können Sie ``http://:9000/mjpg`` im Browser eingeben, um das Videosignal zu sehen, z.B.: ``https://192.168.18.113:9000/mjpg`` .. image:: img/display.png **Code** .. note:: Sie können den untenstehenden Code **modifizieren/zurücksetzen/kopieren/ausführen/stoppen**. Bevor Sie das tun, sollten Sie zum Quellcodepfad wie ``picar-x\beispiele`` gehen. Nachdem Sie den Code modifiziert haben, können Sie ihn direkt ausführen, um die Wirkung zu sehen. .. raw:: html .. code-block:: python 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'] # change the pan-tilt angle for track the object 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) # move # The movement direction will change slower than the pan/tilt direction # change to avoid confusion when the picture changes at high speed. 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) **Wie funktioniert des?** Sie sollten auf die folgenden drei Teile dieses Beispiels achten: 1. Die Hauptfunktion definieren: * Starten Sie die Kamera mit ``Vilib.camera_start()``. * Zeigen Sie das Kamera-Feed mit ``Vilib.display()`` an. * Aktivieren Sie die Farberkennung und legen Sie die Zielfarbe als „rot“ fest mit ``Vilib.color_detect("red")``. * Initialisieren Sie Variablen: ``speed`` für die Bewegungsgeschwindigkeit des Autos, ``dir_angle`` für den Richtungswinkel der Bewegung des Autos, ``x_angle`` für den Schwenkwinkel der Kamera und ``y_angle`` für den Neigungswinkel der Kamera. 2. Treten Sie in eine kontinuierliche Schleife (while True), um das rotfarbene Objekt zu verfolgen: * Überprüfen Sie, ob ein rotfarbenes Objekt erkannt wurde (``Vilib.detect_obj_parameter['color_n'] != 0``). * Wenn ein rotfarbenes Objekt erkannt wird, erhalten Sie dessen Koordinaten (``coordinate_x`` und ``coordinate_y``). * Berechnen Sie neue Schwenk- und Neigungswinkel (``x_angle`` und ``y_angle``) basierend auf der Position des erkannten Objekts und passen Sie diese an, um das Objekt zu verfolgen. * Begrenzen Sie die Schwenk- und Neigungswinkel innerhalb des festgelegten Bereichs mit der Funktion ``clamp_number``. * Stellen Sie die Schwenk- und Neigungswinkel der Kamera mit ``px.set_cam_pan_angle()`` und ``px.set_cam_tilt_angle()`` ein, um das Objekt im Blick zu behalten. 3. Steuern Sie die Bewegung des Autos basierend auf dem Unterschied zwischen ``dir_angle`` und ``x_angle``: * Wenn ``dir_angle`` größer als ``x_angle`` ist, verringern Sie ``dir_angle`` um 1, um den Richtungswinkel allmählich zu ändern. * Wenn ``dir_angle`` kleiner als ``x_angle`` ist, erhöhen Sie ``dir_angle`` um 1. * Stellen Sie den Lenkservo-Winkel mit ``px.set_dir_servo_angle()`` ein, um die Räder des Autos entsprechend zu steuern. * Bewegen Sie das Auto vorwärts mit der festgelegten Geschwindigkeit mit ``px.forward(speed)``.