feat: add browser-based MuJoCo simulation platform
build / setup (compute matrix) (pull_request) Has been cancelled
build / ${{ matrix.label }} (pull_request) Has been cancelled
build / macos-15-arm64-studio (pull_request) Has been cancelled
build / ubuntu-24.04-clang-18-studio (pull_request) Has been cancelled
build / ubuntu-24.04-gcc-14-studio (pull_request) Has been cancelled
build / windows-2025-ninja-studio (pull_request) Has been cancelled
build / ubuntu-24.04-clang-18-wasm (pull_request) Has been cancelled
build / ubuntu-24.04-clang-18-mjx (pull_request) Has been cancelled
lint / pre-commit (pull_request) Has been cancelled

This commit is contained in:
2026-08-20 15:12:08 +08:00
parent b45b15d153
commit 1eb05132f1
45 changed files with 5584 additions and 18 deletions
@@ -0,0 +1,22 @@
import {groundConvertedMjcf} from './urdfToMjcf';
const encode=(value:string)=>new TextEncoder().encode(value);
const decode=(value:Uint8Array)=>new TextDecoder().decode(value);
describe('groundConvertedMjcf',()=>{
it('抬升所有根 body,并在 z=0 添加地面',()=>{
const result=decode(groundConvertedMjcf(encode('<mujoco><worldbody><body name="robot" pos="1 2 0.1"><geom type="box" size="1 1 1"/></body></worldbody></mujoco>'),-0.4,'fixed'));
const document=new DOMParser().parseFromString(result,'application/xml');
expect(document.querySelector('body[name="robot"]')?.getAttribute('pos')).toBe('1 2 0.5');
expect(document.querySelector('geom[name="__platform_ground__"]')).toMatchObject({tagName:'geom'});
expect(document.querySelector('geom[name="__platform_ground__"]')?.getAttribute('group')).toBe('5');
expect(document.querySelector('freejoint')).toBeNull();
});
it('为浮动基座的每个世界根 body 添加 freejoint',()=>{
const result=decode(groundConvertedMjcf(encode('<mujoco><worldbody><body name="robot"><geom type="sphere" size="1"/></body></worldbody></mujoco>'),-1,'floating'));
const document=new DOMParser().parseFromString(result,'application/xml');
expect(document.querySelector('body[name="robot"] > freejoint')?.getAttribute('name')).toBe('__platform_base_freejoint__');
expect(document.querySelector('body[name="robot"]')?.getAttribute('pos')).toBe('0 0 1');
});
});