9. 姿态

PiCrawler 可以通过编写坐标数组来摆出特定的姿态。这里演示的是抬起右后腿的姿势。

../_images/4cood.A.png

运行代码

cd ~/picrawler/examples
sudo python3 9_do_step.py

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

站立完成后,机器人会在循环中重复执行两个动作。它首先进入一个站立步态姿势,并保持该姿势几秒钟,然后切换到一个自定义步态,使四条腿移动到不同的坐标位置。这样就形成了一个重复的姿态变化动作。

机器人会持续在这两种姿态之间交替运行,直到程序被停止。如果按下 Ctrl+C,程序会安全退出,机器人也会回到坐下的姿态。

代码

#!/usr/bin/env python3
from picrawler import Picrawler
from time import sleep

# Create Picrawler instance
crawler = Picrawler()

# Leg order:
# [right front], [left front], [left rear], [right rear]
new_step = [[45, 45, -75], [45, 0, -75], [45, 0, -30], [45, 45, -75]]

# Get the default stand step from the move list
stand_step = crawler.move_list['stand'][0]


def main():
    action_speed = 80  # Speed for movement actions

    try:
        # Stand up slowly at 40% speed to reduce current spikes
        crawler.do_step('stand', 40)
        sleep(1.0)

        # Continuous action loop
        while True:
            crawler.do_step(stand_step, action_speed)
            sleep(3)

            crawler.do_step(new_step, action_speed)
            sleep(3)

    except KeyboardInterrupt:
        # Handle Ctrl+C for safe exit
        print("\nExiting safely...")

    finally:
        # Return to sitting position before shutting down
        try:
            crawler.do_step('sit', 40)
            sleep(1.0)
        except Exception:
            pass


if __name__ == "__main__":
    main()

它是如何工作的?

在这段代码中,你需要特别关注的是 crawler.do_step()

do_action() 类似, do_step() 也能控制 PiCrawler 的动作。 不同之处在于:前者用于执行连续动作,例如 move forward ;而后者则用来实现 standsit 等独立的姿态。

它有两种用法:

第一种:可以直接传入字符串,调用 picrawler 库中的 step_list 字典。

crawler.do_step('stand',speed)
# "speed" 表示动作速度,范围为 0~100。

第二种:也可以直接传入包含 4 组坐标值的数组。

new_step=[[45, 45, -75], [45, 0, -75], [45, 0, -30], [45, 45, -75]]
# 这四组坐标分别用于控制右前腿、左前腿、左后腿和右后腿。

每条腿都有独立的坐标系,如下图所示:

../_images/4cood.png

你需要分别测量每个足端的坐标,如下图所示:

../_images/1cood.png

顺带一提:第一种方法中调用的 step_list 其实也是由 4 组坐标值数组组成的。

step_list = {

    "stand":[
        [45, 45, -50],
        [45, 45, -50],
        [45, 45, -50],
        [45, 45, -50]
    ],
    "sit":[
        [45, 45, -30],
        [45, 45, -30],
        [45, 45, -30],
        [45, 45, -30]
    ],

}