ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

microduck Policy Playground:为鸭子机器人打造的可视化技能策略试玩空间

microduck Policy Playground:为鸭子机器人打造的可视化技能策略试玩空间 机器人嵌入式强化学习人工智能智能硬件计算机视觉音视频【免费下载链接】microduckA Tiny biped duck robot 项目地址https://gitcode.com/gh_mirrors/mi/microduck点击查看免费下载导读microduck 是一个微型双足鸭子机器人项目而spaces/policy-playground/是该项目为它提供的 Hugging Face Space一个纯浏览器端Vite TypeScript的技能试玩场——登录后唤醒你的鸭子按下任意一张技能卡片该技能策略便会从 Hugging Face Hub 下载到机器人上运行卡片实时告诉你它正在执行哪一步。本文将围绕该 Space 的架构与实现展开本地开发与构建流程、为什么选择浏览器而非 Python 容器、四个 RPC 调用policy.fetch、robot.setSkill、robot.policies、robot.do如何贯通获取 → 安装 → 等待 → 执行全链路以及rendezvous.ts、hub.ts、auth.ts三个核心模块的源码级原理。读完你既能照抄本地开发命令也能理解这套控制通道复用 rendezvous、Hub 目录即机器人目录的设计取舍。这个 Space 是什么spaces/policy-playground/README.md 的 YAML frontmatter 定义了它的身份sdk: docker、app_port: 7860、hf_oauth: true、OAuth 令牌有效期 1440 分钟一天一句话简介是 Pick a trick, watch your duck do it.整个交互体验可以概括为一段话登录 → 唤醒你的鸭子 → 按下一张技能卡片 → 技能从 Hub 下载到鸭子身上并运行 → 卡片告诉你鸭子正在做的是哪一个。README 特别强调了两点工程约束不要直接编辑 Space 本体。它的源码就在本仓库的spaces/policy-playground/中由 scripts/publish-space.sh 负责发布。Space 消费的机器人状态rendezvous 协议、机器人自身的 RPC 方法名都随仓库演进副本放在 Space 仓库里会与上游漂移。发布顶层文件而非目录树。publish-space.sh只发布spaces/name/目录的顶层文件与符号链接find -maxdepth 1 \( -type f -o -type l \)所以前端必须用vite-plugin-singlefile把整个应用打包进单个自包含的index.html并提交到仓库。发布后的 Space 永远是四个文件页面、Dockerfile、entrypoint.sh和 README 卡片——Hugging Face 侧没有任何构建步骤也就不会出现别人看不到的失败。本地开发与构建启动开发服务器cd spaces/policy-playground/web npm installnpm run dev开发服务器直接面向真实的 Hub 与真实的 rendezvous提供服务页面并非打桩。登录需要一个 redirect URI 与开发地址完全一致的 OAuth 应用通过查询参数传入open http://localhost:5173/?client_idan app registered for localhost:5173本地还有一种免 OAuth 注册的捷径见下文auth.ts中的?token分支。构建单文件产物npm run buildweb/package.json 中该脚本是tsc --noEmit vite build cp dist/index.html ../index.html——类型检查、打包、然后把产物复制到上一级目录Dockerfile 所在处这个文件被提交进仓库。web/vite.config.ts 解释了为什么必须单文件publish-space.sh发布的是顶层文件而非目录树而 bundler 默认会产出assets/子目录viteSingleFile()把所有内容内联进一个index.html代价只是一页约 60 KB 的 HTML 体积变大、失去缓存粒度对一个页面来说不是成本。Docker 运行环境Dockerfile 基于python:3.13-slim整个服务就是python -m http.server 7860 --directory /srv——一个文件、只读 GET、无上传路径、无配置。镜像只做一件事拷贝已构建的index.html与 entrypoint.sh 并运行后者。为什么是浏览器而不是 Python 容器README 记录了一段重要的历史这个页面的Gradio 版本至今仍在线可用而它遇到的每一个难题都源于客户端跑在数据中心里这个前提Gradio 时代的难题根因浏览器版本如何解决rendezvous 拒绝它requests库把所有调用签名为python-requests/2.xHugging Face 的边缘层把它识别为 bot来自 Space 容器的第一个GET /api/robot-status就返回429 HTML 页面serverawselb/2.0服务端根本没收到请求浏览器请求携带访问者自己的 IP 与浏览器签名所有访问者共享一台机器人会话存在模块级全局对象里——模块全局量按进程计而一个 Space 只有一个进程每位访问者就是自己的浏览器按访客分配会话零成本aiortc、av、DTLS 补丁、PyGObject为给 Python 凑一套 WebRTC 栈浏览器天生自带 WebRTC服务端渲染页面前架了 Node 代理启动十秒后无 traceback 停摆完全去掉这些在浏览器版本里一个都不存在同样形态的microduck-console从未经历过它们。详细证据可对照 spaces/shared/wire.py 中的实现与 spaces/shared/rendezvous.py 中对python-requests签名被限流一事的完整注释。为谁而做整页约束而非表面装饰README 明说目标用户是**一个十岁的、拥有一条鸭子的小孩**——这是对整个页面的约束不是一层皮页面上没有任何地方出现方法名、传输层、socket 或 schema 的字眼。一个技能只有三样东西一个名字、一句它做什么的话、一个按钮。而真正的技术细节——四个调用是什么policy.fetch、robot.setSkill、robot.policies、robot.do、走哪条通道、为什么被拒绝——全部收纳在页面底部的What just happened?发生了什么折叠面板里。那是出问题时去的地方而不是想看鸭子鞠躬时去的地方。这个设计在 web/src/main.ts 中有多处呼应错误要说人话。inWords()会把 daemon 日志里的network error: Teethyfish/microduck-… will not run on this robot: it is for a microduck full_shell, and this is a microduck翻译成xxx is made for a full_shell, and yours is a microduck.——什么都不虚构、什么都不吞掉完整原文始终保留在日志里。回答必须出现在提问处。Gradio 版把所有答案打在页面顶部一行离按钮两千像素远于是拒绝读起来就是按钮没反应。重建时改成答案贴在按下那张卡片上。robot.relax刻意缺席。它切断力矩、鸭子当场摔倒robotctl需要--yes守护BLE 干脆拒绝承载在给孩子看的页面上那会是一个写着休息一下、实际是摔一跤的按钮。三个核心模块的源码级拆解rendezvous.ts通往鸭子的控制通道web/src/rendezvous.ts 是 spaces/shared/wire.py 的浏览器移植GET /events开流、其余全部走POST /send携带rpc键的peer信封就是一次控制调用。原理是 rendezvous 的handle_peer_message会把peer信封里除type与sessionId外的每个键原样转发给会话对端于是rpc就成了一条控制通道由mediad::relay的控制通道从 datachannel 所用的同一张路由表应答。协议里四条不读懂就吃亏的规则Python 版踩坑换来的浏览器版依然成立先POST /send后GET /events是 400。身份来自 bearer token而事件流才是绑定它的东西——所以必须先开流一切等welcome。startSession与list的应答在 POST 响应体里其余都从流上回来。这是读者最容易错一次的形状。CRLF 不是我们可以假设的。SSE 允许\r\n代理也可能改写它只按\n\n切分就会什么都匹配不到、所有消息静默消失。因此openStream()在解码时统一做replaceAll(\r\n, \n)归一化。每台机器人只有一个消费者。sessionRejected意味着别人正握着它而且机器人的官方 console 也算一个。浏览器还带来一个改善EventSource无法发送Authorization头所以这里用fetch reader 读流——这不是 workaround而是让 token 留在 header而不是服务端只作为弃用回退保留的查询串成为可能。代码还精确地处理了 401重新登录、429限流1200 请求/分钟、400peer 不存在事件流已断需重连等错误并给出可操作的中文文案。列表接口值得一提rendezvous.py 与listDucks()都走GET /api/robot-status——它只做一次请求、不开事件流所以会话进行中刷新列表是安全的而 console 的list会在同一 token 上再开一条流把会话所骑乘的 peer 挤下线。hub.ts机器人怎么读 Hub页面就怎么读web/src/hub.ts 精确复刻了updater/src/policy.rs的两个请求——?searchmicroduck搜仓库命中后逐个拉manifest.json——因此画廊与机器人的policy.search永远不会对世界上存在什么产生分歧。默认端点https://huggingface.co/api/models官方集合仓库是pollen-robotics/microduck-policies。几个关键设计manifest 中repo级别以下的一切字段都是发布者的声明——展示、绝不作为安装依据真正安装的内容来自机器人自己解析下载到的 manifest。页面上标着made by Pollen官方与for a xxx面向其他机型的 chip 就是这种声明即展示。notATrick()二次实现daemon 不做这道检查、robot.setSkill会照单全收——一个命令生成型策略phase编码的地面拾取、posture_flag的坐下/站起被喂进常量机器人会看似合理实则错误地动比拒绝更糟。规则原本只在robotctl侧而robotctl不在点击链路里所以在这里再写一遍并翻成小孩能行动的话这是你的鸭子自己驱动的东西是它移动方式的一部分不是技能。isATrick()判断有没有结尾roulade一秒结束alpha_walking会一直走到有人叫停且声明了无法被叫停无command.idle、无unwind_s。无结尾的步态与姿态不放进可按压网格而是收进 Part of how your duck moves 折叠区——列出来、解释清楚、不提供按钮。预览视频按约定而非按猜测选取优先media/preview.mp4、preview.mp4再按路径深度/长度排序兜底只有完全无视频时才退而用.gif。因为某个仓库里躺着一个被拒的训练产物experiments/…/rejected_phrase_609_…_front_split_v2.mp4取第一个.mp4就会把它放上卡片。fulltrue参数让文件列表搭搜索请求的便车预览视频零额外请求。auth.ts无密钥的 PKCE 登录web/src/auth.ts 实现 PKCE浏览器证明它发起了流程因此应用不需要 client secret页面可以公开给任何人读。OAUTH_CLIENT_SECRET存在于 Space 环境变量中但永不进入页面。三个值得注意的细节client id 由entrypoint.sh注入而非平台注入。sdk: static的 Space 会往head里注入window.huggingface.variables但microduck-console经历了重建、隐私开关、重建……整整一天什么都没注入——console 的 Dockerfile 记录了这个下午。所以这里采用telepresenceSpace 的同款出路hf_oauth: true把值放进环境变量entrypoint.sh 用 Python而非sed因为被替换的值现在是 JSONsed会把 provider URL 中的字符当语法把唯一一个、必须恰好匹配一次的head行锚定替换把window.huggingface.variables原样写进页面。这样auth.ts就是普通的huggingface/hub代码没有任何 Space 形状的东西。过期时间被记住过、但从没被读过。早期版本把整个 OAuth 结果含 expiry存进localStorage此后把 token 永远交给 rendezvous——一天后页面仍显示已登录唯一信号是 rendezvous 拒绝报出鸭子名字。stillValid()补上了这道检查过期的 token 视同不存在页面重新要一个。?token是本地运行专用捷径。hf auth login已存的 tokencat ~/.cache/huggingface/token可以直接贴进地址栏省去注册 redirect URI 是 dev server 的 OAuth 应用但onThisMachine()严格限定localhost/127.0.0.1/[::1]因为查询串里的 token 会进浏览器历史、referrer 和中间代理——在正式 Space 上这条分支根本不可达。按下一张卡片会发生什么四阶段流程README 给出了核心流程并强调等待你的鸭子不是凑数getting it → putting it on your duck → waiting for your duck → doing it获取它 → 装到你的鸭子身上 → 等待你的鸭子 → 执行它web/src/main.ts 把四个阶段逐一落在卡片上Getting itpolicy.fetch参数{repo, file}超时 180 秒——这是经鸭子自己 WiFi 的下载不是状态询问从 Hub 把策略取到机器人。Putting it on your duckrobot.setSkill——参数由skillFor()依据policy.fetch的应答即机器人自己读到的 manifest 字节构造name空格转连字符、path、duration无自有时长则用HOLD_SECONDS 3的按住时长、可选的chain/unwind/unwind_s/action_scale与robotctl policy add逐字段对应。注意accepted 不等于已安装setSkill触发重载重载失败会体现在随后robot.policies应答的change_error里只有这里能看见。Waiting for your duck把技能装上鸭子会令它重载重载中的鸭子会回到站立姿态在回到姿态前拒绝执行任何操作——所以没有这一步安装的那次按压就是被拒绝的那次按压。waitForHome()以robot.policies应答中的homedAPI_VERSION30为等待标志500ms 轮询、15 秒超时发布不了该字段的老鸭子什么都不发那就没有可等的东西直接继续。Doing itrobot.do{skill: name}。同样先waitForHome()再执行。按压进行时页面其余部分全部惰性——鸭子一次只做一件事接受第二次按压的页面就是在承诺它守不住的东西。state.busy在整段流程中非空所有按钮随之disabled。流程之外还有三个鸭子需要、但不是技能的操作robot.init站立永不被拒、robot.enable启动页面只在鸭子确实关闭时才给出 Start 按钮——一个平时是空操作的按钮没人会信、以及刻意缺席的robot.relax。站立按钮背后还藏着两个调用鸭子坐着时由sit_toggle闩锁保持init会与闩锁打架所以先robot.do {skill: sit_toggle}再站。发布与部署发布是手工脚本 scripts/publish-space.shscripts/publish-space.sh policy-playground # 推到 pollen-robotics/microduck-policy-playground scripts/publish-space.sh policy-playground --dry-run # 只打印将发布的文件清单要点从spaces/name/顶层**复制而非同步**文件cp -L跟随并展平符号链接让多个 Space 共享spaces/shared/下的协议模块而不复制漂移git add -A后先暂存再比对避免只有新文件时误报已经是最新提交信息带仓库短 SHA。发布后 Space 重建只需一两分钟。小结policy-playground是一个以十岁小孩也能操作为硬约束、但内部全是严肃工程的浏览器应用用 rendezvous 的peer/rpc信封做免 WebRTC 的控制通道用与updater完全一致的 Hub 读取逻辑保证画廊与机器人所见一致用 PKCE entrypoint 注入绕开静态 Space 注入失效的坑再用四阶段按压流程把下载、安装、回位、执行的每次拒绝都变成小孩看得懂的一句话。想继续深入推荐按此顺序阅读README.md → web/src/main.ts → web/src/rendezvous.ts → web/src/hub.ts → web/src/auth.ts对照 Python 原型 spaces/shared/wire.py 与 spaces/shared/rendezvous.py可以完整还原这套架构从 Gradio 到纯浏览器的演进理由。赞分享机器人嵌入式强化学习人工智能智能硬件计算机视觉音视频【免费下载链接】microduckA Tiny biped duck robot 项目地址https://gitcode.com/gh_mirrors/mi/microduck点击查看免费下载相关推荐Microduck开发板入门从一块空白板到能接收分支构建的AI鸭子机器人Microduck开发板入门从一块空白板到能接收分支构建的AI鸭子机器人 Microduck 开发板dev board是把一块空白 Radxa Zero机器人嵌入式强化学习人工智能智能硬件计算机视觉音视频Microduck 深度解析一只由强化学习策略驱动的开源双足鸭子机器人Rust 守护进程、50 Hz 控制回路与不可损坏的更新机制Microduck 深度解析一只由强化学习策略驱动的开源双足鸭子机器人Rust 守护进程、50 Hz 控制回路与不可损坏的更新机制 Microduck 是机器人嵌入式强化学习人工智能智能硬件计算机视觉音视频microduck 策略通道Policy Channel设计深度解析ONNX 策略如何从 Hub 到达机器人以及如何安全试跑与回退microduck 策略通道Policy Channel设计深度解析ONNX 策略如何从 Hub 到达机器人以及如何安全试跑与回退 导读 本文基于 d机器人嵌入式强化学习人工智能智能硬件计算机视觉音视频上一篇revanced-patches备份恢复确保配置数据不丢失下一篇让训练告别黑盒mmsegmentation 语义分割可视化全流程实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表