上周进行了机器人端站立、左右挥手、摇头这三个基本的仅需要少量舵机协作的动作组的开发。

本周我的第一个任务是基于这三个动作组进行Milk-V Duo S串口控制。之后开发其他的较为复杂的动作组。

使用Milk-V Duo S控制机器人执行动作组

在成功实现这一步之前我们走了一些错误的路线,比如在Duo S串口选择上

串口选择与交叉连接

在终端查看之后发现有多个可能串口

ls /dev/tty*

/dev/ttyS1、/dev/ttyS2、/dev/ttyS3、/dev/ttyS4、 /dev/ttyS0 都是 Duo  S自带串口

我们采取了枚举串口逐个尝试进行控制的方式,来确定具体哪一个Duo S串口接的是舵机控制板,但是这涉及到一个问题如下:

经过查阅资料

接线方式如下:

Duo S 控制板
TX RX
RX TX
GND GND

采用母对母杜邦线串口交叉连接!TX 接 RX,RX 接 TX,GND 对 GND

之后舵机控制板 必须单独供电(6V~12V)

我们初次尝试认为Duo S上的4组TX、RX、GND(即正负极和接地)是等效的

未考虑到不同串口的接线引脚是不同的。
同时在Python脚本编写过程中,忽略了设置需要手动波特率为115200这一关键信息,这两处错误也促使我们在早起的尝试中一直是失败的状态,即无法正确调用动作组。

最终成功时候正确选择是选择串口/dev/ttyS0,同时Duo S引脚选择为:

舵机控制板 Duo S
TX Pin 10(RX)
RX Pin 8(TX)
GND Pin 6(GND)

使用AI生成代码:提示词/VIBE/SPEC过程

在此之前在Duo S开发板内安装python的串口控制库:

pip3 install pyserial

单任务控制

提示词:

请生成一个 Python 脚本,用于在 Milk-V Duo S(或其他 Linux 板卡)上通过串口控制机器人执行已下载的动作组。要求如下:

- 使用 pyserial 库,串口设备默认 "/dev/ttyS0",波特率 115200.
- 定义一个 RobotController 类,包含以下方法:
  - __init__(self, port="/dev/ttyS0", baudrate=115200):初始化串口。
  - send_cmd(self, cmd):发送指令,自动在指令末尾追加 "\r\n",并编码为字节后写入串口,同时打印“发送: cmd”。
  - run_action(self, action_id, speed=100):发送运行动作组的指令,格式为 "PL0 SQ{action_id} SM{speed} ONCE"。
  - stop(self):发送停止指令 "PL0"。
  - close(self):关闭串口。
- 在主程序中:
  - 实例化 RobotController 对象。
  - 调用 run_action(1) 运行 1 号动作组。
  - 调用 run_action(2) 运行 2 号动作组。
请输出完整的 Python 代码

LLM生成code:

import serial
import time


class RobotController:
    def __init__(self, port="/dev/ttyS0", baudrate=115200):
        self.ser = serial.Serial(port, baudrate, timeout=1)
        time.sleep(1)

    def send_cmd(self, cmd):
        full_cmd = cmd + "\r\n"
        self.ser.write(full_cmd.encode())
        print("发送:", cmd)

    def run_action(self, action_id, speed=100):
        cmd = f"PL0 SQ{action_id} SM{speed} ONCE"
        self.send_cmd(cmd)

    def stop(self):
        self.send_cmd("PL0")

    def close(self):
        self.ser.close()


if __name__ == "__main__":
    robot = RobotController()

    robot.run_action(1)
    time.sleep(2)

    robot.run_action(2)
    time.sleep(2)

    robot.stop()
    robot.close()

       这份代码的尚存问题是机器人执行连续动作组之间的时间间隔控制做的存在逻辑问题,程序的线程睡眠时间控制不够严密,可以发现代码中的逻辑是执行完动作组1-挥手之后,线程挂起睡眠2s之后继续发送执行动作组2-摇头的指令,在测试的过程会发现第二条robot.run_action(2)指令会与前一条robot.run_action(1)在刚执行之后发送打断冲突!即过早执行下一行代码,从而无法执行。于是我将睡眠时长改为15s以确保上一个动作组执行完之后,收到下一个通信指令,两个动作组就可以成功依次执行了。
   control.py 是我们在 Milk-V Duo S 上最早落地的一份单任务控制脚本。它把机器人的通信协议封装成一个最简洁的 RobotController 类:打开串口、发送指令、停止、关闭,一切都围绕着一行核心命令 PL0 SQ{id} SM{speed} ONCE 展开。这份代码的意义在于快速验证——我们把挥手和摇头的动作组下载到机器人后,只需要运行这个脚本,就能让机器人依次执行两个动作,用最简单的 time.sleep 等待动作结束。它没有复杂的调度逻辑,但正是这种简单,让我们在前期调试时能第一时间确认“指令发出去、机器人动起来了”,为后续更复杂的序列控制和云控调度打下了可靠的通信基础。

连续序列控制

提示词:

