Aim
Check contact geometry and force response against a simple sliding model.
Time: about 120 minutes. Start with the linked lectures and the course notation contract. The reference program is complete and runnable; your work is to explain it, modify it, and test the results.
Run from this repository
uv sync --locked
uv run --locked python practices/p06-contact/run.py
The program writes configuration, MuJoCo version, and metrics to outputs/p06-contact/metrics.json. Experiments with a time history also write trajectory.csv. These are generated results and are not source material.
Use a separate configuration and output directory for each variation:
uv run --locked python practices/p06-contact/run.py --config practices/p06-contact/config.yml --output outputs/p06-contact/baseline
Keep the original configuration as the baseline. Record all changes in your report; avoid changing several physical and numerical parameters at once.
Tasks
- Inspect the translation-only block and explain why rotation is locked for this benchmark.
- Allow the block to settle, then initialize a horizontal velocity.
- Compare sliding distance with the ideal Coulomb estimate and resting force with mg.
- Sweep friction, solref, and timestep separately. Report penetration and contact counts.
Expected checks
The final support force should be close to 9.81 N for the 1 kg model. The ideal stopping-distance estimate is a reference, not an exact prediction for every regularized solver configuration.
Submission
Submit your YAML configuration, a short explanation of the equations and assumptions, labeled plots or numerical comparisons with units, and a paragraph explaining a failure or limitation. Include the exact run command. The weekly practice rubric awards 40% for correctness and checks, 30% for the controlled comparison, 20% for interpretation, and 10% for reproducibility.
Extension
Restore rotation and compare a box with a sphere. Explain why rolling invalidates the sliding-only analytical benchmark.