Reachy Mini 机器人
Reachy Mini
2025年12月买的 Reachy Mini 机器人,近5个月终于到手了。
购买链接

介绍
Reachy Mini 是由法国机器人公司 Pollen Robotics 开发的一款开源的桌面级人形机器人,旨在为教育、研究和创意项目提供一个灵活且易于使用的平台。Reachy Mini 是 Reachy 机器人的小型版本,具有相似的功能和设计,但体积更小,更适合在桌面环境中使用。
硬件版本
| 功能特性 | Wireless (无线版) | Lite (轻量版) |
|---|---|---|
| 价格 | $449 | $299 |
| 电机与机械结构 | 9 个伺服电机 | 9 个伺服电机 |
| 头部运动 | 6 自由度 (pitch, roll, yaw, x, y, z) | 6 自由度 (pitch, roll, yaw, x, y, z) |
| 身体旋转 | ±160° | ±160° |
| 天线 | 2 个动力感应天线 | 2 个动力感应天线 |
| 摄像头 | 广角摄像头 | 广角摄像头 |
| 麦克风 | 4 麦克风阵列 | 4 麦克风阵列 |
| 扬声器 | 5W 扬声器 | 5W 扬声器 |
| 板载算力 | 树莓派 CM 4 (16GB 存储) | - |
| 加速计 | 内置 IMU | - |
| Wi-Fi 连接 | 支持 | - |
| 独立模式 | 支持 | 需通过 USB 连接控制 |
| 供电方式 | 电池供电 + 电源适配器 (7.3V / 5A) | 仅限电源适配器 (7.3V / 5A) |
开箱与初体验
开箱



组装(近3个小时)
下载 Reachy Mini Control
连接到 Reachy Mini 的 WiFi 热点
- 网络名称:
reachy-mini-ap - 密码:
reachy-mini
连接 WiFi

系统更新

连接 Reachy Mini


⚠️ 注意:Reachy Mini(无线版)不支持(❌) USB-C 线连接
无线版机器人不像Lite版那样通过USB接口连接,所以直接将USB-C线插入笔记本电脑无法建立连接。
正确的做法是:
- 将机器人连接到您的 Wi-Fi 网络,然后使用笔记本电脑上的 SDK 客户端远程控制它。
- 如果你想直接在嵌入式 Raspberry Pi 上运行代码,可以通过 SSH 连接到 Raspberry Pi 并在那里执行你的脚本(Reachy Mini Control 就是在你发布/安装应用程序后执行此操作的)。
- 对于有线连接,请使用 USB-C 转以太网适配器和以太网线——这样就可以用有线以太网代替 Wi-Fi。
硬件数据

自由度
- 头部:6个自由度(3个旋转与3个平移)
- 机身:1个自由度旋转
- 天线:1个自由度(2个)


控制
- 树莓派4计算模块(无线版)

电机规格
- 基座:1个定制Dynamixel XC330-M288-PG(XC330-M288-T,塑料齿轮)
- 天线:2个Dynamixel XL330-M077-T
- Stewart 平台:6 个 Dynamixel XL330-M288-T

麦克风阵列板
- 4 个 PDM MEMS 数字麦克风
- 最大采样率16千赫兹/灵敏度-26分贝满刻度/信噪比64分贝A计权
- 基于 Seeed Studio 的 reSpeaker XMOS XVF3800 打造
摄像头
- 树莓派摄像头v3广角
- 索尼 IMX708
- 1200万像素
- 自动对焦
- I2C*约1个 MIDI DSI 接口
5瓦 4欧姆 扬声器
电源板
- 输入电压:6.8 - 7.6伏
- 磷酸铁锂电池,2000毫安时,6.4伏,12.8瓦时,具备过充保护、过放保护、过流保护、短路保护及温度感应功能。