请生成一个 Python 脚本,用于模拟在Duo端收到云端的动作序列之后,在 Milk-V Duo S 上顺序执行一组机器人动作。要求如下:

- 导入 serial, time, threading 模块。
- 定义一个字典 ACTION_DURATION,存储每个动作 ID 对应的预估执行时间(单位:秒):
  {0:5, 1:12, 2:10, 3:10, 4:9, 5:15, 6:72, 7:20, 8:10, 9:13, 10:12}
- 定义一个 RobotController 类,与之前类似,使用串口 "/dev/ttyS0",波特率 115200。
  - __init__ 中创建串口并休眠 1 秒,同时创建一个 threading.Lock 对象 self.lock。
  - send_cmd(cmd):在指令末尾加 "\r\n" 写入串口,并打印“发送: cmd”。
  - run_action(action_id, speed=100):发送 "PL0 SQ{action_id} SM{speed} ONCE"。
- 定义一个函数 run_sequence(robot, sequence):
  - 使用 with robot.lock 确保同一时间只有一个序列在执行。
  - 遍历 sequence 中的每个动作 ID:
    - 打印“执行动作: {action}”
    - 调用 robot.run_action(action)
    - 从 ACTION_DURATION 字典中获取该动作的时长,若不存在默认 3 秒。
    - time.sleep 相应秒数。
- 在主程序中:
  - 实例化 RobotController。
  - 定义动作序列 sequence = [1, 7, 6, 2, 0]
  - 调用 run_sequence(robot, sequence)

请输出完整的 Python 代码

同时为了防止如果云端连续发两条JSON,会打断上一次的执行
在与LLM交互的过程中,学到采取增加”线程执行锁“来解决这个问题:

LLM生成code:

import serial
import time
import threading

# 动作时间表
ACTION_DURATION = {
    0: 5,
    1: 12,
    2: 10,
    3: 10,
    4: 9,
    5: 15,
    6: 72,
    7: 20,
    8: 10,
    9: 13,
    10: 12
}


class RobotController:
    def __init__(self, port="/dev/ttyS0", baudrate=115200):
        self.ser = serial.Serial(port, baudrate, timeout=1)
        time.sleep(1)
        self.lock = threading.Lock()   # 加锁

    def send_cmd(self, cmd):
        full_cmd = cmd + "\r\n"
        self.ser.write(full_cmd.encode())
        print("发送:", cmd)

    def run_action(self, action_id, speed=100):
        cmd = f"PL0 SQ{action_id} SM{speed} ONCE"
        self.send_cmd(cmd)

    def stop(self):
        self.send_cmd("PL0")

    def close(self):
        self.ser.close()


def run_sequence(robot, sequence):
    with robot.lock:   # 同一时间只允许一个序列执行
        for action in sequence:
            print(f"执行动作: {action}")
            robot.run_action(action)

            duration = ACTION_DURATION.get(action, 3)
            time.sleep(duration)



if __name__ == "__main__":
    robot = RobotController()

    sequence = [1, 7, 6, 2, 0]

    run_sequence(robot, sequence)

    robot.stop()
    robot.close()

  seq_control.py 在单任务的基础上向前走了一大步:它不再是一次性执行一两个动作,而是开始像一个微型“剧本调度器”那样,按顺序驱动一连串的动作组。我们为每一个已下载的动作组都测量了真实的运行时长,存进 ACTION_DURATION 字典里,这样每运行一个动作,脚本就知道要等多少秒再进行下一个,避免指令重叠或提前中断。run_sequence 函数配合 threading.Lock 的引入,虽然当前还是单线程顺序调用,但已经为以后接收云端推送的动作序列、多线程安全控制埋下了接口。这份代码的核心价值在于,它把“动作组”变成了“动作序列”,让我们可以轻松编排出一段由多个动作拼接而成的完整表演,也让我们在调试金鸡独立、后退两步这些高难度组合时,能够一口气验证整套编排是否连贯——这标志着机器人的控制逻辑开始从单条命令执行,走向真正的定时、定序、可组合的动作调度。

动作组开发与调试:下蹲模块

下蹲动作组我们在设计开发的时候,将其划分为9个步骤

