Robosuite Joycon Web 控制系统
基于浏览器的 Nintendo Switch Joy-Con 远程控制方案,利用 WebSocket 与 Robosuite 仿真环境实时联动,支持单臂 / 双臂、多机器人以及局域网远程操作。
🌟 核心亮点
- ✅ 浏览器即遥控器:Gamepad API 读取 Joy-Con 输入,前端 60 Hz 采样
- ✅ 实时双向通信:WebSocket 低延迟推送到 Python 后端
- ✅ 完整 Robosuite 适配:复用官方
Device接口,支持 OSC / Whole Body 控制器 - ✅ 单 / 双 Joy-Con:默认单臂,也可一左一右控制双臂任务
- ✅ 图形界面监控:实时显示按键、摇杆状态、连接信息
- ✅ 跨平台:支持 Linux、Windows(含 WSL2)、macOS,只需蓝牙即可连接 Joy-Con
🧠 系统架构
┌─────────────┐ WebSocket ┌──────────────┐
│ 浏览器 │ ←────────────────────────→ │ Python 服务器 │
│ (前端界面) │ 60Hz 手柄数据 │ (Robosuite) │
└─────────────┘ └──────────────┘
↑ ↓
│ │
Gamepad API Robosuite 仿真
(Joy-Con) (机器人控制)
⚡ 5 分钟快速体验
已具备 Python ≥3.8、Bun/Node.js、蓝牙 Joy-Con。(推荐)
-
获取代码 & 安装依赖
bashcd /home/kewei/17robo/robosuite-joycon-web bun install pip install -r requirements.txt # 安装 robosuite(首次运行需要) cd /home/kewei/17robo/robosuite-joycon pip install -e . cd /home/kewei/17robo/robosuite-joycon-web -
运行无渲染自检(适合 WSL/服务器)
bash
python test_server_no_render.py出现
✅ 所有测试通过!即表示后端逻辑正常。 -
蓝牙连接 Joy-Con
- 长按 Joy-Con 侧边同步键,指示灯快闪
- 在系统蓝牙设置中选择
Joy-Con (R)/Joy-Con (L)连接
-
启动后端 & 前端
bash# 终端 1: 单手柄默认环境(Lift + Panda) ./start_single.sh # 终端 2: React 前端 bun run dev浏览器访问提示地址(默认 http://localhost:5173 )。
-
开始遥控
- 在网页里点击“连接服务器”
- 按下任意 Joy-Con 按钮激活 Gamepad
- 即可实时操控机器人
无显示器 / WSL 环境:若不方便开启渲染,可将
server.py中has_renderer改为False运行。
🚀 启动方式详情
1. 后端服务器
| 模式 | 命令 | 说明 |
|---|---|---|
| 单手柄默认 | ./start_single.sh |
Lift + Panda,端口 8765 |
| 单手柄自定义 | ./start_single.sh [环境] [机器人] [端口] |
例:./start_single.sh PickPlaceCan Sawyer 9000 |
| 双手柄默认 | ./start_bimanual.sh |
TwoArmLift + Panda×2,parallel 配置 |
| 双手柄自定义 | ./start_bimanual.sh [环境] [机器人1] [机器人2] [配置] [端口] |
配置可选 parallel/opposed |
| 核心功能测试 | python test_server_no_render.py |
无渲染环境必跑,用于 CI/诊断 |
2. 前端界面
bashcd /home/kewei/17robo/robosuite-joycon-web
bun run dev
浏览器访问终端提示地址(默认 http://localhost:5173),界面实时展示连接状态、按钮/摇杆读数。
🎮 控制映射(Joy-Con 默认布局)
| 输入 | 功能 |
|---|---|
| 左摇杆 X / Y | 末端 X / Y 平移 |
| R(右手柄) / L(左手柄) | 末端上升(Z+) |
| 摇杆按压 | 末端下降(Z−) |
| 右摇杆 X | Yaw 旋转 |
| 右摇杆 Y | Pitch 旋转 |
| SL / SR | Roll 微调(右手柄顺/逆,左手柄反向) |
| ZR / ZL | 抓取器开 / 合切换(按一下即切换状态) |
| + (Plus) | 触发环境重置 |
| HOME | 姿态回到初始偏置 |
| A / Y | 预留事件标志(与原 JoyConController 接口一致) |
所有输入在 JoyconWebController 中做防抖与归一化处理,后端输出仍为 6+1 维动作向量,完全兼容 Robosuite 官方控制器。
ℹ️ 默认情况下浏览器仅能通过 Gamepad API 读取按键/摇杆,因此需使用右摇杆与 SL/SR 进行姿态调节。启用下方的 WebHID 实验特性后,便可以像原生控制器那样通过旋转 Joy-Con 直接驱动末端姿态。
WebHID 版 IMU 支持(实验特性)
- 在 Chrome / Edge(需 HTTPS 或
localhost)中点击“连接 Joy-Con IMU”按钮,可通过 WebHID 访问 Joy-Con 传感器。 - 连接成功后,网页会实时展示 Roll / Pitch / Yaw,并将其回传至服务器,实现“旋转 Joy-Con 控制姿态”的体验。
- 目前每个浏览器会话仅支持连接 1 个 Joy-Con;若需要切换,请刷新页面并重新连接。
- 不支持 WebHID 的浏览器将维持原有“摇杆 + SL/SR”姿态控制模式。
🧪 测试清单
推荐在上线或大改动后完整跑一遍,勾选表示通过。
基础环境
- [ ] Python 依赖安装成功
- [ ] Bun 前端依赖安装成功
- [ ] Joy-Con 蓝牙连接稳定
核心功能
- [ ]
python test_server_no_render.py通过 - [ ] 单手柄模式可启动并执行动作
- [ ] 双手柄模式可分别控制左右臂
- [ ] 抓取器切换、生效及时
- [ ] 20 Hz 控制循环稳定
界面与通信
- [ ] 浏览器能识别 Joy-Con(按钮高亮)
- [ ] WebSocket 状态显示“已连接”
- [ ] 断开/重连后可恢复控制
性能
- [ ] 控制延迟 < 100 ms
- [ ] 长时间运行 (>30 min) 无明显漂移
更多细化步骤见 test_server_no_render.py 输出与历史测试记录。
🛠️ 常见问题 & 排查
| 问题 | 原因 | 解决方案 |
|---|---|---|
Action vector ... got 12 |
动作维度错误 | 已修复,确保使用当前版本 server.py |
| 服务器在 WSL 卡住 | 无 GUI 渲染阻塞 | 关闭渲染:has_renderer=False,或配置 X11 / VNC |
| 前端未识别 Joy-Con | Gamepad 未激活 | 在浏览器按任意按钮;刷新页面;检查蓝牙连接 |
| WebSocket 连接失败 | 端口被占用或服务未起 | 确认后端 log;lsof -i :8765;pkill -f "python server.py" |
| 控制延迟大 | 网络或 CPU 繁忙 | 建议本机运行;关闭无关程序;仅在局域网内远程 |
新手建议:先运行
python test_server_no_render.py,确认核心控制无误后再接入渲染与前端。
📊 项目状态一览
- 发布日期:2025-10-05
- 版本:v1.0.0
- 完成度:✅ 全功能可用
- 涵盖功能:Gamepad API、WebSocket 服务、单/双 Joy-Con、前端监控、脚本化启动、自动化测试
- 性能指标:
- 控制频率 ~20 Hz
- 手柄采样 60 Hz
- WebSocket 延迟 <5 ms(本地)
- 无渲染 CPU 占用 <30%
🔍 技术实现 & 修复要点
- 完整复用
robosuite.devices.Device逻辑:input2action、get_arm_action、状态机与坐标系转换全部保持一致 - 输出动作维度固定为 6(末端位姿)+1(抓取器),兼容 OSC、Whole Body IK 控制器
- 采用 button edge 检测消除按键抖动,ZR/ZL 实现抓取器状态切换
test_server_no_render.py用于验证动作向量、奖励返回与持续控制- Start 脚本
start_single.sh/start_bimanual.sh封装常见参数,便于部署
📂 目录与脚本速览
| 路径 | 说明 |
|---|---|
server.py |
WebSocket 服务器 & JoyconWebController 核心实现 |
src/App.tsx |
React 前端 UI,实时手柄可视化 |
start_single.sh / start_bimanual.sh |
启动脚本(单臂 / 双臂) |
test_server_no_render.py |
无渲染自动化测试脚本 |
package.json / bun.lock |
前端依赖定义 |
requirements.txt |
Python 依赖列表 |
🧭 下一步可以做什么?
- 🚗 接入移动底座或自定义机器人,在
server.py里扩展动作映射 - 🌐 部署在局域网服务器,结合 HTTPS / WebRTC 远程控制
- 🧪 接入 CI:在管线中运行
python test_server_no_render.py - 🧩 若需额外传感器(IMU/摄像头),可继续扩展 WebSocket 消息格式
如需新增或修改文档,请直接更新本 README,确保所有信息保持同步。祝操控顺利!🎉