0 2 1 0 1 3 0 3 2 1 2 3
确定从当前会话中移除“{state.projectName}”吗?
该操作不会删除本地文件。
确定从当前会话中移除“{state.projectName}”吗?
该操作不会删除本地文件。
确定从当前会话中移除“{state.projectName}”吗?
该操作不会删除本地文件。
确定从当前会话中移除“{state.projectName}”吗?
该操作不会删除本地文件。
MJCF 模式保留 visual mesh、添加物理地面,并将模型最低点对齐到 z=0。
模型没有 actuator
}模型没有驱动器
}选择“外力施加”,在动态物体上按住拖动,松开即清零。
该驱动器包含 {actuator.controlCount} 个控制分量,请在 MJCF 源码或专用控制器中设置。
} + {actuator.controlCount===1&&!actuator.ctrlLimited&&{isPosition?'position 伺服使用 kp 跟踪目标位置,kv 提供速度阻尼。':'motor 保持力/力矩控制且控制输入不限幅。MJCF 的 motor 没有 kp/kv 属性;这里的 kp、kv 会分别保存为对应 joint 的 stiffness、damping。'} 参数修改会立即作用于当前模型,并可随 MJCF 导出。
+该驱动器不是可直接编辑的 motor/position 类型,控制值按模型原始单位显示;请在 MJCF 源码中修改专用参数。
} +确定从当前会话中移除“{state.projectName}”吗?
该操作不会删除本地文件。
{status.error}
} +加载可信的单文件 Python 控制器。脚本在每次 mj_step 前按仿真时间同步执行,默认 100 Hz。
} +MJCF 模式保留 visual mesh、添加物理地面,并将模型最低点对齐到 z=0。
模型没有驱动器
}模型没有驱动器
}选择“外力施加”,在动态物体上按住拖动,松开即清零。
导入 {path} 后,是否自动补充以下仿真组件?稍后重新选择该 URDF 时仍会再次询问。
位置和朝向均相对于所选 Body;常见 ROS 头部摄像头使用 +X 朝前、+Z 朝上。
自动组件只写入浏览器内生成的 MJCF,不会修改本地 URDF 文件;使用“原生 URDF”加载模式时不会注入这些组件。
diff --git a/wasm/web_platform/src/controller/PythonControllerRuntime.ts b/wasm/web_platform/src/controller/PythonControllerRuntime.ts new file mode 100644 index 00000000..c5deac43 --- /dev/null +++ b/wasm/web_platform/src/controller/PythonControllerRuntime.ts @@ -0,0 +1,115 @@ +import type {PyodideInterface} from 'pyodide'; +import type {PyCallable,PyDict} from 'pyodide/ffi'; +import type {ControllerBindings,ControllerStatus} from './types'; + +const DEFAULT_CONTROL_HZ=100; +const MIN_CONTROL_HZ=1; +const MAX_CONTROL_HZ=500; + +let pyodidePromise:Promise确定从当前会话中移除“{state.projectName}”吗?
该操作不会删除本地文件。
{status.error}
} + {status.acceptsCommands&&基本移动指令
加载可信的单文件 Python 控制器。脚本在每次 mj_step 前按仿真时间同步执行,默认 100 Hz。
} ; diff --git a/wasm/web_platform/src/app/components/SidebarPanel.tsx b/wasm/web_platform/src/app/components/SidebarPanel.tsx index 7d4fef37..1cc74aa0 100644 --- a/wasm/web_platform/src/app/components/SidebarPanel.tsx +++ b/wasm/web_platform/src/app/components/SidebarPanel.tsx @@ -6,7 +6,7 @@ import {countModelStructureSearchResults,ModelStructureTree} from '../../project import type {ActuatorInfo,ActuatorParameters,SimulationSnapshot} from '../../simulation/SimulationSession'; import type {UrdfBaseMode,UrdfLoadMode} from '../../simulation/PhysicsAdapter'; import type {ViewerSelection} from '../../viewer/MuJoCoViewer'; -import type {ControllerStatus} from '../../controller/types'; +import type {ControllerCommand,ControllerStatus} from '../../controller/types'; import {Badge,Button,CollapsibleSection,CopyButton,PropertyRow,ResizablePanel,Select,Tabs} from '../../components/ui'; import {TreeSearchField} from './TreeSearchField'; import {ProjectBreadcrumb} from './ProjectBreadcrumb'; @@ -23,13 +23,13 @@ interface ModelControlsProps{ onUrdfMode:(value:UrdfLoadMode)=>void;onBaseMode:(value:UrdfBaseMode)=>void;onShowCollision:(value:boolean)=>void; onResetJoints:()=>void;onToggleJointLimits:()=>void;onToggleAdvanced:()=>void;onToggleAngleUnit:()=>void; onActuator:(id:number,value:number)=>void;onActuatorParameters:(id:number,parameters:ActuatorParameters)=>void;onJoint:(id:number,value:number)=>void;onForceScale:(value:number)=>void; - onSelectControllerPath:(path:string)=>void;onLoadControllerPath:(path:string)=>void;onImportController:(file:File)=>void;onToggleController:(enabled:boolean)=>void;onRemoveController:()=>void; + onSelectControllerPath:(path:string)=>void;onLoadControllerPath:(path:string)=>void;onImportController:(file:File)=>void;onToggleController:(enabled:boolean)=>void;onControllerCommand:(command:ControllerCommand)=>void;onRemoveController:()=>void; } export function ModelControlsSidebar(props:ModelControlsProps){const [tab,setTab]=useState<'properties'|'controls'>('properties'),s=props.snapshot;if(!s)returnMJCF 模式保留 visual mesh、添加物理地面,并将模型最低点对齐到 z=0。
模型没有驱动器
}模型没有驱动器
}选择“外力施加”,在动态物体上按住拖动,松开即清零。