步骤 动作描述
步骤 1 机器人以标准站立姿态就位
步骤 2 双腿髋、膝、踝关节同时弯曲,身体重心下沉,进入下蹲姿态
步骤 3 保持蹲姿,手臂开始向一侧摆动(左手下沉、右手微抬)
步骤 4 手臂迅速摆向另一侧(右手上扬、左脚跟微调)
步骤 5 双臂再次交替摆动,形成蹲姿下的左右挥手
步骤 6 手臂姿态回到与步骤 4 相同的摆幅位置
步骤 7 手臂再次切换到与步骤 5 相同的另一侧摆幅
步骤 8 手臂摆动幅度减小,身体开始准备直立
步骤 9 所有关节恢复至初始站立姿态,动作结束

      下蹲这个动作,表面上只是弯一下腿,但在调试时才发现,想让机器人蹲得稳、蹲得自然,就必须把下半身的每一个舵机都单独驯服。我先用站立姿态作为起点,然后锁定 4、5、6、9、10、11 这几个核心下肢舵机,在子窗口里反复拖动滑竿,把站立时的 P 值分别降到 P1310、P1571、P1429 等中间尺度——降得太少下蹲不明显,降得太多关节直接卡死,这几个数字是我在软件里一次次点“更新动作”在线观测后折中出来的。蹲到最低点时,我还特意调整了 23、25、26、27 这几个远端关节,比如 23 号从 P500 撑到 P1262,25 号从 P2500 收到 P1738,让脚掌和脚踝能适应重心的下沉,否则机器人会向后翻。

      然后为了让机器人满足手腿协调运作的符合需求,蹲稳之后才开始加入左右摆手。摆手动作我拆分在 21、22、26、27 号舵机上,用一个 500ms 的短周期让它们在 P1477↔P952、P1095↔P667、P2190↔P1762 之间来回跳变,形成了蹲姿下的双手摆动。前后一共 9 个步骤,我花了大半天的时间在动作数据显示区里反复修改 T 值和 P 值,蹲下用 1000ms 从容下沉,摆手用 500ms 快节奏交替,起来再用 1000ms 平稳回位。最后的体会是:哪怕是一个简单的蹲起,也需要在数十次“滑动滑竿—添加动作—组运行—微调数值”的循环里,才能让那 17 个舵机配合得像一个有机的整体。

经过我们针对这9个步骤长达4小时的反复调试,最终对9个步骤的每一个步骤的角度值调试最终结果如下:

步骤1:T1000
#3 P1895 #4 P1919 #5 P2151 #6 P1570 #7 P1477 #8 P1523 #9 P1430 #10 P826 #11 P1081 #12 P1105 #21 P1477 #22 P1000 #23 P500 #24 P1500 #25 P2500 #26 P2000 #27 P1500

步骤2:T1000
#3 P1895 #4 P1310 #5 P1571 #6 P1429 #7 P1477 #8 P1523 #9 P1595 #10 P1429 #11 P1690 #12 P1105 #21 P1477 #22 P1000 #23 P500 #24 P1500 #25 P2500 #26 P2000 #27 P1500

步骤3:T500
#3 P1895 #4 P1310 #5 P1571 #6 P1429 #7 P1477 #8 P1523 #9 P1595 #10 P1429 #11 P1690 #12 P1105 #21 P1477 #22 P1000 #23 P1262 #24 P1500 #25 P1738 #26 P2000 #27 P1500

步骤4:T500
#3 P1895 #4 P1310 #5 P1571 #6 P1429 #7 P1477 #8 P1523 #9 P1595 #10 P1429 #11 P1690 #12 P1105 #21 P1477 #22 P1095 #23 P1262 #24 P1500 #25 P1738 #26 P2190 #27 P1881

步骤5:T500
#3 P1895 #4 P1310 #5 P1571 #6 P1429 #7 P1477 #8 P1523 #9 P1595 #10 P1429 #11 P1690 #12 P1105 #21 P952 #22 P667 #23 P1262 #24 P1500 #25 P1738 #26 P1762 #27 P1500

步骤6:T500
#3 P1895 #4 P1310 #5 P1571 #6 P1429 #7 P1477 #8 P1523 #9 P1595 #10 P1429 #11 P1690 #12 P1105 #21 P1477 #22 P1095 #23 P1262 #24 P1500 #25 P1738 #26 P2190 #27 P1881

步骤7:T500
#3 P1895 #4 P1310 #5 P1571 #6 P1429 #7 P1477 #8 P1523 #9 P1595 #10 P1429 #11 P1690 #12 P1105 #21 P952 #22 P667 #23 P1262 #24 P1500 #25 P1738 #26 P1762 #27 P1500

步骤8:T500
#3 P1895 #4 P1310 #5 P1571 #6 P1429 #7 P1477 #8 P1523 #9 P1595 #10 P1429 #11 P1690 #12 P1105 #21 P1477 #22 P1000 #23 P1262 #24 P1500 #25 P1738 #26 P2000 #27 P1500

步骤9:T1000
#3 P1895 #4 P1919 #5 P2151 #6 P1570 #7 P1477 #8 P1523 #9 P1430 #10 P826 #11 P1081 #12 P1105 #21 P1477 #22 P1000 #23 P500 #24 P1500 #25 P2500 #26 P2000 #27 P1500

最终完整数据文件:

