Give Muse a robot body. Native ESP32 firmware for the RIG-Puppy robot dog.
中文说明 · Build from source · Development guide · Technical reference
Muse-triggered greeting on a real Puppy. Silent, looping preview. Watch the MP4.
RIG-Muse connects Muse to a small physical companion that can greet you, move, show expressions, react to handling and share its camera view. It runs directly on the Puppy's ESP32-S3, using Meta's open-source Muse Gadget SDK, without a separate Linux gateway.
This independent project is maintained by LuwuDynamics. It is not an official Meta robot product. The current implementation is experimental and targets RIG-Puppy. This repository distributes source code; users configure and compile their own builds.
Explore how an AI companion becomes more engaging when it has a body. A conversation can lead to a friendly gesture; a shake can become a surprised expression; a photo can bring the robot's surroundings into the conversation. We care about short, expressive interactions that feel responsive and make people smile.
We also want a reusable foundation: Muse handles conversation and tool selection, firmware exposes explicit device capabilities, and each robot backend owns its protocol, calibration and motion. Puppy is the first implementation. RIG-Arm is planned, not supported today.
| Capability | Current implementation |
|---|---|
| Body expression | 16 original Puppy actions; aliases, reset and media-only expressions bring the catalog to 24 entries |
| Movement | Forward, backward, left turn and right turn with bounded speed and duration |
| Face and sound | Animated eyes, particle expressions and short synthesized effects; no TTS |
| Camera | On-demand 240 × 240 JPEG snapshots through camera.capture |
| IMU interaction | Idle expression/sound reactions to shaking, tilt and pickup-like acceleration |
| Battery | Servo-reported voltage and an approximate percentage |
| Light accessory | Timed on/off and mode switching for the light-sword accessory |
| Voice notes | Double-click BOOT to record, double-click again to send; replies appear in Muse |
| Feedback | Job IDs, completion/failure/cancellation, fresh joint feedback and stop control |
rig.catalog lists 24 preset entries, four movement directions and 12 board tools; the SDK adds device.health. Preset count is not total capability count. Left/right means turning, not sideways walking. Motion completion does not measure distance traveled.
You need a RIG-Puppy with ESP32-S3, 16 MB flash, octal PSRAM and valid existing servo calibration; a USB data cable; a Muse account/app with community device support; your own SDK token; and a 2.4 GHz Wi-Fi network that lets Puppy reach Muse. Review the Gadget SDK Terms.
Install ESP-IDF v6.0.1, then activate that environment:
git clone https://github.com/LuwuDynamics/RIG-Muse.git
cd RIG-Muse/esp32
. "$IDF_PATH/export.sh"
python3 -m pip install 'esptool>=5,<6' pyserial
tools/board.sh rig-puppy buildThe Puppy profile creates build-rig-puppy/sdkconfig. No token or personal network settings are committed. The default proxy host is empty, so a new device uses direct access.
Edit your local configuration with:
idf.py -B build-rig-puppy \
-DSDKCONFIG=build-rig-puppy/sdkconfig menuconfigUnder ESP32 Device SDK, set CONFIG_GADGET_SDK_TOKEN to your own token. Configure CONFIG_RIG_HTTP_PROXY_HOST and CONFIG_RIG_HTTP_PROXY_PORT only if your network needs a LAN proxy; otherwise leave the host empty. These settings can also be edited directly in the ignored build-rig-puppy/sdkconfig. Keep real values out of shared source files and commits.
tools/board.sh rig-puppy build
tools/rig_host_tests.sh
python3 tools/prepare_flash.py
python3 build-rig-puppy/flash-rig/flash.py --port YOUR_PUPPY_PORTSelect the actual Puppy USB UART port: /dev/cu.usbmodem... or /dev/cu.usbserial... on macOS, /dev/ttyACM0 or /dev/ttyUSB0 on Linux, or COM5 on Windows. Console baud is 115200; flashing defaults to 230400.
First installation replaces the original firmware and partition layout. The local installer compares original calibration at 0xFFF000 before and after flashing and avoids NVS writes. Keep an original device backup privately if restoration is needed. Never install Puppy code on Arm. See the complete source build guide.
You may leave the compiled token empty and enter it after flashing through a hidden local USB prompt:
python3 tools/provision_rig.py --port YOUR_PUPPY_PORT --sdk-tokenPersonal binaries may contain credentials; keep generated files private. This project does not provide prebuilt binary downloads or GitHub Releases.
Open Settings → Devices → Developer mode in Muse, add MuseGadget-RIG-XXXXXX, follow Wi-Fi setup and press BOOT when physical confirmation is requested. The suffix comes from this Puppy's MAC address.
Once connected, ask Muse to read rig.catalog and rig.status. Put Puppy on a clear, level surface and try a greeting. After updating firmware, reconnect the device and start a fresh conversation if Muse still shows an old tool catalog.
- “Let Puppy wave hello.” →
rig.performwith{"name":"greet"}. - “Take a photo through Puppy's camera.” →
camera.capture. - “Walk forward briefly.” →
rig.movewith{"direction":"forward","speed":30,"duration_ms":500}. - “What's Puppy's battery voltage?” →
rig.battery. - Double-click BOOT while idle to record a voice note, then double-click to send. Single-click cancels recording; button presses during motion prioritize stopping.
Voice sending requires a working Muse connection. The recording, upload and feedback state machine is implemented; end-to-end voice-note behavior still needs broader field validation across networks/accounts.
The source defaults use direct access. A LAN proxy is optional. Set your own host/port in the local build configuration before compiling, or use the USB override below after flashing. No maintainer network address is configured.
python3 tools/provision_rig.py --port YOUR_PUPPY_PORT --proxy YOUR_LAN_PROXY_HOST:7897
# Disable the proxy:
python3 tools/provision_rig.py --port YOUR_PUPPY_PORT --directFor a proxy on a Mac/PC, keep the computer awake and the proxy running. Enable LAN access, bind the HTTP/mixed listener to a LAN-accessible interface and permit its port in the firewall. Puppy must be able to reach that host; using the same Wi-Fi/LAN is simplest. 127.0.0.1 refers to Puppy itself.
Saved USB settings override compiled settings and survive reflashing. Use --direct to force direct access or --clear to remove the USB override and restore compiled defaults after reboot.
HTTP CONNECT carries Muse API and synchronous TLS/WebSocket traffic, while retaining end-to-end hostname/certificate verification. SOCKS5, proxy authentication, UDP tunneling and a device-wide VPN are not implemented. An enabled proxy never silently falls back to direct access on failure. A phone VPN does not automatically carry Puppy traffic.
We recommend Codex, Claude Code, or another repository-aware coding assistant for environment setup, code changes and verification. The repository includes maintained project context:
- AGENTS.md: architecture, build commands, validation and device-handling rules for coding agents.
- CLAUDE.md: Claude Code entry point, referencing the same project instructions.
- Development guide: configuration locations, capability extension points and example task briefs.
- ESP32 SDK instructions: detailed upstream SDK workflows.
Open the repository in your assistant and ask:
Read AGENTS.md and docs/FLASHING.md. Configure the ESP-IDF 6.0.1 environment, build RIG-Puppy from source, and show me how to edit my local token and optional proxy settings without exposing them. Report build and test results before flashing.
For code changes, ask the assistant to inspect the relevant backend, implement the behavior, run the appropriate checks and describe what still needs hardware validation. Credentials should be entered locally, never pasted into an assistant conversation.
| Path | Purpose |
|---|---|
esp32/main/boards/rig_puppy/ |
Puppy hardware, protocol, actions, sensors and media |
esp32/main/rig_setup.* |
Local USB provisioning and boot-time settings |
esp32/main/rig_show.*, rig_pface.* |
Expression/sound synthesis and particle face engine |
esp32/devices/sdkconfig.rig-puppy |
Shared board defaults; personal settings belong in local generated config |
esp32/main/Kconfig.projbuild |
Available configuration options |
esp32/tests/ |
SDK and RIG host tests |
docs/ |
Source build instructions, development, provenance and demo media |
README.upstream.md, linux/, skills/ |
Preserved upstream SDK documentation/functionality |
The firmware starts without an automatic motion routine, reads calibration without rewriting it, executes one body action at a time and stops on cancellation or stale feedback. Torque is telemetry, not software overload protection. Host tests and local catalog checks do not prove cloud registration or successful physical behavior; use the technical reference and validate on the intended board.
Planned work: richer interaction sequences, broader voice-note field testing, reproducible board validation and a separate RIG-Arm backend. Contributions should include the board, firmware version, reproduction steps and redacted logs. See CONTRIBUTING.md and SECURITY.md.
Based on facebookincubator/muse-gadget-sdk, baseline 693cde9a884ad1edc87251b9f8944815f8de4809. Puppy motion formulas and hardware definitions are adapted from Luwu's RIG-Omni implementation. RIG integration, expressions, tests and documentation are maintained by LuwuDynamics.
We retain the upstream Apache-2.0 license and copyright notices. minimp3 retains CC0-1.0; pixel_font.c retains BSD-2-Clause. The upstream Jollybot avatar is outside Apache-2.0. See NOTICE, THIRD_PARTY.md and the upstream README. Muse service access and SDK tokens are governed separately by the Gadget SDK Terms.