☰
microduck 文档地图:从入门驾驶到守护进程改造的完整技术导航
2026/9/25 5:52:46 网站建设 项目流程
  • 机器人
  • 嵌入式
  • 强化学习
  • 人工智能
  • 智能硬件
  • 计算机视觉
  • 音视频

【免费下载链接】microduck

A Tiny biped duck robot 🦆

项目地址:https://gitcode.com/gh_mirrors/mi/microduck
点击查看免费下载

本文是 microduck 开源仓库(一只运行强化学习策略的双足小鸭子机器人)官方文档体系(docs/)的完整地图,服务于两类读者:拿到实体机器人想立刻驾驶的用户,以及准备深入守护进程内部做改造的开发者。读完本文,你将掌握仓库文档的分区逻辑(使用手册 / 设计文档 / 项目记录 / 想法暂存区)、每份文档解决的具体问题、如何正确引用"机制归属"文档以避免文档间互相矛盾,并能顺着索引直达 docs/README.md 中列出的每一份可操作指南。

文档体系的总设计:多扇前门与单一事实来源

microduck 的 docs 目录不是一份文档的堆砌,而是一套经过刻意设计的知识路由系统。从 docs/README.md 本身可以看到它的三层原则:

第一层:多扇前门,按读者身份分流。

  • 根 README.md 是项目的"正门"——它回答"microduck 是什么":约 25 cm、800 g 的双足机器人,主板为 Rockchip RK3566,由一组 Rust 守护进程驱动,50 Hz 控制回路用神经网络策略带动 15 个舵机(README 中明确说明 "This repo is the duck's brain")。手上已经有机器人的读者,README 直接指向速查表。
  • docs/robot/cheatsheet.md 是"驾驶门"——机器人在你面前,想立刻驱动它,从这里开始。
  • docs/faq.md 是另一扇前门,面向在鸭子之上做开发的人:模型太重跑不动怎么办、如何把摄像头接进自己的程序、为什么 Space 连不上。它的 FAQ 回答模式不是讲机制,而是指路——"设计文档说机制怎么运作;这里告诉你该伸手拿哪一块"(原文档原话)。

第二层:机制单一归属(One page owns a mechanism)。

这是整个 docs 体系最核心的写作契约:一份机制只有一页负责完整讲解,其余页面提到它时只说一句话并指过去。原文档用一个真实事故解释了为什么:

A fact written down in six places drifts in six directions……——正是这样,六份文档都承诺updaterd和btd会在下次重启前保留旧二进制,而实际两个发布之后它们早已不这么做了,包括正在排查这个问题的人会读的那两页。

因此文档间出现矛盾时,不拥有该机制的那一页才是 bug,而不是机制归属页。这个原则贯穿 docs/design/ 全部设计文档,也让开发者可以放心引用:architecture.md是服务拆分与 IPC 契约的归属页,updater-design.md是更新引擎的唯一权威。

第三层:按文档生命周期分区。

docs 目录被刻意分成四类,各自有明确的新鲜度预期:

  • robot/—— 使用手册,随版本演进;
  • design/—— 设计文档,很少改动;行为与设计文档不一致时,文档是 bug;
  • project/—— 项目记录,有日期、故意过期,描述某个时刻的状态而非永久真理;
  • ideas/—— 想法暂存区,还没设计成文的思考,先写下来以免丢失,也避免被误当成决策。

robot/——你有一台机器人:八份操作手册

文档解决什么问题
docs/robot/cheatsheet.md每一条robotctl命令:驾驶、配置、语音、chorale、theremin、wifi、更新、日志
docs/robot/pair-a-gamepad.md每个手柄只需配对一次:配对模式、pad pair、以及配对不上时怎么办
docs/robot/cheatsheet-dev.md需要开发板才能用的命令:分支构建、候选版本、dev push
docs/robot/dev-push.md在自己机器上构建、通过 ssh 装到板上,无需 CI
docs/robot/simulation.md模拟鸭子:scripts/duck-sim 让真实守护进程对着 MuJoCo 刚体跑,一个或多个鸭子跑在容器里
docs/robot/duckctl.md每一条duckctl命令——从笔记本电脑经蓝牙操作机器人
docs/robot/install-dev.md从空白板开始,把一块板子设置成可开发状态
docs/robot/install-by-hand.md与 install-dev 相同的安装过程拆成一条条独立命令,用于逐步测试

入门路径:cheatsheet 是机器上最重要的文档

docs/robot/cheatsheet.md 的定位是"在机器人上运行的robotctl",并且它遵守一条诚实原则:每条命令都取自发布分支的--help,而非记忆。它对权限划分有清晰约定:

  • 只读命令不需要特权;
  • 任何改变机器人的操作需要sudo(或configd的--allow-user/--allow-group、updater.toml里的allow_uids/allow_gids)。