<?xml version="1.0" encoding="UTF-8"?>
<NewDataSet>
  <Table1>
    <ID>1</ID>
    <Move> #3 P1895 #4 P1919 #5 P2151 #6 P1570 #7 P1477 #8 P1523 #9 P1430 #10 P826 #11 P1081 #12 P1105 #21 P1477 #22 P1000 #23 P500 #24 P1500 #25 P2500 #26 P2000 #27 P1500</Move>
    <Time> T1000</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>2</ID>
    <Move> #3 P1895 #4 P1310 #5 P1571 #6 P1429 #7 P1477 #8 P1523 #9 P1595 #10 P1429 #11 P1690 #12 P1105 #21 P1477 #22 P1000 #23 P500 #24 P1500 #25 P2500 #26 P2000 #27 P1500</Move>
    <Time> T1000</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>3</ID>
    <Move> #3 P1895 #4 P1310 #5 P1571 #6 P1429 #7 P1477 #8 P1523 #9 P1595 #10 P1429 #11 P1690 #12 P1105 #21 P1477 #22 P1000 #23 P1262 #24 P1500 #25 P1738 #26 P2000 #27 P1500</Move>
    <Time> T500</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>4</ID>
    <Move> #3 P1895 #4 P1310 #5 P1571 #6 P1429 #7 P1477 #8 P1523 #9 P1595 #10 P1429 #11 P1690 #12 P1105 #21 P1477 #22 P1095 #23 P1262 #24 P1500 #25 P1738 #26 P2190 #27 P1881</Move>
    <Time> T500</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>5</ID>
    <Move> #3 P1895 #4 P1310 #5 P1571 #6 P1429 #7 P1477 #8 P1523 #9 P1595 #10 P1429 #11 P1690 #12 P1105 #21 P952 #22 P667 #23 P1262 #24 P1500 #25 P1738 #26 P1762 #27 P1500</Move>
    <Time> T500</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>6</ID>
    <Move> #3 P1895 #4 P1310 #5 P1571 #6 P1429 #7 P1477 #8 P1523 #9 P1595 #10 P1429 #11 P1690 #12 P1105 #21 P1477 #22 P1095 #23 P1262 #24 P1500 #25 P1738 #26 P2190 #27 P1881</Move>
    <Time> T500</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>7</ID>
    <Move> #3 P1895 #4 P1310 #5 P1571 #6 P1429 #7 P1477 #8 P1523 #9 P1595 #10 P1429 #11 P1690 #12 P1105 #21 P952 #22 P667 #23 P1262 #24 P1500 #25 P1738 #26 P1762 #27 P1500</Move>
    <Time> T500</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>8</ID>
    <Move> #3 P1895 #4 P1310 #5 P1571 #6 P1429 #7 P1477 #8 P1523 #9 P1595 #10 P1429 #11 P1690 #12 P1105 #21 P1477 #22 P1000 #23 P1262 #24 P1500 #25 P1738 #26 P2000 #27 P1500</Move>
    <Time> T500</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>9</ID>
    <Move> #3 P1895 #4 P1919 #5 P2151 #6 P1570 #7 P1477 #8 P1523 #9 P1430 #10 P826 #11 P1081 #12 P1105 #21 P1477 #22 P1000 #23 P500 #24 P1500 #25 P2500 #26 P2000 #27 P1500</Move>
    <Time> T1000</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
</NewDataSet>

动作组开发与调试:后退模块

后退的动作组我们在设计开发调试的时候,将其划分为如下的12个步骤

步骤 动作描述
步骤 1 机器人以标准站立姿态就位。
步骤 2 双脚前掌微抬(7、8 号舵机上移),为后撤步做准备。
步骤 3 身体重心后移,左腿向后迈出第一步,手臂配合摆动。
步骤 4 重心完全移到后撤的左腿上,右脚跟随拖步后移。
步骤 5 双腿微屈缓冲,身体姿态稳定,完成第一步后退。
步骤 6 双脚前掌再次抬起,手臂回收,准备第二步后退。
步骤 7 右腿向后迈出第二步,身体重心再次后移,手臂交替摆动。
步骤 8 重心转移到后撤的右腿,左脚跟随拖步后移。
步骤 9 双腿再次微屈缓冲,完成第二步后退。
步骤 10 双脚调平,身体开始恢复直立姿态。
步骤 11 双脚完全着地,手臂回收至站立位。
步骤 12 所有关节恢复初始站立姿态,动作结束。

“后退两步”的动作看似只是向后走,但在调试时才发现它比前进更需要精细的步态规划——因为机器人的重心在拼装之后本就是偏前,后退时一旦落脚角度不对,就会直接坐倒或者前趴。我把整个动作拆成两个完全对称的步态周期,每个周期都按“抬脚预置→撤步跨腿→拖步跟随→缓冲着地”四个阶段来编排。抬脚预置阶段,我先把 7、8 号舵机推到 P1600 和 P1650,让前脚掌微微离地,减小后退时的摩擦力。然后才是真正的撤步:3、4、5、6 这组髋膝踝关节的 P 值被我一遍遍在滑竿上拖动,从站立位推到 P1919、P1547、P1988 等后限位置,一边拖一边看机器人会不会后仰——发现后仰就把 23 号脚踝的 P 值从 500 拉到 1105 来增加前脚抓地力,发现前趴就把 25 号膝关节从 2500 调到 1919 来降低重心高度。

两个步态周期的难点在于“拖步跟随”的时机。当一条腿后撤后,另一条腿不能清脆地抬起来跟,而要用 9、10、11 号舵机的微调实现一种“拖着地蹭回去”的感觉,这样重心才不会在两脚间剧烈摆动。我把每一步都切成 750ms 的固定节拍,就是为了让整个后退的节奏像节拍器一样稳定,不会某一步快某一步慢导致摔倒。最后两个步骤用时 700ms 轻微加速收尾,让机器人能平滑地回到站立姿态。这 12 个步骤里的每一个 P 值,几乎都是在在线运行模式下反复“拖滑竿→点添加动作→组运行→看倒不倒→再拖滑竿”这样循环试出来的,真正是人在上位机里一点一点“牵着”机器人学会了后退。

