feat(web-platform): release V0.4 balance control

This commit is contained in:
2026-08-24 14:45:52 +08:00
parent dc494f7a2d
commit c12e52f843
19 changed files with 625 additions and 25 deletions
+10 -1
View File
@@ -12,6 +12,7 @@
- Three.js primitive、mesh、材质/贴图显示与对象选择
- 播放、暂停、单步、重置、0.25×–4× 速度
- actuator 滑杆、hinge/slide 关节拖动、动态 body 外力拖拽
- 导入单文件 `.py` 控制器,通过本地 Pyodide 在 `mj_step` 前按仿真时间同步执行
- FPS、物理耗时和主线程步进预算提示
## 开发
@@ -53,6 +54,13 @@ python3 -m http.server 8080 --directory wasm/web-platform-dist
- XML 的 `include`、mesh 和贴图路径必须相对于入口/编译器配置可解析。
- 路径穿越、绝对路径、加密 ZIP、重复路径会被拒绝。
- 默认限制:2000 个文件、单文件 128 MiB、总解压大小 512 MiB、ZIP 文件 128 MiB。
- 文件夹或 ZIP 中的 `.py` 会显示在“控制 → Python 控制器”;也可以在加载模型后单独导入不超过 1 MiB 的 `.py`。
## Python 控制器
Python 控制器是可信的单文件脚本,必须同步定义 `step(ctx, state)`;可选定义 `NAME`、`CONTROL_HZ`(限制为 1–500 Hz)、`init(api)`、`reset(state)` 和 `dispose(state)`。`init` 可用 `api.joint(name)`、`api.actuator(name)`、`api.sensor(name)`、`api.body(name)` 预解析 ID;`step` 可用 `ctx.qpos(id)`、`ctx.qvel(id)`、`ctx.sensor(id)`、`ctx.body_quat(id)`、`ctx.body_position(id)` 读取状态,并用 `ctx.set_control(id, value)` 写入经过有限值检查和 actuator 限幅的控制量。异常会自动停止控制器、暂停仿真并清零 `ctrl`。
当前 Python 与 MuJoCo 都运行在主线程,以保证闭环调用严格位于 `mj_step` 前。仅运行可信脚本;死循环仍可能阻塞页面。Pyodide 及 Python 标准库由 npm 包随生产构建离线发布,不从 CDN 下载;暂不支持第三方 Python 包、`pip` 或多文件 import。
## 示例
@@ -60,6 +68,7 @@ python3 -m http.server 8080 --directory wasm/web-platform-dist
- `mjcf_include/`:MJCF include、OBJ/STL mesh 和 PNG texture;
- `urdf_mesh/`:引用 OBJ 的 URDF;
- `python_controller/`:倒立摆模型及 `balance.py` PD 控制器;
- `invalid.xml`:无效模型;
- `missing-resource.xml`:缺失资源错误示例。
@@ -69,7 +78,7 @@ python3 -m http.server 8080 --directory wasm/web-platform-dist
- 仅面向桌面版 Chrome、Edge、Firefox;未适配手机和平板。
- 物理运行在主线程、单线程 WASM。超出每帧预算时限制追帧并提示。
- 不支持 Xacro、XML 在线编辑、热重载、导出、账号或云端保存。
- 不支持 Xacro、账号或云端保存;Python 控制器暂不支持第三方包和不可信代码隔离。
- 关节拖动只支持 hinge/slide;ball/free joint 只读。
- MuJoCo WASM 本身不支持 DAE mesh。平台会移除 DAE visual,并以 collision 几何显示;DAE collision 会替换为半径 0.05 m 的占位球体并在界面警告。高精度仿真应先将 DAE 转为 OBJ/STL 或改为 URDF primitive。
- 导入工程只存在当前页面内存,刷新页面后需重新导入。