它给出的第一个命令是robotctl version——对比"每个守护进程实际运行的是哪个版本"与"安装的是哪个版本",因为更新后仍在服务旧代码的守护进程,看起来和刚修好的 bug 一模一样。其次是robotctl health,硬件与软件一份报告,机器人不健康或不可达时以非零退出码退出,因此可以被脚本当作门禁;--json用于生成支持工单。这两个命令恰好对应 src/robotctl 的实现以及各守护进程启动时写入/run/<service>/identity.json的运行版本机制(见 docs/design/architecture.md §8.3)。

模拟与开发:没有实体鸭子也能工作

scripts/duck-sim 让没有机器人在手边的开发者用真实守护进程对着 MuJoCo 中的刚体跑仿真——这是 docs/robot/simulation.md 的核心主题,而 docs/design/simulation.md 则从设计侧说明"守护进程与身体之间的接缝在哪、身体协议是什么、假无线电如何工作"。robot/与design/各有一份 simulation 文档,正是"使用手册 + 设计文档"双视角的典型组合。

design/——你在改守护进程:机制归属表

这份表格是 docs 体系的权威分配表:一个事实属于哪一页,其他页面就只能一句话带过并指向它。

文档归属的机制
docs/design/architecture.md服务拆分、IPC 契约、状态归属、安全与权威
docs/design/robotd-design.md控制回路:Dynamixel 总线与端口归属、模型、感知、观测、策略、安全——以及挂在 tick 上的其他一切
docs/design/updater-design.md更新引擎:校验、原子切换、健康门禁、回滚、发布格式
docs/design/policy-channel-design.mdONNX 策略从哪来:policies组件、试玩别人的策略、reset会放回什么
docs/design/restart-order.md在所有移动current的路径上(以及开机时),哪个单元在哪一步重启
docs/design/app-path-design.mdbtd与configd——手机如何通过 BLE 配置机器人
docs/design/mobile-app.md手机 App:由什么构建、机器人还欠它什么;代码在独立的 microduck-app 仓库
docs/design/remote-webrtc.mdWebRTC 会话、信令、控制通道——对端如何驾驶与观察机器人
docs/design/webrtc-console.mdWebRTC 客户端:如何从机器人上提供页面、如何找到机器人、页面应该长什么样
docs/design/remote-access-design.md从局域网外访问鸭子:Hugging Face 账号、设备流、通往 rendezvous 服务的桥
docs/design/boot-recovery-net.md启动的发布无法拉起守护进程时,回退到 golden 版本
docs/design/simulation.md数字孪生:守护进程与身体之间的接缝、身体协议、假无线电、容器,以及它"是什么的孪生、不是什么"

架构事实:七守护进程与"三类生存者"

结合 docs/design/architecture.md 可以理解这份表的重量级内容:单板上七个守护进程通过Unix socket 上的 JSON-RPC 2.0(NDJSON,一行一个对象)通信,robotd是唯一碰机器人的进程——15 个舵机和 IMU 共享一条串行总线,50 Hz 控制回路独占它,客户端只能发送intent("以这个速度走"、"看向那里"),安全层由robotd决定什么可以执行。源码侧,robotd/src、configd/src、updater/src、btd/src、mediad/src、tof/src、padd/src 与架构中的服务一一对应。

架构中一条反复出现的不变量是:btd、configd、updaterd在robotd死亡时仍须存活——它们是恢复路径,因为"控制回路起不来的机器人,恰恰是最需要被重新配置、更新或回滚的那台"。这也是为什么配置放在configd而非robotd:给坏掉的机器人配 wifi,正是它坏了时最需要的事。这一设计在文档表中体现为app-path-design.md与boot-recovery-net.md各自负责的机制边界。

更新与策略:两个独立机制的所有权页

  • docs/design/updater-design.md 是更新引擎唯一权威:发布以整目录落到/opt/robot/daemon/releases/<version>/,updaterd校验签名、移动current符号链接、重启单元、然后向robotd询问健康;不健康就把旧发布放回去。该设计被 deploy/ 与 updater/ 的源码(updater/src/verify.rs、updater/src/engine.rs)实现。
  • docs/design/policy-channel-design.md 是策略通道的唯一权威,其实操契约则在 docs/policy-manifest.md:一份位于.onnx旁边的manifest.json的每个字段都由它定义(kind决定谁结束策略——episodic/perpetual/scripted;command.encoding决定守护进程喂给它什么——constant/phase/posture_flag)。索引文档特意指出:"设计文档给出理由并指向它",这正是"一页归属机制、其他页一句话指过去"的实例。