经过我们针对这12个步骤长达8小时的反复调试,最终对9个步骤的每一个步骤对应的17个舵机的角度值调试最终结果如下:

步骤 T 延时 #3 #4 #5 #6 #7 #8 #9 #10 #11 #12 #21 #22 #23 #24 #25 #26 #27
步骤 1 T1000 P1895 P1919 P2151 P1570 P1477 P1523 P1430 P826 P1081 P1105 P1477 P1000 P500 P1500 P2500 P2000 P1500
步骤 2 T750 P1895 P1919 P2151 P1570 P1600 P1650 P1430 P826 P1081 P1105 P1477 P1000 P500 P1500 P2500 P2000 P1500
步骤 3 T750 P1919 P1547 P1988 P1650 P1600 P1616 P1759 P1267 P1337 P1174 P1477 P1000 P1105 P1500 P2500 P2000 P1500
步骤 4 T750 P1802 P1477 P1988 P1826 P1394 P1390 P1600 P1221 P1360 P1012 P1477 P1000 P500 P1500 P1919 P2000 P1500
步骤 5 T750 P1802 P1453 P1570 P1384 P1350 P1390 P1370 P1012 P1453 P1058 P1477 P1000 P500 P1500 P1919 P2000 P1500
步骤 6 T750 P1988 P1686 P1779 P1384 P1600 P1650 P1267 P1012 P1500 P1198 P1477 P1000 P1105 P1500 P2500 P2000 P1500
步骤 7 T750 P1919 P1547 P1988 P1650 P1600 P1616 P1759 P1267 P1337 P1174 P1477 P1000 P1105 P1500 P2500 P2000 P1500
步骤 8 T750 P1802 P1477 P1988 P1826 P1394 P1390 P1600 P1221 P1360 P1012 P1477 P1000 P500 P1500 P1919 P2000 P1500
步骤 9 T750 P1802 P1453 P1570 P1384 P1350 P1390 P1370 P1012 P1453 P1058 P1477 P1000 P500 P1500 P1919 P2000 P1500
步骤 10 T750 P1988 P1686 P1779 P1384 P1600 P1650 P1267 P1012 P1500 P1198 P1477 P1000 P1105 P1500 P2500 P2000 P1500
步骤 11 T700 P1895 P1919 P2151 P1570 P1600 P1650 P1430 P826 P1081 P1105 P1477 P1000 P500 P1500 P2500 P2000 P1500
步骤 12 T700 P1895 P1919 P2151 P1570 P1477 P1523 P1430 P826 P1081 P1105 P1477 P1000 P500 P1500 P2500 P2000 P1500

最终完整数据文件:

<?xml version="1.0" encoding="UTF-8"?>
<NewDataSet>
  <Table1>
    <ID>1</ID>
    <Move> #3 P1895 #4 P1919 #5 P2151 #6 P1570 #7 P1477 #8 P1523 #9 P1430 #10 P826 #11 P1081 #12 P1105 #21 P1477 #22 P1000 #23 P500 #24 P1500 #25 P2500 #26 P2000 #27 P1500</Move>
    <Time> T1000</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>2</ID>
    <Move> #3 P1895 #4 P1310 #5 P1571 #6 P1429 #7 P1477 #8 P1523 #9 P1595 #10 P1429 #11 P1690 #12 P1105 #21 P1477 #22 P1000 #23 P500 #24 P1500 #25 P2500 #26 P2000 #27 P1500</Move>
    <Time> T1000</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>3</ID>
    <Move> #3 P1895 #4 P1310 #5 P1571 #6 P1429 #7 P1477 #8 P1523 #9 P1595 #10 P1429 #11 P1690 #12 P1105 #21 P1477 #22 P1000 #23 P1262 #24 P1500 #25 P1738 #26 P2000 #27 P1500</Move>
    <Time> T500</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>4</ID>
    <Move> #3 P1895 #4 P1310 #5 P1571 #6 P1429 #7 P1477 #8 P1523 #9 P1595 #10 P1429 #11 P1690 #12 P1105 #21 P1477 #22 P1095 #23 P1262 #24 P1500 #25 P1738 #26 P2190 #27 P1881</Move>
    <Time> T500</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>5</ID>
    <Move> #3 P1895 #4 P1310 #5 P1571 #6 P1429 #7 P1477 #8 P1523 #9 P1595 #10 P1429 #11 P1690 #12 P1105 #21 P952 #22 P667 #23 P1262 #24 P1500 #25 P1738 #26 P1762 #27 P1500</Move>
    <Time> T500</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>6</ID>
    <Move> #3 P1895 #4 P1310 #5 P1571 #6 P1429 #7 P1477 #8 P1523 #9 P1595 #10 P1429 #11 P1690 #12 P1105 #21 P1477 #22 P1095 #23 P1262 #24 P1500 #25 P1738 #26 P2190 #27 P1881</Move>
    <Time> T500</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>7</ID>
    <Move> #3 P1895 #4 P1310 #5 P1571 #6 P1429 #7 P1477 #8 P1523 #9 P1595 #10 P1429 #11 P1690 #12 P1105 #21 P952 #22 P667 #23 P1262 #24 P1500 #25 P1738 #26 P1762 #27 P1500</Move>
    <Time> T500</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>8</ID>
    <Move> #3 P1895 #4 P1310 #5 P1571 #6 P1429 #7 P1477 #8 P1523 #9 P1595 #10 P1429 #11 P1690 #12 P1105 #21 P1477 #22 P1000 #23 P1262 #24 P1500 #25 P1738 #26 P2000 #27 P1500</Move>
    <Time> T500</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>9</ID>
    <Move> #3 P1895 #4 P1919 #5 P2151 #6 P1570 #7 P1477 #8 P1523 #9 P1430 #10 P826 #11 P1081 #12 P1105 #21 P1477 #22 P1000 #23 P500 #24 P1500 #25 P2500 #26 P2000 #27 P1500</Move>
    <Time> T1000</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
