torchcontrol
torchcontrol is a modern, parallel control system simulation and control library built on PyTorch. It supports batch simulation, classical and modern control, nonlinear systems, GPU acceleration, and rich visualization. Designed for both research and teaching, torchcontrol is modular, extensible, and easy to use for rapid prototyping and large-scale experiments.
🚀 Features
- Batch simulation: Simulate many environments in parallel (vectorized, GPU-friendly)
- Classical & modern control: Built-in PID, state-space, transfer function, and nonlinear system support
- Custom plants: Easily define linear or nonlinear plants (systems) with custom dynamics
- GPU acceleration: All computations support CUDA (if available)
- Visualization: Example scripts for step response, PID control, nonlinear and UAV systems with matplotlib and animation output
- Extensible: Modular design for adding new controllers, observers, or plants
- Research-ready: RL-style interfaces, batched rollouts, and reproducible results
📦 Installation
Install the latest release from PyPI:
pip install torchcontrol
Or, for the latest development version from source (from the project root):
pip install .
Or for development mode (auto-reload on code change):
pip install -e .
🗂️ Directory Structure
torchcontrol/— Main package (controllers, plants, system, observers, utils)examples/— Example scripts (PID, nonlinear, batch, UAV, visualization)results/— Output results (figures, GIFs, logs, etc.)
assets/— Project images and GIFs for documentationtests/— Unit tests (pytest)README.md,setup.py,pyproject.toml,LICENSE
🖼️ Visual Examples
MPPI UAV Trajectory Tracking (Batch, 3D, Animated)
Batch PID Control (Internal Plant)
Batch Step Response (Second-Order System)
Nonlinear System Step Response (Batch)
📖 Quick Start
Batch PID Control of a Second-Order System
from torchcontrol.controllers import PID, PIDCfg
from torchcontrol.plants import InputOutputSystem, InputOutputSystemCfg
import torch
dt = 0.01
num_envs = 16
num = [1.0]
den = [1.0, 2.0, 1.0]
initial_states = torch.rand(num_envs, 1) * 2
plant_cfg = InputOutputSystemCfg(numerator=num, denominator=den, dt=dt, num_envs=num_envs, initial_state=initial_states)
plant = InputOutputSystem(plant_cfg)
pid_cfg = PIDCfg(Kp=120.0, Ki=600.0, Kd=30.0, dt=dt, num_envs=num_envs, state_dim=1, action_dim=1, plant=plant)
pid = PID(pid_cfg)
# ...simulate and visualize...
Nonlinear System Example
from torchcontrol.system import Parameters
from torchcontrol.plants import NonlinearSystem, NonlinearSystemCfg
import torch
def nonlinear_oscillator(x, u, t, params):
k, c, alpha = params.k, params.c, params.alpha
x1, x2 = x[:, 0], x[:, 1]
dx1 = x2
dx2 = -k * x1 - c * x2 + alpha * x1 ** 3 + u.squeeze(-1)
return torch.stack([dx1, dx2], dim=1)
params = Parameters(k=1.0, c=0.7, alpha=0.1)
initial_states = torch.rand(16, 2)
cfg = NonlinearSystemCfg(dynamics=nonlinear_oscillator, output=None, dt=0.01, num_envs=16, state_dim=2, action_dim=1, initial_state=initial_states, params=params)
plant = NonlinearSystem(cfg)
# ...simulate and visualize...
🏗️ Architecture Overview
- SystemBase: Abstract base for all systems (plants, controllers, observers)
- PlantBase: Base for all plant (system) models (linear, nonlinear, batch)
- ControllerBase: Base for all controllers (PID, MPPI, custom)
- Config Classes: All systems/controllers/plants use dataclass configs for reproducibility
- Batching: All classes support
num_envsfor parallel simulation - Device: All tensors and computation can run on CPU or CUDA
📚 Example Scripts
Run from the project root:
python3 examples/pid_with_internal_plant.py
python3 examples/pid_with_external_plant.py
python3 examples/second_order_plant_step_response.py
python3 examples/nonlinear_plant_step_response.py
python3 examples/uav_geometric_hover.py
python3 examples/uav_geometric_tracking.py
python3 examples/uav_mppi_tracking.py
python3 examples/uav_thrust_descent_to_hover.py
- All import paths use package-level imports (e.g.,
from torchcontrol.controllers import PID). - Output files are saved in
examples/results/. - All examples support both CPU and GPU (CUDA) if available.
🧪 Testing
Run all tests with:
pytest tests/
🛠️ Customization & Extension
- Add new controllers by inheriting from
ControllerBaseand registering a config - Add new plants by inheriting from
PlantBaseor usingInputOutputSystem/NonlinearSystem - See
examples/for advanced usage, batch simulation, and RL-style rollouts
🤝 Contributing
Pull requests, issues, and suggestions are welcome! Please see CONTRIBUTING.md if available, or open an issue to discuss your ideas.
📄 License
MIT License © 2025 Tang Longbin
Metadata
Release files for torchcontrol 0.1.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| torchcontrol-0.1.5.tar.gz | 27.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| torchcontrol-0.1.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 61.8 kB
Release files / torchcontrol-0.1.5.tar.gz
| Download URL | torchcontrol-0.1.5.tar.gz |
|---|---|
| Size | 27.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
119fee2cdaec7f4e75a3ddcae136065925a54d85f5a1b1664813e28a12871448
|
|
BLAKE2b-256 checksum How to use checksums |
dd8538e0e62b333e0117707ddea36fd3700e0be6e65729bda9fc84035d430eab
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 12, 2025.
Transparency logRelease files / torchcontrol-0.1.5-py3-none-any.whl
| Download URL | torchcontrol-0.1.5-py3-none-any.whl |
|---|---|
| Size | 34.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
67daf1055f724f759ea1d53444e0bfc1c8af28ed745da009379286c1015eab9a
|
|
BLAKE2b-256 checksum How to use checksums |
83baf9040ef7953a584d009fa016baa99fbb88cf466ade663fea039a059d14f2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 12, 2025.
Transparency log