加载中…
加载中…
Physics-informed surrogate (random-Fourier-feature residual tanh MLP, 4 blocks x 96) of the Wong-Reece rigid-wheel model for the NASA VIPER wheel (R 0.25 m, b 0.20 m, 24 grousers, parametric model from public figures) on GRC-1 lunar simulant, with slip-sinkage (sinkage exponent n = n0 + n1 s, Ding et al. 2010/2011; GRC-1 n1 = 0.8). Inputs slip and sinkage, outputs drawbar pull, normal load and driving torque. Trained with soft constraints dFz/dz >= 0, dFx/ds >= 0 (slip <= 0.3), Mohr-Coulomb traction limit and My >= R Fx. The exact physics configuration it was trained on is recorded in data_lineage.physics and config.json (checked by ZooContactSurrogate.check_physics).
rover_contact_grc1_viper v1.1.0 (revision v1.1.0.post1) · part of the PINNeAPPle zoo · training data PINNeAPPle-Labs/rover-contact-grc1-viper
Try it without installing anything: PINNeAPPle zoo demo (pick rover_contact_grc1_viper: its predictions along each input with their band and where its physics checks warn or fail, and your own inputs evaluated in the browser).
Task: Wheel-soil contact forces of a rigid grousered wheel on lunar regolith simulant (terramechanics)
| Name | Unit | Description |
|---|---|---|
slip |
- | longitudinal slip ratio (negative = skid) |
sinkage_m |
m | static + slip sinkage of the wheel |
| Name | Unit | Description |
|---|---|---|
Fx_N |
N | drawbar pull |
Fz_N |
N | normal load carried by the soil |
My_Nm |
N m | driving torque |
slip: [-0.4, 0.9]sinkage_m: [0.002, 0.06]soil: GRC-1 (pinneapple terramechanics soil database)wheel: VIPER wheel, R 0.25 m, b 0.20 m, 24 grousersslip_angle_deg: 0.0physics: Wong-Reece with slip-sinkage n = n0 + n1 s on driving slip (GRC-1: n0 0.8, n1 0.8); steady state, so the slip that sets the exponent equals the slipcontact_net — {"hidden": 96, "depth": 4, "n_fourier": 16, "scale": 2.0, "seed": 0}Reference: 2000 held-out Latin-hypercube states (seed 1000, disjoint from training) of the Wong-Reece model evaluated by adaptive quadrature (analytic reference). The Wong-Reece implementation is compared with published single-wheel tests (Ding et al. 2011; Wang & Han 2016; dataset single_wheel_tests).
| Metric | Value |
|---|---|
| test/Fx_rmse_N | 0.22012320923636258 |
| test/Fx_max_abs_N | 1.6962837221363714 |
| test/Fx_r2 | 0.9999991370180031 |
| test/Fz_rmse_N | 0.46965493069413194 |
| test/Fz_max_abs_N | 5.374369781392943 |
| test/Fz_r2 | 0.9999981720332396 |
| test/My_rmse_Nm | 0.07066064857911242 |
| test/My_max_abs_Nm | 0.6174497678684645 |
| test/My_r2 | 0.9999985029384229 |
| test/n | 2000.0 |
Decision: APPROVED · score 1.00 · coverage 100%
License: apache-2.0
PINNeAPPle contributors (2026). Wheel-soil contact PINN surrogate (Wong-Reece, GRC-1, VIPER wheel). PINNeAPPle model zoo, https://github.com/PINNeAPPle-Labs/PINNeAPPle
pass: every applicable check passed (12/12 applicable checks pass; level standard; generated by pp.validate with PINNeAPPle 0.7.0, schema validation-report/v1).
| Factor | Credibility | Meaning |
|---|---|---|
| code_verification | 0 | no evidence |
| solution_verification | 3 | passes quantitative checks |
| validation | 4 | passes against an independent reference or a guaranteed bound |
| input_pedigree | 3 | passes quantitative checks |
| uncertainty | 0 | no evidence |
| robustness | 0 | no evidence |
| applicability | 0 | no evidence |
| Check | Status | Result |
|---|---|---|
method.status |
not-applicable | no catalog method id given (validate(..., method='S2')) |
reference.card_metrics |
pass | card metrics reproduced on the stored reference (max relative difference) |
reference.acceptance.test/Fx_rmse_N |
pass | held-out test/Fx_rmse_N within the zoo acceptance limit |
reference.acceptance.test/Fz_rmse_N |
pass | held-out test/Fz_rmse_N within the zoo acceptance limit |
reference.acceptance.test/My_rmse_Nm |
pass | held-out test/My_rmse_Nm within the zoo acceptance limit |
physics.model_checks.1 |
pass | dFz/dz >= 0 (share of grid steps violating beyond 0.2 % of range) |
physics.model_checks.2 |
pass | dFx/ds for slip <= 0.3 has the sign of the Wong-Reece reference (share disagreeing) |
physics.model_checks.3 |
pass | Mohr-Coulomb limit Fx <= c A + Fz tan(phi) (share violating) |
physics.model_checks.4 |
pass | torque coupling My >= R Fx (share violating) |
applicability.range |
not-applicable | no query inputs given |
uncertainty.spread |
not-applicable | the model returns no spread |
metamorphic |
not-applicable | no relations declared for rover_contact_grc1_viper |
data.finite |
pass | stored audit card of rover_contact_grc1_viper: every value finite |
data.physics.physics |
not-applicable | stored audit card of rover_contact_grc1_viper: no PDE stated for this dataset |
data.diversity.duplicates |
pass | stored audit card of rover_contact_grc1_viper: train: 0 exact, 0 near copies of 3600; test: 0 exact, 0 near copies of 2000 |
data.diversity.effective |
pass | stored audit card of rover_contact_grc1_viper: effective sample count 2.53 of 3600 (no generator stated: only a collapse to one pattern is flagged) |
data.leakage |
pass | stored audit card of rover_contact_grc1_viper: 0 of 2000 test samples are (near) copies of train samples (closest: 0.0193 x the median train spacing) |
Model SHA-256 210464578510a4f94eae0e5071efe1141367015e645274bd0ff9c28d072825b4.
pip install "pinneapple @ git+https://github.com/PINNeAPPle-Labs/PINNeAPPle"
import pinneapple as pp
model = pp.zoo.load("rover_contact_grc1_viper") # weights checked against their SHA-256
inputs = {"slip": -0.00237311, "sinkage_m": 0.0121651}
out = model.predict(inputs) # warns for inputs outside the validity range
print({k: round(float(v[0]), 6) for k, v in out.items()})
# {'Fx_N': -10.081497, 'Fz_N': 165.083856, 'My_Nm': 2.054259}
print(pp.zoo.query_checks(model, inputs)[0]["verdict"]["status"]) # per-query trust checks
# pass
print(pp.zoo.validate(model).decisao) # card metrics reproduced + physics checks
# APPROVED
The inputs are the first held-out test case of the training dataset; its reference value is Fx_N = -10.4698, Fz_N = 167.455, My_Nm = 2.18489. pp.zoo.evaluate("rover_contact_grc1_viper") recomputes every metric of the card on the stored reference.
No Hugging Face inference provider can run this model, so the Hub widget is off (inference: false). It is a small PyTorch network, but its prediction is more than a forward pass: the inputs are encoded and normalised, the outputs denormalised (and, for ensembles, averaged with their spread), and every query is checked against the validity range and the model's physics checks. The pinneapple library does all of that (below); the ONNX graph carries the pre- and post-processing but not the checks; the zoo demo Space shows the model along a sweep of each input and runs it, with its checks, in your browser.
model.onnx (opset 17) maps x, shape (n, 2) float32 with the columns slip, sinkage_m, to the outputs y: ['Fx_N', 'Fz_N', 'My_Nm']. Pre- and post-processing are in the graph (largest difference from PyTorch on the reference inputs: 5.6e-07); the validity-range and physics checks are not, so check the range yourself.
import numpy as np, onnxruntime as ort
from huggingface_hub import hf_hub_download
path = hf_hub_download("PINNeAPPle-Labs/rover-contact-grc1-viper", "model.onnx", revision="v1.1.0.post1")
session = ort.InferenceSession(path)
x = np.array([[-0.00237311, 0.0121651]], np.float32)
print(dict(zip([o.name for o in session.get_outputs()], session.run(None, {"x": x}))))
| File | Content | SHA-256 |
|---|---|---|
weights.pt |
PyTorch state_dict (torch.load(weights_only=True)), what pp.zoo.load reads |
73f9275002e20bd891981e07a070e7bc21a68c223678167f1d4aec4c2c5dd8d9 |
config.json |
architecture and normalisation | ea62c1e50300efd4340abd6857db4d7538600b5457ab06ee0b512d0d216e34b3 |
model_card.json |
the model card: inputs, outputs, validity range, metrics, trust report | bd66490d4c88f6477f6322c8b9d7d49591b14f51e2e5e1d4679ac71d0b6a8219 |
model.safetensors |
the same tensors as weights.pt in safetensors format (pinneapple_hub.zoo.export.load_safetensors loads them) |
derived |
model.onnx |
ONNX graph, physical inputs to physical outputs (below) | derived |
example.json |
the "How to use" case: inputs, outputs, reference, verdicts | derived |
The SHA-256 are those of the package's manifest: pp.zoo.load refuses any other file.
If you use this model, please cite PINNeAPPle (software, Zenodo DOI 10.5281/zenodo.23343062; see CITATION.cff):
@software{pinneapple,
author = {Barros, Yan and Schiassi, Enrico},
title = {PINNeAPPle},
doi = {10.5281/zenodo.23343062},
url = {https://github.com/PINNeAPPle-Labs/PINNeAPPle}
}