</NewDataSet>

 动作组开发与调试:自由飞翔模块

然后是这个调试时间最长、失败(机器人倾倒)次数最多的一个动作组,经过多次调整我们在开发过程中,将其划分为17个步骤。

步骤 动作描述
步骤 1 机器人以标准站立姿态就位,为后续动作做好准备。
步骤 2 双腿微屈下蹲蓄力,双臂开始微微张开。
步骤 3 左脚掌抬起(7、8 号舵机上移),重心开始向右腿转移。
步骤 4 右腿髋、膝关节大幅后伸(10、11 号舵机推向极限),右腿向后蹬出。
步骤 5 左腿进一步屈膝承重,右腿持续后伸,双臂继续展开辅助平衡。
步骤 6 身体重心进一步压低(9 号舵机降至 P1291),右腿完全后伸定型。
步骤 7 左臂(21、22 号舵机)开始大幅展开,左腿(26、27 号舵机)调整角度配合。
步骤 8 左臂继续调整展幅(22 号从 P1826 换至 P1360),右腿微调姿态稳定重心。
步骤 9 左臂展开至最大幅度(22 号 P2081),右腿回收微调,形成完整展开姿态。
步骤 10 左臂轻微回收(22 号 P1407),右腿再次微调,身体做小幅平衡修正。
步骤 11 左臂再次大幅展开(22 号 P1988),与步骤 9 形成交替平衡摆动。
步骤 12 左臂回收(22 号 P1407),回到与步骤 10 相同的修正姿态。
步骤 13 右腿开始回收,左腿准备承重,双臂展幅减小。
步骤 14 右腿大幅回收至后蹬准备位,双臂保持展开辅助回正。
步骤 15 右腿进一步回收至微屈姿态,身体重心回到双腿之间。
步骤 16 左脚掌回落(7、8 号舵机恢复),双臂开始收拢。
步骤 17 所有关节恢复至初始站立姿态,动作结束。

       自由飞翔的这个动作组是我们调试时间最长、失败次数最多的一个动作组。它的难度在于,机器人必须在单腿支撑的状态下,将另一条腿向后伸展,同时双臂展开维持平衡,任何一个舵机的角度偏差或时间配合失误,都会导致机器人倾倒。我从站立开始,先让机器人下蹲蓄力,把 4、5、6 号(髋、膝、踝)的 P 值从站立位精准拉到 P1500、P1500、P1281,这一步就反复调了不下二十次,因为蹲得太深后腿无法抬起,蹲得太浅又蓄能不足。

      接下来是真正的技术难点:右腿后伸。我同时调整 10、11 号舵机(右髋和右膝),将 10 号从 P1500 推到 P2151,11 号从 P1500 降到 P500,形成明显的后蹬角度;同时为了不让左腿被带翻,又把 9 号(左髋)固定在 P1733~P1291 之间精细平衡。双臂的展开我用 21、22、26、27 号舵机做了一组从收拢到完全张开的序列,P 值在 1872↔1570、1221↔2081、1221↔1151 之间反复推敲,让手臂像走平衡木一样帮助抵消后腿的重量。整套动作 17 个步骤,我几乎是在在线运行模式下“黏”在机器人旁边完成的——每调整一个 P 值就点一下组运行,看它能不能稳住 3 秒以上,如果倒了就立刻在动作数据显示区里双击修改,再试,再倒,再改。从第 5 步到第 12 步的每一处数值,都是这样一遍遍摔出来、调出来的。最终当机器人真的单腿站立、双臂平展并稳定回位时,我有了这种感受,所谓高难度动作,不过是无数个精确到微秒的 P 值与 T 值,在反复失败后的最佳妥协。

     经过我们针对这17个步骤两天长达大约9小时的反复调试,最终对17个步骤的每一个步骤的角度脉冲值调试最终结果如下:

