Physics Prediction¶
Physics prediction component — Genesis-backed simulation with pure-Python fallback.
Cluster: Physical AI | Type: component | MCP Tools: None
Overview¶
Backend fidelity
Without genesis-world, Genesis-specific operations fail closed and the component uses pure-Python fallback dynamics. The fallback is useful for estimates and tests, not safety-critical physics prediction.
Physics simulation and prediction engine for articulated robots and rigid-body scenes. Implements forward dynamics, contact force estimation, material property lookup, trajectory generation, and stability scoring using a pure-Python backend by default, with optional Genesis solver backends (rigid, MPM, SPH, FEM) for high-fidelity simulation. Supports URDF robot loading and multi-solver scene generation when Genesis is available.
When to use:
- Estimating joint trajectories and contact forces before simulated or human-reviewed physical planning
- Assessing breakage probability or stack stability before a manipulation step
- Generating interpolated waypoint trajectories for robot motion planning
- Discovering backend availability before execution via
source_capabilitiesandsource_health
Fallback outputs use the canonical envelope: completion_state: qualified-draft, degraded: true, a warning_card, and top-level evidence. Physics prediction and simulation results (trajectories, stability, contact force, breakage, risk, generated scenes/trajectories, articulated/stepped state) are always completion_state: qualified-draft: a model output is a prediction, never self-certified as externally-validated ground truth (S-P0-1). Only non-prediction discovery/metadata/lifecycle ops (get_info, reset, source_capabilities, source_health, material get/set) use completion_state: verified. Failures/refusals are surfaced as blocked-escalated by response wrappers such as MCP. predict_outcome discloses its breakage model as linear_force_ratio with uncalibrated_heuristic confidence metadata.
Example:
from mvp.physics_prediction import PhysicsPredictionBlock, PhysicsPredictionInput
block = PhysicsPredictionBlock(name="physics")
result = block.infer(PhysicsPredictionInput(
op="predict_trajectory",
initial_state=[0.0, 0.0, 1.0, 0.0, 0.0, 0.0],
forces=[[0.0, 0.0, -9.81]] * 20,
steps=20,
dt=0.05,
))
# result.value.predicted_trajectory → list of state vectors
Works well with: motor_control, mesh3d, sensory_fusion
Public API¶
PhysicsPredictionBlock(AIBlock[PhysicsPredictionInput, PhysicsPredictionOutput, dict])¶
| Field | Type | Default |
|---|---|---|
name | str | 'physics_prediction' |
state | dict | field(default_factory=dict) |
resource_bounds | ResourceBounds | field(default_factory=ResourceBounds) |
usage | ResourceUsage | field(default_factory=ResourceUsage) |
Methods:
infer(data: PhysicsPredictionInput) -> Result[PhysicsPredictionOutput]¶
PhysicsPredictionInput¶
| Field | Type | Default |
|---|---|---|
op | PHYSICS_OPS | 'get_info' |
links | list[dict] | field(default_factory=list) |
joint_angles | list[float] | field(default_factory=list) |
joint_velocities | list[float] | field(default_factory=list) |
joint_torques | list[float] | field(default_factory=list) |
dt | float | 0.01 |
steps | int | 10 |
object_class | str | '' |
action_type | str | '' |
force_vector | list[float] | field(default_factory=list) |
objects | list[dict] | field(default_factory=list) |
penetration_depth | float | 0.0 |
relative_velocity | float | 0.0 |
material | str | '' |
material_name | str | '' |
material_properties | dict | field(default_factory=dict) |
breakage_force_n | float | 50.0 |
initial_state | list[float] | field(default_factory=list) |
forces | list[list[float]] | field(default_factory=list) |
gravity | list[float] | field(default_factory=list) |
safety_critical | bool | False |
metadata | dict | field(default_factory=dict) |
robot_urdf_path | str | '' |
robot_description | dict | field(default_factory=dict) |
robot_name | str | 'robot' |
scene_config | dict | field(default_factory=dict) |
scene_prompt | str | '' |
solver | str | '' |
start_joints | list[float] | field(default_factory=list) |
end_joints | list[float] | field(default_factory=list) |
n_waypoints | int | 10 |
interpolation | str | 'linear' |
densify | bool | False |
steps_per_waypoint | int | 10 |
PhysicsPredictionOutput¶
| Field | Type | Default |
|---|---|---|
op | str | '' |
completion_state | str | 'qualified-draft' |
degraded | bool | False |
warning_card | dict \| None | None |
evidence | dict | field(default_factory=dict) |
request_id | str | '' |
task_id | str | '' |
run_id | str | '' |
positions | list | field(default_factory=list) |
velocities | list | field(default_factory=list) |
accelerations | list | field(default_factory=list) |
contact_force | float | 0.0 |
breakage_probability | float | 0.0 |
stability_score | float | 0.0 |
predicted_trajectory | list | field(default_factory=list) |
risk_assessment | dict | field(default_factory=dict) |
material_properties | dict | field(default_factory=dict) |
joint_forces | list | field(default_factory=list) |
metadata | dict | field(default_factory=dict) |
scene_config | dict | field(default_factory=dict) |
robot_state | dict | field(default_factory=dict) |
solvers_active | list[str] | field(default_factory=list) |
genesis_available | bool | False |
waypoints | list[list[float]] | field(default_factory=list) |
trajectory_time_series | list[list[float]] | field(default_factory=list) |