# Physicalai Runtime Running Policy On Robot

> Runs exported policies on hardware with PolicyRuntime, execution modes, and physicalai run. Use when wiring PolicyRuntime, SyncExecution or RTC execution, runtime YAML configs, action queues, runtime callbacks, or docs/how-to/runtime run-policy-on-robot and execution modes.

- Skill: `openvinotoolkit/physicalai-runtime-running-policy-on-robot` (Agent Skill)
- Install (CLI): `npx skillmds@latest add openvinotoolkit/physicalai-runtime-running-policy-on-robot`
- Raw SKILL.md: https://api.skillmd.com/api/skills/openvinotoolkit/physicalai-runtime-running-policy-on-robot/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: Apache-2.0
- Author: openvinotoolkit (https://skillmd.com/u/openvinotoolkit)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/openvinotoolkit/physicalai-runtime-running-policy-on-robot

---


# Running a Policy on a Robot

`PolicyRuntime` (`src/physicalai/runtime/runtime.py`) owns the control loop; `InferenceModel` owns policy math. Execution strategy lives under `src/physicalai/runtime/execution.py` and `src/physicalai/runtime/rtc_execution.py`. CLI: `physicalai run` in `src/physicalai/cli/run.py` instantiates from YAML via jsonargparse.

## Workflow

1. **Choose API vs config**: Python for notebooks/tests; YAML + `physicalai run` for reproducible deployment.
   - Done when: entry point matches the user's task.
2. **Python minimal loop** (see `docs/how-to/runtime/run-policy-on-robot.md`):

   ```python
   from physicalai.runtime import PolicyRuntime, SyncExecution
   from physicalai.inference import InferenceModel
   from physicalai.robot import SO101
   from physicalai.capture import UVCCamera

   runtime = PolicyRuntime(
       fps=30,
       robot=SO101(port="/dev/ttyACM0"),
       model=InferenceModel("./exports/act_policy"),
       cameras={"wrist": UVCCamera(device="/dev/video0", width=640, height=480)},
       execution=SyncExecution(),
   )
   with runtime:
       runtime.run(duration_s=60)
   ```

   - Done when: components connect and the loop runs in a test or dry-run with fakes.

3. **YAML config** — nest `class_path` / `init_args` for robot, model, cameras, execution; run:

   ```bash
   physicalai run --config runtime.yaml --run.duration_s=60
   ```

4. **Execution mode** — pick sync vs RTC per `docs/how-to/runtime/use-execution-modes.md`; do not build ad-hoc timing around `InferenceModel.select_action` when `PolicyRuntime` should own the queue.
5. **Callbacks** — register via runtime callback APIs (`docs/how-to/runtime/add-runtime-callbacks.md`) for telemetry/latency, not inside inference adapters.

## Validation loop

```bash
uv run pytest tests/unit/runtime/ -q
```

Use fake robots/cameras from runtime tests when hardware is unavailable.

## Required checks

- `fps` and camera read rates are consistent.
- Action dimensions match robot `send_action` expectations.
- Config `class_path` targets are importable without training packages.
- Document breaking changes to runtime config schema in `docs/reference/config-schema.md`.

## References

- `docs/how-to/runtime/run-policy-on-robot.md`
- `docs/how-to/config/write-runtime-config.md`