步骤 T 延时 #3 #4 #5 #6 #7 #8 #9 #10 #11 #12 #21 #22 #23 #24 #25 #26 #27
步骤 1 T1000 P1895 P1919 P2151 P1570 P1477 P1523 P1430 P826 P1081 P1105 P1477 P1000 P500 P1500 P2500 P2000 P1500
步骤 2 T1000 P1895 P1500 P1500 P1281 P1477 P1523 P1779 P1500 P1500 P1105 P1872 P1221 P500 P1500 P2500 P1640 P1174
步骤 3 T800 P1895 P1500 P1500 P1281 P1620 P1700 P1779 P1500 P1500 P1105 P1872 P1221 P500 P1500 P2500 P1640 P1174
步骤 4 T800 P1895 P1500 P1500 P1281 P1620 P1700 P1779 P2151 P1988 P1105 P1872 P1221 P500 P1500 P2500 P1640 P1174
步骤 5 T1200 P1895 P1300 P1500 P1281 P1620 P1477 P1733 P1477 P500 P1105 P1872 P1221 P500 P1500 P2500 P1640 P1174
步骤 6 T1000 P1895 P1300 P1500 P1281 P1620 P1477 P1291 P988 P500 P1105 P1872 P1221 P500 P1500 P2500 P1640 P1174
步骤 7 T1000 P1895 P1300 P1500 P1281 P1620 P1477 P1291 P988 P500 P1105 P1570 P1826 P500 P1500 P2500 P1221 P1453
步骤 8 T800 P1895 P1300 P1500 P1281 P1620 P1477 P1291 P988 P500 P1105 P1570 P1360 P500 P1500 P2500 P1826 P1453
步骤 9 T800 P1895 P1300 P1500 P1281 P1620 P1477 P1291 P988 P500 P1105 P1570 P2081 P500 P1500 P2500 P1151 P1453
步骤 10 T800 P1895 P1300 P1500 P1281 P1620 P1477 P1291 P988 P500 P1105 P1570 P1407 P500 P1500 P2500 P1756 P1453
步骤 11 T800 P1895 P1300 P1500 P1281 P1620 P1477 P1291 P988 P500 P1105 P1570 P1988 P500 P1500 P2500 P1151 P1453
步骤 12 T800 P1895 P1300 P1500 P1281 P1620 P1477 P1291 P988 P500 P1105 P1570 P1407 P500 P1500 P2500 P1756 P1453
步骤 13 T800 P1895 P1300 P1500 P1281 P1620 P1477 P1733 P1477 P500 P1105 P1872 P1221 P500 P1500 P2500 P1640 P1174
步骤 14 T1000 P1895 P1500 P1500 P1281 P1620 P1700 P1779 P2151 P1988 P1105 P1872 P1221 P500 P1500 P2500 P1640 P1174
步骤 15 T1000 P1895 P1500 P1500 P1281 P1620 P1700 P1779 P1500 P1500 P1105 P1872 P1221 P500 P1500 P2500 P1640 P1174
步骤 16 T600 P1895 P1500 P1500 P1281 P1477 P1523 P1779 P1500 P1500 P1105 P1872 P1221 P500 P1500 P2500 P1640 P1174
步骤 17 T1000 P1895 P1919 P2151 P1570 P1477 P1523 P1430 P826 P1081 P1105 P1477 P1000 P500 P1500 P2500 P2000 P1500

最终完整数据文件:

