MJlab 可视化预览
MJlab 是跑在 MuJoCo Warp(GPU 物理引擎)上的机器人仿真框架,沿用 Isaac Lab 的 manager-based API。本镜像把 MJlab 和一个 viser 浏览器串流前置打包在一起,支持用户可视化检查机器人运行情况,同时可以通过编程方式测试机器人/算法稳定性。
镜像里已经预置:
| 内容 | 说明 |
|---|---|
| mjlab venv | 约 6.5 GB,含 torch / mujoco / mujoco-warp / viser |
| warp JIT 缓存 | 把冷启动从分钟级压到十几秒 |
| 走路人形预训练资产 | demo_ckpt.pt(策略)+ motion 参考序列,开箱即可演示"会跳舞的人形机器人" |
部署环境要求
| 部署要求 | 最佳实践 |
|---|---|
| GPU | NVIDIA 显卡,支持 CUDA(warp 为 GPU 物理引擎) |
| CPU / 内存 | 按需 |
| 磁盘 | 按需(镜像含约 6.5 GB venv 与预训练资产) |
| 网络 | 1 条对外 TCP 端口(默认 8435,页面与 wss 同口)+ 1 个公网 / 浮动 IP |
| 客户端 | 支持 WebGL / three.js 的现代浏览器 |
使用需知
- 本实践需要开启 BLB 公网端口,虽然会使用自动生成 token 进行鉴权,但请谨慎使用。
使用说明
1. 启动服务(一条命令起站)
在开发机 / 服务器上执行:
1cd /root/workspace
2WEB_PORT=<你的 BLB 端口> EIP=<你的公网IP> bash mjlab-stream-deploy.sh --yes
参数说明:
- WEB_PORT:对外 HTTPS 端口
- EIP:公网 / 浮动 IP,会写进自签证书
- --yes:非交互模式,其余全部使用镜像内默认值
约 15 秒后打印带token的访问链接。默认起一个走路人形实例(Mjlab-Tracking-Flat-Unitree-G1,4 个环境,官方预训练策略),开箱就是会跳舞的人形机器人。
启动结果:

2. 打开访问
访问链接形如:
1https://<EIP>:<WEB_PORT>/?token=<自动生成的票据>
自签证书,浏览器首次会拦一下,点「继续访问」信任一次即可。打开后是实例列表,点进去就是实时画面。页面上的面板可以暂停 / 重置 / 调速 / 切视角。

⚠️ 票据是一层共享口令:谁拿到链接谁就能操作仿真(面板上能暂停 / 重置)。票据每次起站随机生成,不进镜像。生产接入需换成平台身份鉴权。
3. 实例变更
MJ_INSTANCES 是唯一的"跑什么"来源,格式 名字=任务:环境数,逗号分隔。名字会进 URL 路径:
1# 单实例、16 个环境(只涨码率,几乎不涨显存)
2MJ_INSTANCES='walk=Mjlab-Tracking-Flat-Unitree-G1:16' \ WEB_PORT=8435 EIP=<公网IP> bash mjlab-stream-deploy.sh --yes# 起多个实例,打开是列表,各点各的
3MJ_INSTANCES='walk=Mjlab-Tracking-Flat-Unitree-G1:4,go1=Mjlab-Velocity-Flat-Unitree-Go1:8' \ MJ_AGENT=zero \ WEB_PORT=8435 EIP=<公网IP> bash mjlab-stream-deploy.sh --yes
查看有哪些任务:
1bash mjlab-stream-deploy.sh --list-tasks # 共 12 个
⚠️ --agent zero 下 29 自由度的 G1 会倒、Go1 站得住。要"会走路的人形"就用默认的 trained + 走路 checkpoint。
4. 热加载(不换 URL、不换票据)
--yes 会重新生成票据,且对已经在跑的实例是"跳过"。要改运行中的站点用 --only,它不动票据、不动 URL:
1# 把 walk 从 4 环境热改成 16,URL / 票据不变
2MJ_INSTANCES='walk=Mjlab-Tracking-Flat-Unitree-G1:16' \ bash mjlab-stream-deploy.sh --only walk# 热加一个新实例(两步:先起实例,再让前置把它收进 URL)
3MJ_INSTANCES='walk=...:4,walk2=Mjlab-Tracking-Flat-Unitree-G1:4' \ bash mjlab-stream-deploy.sh --only walk2MJ_INSTANCES='walk=...:4,walk2=Mjlab-Tracking-Flat-Unitree-G1:4' \ bash mjlab-stream-deploy.sh --only web
5. 换策略 checkpoint
用 MJ_EXTRA 把参数透传给底层 play(-- 之后的参数):
1MJ_EXTRA='--checkpoint-file /你的/xxx.pt --motion-file /你的/yyy.npz' \ bash mjlab-stream-deploy.sh --only walk
也可以直接在面板的 Checkpoints 下拉里热换(同一 run 目录下的多个 model_*.pt,进程不重启)。
⚠️ 当前 MJ_EXTRA 是所有实例共用同一个 ckpt。要不同实例跑不同策略,需要给脚本加每实例配置。
运维命令参考
1bash mjlab-stream-deploy.sh --check # 六项就绪门禁(前置/端口/回环/安全绑定/握手/收帧)
2bash mjlab-stream-deploy.sh --status # 端口/进程/实例占用,不改状态
3bash mjlab-stream-deploy.sh --url # 只打印带票据的访问链接
4bash mjlab-stream-deploy.sh --gpu # GPU 预检(驱动 / torch CUDA / warp)
5bash mjlab-stream-deploy.sh --teardown # 停所有进程(前置 + 实例)
常见问题
| 现象 | 原因 / 处理 |
|---|---|
| 画面里有个绿色半透明人形 | 那是 motion 参考影(ghost),不是第二个机器人,默认只画在选中的那个环境上;它没有物理、不参与仿真 |
| 一堆人形里某个动作不一样 | tracking 各环境的参考相位起点不同(同一策略、同一支舞的不同小节),或它刚被重置恢复。面板 Select env + Track camera 可单独盯它确认 |
| 打开后画面永远"连接中" | 中间套了会改请求头的反代(nginx / 平台 /proxy/ |
| 换端口后门禁说"前置没在跑" | 门禁探的是默认口;看 conf/ports.env,或删掉它回默认 |
| --only <名字> 找不到实例 | 名字要和 MJ_INSTANCES 里的一致 |
| 对外口被别的进程占着 | 换一个口:WEB_PORT=8439 … |
| curl … | bash 直接报错退出 |
运行效果

评价此篇文章