project/——你在运行这个项目:有日期的现场记录

这些是有日期的记录而非参考资料,描述的是某个时刻的状态,故意过时。

文档记录什么
docs/project/roadmap.md里程碑,以及今天能用的 vs. 已经设计好的
docs/project/ci-setup.md发布流水线的一次性设置:密钥、机密、轮换
docs/project/install-path-gap.md四个安装路径 bug 为什么上了板子,以及什么堵住了它;它教会的那条规则在 docs/design/updater-design.md §9.1
docs/project/slice-2-bringup.md真 Radxa Zero 3W 在 slice 2 上做了什么
docs/project/update-over-ble.md从手机驱动更新路径:发现了什么,以及关于无线电回滚的决定
docs/project/media-bringup.mdRadxa Zero 3W 怎么处理视频:VPU、MPP 需要什么、必须构建的两个插件
docs/project/pad-minimal-pairing.md手柄能配对的最小板级配置——逐个移除配置项找出来的
docs/project/idle-cpu.md没人请求时守护进程在干什么:四件已停的事、两件测过但保持原样的、一件仍待板子验证的
docs/project/tof-on-demand.mdtofd的空闲 5% 里九成是头部 IMU、一成是深度,而 IMU 没有消费者;为什么激光与整机保持原样、IMU 加了个开关

这类文档的价值在于它们是真实发生过的工程决策记录,比如install-path-gap.md明确指向它教会的规则(updater-design.md§9.1),形成"事故 → 规则"的闭环,而不是停留在口号层面。

ideas/——还没设计完:思考的蓄水池

文档内容
docs/ideas/autonomous_behavior.md行为栈:运行时的大脑必须交出什么,以及 chorale 和 theremin 工作留下的想法

它存在的理由正如索引原文所述:"一件即将需要设计文档的事,在拥有它之前先写下来,这样思考不会丢失,也不会被误当成决策。"这份文档与仓库里 robotd/src/chorale.rs、robotd/src/theremin.rs 以及 sounds/src 的合唱/特雷门实现相互呼应,是可以追踪"想法如何沉淀为机制"的起点。

Elsewhere:文档体系之外的三处补充

文档内容
CONTRIBUTING.md构建、测试、仓库布局、约定、发布
docs/project/npu-bringup.mdRK3566 NPU 上的鸭子检测器:跑什么、怎么基准测试、仍然缺失的帧路径
deploy/README.md机器人镜像被配置了什么、provisioning 实际做什么

其中 deploy/README.md 值得单独说明:它描述的是属于镜像而非单个服务的 OS 级配置——updater.toml(客户端机器人携带的配置,安装到/etc/robot/updater.toml)、trusted_keys/(发布公钥,即信任锚)、journald.conf.d/10-robot.conf(日志持久化与容量上限)。它还记录了一个实测发现:该镜像的/var/log是 zram 设备,Storage=persistent实际是内存中的目录,断电会丢失最近日志——因此/var/lib下的更新历史是唯一持久记录,这正是 docs/design/architecture.md §8.2 如此设计的原因。

如何正确使用这份文档地图

综合原索引文档的组织意图,实际使用可以遵循三条经验法则:

  1. 按身份找门:有机器在手 → docs/robot/cheatsheet.md(机器上第一条命令永远是robotctl version);构建自己的程序接入鸭子 → docs/faq.md;要改守护进程 → 查 docs/design/ 的机制归属表。
  2. 按机制引用:引用一个机制时,永远指向它的归属页——更新相关引 docs/design/updater-design.md,策略通道引 docs/design/policy-channel-design.md 与 docs/policy-manifest.md,服务架构引 docs/design/architecture.md。
  3. 区分新鲜度:project/的文档有日期、可能已过时;行为与设计文档冲突时,是文档错了而不是代码错了;ideas/是想法不是决策。

这套"多门分流 + 单一机制归属 + 生命周期分区"的文档架构,让一个同时承载实体硬件操作手册、系统设计文档、工程复盘记录和想法沉淀的仓库,保持了可导航、可引用、可纠错的一致性——这正是从 docs/README.md 出发能够掌握的最大价值。

  • 机器人
  • 嵌入式
  • 强化学习
  • 人工智能
  • 智能硬件
  • 计算机视觉
  • 音视频

【免费下载链接】microduck

A Tiny biped duck robot 🦆

项目地址:https://gitcode.com/gh_mirrors/mi/microduck
点击查看免费下载

相关推荐

上一篇:HomeMirror性能调优指南:解决卡顿与ANR问题
下一篇:未来展望:Hex 语音转文字路线图与 5 大技术发展趋势

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询