<?xml version="1.0" encoding="UTF-8"?>
<NewDataSet>
  <Table1>
    <ID>1</ID>
    <Move> #3 P1895 #4 P1919 #5 P2151 #6 P1570 #7 P1477 #8 P1523 #9 P1430 #10 P826 #11 P1081 #12 P1105 #21 P1477 #22 P1000 #23 P500 #24 P1500 #25 P2500 #26 P2000 #27 P1500</Move>
    <Time> T1000</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>2</ID>
    <Move> #3 P1895 #4 P1500 #5 P1500 #6 P1281 #7 P1477 #8 P1523 #9 P1779 #10 P1500 #11 P1500 #12 P1105 #21 P1872 #22 P1221 #23 P500 #24 P1500 #25 P2500 #26 P1640 #27 P1174</Move>
    <Time> T1000</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>3</ID>
    <Move> #3 P1895 #4 P1500 #5 P1500 #6 P1281 #7 P1620 #8 P1700 #9 P1779 #10 P1500 #11 P1500 #12 P1105 #21 P1872 #22 P1221 #23 P500 #24 P1500 #25 P2500 #26 P1640 #27 P1174</Move>
    <Time> T800</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>4</ID>
    <Move> #3 P1895 #4 P1500 #5 P1500 #6 P1281 #7 P1620 #8 P1700 #9 P1779 #10 P2151 #11 P1988 #12 P1105 #21 P1872 #22 P1221 #23 P500 #24 P1500 #25 P2500 #26 P1640 #27 P1174</Move>
    <Time> T800</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>5</ID>
    <Move> #3 P1895 #4 P1300 #5 P1500 #6 P1281 #7 P1620 #8 P1477 #9 P1733 #10 P1477 #11 P500 #12 P1105 #21 P1872 #22 P1221 #23 P500 #24 P1500 #25 P2500 #26 P1640 #27 P1174</Move>
    <Time> T1200</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>6</ID>
    <Move> #3 P1895 #4 P1300 #5 P1500 #6 P1281 #7 P1620 #8 P1477 #9 P1291 #10 P988 #11 P500 #12 P1105 #21 P1872 #22 P1221 #23 P500 #24 P1500 #25 P2500 #26 P1640 #27 P1174</Move>
    <Time> T1000</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>7</ID>
    <Move> #3 P1895 #4 P1300 #5 P1500 #6 P1281 #7 P1620 #8 P1477 #9 P1291 #10 P988 #11 P500 #12 P1105 #21 P1570 #22 P1826 #23 P500 #24 P1500 #25 P2500 #26 P1221 #27 P1453</Move>
    <Time> T1000</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>8</ID>
    <Move> #3 P1895 #4 P1300 #5 P1500 #6 P1281 #7 P1620 #8 P1477 #9 P1291 #10 P988 #11 P500 #12 P1105 #21 P1570 #22 P1360 #23 P500 #24 P1500 #25 P2500 #26 P1826 #27 P1453</Move>
    <Time> T800</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>9</ID>
    <Move> #3 P1895 #4 P1300 #5 P1500 #6 P1281 #7 P1620 #8 P1477 #9 P1291 #10 P988 #11 P500 #12 P1105 #21 P1570 #22 P2081 #23 P500 #24 P1500 #25 P2500 #26 P1151 #27 P1453</Move>
    <Time> T800</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>10</ID>
    <Move> #3 P1895 #4 P1300 #5 P1500 #6 P1281 #7 P1620 #8 P1477 #9 P1291 #10 P988 #11 P500 #12 P1105 #21 P1570 #22 P1407 #23 P500 #24 P1500 #25 P2500 #26 P1756 #27 P1453</Move>
    <Time> T800</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>11</ID>
    <Move> #3 P1895 #4 P1300 #5 P1500 #6 P1281 #7 P1620 #8 P1477 #9 P1291 #10 P988 #11 P500 #12 P1105 #21 P1570 #22 P1988 #23 P500 #24 P1500 #25 P2500 #26 P1151 #27 P1453</Move>
    <Time> T800</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>12</ID>
    <Move> #3 P1895 #4 P1300 #5 P1500 #6 P1281 #7 P1620 #8 P1477 #9 P1291 #10 P988 #11 P500 #12 P1105 #21 P1570 #22 P1407 #23 P500 #24 P1500 #25 P2500 #26 P1756 #27 P1453</Move>
    <Time> T800</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>13</ID>
    <Move> #3 P1895 #4 P1300 #5 P1500 #6 P1281 #7 P1620 #8 P1477 #9 P1733 #10 P1477 #11 P500 #12 P1105 #21 P1872 #22 P1221 #23 P500 #24 P1500 #25 P2500 #26 P1640 #27 P1174</Move>
    <Time> T800</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>14</ID>
    <Move> #3 P1895 #4 P1500 #5 P1500 #6 P1281 #7 P1620 #8 P1700 #9 P1779 #10 P2151 #11 P1988 #12 P1105 #21 P1872 #22 P1221 #23 P500 #24 P1500 #25 P2500 #26 P1640 #27 P1174</Move>
    <Time> T1000</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>15</ID>
    <Move> #3 P1895 #4 P1500 #5 P1500 #6 P1281 #7 P1620 #8 P1700 #9 P1779 #10 P1500 #11 P1500 #12 P1105 #21 P1872 #22 P1221 #23 P500 #24 P1500 #25 P2500 #26 P1640 #27 P1174</Move>
    <Time> T1000</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>16</ID>
    <Move> #3 P1895 #4 P1500 #5 P1500 #6 P1281 #7 P1477 #8 P1523 #9 P1779 #10 P1500 #11 P1500 #12 P1105 #21 P1872 #22 P1221 #23 P500 #24 P1500 #25 P2500 #26 P1640 #27 P1174</Move>
    <Time> T600</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
  <Table1>
    <ID>17</ID>
    <Move> #3 P1895 #4 P1919 #5 P2151 #6 P1570 #7 P1477 #8 P1523 #9 P1430 #10 P826 #11 P1081 #12 P1105 #21 P1477 #22 P1000 #23 P500 #24 P1500 #25 P2500 #26 P2000 #27 P1500</Move>
    <Time> T1000</Time>
    <position> POS3X=221Y=165 POS4X=251Y=249 POS5X=251Y=332 POS6X=251Y=416 POS7X=122Y=416 POS8X=554Y=419 POS9X=427Y=419 POS10X=427Y=336 POS11X=428Y=253 POS12X=467Y=170 POS21X=57Y=128 POS22X=92Y=39 POS23X=223Y=81 POS24X=346Y=3 POS25X=467Y=87 POS26X=596Y=47 POS27X=637Y=134</position>
  </Table1>
</NewDataSet>

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