CM4 控制板
- 由电源板提供 6.8 - 7.6 伏电压
- Dynamixel 电机 TTL 连接
- 摄像头CSI接口
- 麦克风阵列接口
- USB‑C 输出(即可插入 U 盘等设备)。请注意,无法(❌)通过此 USB 接口进行充电。
- 树莓派4计算模块 - CM4104016
- WiFi
- 4GB内存
- 16GB闪存
- Wi-Fi天线 - 2.4-5GHz双频段贴片天线,2.79 dBi,全向型
📌 软件指南篇
安装
1. 前提条件
| 工具 | 版本 | 用途 |
|---|---|---|
| 🐍 Python | 3.10 - 3.12 | 运行 Reachy Mini SDK |
| 📂 Git | 最新版本 (Latest) | 下载源码和应用程序 |
| 📦 Git LFS | 最新版本 (Latest) | 下载模型资源文件 |
安装 uv
curl -LsSf https://astral.sh/uv/install.sh | sh
安装 Python
uv python install 3.12 --default
安装 Git & Git LFS
- 安装 Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
- 安装 Git 和 Git LFS
brew install git git-lfs
- 初始化
git lfs install
2. 创建虚拟环境
创建环境
sudo mkdir /opt/uv
cd /opt/uv
sudo uv venv reachy-mini --python 3.12
sudo chown -R $(whoami) /opt/uv/reachy-mini
激活环境
source reachy-mini/bin/activate
3. 安装 Reachy Mini
在终端中,运行:
uv pip install "reachy-mini"
如果你想使用模拟模式,需要添加 mujoco 附加依赖:
uv pip install "reachy-mini[mujoco]"
入门指南
直接在 Reachy Mini(无线版)上运行 SDK
如果你想直接在无线版 Reachy Mini 上运行 SDK,而非在电脑上远程运行,可以通过 SSH 连接到它。
步骤 1:SSH 连接
ssh pollen@reachy-mini
默认用户名:pollen,密码:
root
查看操作系统版本
cat VERSION.txt
ReachyMiniOS: v0.2.3
Created on: 2026-01-15
SSH 无需密码直接连接到机器人
复制您的公匙 id_rsa.pub 到机器人上,命名为 authorized_keys。
scp ~/.ssh/id_rsa.pub pollen@reachy-mini:/home/pollen/.ssh/authorized_keys
ssh 登录可以不用输入密码直接登录机器人了。
ssh pollen@reachy-mini
步骤 2:激活 Python 虚拟环境
source /venvs/apps_venv/bin/activate
步骤 3:在本地运行脚本
在 Reachy Mini 本体上运行脚本时,请使用标准的 ReachyMini() 构造函数。自动模式会保持本地主机的连接,除非你显式地覆盖它:
from reachy_mini import ReachyMini
with ReachyMini() as mini:
# Your code here
确保机器人服务器(守护进程)处于运行状态
守护进程是一种后台服务,负责与电机和传感器进行底层通信。必须保持该进程运行,你的代码才能正常工作。
Reachy Mini(无线版)
-
Reachy Mini Control
运行应用: Reachy Mini Control
-
Reachy Mini Dashboard(未来会停用)
浏览器打开网址: http://reachy-mini:8000/

