Skip to content

Plants: the ground is no building contact, and the risk governor under material - #154

Merged
transfix merged 2 commits into
mainfrom
fix/plant-ground-and-governor
Nov 3, 2026
Merged

transfix merged 2 commits into
mainfrom
fix/plant-ground-and-governor

Conversation

@transfix

@transfix transfix commented Nov 3, 2026

Copy link
Copy Markdown
Contributor

What

These are the two libcvc questions left open in #145, answered on the GRL-SNAM side.

building_contacts counted the ground. JoltPlant now names its ground to pycvc's nav_plant (ground_bodies, transfix/libcvc#1011), so a chassis scraping the ground is no longer a building contact in nav_stats. On a pycvc without the argument, it falls back to the old call.

On the dynamic plant, material changed nothing in the scenario story. The material's forces slow a vehicle only by what they take from its goal pull's surplus over its top speed.

  • A physics plant's top speed is under the policy's cruise, so that surplus is large. The dynamic RoboRacer meets the water at its top speed of 10 m/s. The water's push is at most half the surplus, so its command, and its run, are the same as without material.
  • Head on, the push has no sideways part, so it does not steer either.

What slows a vehicle on risky ground is libcvc's risk governor, which a sim_world can now switch on (sim_world::set_risk_governor, transfix/libcvc#1012):

  • NativeSimWorld.set_risk_governor and PlantNavigator(..., risk_governor=True | {...}) turn it on; nav_native.HAS_RISK_GOVERNOR probes for it.
  • material-demo --plant turns it on for the dynamic and Jolt plants where the running pycvc has it. --no-governor shows the forces alone; --governor puts it on the kinematic bicycle too.

What it shows

material-demo --plant, RoboRacers, material on. Without material, every run crosses the water.

swarm scenario
Jolt, governor no hazard or mud cells; 3 of 6 arrive no hazard cells, mud exposure 42.7; never reaches the goal
Jolt, forces only no hazard or mud cells; 2 of 6 arrive no hazard cells, mud exposure 119.7; never reaches the goal
dynamic, governor no hazard cells; 3 of 6 arrive no hazard cells; never reaches the goal
dynamic, forces only no hazard cells; 4 of 6 arrive 14 hazard steps: the run without material, to the millimetre
kinematic, forces only no hazard cells; 6 of 6 arrive 8 hazard steps, as without material; arrives
kinematic, governor no hazard cells; 6 of 6 arrive 62 hazard steps, creeping through the water; arrives

The governor stops both physics vehicles short of the water. With no planner to find the dry gap, that is a dead end. On the kinematic bicycle the governor makes the scenario worse, which is why it stays off there by default. That bicycle is also the Python stories' twin.

Verified

On Windows, against a pycvc built with transfix/libcvc#1011 and #1012:

  • tests/test_plant_ground_and_governor.py (new, 4 tests):
    • the CLI flag;
    • the governor's default per plant;
    • JoltPlant naming its ground, and the fallback;
    • on the dynamic plant, the forces alone leave the scenario run as it is without material, and the governor holds it out of the water.
  • With test_fog_plant.py and test_plant_capture.py: 22 passed.
  • The table above, from material-demo --plant {dynamic,jolt,kinematic} {--governor,--no-governor}.
  • The full suite: 771 passed, 20 skipped, none failed (test_lab deselected: it needs pycvc_gl.lab). An earlier run hit test_sim_thread_pause_resume once under load; alone it passes 4 of 4.
  • ruff and black 26.5.1 are clean.

Until a pycvc release carries #1011 and #1012:

  • HAS_RISK_GOVERNOR is False and the demo runs the forces alone, as before;
  • JoltPlant falls back to the ground-counting call.

…r material

JoltPlant names its ground to pycvc's nav_plant (ground_bodies,
transfix/libcvc#1011), so a chassis scraping it is no building contact in
nav_stats; it falls back on a pycvc without the argument.

material-demo --plant runs libcvc's risk governor on the dynamic and Jolt
plants where pycvc has it (sim_world::set_risk_governor, transfix/libcvc#1012;
NativeSimWorld.set_risk_governor, PlantNavigator(risk_governor=...)).
--no-governor shows the forces alone, --governor puts it on the kinematic
bicycle too. The forces slow a vehicle only by what they take from its goal
pull's surplus over its top speed, which on a physics plant is all of it: the
dynamic RoboRacer crossed the scenario story's water at its top speed, its run
the same to the millimetre as without material. Under the governor it stops
short of the water (0 hazard steps, 14 before).

docs/PLANTS.md explains both, with the material demo's table for every plant
with and without the governor.
…lant's fallback

CI's catalog pycvc refuses the ground_bodies call and JoltPlant makes the old
one, which the spy recorded last. Check the first call names the ground and a
second, if any, is the fallback.
@transfix
transfix merged commit 678ae2f into main Nov 3, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant