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

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:

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://<Ihre IP>:9000/mjpg im Browser eingeben, um das Videosignal zu sehen, z.B.: https://192.168.18.113:9000/mjpg

../_images/display.png

Code

Bemerkung

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.

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).