"Use when an AlpaSim task concerns vehicle state, controller or MPC
Scanned 9/8/2026
Install to Claude Code
npx -y skills add VectorSpaceLab/AREX-Skill --skill control-physics-traffic --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Control Physics Traffic?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/vectorspacelab-control-physics-traffic)More formats (shields.io, HTML) on the badges page.
---
name: control-physics-traffic
description: "Use when an AlpaSim task concerns vehicle state, controller or MPC
selection, ground-mesh physics, CATK traffic sessions, handover behavior, or
backend/data requirements for these services."
disable-model-invocation: true
metadata:
disco-role: operating
license: Apache 2.0
---
# Control, physics, and traffic
Use this sub-skill for the three simulation components that close the motion
loop:
- **Controller:** planar dynamic-bicycle vehicle state, linear/nonlinear MPC,
trajectory tracking, and the controller gRPC session.
- **Physics:** Warp ground-mesh intersection that corrects vehicle/object poses;
it is not a collision engine or a replacement for vehicle dynamics.
- **Traffic:** the CATK-backed traffic gRPC service, including session history,
logged replay, handover, prediction batching, and failure statuses.
Do not use this sub-skill to compose a wizard deployment, choose a driver policy,
or edit protobufs. Route those to `simulation-wizard`, `drivers-and-plugins`, or
`grpc-and-developer-tools`, respectively. Use `runtime-services` for the
runtime's event loop and service orchestration, and `evaluation-and-logs` for
post-run logs and metrics.
## Start with a capability and backend check
1. Identify the service being changed or queried. Record the simulation time
unit, coordinate frame, scene identifier, and whether the request is replay
or closed-loop inference.
2. Run the bundled, read-only probe before debugging imports or optional
backends:
Read [backend compatibility](references/backend-compatibility.md), then run
the bundled [backend checker](scripts/check_backend.py) before debugging
imports or optional backends:
```bash
python scripts/check_backend.py
python scripts/check_backend.py --usdz-folder /data/scenes \
--model-config /models/catk/config.yaml \
--checkpoint /models/catk/latest.ckpt \
--token-dir /models/tokens
```
The second form only inspects supplied paths; it never downloads or changes
them. Treat warnings about CUDA, PyG extensions, USDZ, or model assets as
capability limits, not as proof of a working CATK service.
3. For a controller-only CPU smoke test, use the package's focused tests or
instantiate `LinearMPC` with an 8-element state and a time-stamped
`Trajectory`. For a nonlinear smoke test, ensure `do_mpc` and CasADi are
importable before the first `compute_control` call.
4. For physics, use a small valid PLY ground mesh and positive AABB dimensions.
`PhysicsBackend` constructs Warp mesh data and launches CUDA kernels during
`update_pose`; a successful Python import is not a physics execution test.
5. For CATK, verify the scene directory contains `.usdz` files and that the
model config, checkpoint, token directory, CUDA device, and matching PyG
compiled extensions are all available. Never substitute a static traffic
trajectory for a failed post-handover prediction.
See [backend compatibility](references/backend-compatibility.md) before
installing optional packages and [troubleshooting](references/troubleshooting.md)
when a check fails.
## Choose and use the controller
1. Represent the current vehicle state in the documented order
`[x, y, yaw, vx_cg, vy_cg, yaw_rate, steering, accel]`. The position and yaw
are for the rig origin in the temporary inertial frame; `vx_cg` and `vy_cg`
are body-frame CG velocities. Do not silently treat rig-frame lateral speed
as CG lateral speed.
2. Use **linear MPC** (`mpc_implementation: linear`) as the normal fast choice.
It linearizes the bicycle model about the current state and solves an OSQP
QP. Use **nonlinear MPC** for aggressive maneuvers or tight turns when the
slower do_mpc/CasADi/IPOPT solve is acceptable. This is a modeling trade-off,
not a claim that nonlinear is always more stable.
3. Keep `n_horizon` and `dt_mpc` consistent with the trajectory sampling. The
defaults are 20 steps and 0.1 seconds. Tracking cost begins at
`gains.idx_start_penalty` (default 10), while actuator regularization applies
to command changes.
4. In a service session, call `start_session` before the first run, provide a
non-empty planned trajectory, advance to a strictly later `future_time_us`,
and close the session exactly once. The first run lazily constructs the
system and creates a CSV controller log.
5. Set `coerce_dynamic_state` when current ground-truth dynamic state should
replace the model's velocity, yaw rate, and acceleration before solving. The
system converts rig-frame velocity to CG-frame velocity and preserves the
integrated pose origin.
The exact dataclasses, solver bounds, frame conversion, service invariants, and
standalone server flags are in [controller API](references/controller-api.md).
## Apply ground constraints
1. Give the physics service a scene artifact glob ending in `.usdz` and select
a scene whose ground mesh is available. The command shape is:
```bash
physics_server --artifact-glob '/data/artifacts/*.usdz' \
--host 0.0.0.0 --port 8080 --cache-size 16
```
`--use-ground-mesh`, `--visualize`, and the cache size affect artifact/backend
loading; visualization is optional and may require extra packages.
2. For every pose, physics samples the bottom of the AABB, casts ±Z rays into
the Warp mesh, fits a plane, and applies bounded translation/rotation
corrections. It deliberately preserves predicted X/Y after correction and
returns a status for each pose.
3. Handle `SUCCESSFUL_UPDATE`, `INSUFFICIENT_POINTS_FITPLANE`, `HIGH_TRANSLATION`,
and `HIGH_ROTATION` as distinct observations. Repeated high corrections are
usually a scene, AABB, timestamp, or upstream pose problem; do not hide them
by retrying indefinitely.
Physics does not model collisions, full vehicle dynamics, or arbitrary lateral
motion. See [physics and traffic](references/physics-and-traffic.md).
## Run a CATK traffic session
1. Start the service only after its Hydra config resolves. A documented local
shape is:
```bash
catk_trafficsim_server \
--config-path=/path/to/config-dir \
--config-name=server.yaml \
server.port=6200 \
catk.loader.usdz_folder=/data/scenes
```
The model paths and timing settings belong in the resolved config. The
wizard normally writes this config for a container deployment; do not make a
second deployment recipe here.
2. `start_session` requires a session UUID, scene ID, at least one logged object
trajectory including `EGO`, and a positive `handover_time_us`. The service
builds a fixed history window (`num_history_steps`, default 16) sampled at
`time_step` (default 0.1 s).
3. At or before handover, `simulate` resamples logged trajectories and returns
replay. After handover, it resamples the latest history, fills the ego future
from the request/update, runs CATK, and merges predicted agent trajectories.
Requests are serialized per session but different sessions may reach the
inference batcher concurrently.
4. Respect the configured `prediction_steps` (default 5). A request beyond the
fixed prediction horizon is `INVALID_ARGUMENT`; missing usable map/model
predictions after handover are `FAILED_PRECONDITION`. An unexpected model
exception is `INTERNAL`. These statuses are actionable distinctions.
5. Close sessions and retry only after fixing the reported scene, trajectory,
horizon, map, model, or backend issue. There is no valid CPU/static fallback
for CATK's required post-handover prediction path.
Use [physics and traffic](references/physics-and-traffic.md) for the request
sequence, config fields, batching semantics, and status mapping.
## Verification and handoff
- Run parser/help checks for the bundled script and server commands without
starting a daemon or downloading assets.
- Run controller system, linear-MPC, nonlinear-MPC, physics-utils, and traffic
service/batching tests according to their backend markers. Keep CATK
integration tests skipped unless CUDA, matching PyG extensions, USDZ scenes,
and model weights are all present.
- Test the difficult cases in the review artifact: aggressive-turn controller
selection and a CATK `FAILED_PRECONDITION` after handover. The expected answer
must name the validation signal and must not invent a fallback.
- If a service contract or protobuf message is the issue, hand off rather than
duplicating generic message definitions. Record unresolved backend/data gaps
explicitly in the verification report.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!