用于模拟(无需机器人)
运行 Reachy Mini Daemon(模拟模式)
mjpython -m reachy_mini.daemon.app.main --sim
验证:在浏览器中打开 http://localhost:8000/docs 或 http://reachy-mini.local:8000/docs 。若能看到 Reachy SDK 接口文档,即代表配置完成!
你的第一个脚本
创建脚本:hello.py
from reachy_mini import ReachyMini
# Connect to the running daemon
with ReachyMini() as mini:
print("Connected to Reachy Mini! ")
# Wiggle antennas
print("Wiggling antennas...")
mini.goto_target(antennas=[0.5, -0.5], duration=0.5)
mini.goto_target(antennas=[-0.5, 0.5], duration=0.5)
mini.goto_target(antennas=[0, 0], duration=0.5)
print("Done!")
python hello.py
Connected to Reachy Mini!
Wiggling antennas...
Done!
📌 在这里出现了个大坑,我使用的
iTerm2终端无法正常工作,ssh 连接和运行守护进程reachy-mini-daemon,都出现错误:No route to host,各种折腾,整了大半天。最终换成系统自带的Terminal之后就正常了。
Reachy Mini 系统
系统信息
uname -a
Linux reachy-mini 6.12.62+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.12.62-1+rpt1 (2025-12-18) aarch64 GNU/Linux
树莓派专用 64 位 Linux 内核 6.12.62,主机名 reachy-mini,ARM64 架构,多核实时抢占内核,基于 Debian。
查看当前守护进程的状态
浏览器打开网址:http://reachy-mini:8000/api/daemon/status
或者使用 curl 命令:
curl -X 'GET' \
'http://reachy-mini.local:8000/api/daemon/status' \
-H 'accept: application/json'
{
"type": "daemon_status",
"robot_name": "reachy_mini",
"state": "running",
"wireless_version": true,
"desktop_app_daemon": false,
"simulation_enabled": false,
"mockup_sim_enabled": false,
"no_media": false,
"media_released": false,
"camera_specs_name": "wireless",
"backend_status": {
"ready": false,
"motor_control_mode": "enabled",
"last_alive": null,
"control_loop_stats": {
"mean_control_loop_frequency": 49.5906534853054,
"max_control_loop_interval": 0.0202715396881104,
"nb_error": 0,
"motor_controller": "ControlLoopStats(period=~20.00ms, read_dt=~1.95 ms, write_dt=~0.08 ms)"
},
"error": null
},
"error": null,
"wlan_ip": "192.168.1.205",
"version": "1.7.1"
}
设置时区和时间同步
默认时区设置:
- 时区(Time zone) 被设置成了
Europe/London(伦敦时间)。 - NTP 服务(NTP service) 是激活状态(
active),并且系统时钟已经同步(System clock synchronized: yes)。
$ timedatectl
Local time: Mon 2026-05-18 13:53:08 BST
Universal time: Mon 2026-05-18 12:53:08 UTC
RTC time: n/a
Time zone: Europe/London (BST, +0100)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
$ date
Mon 18 May 13:53:10 BST 2026
这里将时区更改为上海时间(Asia/Shanghai),运行以下命令:
timedatectl set-timezone Asia/Shanghai
如果没有开启 NTP 服务,运行以下命令启用:
timedatectl set-ntp true
更改后再次检查:
$ timedatectl
Local time: Mon 2026-05-18 20:53:52 CST
Universal time: Mon 2026-05-18 12:53:52 UTC
RTC time: n/a
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
$ date
Mon 18 May 20:53:57 CST 2026
列出所有正在运行的服务
systemctl list-units --type=service --state=running
UNIT LOAD ACTIVE SUB DESCRIPTION
avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack
bluetooth.service loaded active running Bluetooth service
cron.service loaded active running Regular background program processing daemon
dbus.service loaded active running D-Bus System Message Bus
getty@tty1.service loaded active running Getty on tty1
gpio-shutdown-daemon.service loaded active running Reachy Mini GPIO Shutdown Daemon
ModemManager.service loaded active running Modem Manager
NetworkManager.service loaded active running Network Manager
polkit.service loaded active running Authorization Manager
reachy-mini-bluetooth.service loaded active running Reachy Mini Bluetooth GATT Service
reachy-mini-daemon.service loaded active running Reachy Mini AP Launcher Service
serial-getty@ttyS0.service loaded active running Serial Getty on ttyS0
ssh.service loaded active running OpenBSD Secure Shell server
systemd-journald.service loaded active running Journal Service
systemd-logind.service loaded active running User Login Management
systemd-timesyncd.service loaded active running Network Time Synchronization
systemd-udevd.service loaded active running Rule-based Manager for Device Events and Files
udisks2.service loaded active running Disk Manager
user@1000.service loaded active running User Manager for UID 1000
wpa_supplicant.service loaded active running WPA supplicant
Legend: LOAD → Reflects whether the unit definition was properly loaded.
ACTIVE → The high-level unit activation state, i.e. generalization of SUB.
SUB → The low-level unit activation state, values depend on unit type.
20 loaded units listed.
开机后自动唤醒
开机后自动唤醒功能默认是关闭的。
查看 reachy-mini-daemon.service 服务状态
systemctl cat reachy-mini-daemon.service
# /etc/systemd/system/reachy-mini-daemon.service
[Unit]
Description=Reachy Mini AP Launcher Service
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/venvs/mini_daemon/lib/python3.12/site-packages/reachy_mini/daemon/app/services/wireless/launcher.sh
Restart=on-failure
RestartSec=3s
User=pollen
WorkingDirectory=/venvs/mini_daemon/lib/python3.12/site-packages/reachy_mini/daemon/app/services/wireless
[Install]
WantedBy=multi-user.target
编辑 launcher.sh 脚本
vi /venvs/mini_daemon/lib/python3.12/site-packages/reachy_mini/daemon/app/services/wireless/launcher.sh
#!/bin/bash
source /venvs/mini_daemon/bin/activate
export GST_PLUGIN_PATH=$GST_PLUGIN_PATH:/opt/gst-plugins-rs/lib/aarch64-linux-gnu/
export PATH=$PATH:/opt/uv
# Ensure WiFi is not soft-blocked (can happen after a crash or kernel module reload)
sudo rfkill unblock wifi
# Run Python in unbuffered mode (-u) to ensure logs are immediately forwarded to systemd
#python -u -m reachy_mini.daemon.app.main --wireless-version --no-wake-up-on-start
python -u -m reachy_mini.daemon.app.main --wireless-version
reachy-mini-daemon 默认是加上了 --no-wake-up-on-start 参数的,这个参数会禁止开机自动唤醒。要启用开机自动唤醒功能,需要删除该参数。
物理按键关机不能正常 Sleep
我测试了下面的两种方法都没有成功。
当你按下物理按键时,这个 Bash 脚本拉起了一个专门的 Python 模块 shutdown_monitor。
这个 Python 脚本在监听到 GPIO 信号后,估计直接在底层调用了类似 os.system("sudo poweroff") 或者 os.system("sudo shutdown now") 的命令。由于它绕过了系统的 systemd 服务管理,直接向内核申请了关机,导致系统来不及通知 reachy-mini-daemon 执行 goto-sleep,机器人就直接断电砸下来了。
要修复这个问题,我们甚至不需要去改动复杂的 Python 代码,直接在它赖以生存的 systemd 依赖层面上做两步调整,就能完美解决。
解决方案 1:利用 Systemd 依赖链硬锁(最推荐,最优雅)
我们要让系统明白:reachy-mini-daemon 必须在系统完全关闭之前先退出。
- 在终端中编辑机器人的核心服务:
sudo systemctl edit reachy-mini-daemon.service
- 在弹出的编辑界面中(注意:如果里面有注释行,请确保写在非注释区域,或者直接写在文件顶部),添加以下内容:
[Unit]
Before=shutdown.target reboot.target halt.target
Conflicts=shutdown.target reboot.target halt.target
Before=...和Conflicts=...的作用:告诉系统,这个机器人控制服务与“关机/重启”是冲突的。当系统因为物理按键触发关机(shutdown.target激活)时,系统会强制要求先卸载并停止reachy-mini-daemon。这样就会正大光明地触发它自带的--goto-sleep-on-stop减震趴下动作。
- 保存并退出(如果是 nano 剪辑器,按
Ctrl+O然后回车保存,再按Ctrl+X退出)。 - 让系统重新加载配置:
sudo systemctl daemon-reload
解决方案 2:直接去改那个 Python 监听脚本(治本法)
如果你想看看它底层到底是怎么写关机命令的,你可以直接去查看那个 Python 文件。
根据你的 launcher.sh 里的路径:
python -m reachy_mini.daemon.app.services.gpio_shutdown.shutdown_monitor
这个文件在系统中的绝对路径通常是:
cat /venvs/mini_daemon/lib/python3.12/site-packages/reachy_mini/daemon/app/services/gpio_shutdown/shutdown_monitor.py
(如果是 .py 后缀,你可以用 cat 或 nano 看看里面的内容)
如果你在里面看到了类似 subprocess.run(["sudo", "poweroff"]) 这样的代码,你可以直接把它改成:
# 更改前:直接关机
# os.system("sudo poweroff")
# 更改后:先用 systemctl 优雅停止机器人,等 3 秒,再关机
os.system("sudo systemctl stop reachy-mini-daemon.service && sleep 3 && sudo poweroff")
Reachy Mini 最佳的开启和关闭
开启
- 按物理开关,启动 Reachy Mini。(未唤醒)
- 连接到 Reachy Mini 的 Wi-Fi 热点。
- 运行 Reachy Mini Control 应用,或通过 SSH 连接到 Reachy Mini 并手动唤醒。
关闭
传统的关机命令
sudo shutdown -h now
现代 Linux 系统原生的关机命令
sudo systemctl poweroff
唤醒与睡眠
通过 API 唤醒
curl -X 'POST' \
'http://reachy-mini.local:8000/api/move/play/wake_up' \
-H 'accept: application/json' \
-d ''
通过 API 睡眠
curl -X 'POST' \
'http://reachy-mini.local:8000/api/move/play/goto_sleep' \
-H 'accept: application/json' \
-d ''
Reachy Mini(无线版)开发工作流
这里介绍了在无线版 Reachy Mini 机器人上进行代码开发与测试的高效工作流程。
前置条件
- 可通过SSH连接机器人(连接命令:
ssh pollen@reachy-mini.local,密码:root) - 本地电脑已安装SSHFS(Ubuntu/Debian 系统执行:
sudo apt install sshfs) - 获取机器人IP地址(可在Reachy Mini控制端、路由器后台查看,或SSH登录后执行
ifconfig查询)
跨平台简易方案
在完整工作流之前,先介绍两种更简单的跨平台开发方式:
VS Code 远程SSH
安装 VS Code 的 Remote - SSH extension 后,可直接在机器人上编辑文件。
连接到 pollen@reachy-mini.local,随后即可打开任意文件夹。修改内容会直接保存到机器人设备中,支持Windows、macOS、Linux全平台。

