Bemerkung

Hallo und herzlich willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Community auf Facebook! Tauchen Sie tiefer in die Welt von Raspberry Pi, Arduino und ESP32 ein und verbinden Sie sich mit anderen Technikbegeisterten.

Warum mitmachen?

  • Expertenunterstützung: Lösen Sie Probleme nach dem Kauf und technische Herausforderungen mit Hilfe unserer Community und unseres Teams.

  • Lernen & Teilen: Tauschen Sie Tipps und Tutorials aus, um Ihre Fähigkeiten zu verbessern.

  • Exklusive Vorschauen: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und Einblicken.

  • Exklusive Rabatte: Profitieren Sie von exklusiven Rabatten auf unsere neuesten Produkte.

  • Festliche Aktionen und Gewinnspiele: Nehmen Sie an Verlosungen und festlichen Aktionen teil.

👉 Bereit für spannende Projekte? Klicken Sie auf [hier] und treten Sie noch heute bei!

13. Emotionaler Roboter

Dieses Beispiel zeigt mehrere interessante benutzerdefinierte Aktionen des PiCrawler.

Code ausführen

cd ~/picrawler/examples
sudo python3 13_emotional_robot.py

Nachdem das Programm gestartet wurde, steht der Roboter zunächst langsam auf, um eine stabile Haltung zu erreichen.

Anschließend führt er eine Reihe von Bewegungen aus, darunter schwimmähnliche Bewegungen, Liegestütze, Winken mit den Vorderbeinen und eine Drehbewegung wie bei einem Tanz. Diese Aktionen werden nacheinander ausgeführt und erzeugen ein dynamisches und ausdrucksstarkes Verhalten.

Wenn Ctrl+C gedrückt wird, beendet sich das Programm sicher und der Roboter kehrt in eine Sitzposition zurück.

Code

Bemerkung

Sie können den folgenden Code Ändern/Zurücksetzen/Kopieren/Ausführen/Beenden. Bevor Sie dies tun, wechseln Sie bitte zum Quellcode-Pfad wie picrawler\examples. Nach Änderungen können Sie den Code direkt ausführen, um die Effekte zu sehen.

from picrawler import Picrawler
from time import sleep

crawler = Picrawler()


def get_sit_step():
    # Get a valid sit step used as the base pose for hand actions
    try:
        return crawler.move_list['sit'][0]
    except Exception:
        return None


def handwork(speed):
    base = get_sit_step()

    # If a valid sit step cannot be retrieved, just perform a sit action
    if not base or len(base) < 4:
        crawler.do_step('sit', speed)
        sleep(0.6)
        return

    # Generate hand poses by modifying the sit step
    left_hand = crawler.mix_step(base, 0, [0, 50, 80])
    right_hand = crawler.mix_step(base, 1, [0, 50, 80])
    two_hand = crawler.mix_step(left_hand, 1, [0, 50, 80])

    crawler.do_step('sit', speed)
    sleep(0.6)

    crawler.do_step(left_hand, speed)
    sleep(0.6)

    crawler.do_step(two_hand, speed)
    sleep(0.6)

    crawler.do_step(right_hand, speed)
    sleep(0.6)

    crawler.do_step('sit', speed)
    sleep(0.6)

def twist(speed):
    # Initialize the base position for all four legs
    new_step = [[50, 50, -80], [50, 50, -80], [50, 50, -80], [50, 50, -80]]

    # Create a twisting motion by alternating rise and drop movements
    for i in range(4):
        for inc in range(30, 60, 5):
            rise = [50, 50, (-80 + inc * 0.5)]
            drop = [50, 50, (-80 - inc)]

            new_step[i] = rise
            new_step[(i + 2) % 4] = drop
            new_step[(i + 1) % 4] = rise
            new_step[(i - 1) % 4] = drop

            crawler.do_step(new_step, speed)
            sleep(0.02)

def pushup(speed):
    # Two poses used to simulate a push-up motion
    up = [[80, 0, -100], [80, 0, -100], [0, 120, -60], [0, 120, -60]]
    down = [[80, 0, -30], [80, 0, -30], [0, 120, -60], [0, 120, -60]]

    crawler.do_step(up, speed)
    sleep(0.6)

    crawler.do_step(down, speed)
    sleep(0.6)

def swimming(speed, loops=100):
    # Simulate a swimming-like motion by gradually adjusting leg coordinates
    for i in range(loops):
        crawler.do_step(
            [
                [100 - i, i, 0],
                [100 - i, i, 0],
                [0, 120, -60 + i / 5],
                [0, 100, -40 - i / 5]
            ],
            speed
        )
        sleep(0.01)

def main():
    speed = 100

    try:
        # Stand up slowly before performing actions
        crawler.do_step('stand', 40)
        sleep(1.0)

        swimming(speed)
        pushup(speed)
        handwork(speed)
        twist(speed)

    except KeyboardInterrupt:
        print("\nCtrl+C detected, exiting...")

    finally:
        # Return to a sitting posture before exiting
        try:
            crawler.do_step('sit', 40)
            sleep(1.0)
        except Exception:
            pass

if __name__ == "__main__":
    main()

Wie funktioniert es?

  1. Wenn das Programm startet, steht der Roboter zunächst langsam auf, um eine stabile Haltung zu erreichen.

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

    Nachdem der Roboter steht, führt das Programm mehrere vordefinierte Bewegungen nacheinander aus.

  2. Schwimmbewegung

    Der Roboter führt eine schwimmähnliche Bewegung aus, indem die Bein-Koordinaten schrittweise angepasst werden.

    for i in range(loops):
        crawler.do_step([
            [100-i, i, 0],
            [100-i, i, 0],
            [0,120,-60+i/5],
            [0,100,-40-i/5]
        ], speed)
    
  3. Liegestütz-Bewegung

    Zwei Positionen werden definiert, um eine Liegestützbewegung zu simulieren.

    up = [[80,0,-100],[80,0,-100],[0,120,-60],[0,120,-60]]
    down = [[80,0,-30],[80,0,-30],[0,120,-60],[0,120,-60]]
    
    crawler.do_step(up, speed)
    crawler.do_step(down, speed)
    
  4. Handbewegung

    Das Programm verändert die Koordinaten der Vorderbeine mithilfe von mix_step(), um eine Wellenbewegung zu erzeugen.

    left_hand = crawler.mix_step(base,0,[0,50,80])
    right_hand = crawler.mix_step(base,1,[0,50,80])
    
  5. Twist-Bewegung

    Der Roboter dreht seinen Körper, indem diagonal gegenüberliegende Beine angehoben und abgesenkt werden.

    rise = [50,50,(-80+inc*0.5)]
    drop = [50,50,(-80-inc)]
    crawler.do_step(new_step, speed)
    
  6. Wenn Ctrl+C gedrückt wird, beendet sich das Programm sicher und der Roboter kehrt in eine Sitzposition zurück.

    crawler.do_step('sit', 40)