📈 GH Trending Explorer 🎲 Surprise me

← all repos

AI-FanGe / Microduck-build-tutorial

git clone https://github.com/AI-FanGe/Microduck-build-tutorial.git image.v1 · 1mo ago

A practical hardware and software setup for a compact RL-powered biped robot.

+8
stars, 24h · #1,711
+~56
stars, 7 days · #2,157
+~240
stars, 30 days · #2,152
1.3k
★ total · +4% this week
319
forks · 10 open issues

Star history (as recorded here)

2026-10-20 · 1,308 ★ 2026-10-22 · 1,331 ★
LanguagePython
LicenseMIT
Created2026-09-04 (1mo ago)
Last push1mo ago
Watchers11
OwnerUser

Links

README excerpt
# Microduck
Microduck 是一个小型双足机器人项目,包含两部分:
- `microduck/`: Raspberry Pi Zero 2 W 上运行的部署代码,负责读取 IMU、读取手柄/键盘输入、驱动 Dynamixel 舵机,并加载 ONNX 行走策略。
- `mjlab_microduck/`: 基于 MuJoCo/MjLab 的强化学习训练环境,用来训练并导出 `walk.onnx`。
本 README 面向装机和第一次运行:准备硬件、接线、刷写 `microduck.img.xz`、初始化 Wi-Fi、SSH 登录、运行模型,以及后续更新代码。3D打印的文件在项目中。
视频教程:https://www.youtube.com/watch?v=Vep8AjoCnEM
## 致谢
感谢开源项目 microban 和 microduck。本项目的机械结构、部署思路、仿真训练和实机行走流程都受益于这些开源工作。
## 项目状态
当前发布镜像已经内置:
- Raspberry Pi OS Lite 64-bit。
- 主机名 `microduck`。
- 默认用户 `user`。
- 部署目录 `~/microduck`。
- Python 虚拟环境 `~/microduck/.venv`。
- 行走模型 `~/microduck/src/agents/walk.onnx`。
- 无头手柄服务 `microduck-gamepad.service`,可开机后用手柄启动模型。
当前预构建镜像:
- microduck.img.xz
## BOM
下面是组装一台 Microduck 的主要物料。价格会随地区、采购渠道和批量变化,仅用于估算。
| 类别 | 物料 | 数量 | 说明 |
| :--- | :--- | :---: | :--- |
| 控制板 | Raspberry Pi Zero 2 W | 1 | 运行控制程序、蓝牙手柄、Wi-Fi 和 SSH。 |
| 舵机控制板 | ROBOTIS OpenRB-150 | 1 | 通过 USB 连接 Raspberry Pi,负责和 XL330 舵机总线通信。代码会优先自动查找 `/dev/serial/by-id/usb-ROBOTIS_OpenRB-150_*`。 |
| 舵机 | Dynamixel XL330-M288-T | 14 | 当前行走代码使用 14 个舵机:双腿 10 个,头/颈 4 个。若安装嘴部舵机,可使用 ID 15,但当前行走模型不依赖它。 |
| 电池 | 成品 6V 可充电电池 | 1 | 当前硬件直接使用成品 6V 电池包供电,不使用两节 18650 自制电池组。请确认电池能提供足够瞬时电流。 |
| 开关 | 电源开关 | 1 | 控制机器人主电源。 |
| 存储 | 16GB 或更大 microSD 卡 | 1 | 推荐使用质量稳定的新卡。镜像刷写后首次启动会自动扩展分区。 |
| IMU | BNO080/BNO085/BNO086 模块 | 1 | 通过 I2C 读取姿态,代码会自动探测常见地址。 |
| 结构件 | 3D 打印件 | 1 套 | 使用 `microduck/cad/` 中的模型打印。推荐 PLA。 |
| 螺丝 | M2/M2.5 自攻螺丝 | 若干 | 舵机固定、舵盘固定、结构件连接。建议多备。 |
| 线材 | Dynamixel 3-pin 线| 若干 | 舵机串联、电源连接、分线。 |
## 舵机 ID
控制代码期望的 ID 映射如下。烧录镜像之前或第一次运行之前,应先用 Dynamixel Wizard 设置好每个舵机。
| ID | 名称 | 位置 |
| :---: | :--- | :--- |
| 1 | `right_ankle` | 右踝 |
| 2 | `right_knee` | 右膝 |
| 3 | `right_hip_pitch` | 右髋俯仰 |
| 4 | `right_hip_roll` | 右髋横滚 |
| 5 | `right_hip_yaw` | 右髋偏航 |
| 6 | `left_ankle` | 左踝 |
| 7 | `left_knee` | 左膝 |
| 8 | `left_hip_pitch` | 左髋俯仰 |
| 9 | `left_hip_roll` | 左髋横滚 |
| 10 | `left_hip_yaw` | 左髋偏航 |
| 11 | `head_pitch` | 头部俯仰 |
| 12 | `neck_pitch` | 颈部俯仰 |
| 13 | `head_yaw` | 头部偏航 |
| 14 | `head_roll` | 头部横滚 |
| 15 | `mouth` | 可选嘴部舵机,当前行走策略不使用 |
Dynamixel Wizard 推荐参数:
- Protocol: `2.0`
- Baud Rate: `1Mbps`
- Return Delay Time: `0`
- PWM Slope: `255`
- Shutdown: 去掉输入电压错误触发项,避免电池电压波动时误停
## 接线图
### 电源接线
电源链路如下:
 [code] 
检查要点:
- 上电前用万用表确认正负极。
- 当前硬件使用成品 6V 可充电电池,不需要自制 2S 电池组、BMS 和 2S 充电板。
- OpenRB-150 负责 XL330 舵机通信,Raspberry Pi 通过 USB 连接 OpenRB-150。
- Raspberry Pi 需要稳定 5V 供电;舵机/OpenRB-150 使用 6V 电池侧供电。两侧必须共地,具体以你的电源模块和 OpenRB-150 接法为准。
- 焊点需要热缩管或热熔胶绝缘,避免短路。
### 舵机总线
XL330 使用 3-pin 串联总线。OpenRB-150 接出后可通过分线分到左右腿和头部。
 [code] 
注意:
- 舵机顺序可以按结构方便布线,但 ID 必须和上表一致。
- 如果总线上有通信错误,优先检查 OpenRB-150 是否枚举成功、电池电压、GND、线序和舵机 ID。
- 正常情况下代码会自动选择 OpenRB-150 的 USB 串口;如果没有找到,会回退到 `/dev/ttyACM0`、`/dev/serial0`、`/dev/ttyAMA0` 或 `/dev/ttyS0`。
### IMU 接线
BNO08x 模块走 I2C:
| IMU 引脚 | Raspberry Pi / Hat |
| :--- | :--- |
| `VIN` / `3V3` | 3.3V,按模块标识选择 |
| `GND` | GND |
| `SDA` | GPIO2 / I2C SDA |
| `SCL` | GPIO3 / I2C SCL |
软件默认使用 I2C bus `1`,会自动寻找 BNO08x 常见地址。安装方向由 `IMU_MOUNT_QUAT` 配置,已经和当前行走模型匹配。
## 使用 `microduck.img.x