Rsync 同步
使用 rsync 可将本地源代码同步至机器人的 site-packages 目录,传输速度快,几乎适配所有系统:
rsync -avz /path/to/your_app/src/your_app/ \
pollen@reachy-mini.local:/venvs/apps_venv/lib/python3.12/site-packages/your_app/
每次代码修改后执行该命令即可推送更新;添加参数 --delete 可同步删除本地已移除的文件。
对于这两种选择,请参阅 方法 A 的步骤 3,在机器人上运行您的代码。
方案A:机器人拉取代码仓库、本地编辑(推荐)👍
这是首选开发流程:代码存放于机器人端,你可在本地电脑用常用IDE或AI编码工具进行编辑。
第一步:在机器人上克隆代码仓库
ssh pollen@reachy-mini.local
cd /home/pollen
git clone https://github.com/YOUR_USER/YOUR_APP.git
第二步:将机器人文件挂载到本地电脑
在本地电脑创建挂载目录并执行挂载:
mkdir -p ~/wireless_dev
sshfs pollen@reachy-mini.local:/home/pollen/YOUR_APP ~/wireless_dev \
-o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3
之后可在IDE中打开~/wireless_dev目录,像编辑本地文件一样直接修改机器人代码。
SSHFS(SSH Filesystem) 是一个基于 FUSE(用户空间文件系统) 与 SSH/SFTP 协议的工具,作用是:把远程机器的目录,直接挂载到本地,像操作本地文件一样读写远程文件,全程加密、无需改服务端配置。
- 安装 SSHFS
brew install macfuse sshfs
第三步:在机器人安装并运行代码
通过 SSH 连接到机器人并安装/运行你的应用程序:
ssh pollen@reachy-mini.local
cd /home/pollen/YOUR_APP
# 以可编辑模式安装(修改会立即生效):
/venvs/apps_venv/bin/pip install -e .
# 然后运行你的应用程序:
/venvs/apps_venv/bin/python -m YOUR_MODULE.main
# 或直接运行,无需安装:
/venvs/apps_venv/bin/python your_script.py
第四步:开发完成后取消挂载
fusermount -u ~/wireless_dev
方案B:覆盖已安装应用源码
若已通过Reachy Mini控制端安装应用,可通过本地文件挂载覆盖机器人端源码,直接修改程序。
第一步:查找机器人上已安装的应用路径
应用默认安装路径:
/venvs/apps_venv/lib/python3.12/site-packages/YOUR_APP_NAME/
第二步:将本地源码挂载覆盖安装目录
在机器人终端执行以下命令,把电脑本地源码挂载覆盖机器人的站点包:
ssh pollen@reachy-mini.local
# Mount your local src content onto site-packages
sshfs YOUR_USER@YOUR_PC_IP:/path/to/your_app/src/your_app \
/venvs/apps_venv/lib/python3.12/site-packages/YOUR_APP_NAME \
-o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3
重要说明:仅挂载src/your_app/目录内的文件,不要挂载整个代码仓库。站点包目录只存放程序包本身,不兼容仓库层级结构。
此后在电脑修改文件,重启应用即可生效。
方案C:挂载本地源码并直接运行
与方案B类似,但无需执行pip安装、也不依赖Reachy Mini控制端。直接挂载本地源码到机器人并运行程序。
第一步:将本地源码挂载到机器人
在机器人终端执行:
ssh pollen@reachy-mini.local
mkdir -p /home/pollen/my_app_mount
sshfs YOUR_USER@YOUR_PC_IP:/path/to/your_app /home/pollen/my_app_mount \
-o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3
第二步:直接运行应用
cd /home/pollen/my_app_mount
/venvs/apps_venv/bin/python main.py
该方式适合快速测试,但应用不会注册到Reachy Mini控制端中。
安装指定分支/版本
全局安装代码仓库的指定版本:
ssh pollen@reachy-mini.local
/venvs/apps_venv/bin/python -m pip install --force-reinstall \
"git+https://github.com/pollen-robotics/MY_AWESOME_APP.git@MY_AWESOME_BRANCH"
将分支名替换为实际分支名称(如develop)、版本标签或提交哈希值。
常见问题与注意事项
SSHFS挂载后pip安装缓慢
若从本地电脑反向挂载文件到机器人(与方案A相反),pip安装会极度卡顿,原因是pip需通过网络读取大量小文件。
解决办法:
- 采用方案A(代码存机器人、挂载到本地编辑)
- 跳过pip安装,直接用
python -m 模块名手动运行
站点包挂载路径错误
代码仓库标准结构:
your_app/
src/
your_app/
__init__.py
main.py
而机器人站点包结构为:
your_app/
__init__.py
main.py
若直接挂载整个仓库到站点包,Python将无法识别程序。仅需挂载内层程序包目录。
常用命令速查表
| 操作 | 命令 |
|---|---|
| SSH连接机器人 | ssh pollen@reachy-mini.local |
| 停止后台守护进程 | sudo systemctl stop reachy-mini-daemon |
| 启动后台守护进程 | sudo systemctl start reachy-mini-daemon |
| 查看守护进程日志 | journalctl -u reachy-mini-daemon -f |
| 查看机器人状态 | reachyminios_check |
| 机器人文件挂载到本地 | sshfs pollen@IP:/path ~/local_mount -o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3 |
| 取消挂载 | fusermount -u ~/local_mount |