12. 扭动舞

我们已经学会了如何让 PiCrawler 定格在某个特定姿势,下一步就是将这些姿势组合起来,形成连续的动作。

在这个示例中,PiCrawler 的四条腿两两抬起和落下,伴随音乐节奏跳动。

运行代码

cd ~/picrawler/examples
sudo python3 12_twist.py

程序启动后,机器人会先缓慢站立起来,以达到稳定的姿态。

站立完成后,背景音乐开始播放。同时,机器人会持续执行扭动式的舞蹈动作。在这个动作过程中,四条腿会交替抬起和放下,形成有节奏的扭动效果。四条腿会以协调的方式成对运动,使机器人身体看起来像左右摆动。

每一步之间都会加入短暂的延时,使动作更加平滑和稳定,而不会显得突兀或过快。

机器人会在音乐播放的同时持续跳舞。当按下 Ctrl+C 时,程序会停止运行,机器人会在退出前安全地回到坐下的姿态。

代码

备注

你可以对下面的代码进行 Modify/Reset/Copy/Run/Stop 操作。但在此之前,需要先进入源码路径,例如 picrawler\examples。修改代码后,可以直接运行并查看效果。

from picrawler import Picrawler
from robot_hat import Music
from time import sleep

music = Music()
crawler = Picrawler()

def twist(speed):
    new_step = [[50, 50, -80], [50, 50, -80], [50, 50, -80], [50, 50, -80]]

    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.03)  # small delay to make motion smoother and less "crazy"

def main():
    try:
        # Stand up slowly first
        crawler.do_step('stand', 40)
        sleep(1.0)

        # Start music
        music.music_play('./musics/sports-Ahjay_Stelino.mp3')
        music.music_set_volume(20)

        while True:
            twist(speed=100)

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

    finally:
        # Sit down safely before exit
        try:
            crawler.do_step('sit', 40)
            sleep(1.0)
        except Exception:
            pass

if __name__ == "__main__":
    main()

它是如何工作的?

在这段代码中,需要特别注意以下部分:

def twist(speed):
    new_step = [[50, 50, -80], [50, 50, -80], [50, 50, -80], [50, 50, -80]]

    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.03)  # small delay to make motion smoother and less "crazy"

简单来说,这段代码使用两层 for 循环,使 new_step 数组持续产生规律变化,同时通过 crawler.do_step() 执行姿态,从而形成连续的动作。

你可以通过 10. 调整姿态 直观地查看每个姿态对应的坐标数组。

此外,该示例还播放了背景音乐,具体实现方法如下。

通过导入以下库来播放音乐:

from robot_hat import Music

声明一个 Music 对象:

music = Music()

播放 picrawler/examples/musics 目录中的背景音乐,并将音量设置为 20。你也可以通过 FileZilla 软件musics 文件夹中添加自己的音乐。

music.music_play('./musics/sports-Ahjay_Stelino.mp3')
music.music_set_volume(20)