先说清「SDK」这个词
很多人搜「Microduck SDK Python JavaScript」,想找的是一份官方的、带稳定函数签名的开发包。按官方当前公开资料,SDK 的语言清单还在最终确定阶段,没有可照抄的官方多语言 SDK 承诺。真正稳定、可核验的入口是另一层:运行时由 robotd、configd、updaterd、btd、padd、mediad、tofd 等 Rust 守护进程组成,彼此走 Unix socket 上的一份 JSON-RPC 契约;玩家接触得到的是 robotctl 与 duckctl 这两个命令行工具族。
「自定义行为」实际有三条路,难度和可靠性各不相同。下面按从稳到活的顺序讲,代码示例来自社区复刻教程而不是官方 SDK;动手前先确认自己用的是哪套仓库,别把 A 仓库的目录结构套到 B 仓库上。
路径一:不写代码,组合现成命令
最稳的一条路,改的是「调用什么」,不动「程序怎么跑」。官方产品页与仓库 README 里出现的命令族大致是 robotctl configure、update、monitor、policy add、policy load、robot do;蓝牙直连可用 duckctl,不需要网络与 ssh。社区复刻路线还给出 make sync、make run、make stop、make imu、make voltage 一类包装命令,以及键盘与手柄的按键映射。
- 先用
robotctl monitor或make imu读一帧实时状态,确认 15 颗舵机与 IMU 在线。预期结果:数值在连续变化,没有卡住不动的样本块。 - 列出现有策略与动作名,选一个现成动作触发,例如站起、坐下或触发一次已安装的 episodic 策略。预期结果:动作执行完能回到稳定姿态。
- 把几个动作按需要的顺序写成一份脚本或快捷方式,每次只加一个动作。预期结果:每一步都能单独复现,出了问题能定位到具体哪条命令。
- 需要换步态时用 policy load 指向自己的 ONNX,并把旧文件留一份在目录外。预期结果:新旧策略可来回切换对比。
路径二:Python 侧写一个规则动作
简化教学路线把动作抽象成 Move:在 src/moves/ 下新建一个 Python 文件,继承 Move 基类,实现 step 方法,从观测里读当前关节角度,用三角函数生成周期性摆动写入目标角度,再注册进 Scheduler 并给手柄键位绑定触发。这条路不用碰强化学习公式,改的是规则动作,不是策略网络。
# src/moves/my_dance.py(示意,按自己仓库的 Move 基类签名调整)
import math
from moves.base import Move
class MyDance(Move):
def step(self, obs, command):
t = obs.time
joints = obs.robot_state.joint_positions
for i in range(len(command.target_angles)):
command.target_angles[i] = joints[i] + 0.1 * math.sin(t)
return command
- 先确认仓库里确实有 moves 目录与 Move 基类,并读一份现成动作当模板。预期结果:能找到 step 方法与 target_angles 字段。
- 新文件里只做一个关节的小幅摆动,幅度从 0.1 弧度起步。预期结果:卸力预览时这个关节按预期缓慢摆动,其他关节不动。
- 把新动作注册进调度列表并绑定一个手柄按键。预期结果:按键能触发,且
make run无导入错误。 - 再逐步扩大到多关节,每加一个就重跑一次预览。预期结果:动作可重复,没有撞限位。别一上来就写整段舞蹈。
目录也要讲纪律:agents 下的 walk.onnx、moves、systemd 服务定义、docs 可以改;main.py、scheduler.py、robot_controller.py、imu_reader.py 是骨架,改错了往往不报错,只看到「程序起来了但鸭子行为怪」,这种问题最难查。虚拟环境是按锁文件生成的,弄坏了删掉重跑 setup,比修它快。
路径三:JavaScript 前端做一层遥控面板
严格说这里跑在机器人侧的仍是一个最小 HTTP 服务,JavaScript 只负责按钮与请求。社区文章里值得借鉴的是安全结构,不是代码本身:服务对外只暴露一个动作白名单,把「stand」「sit」这类按钮名翻译成固定的 robotctl 命令;每个请求先校验一次性 token,不对就拒绝,绝不放行任意命令;画面帧从机器人已有的媒体服务拉,不自己写采集逻辑。
| 要做的 | 预期结果 | 没做到会怎样 |
|---|---|---|
| 动作白名单 | 前端只能触发列表里的几个固定动作 | 等于把机器人命令行暴露到公网 |
| 启动时生成 token 并只发给可信的人 | 无 token 的请求全部被拒 | 任何扫描到端口的人都能让它动起来 |
| 命令调用加超时与返回码判断 | 失败时前端能看到明确报错 | 按钮点了没反应,无法区分超时与执行失败 |
| 先在内网跑通再考虑外网映射 | 内网四步都能复现 | 把网络问题、鉴权问题、控制问题叠在一起查 |
这条路的边界要讲清:它不是官方 JavaScript SDK,也不是官方推荐的远程控制方案;把机器人端口映射到公网前,鉴权、内网暴露和物理安全这三件事先想清楚。
三条路径怎么挑
| 路径 | 改动位置 | 适合 | 风险 |
|---|---|---|---|
| 命令组合 | 不改进仓库 | 只想编排现成动作、换现成策略 | 最低,出问题换回去即可 |
| Python 规则动作 | moves 与按键映射 | 想让鸭子做自定义周期动作 | 中,需跟对仓库版本,别碰骨架文件 |
| HTTP 面板 | 常开机器上的独立服务 | 想给家人或手机一个按钮 | 较高,涉及鉴权与网络暴露 |
边界与下一步
本页的 daemon 与命令族来自官方仓库,Move 抽象、make 命令族、按键映射与面板骨架来自社区复刻教程与调试专栏,许可证各不相同(有 MIT,也有个人非商业许可),再分发前要逐仓确认;本站没做真机实测,也不把社区实现说成官方 SDK。想从训练侧产出自己的 ONNX 策略,看《Microduck 强化学习训练与真机部署》;想找现成策略与社区资源,看《Microduck 玩法扩展与社区资源》;动作写完行为异常,按《Microduck 常见问题与故障排查》分层反查。