Repository files navigation

torchcontrol

PyPICI

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 documentation
  • tests/ — Unit tests (pytest)
  • README.md, setup.py, pyproject.toml, LICENSE

🖼️ Visual Examples

MPPI UAV Trajectory Tracking (Batch, 3D, Animated)

UAV MPPI Tracking

Batch PID Control (Internal Plant)

PID with Internal Plant

Batch Step Response (Second-Order System)

Second Order Step Response

Nonlinear System Step Response (Batch)

Nonlinear Plant Step Response


📖 Quick Start

Batch PID Control of a Second-Order System

fromtorchcontrol.controllersimportPID, PIDCfgfromtorchcontrol.plantsimportInputOutputSystem, InputOutputSystemCfgimporttorchdt=0.01num_envs=16num= [1.0]
den= [1.0, 2.0, 1.0]
initial_states=torch.rand(num_envs, 1) *2plant_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

fromtorchcontrol.systemimportParametersfromtorchcontrol.plantsimportNonlinearSystem, NonlinearSystemCfgimporttorchdefnonlinear_oscillator(x, u, t, params):
k, c, alpha=params.k, params.c, params.alphax1, x2=x[:, 0], x[:, 1]
dx1=x2dx2=-k*x1-c*x2+alpha*x1**3+u.squeeze(-1)
returntorch.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_envs for 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 ControllerBase and registering a config
  • Add new plants by inheriting from PlantBase or using InputOutputSystem/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

About

torchcontrol is a parallel control system simulation and control library based on PyTorch, supporting RL, classical control, and GPU parallelism.

Resources

Contributing

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

torchcontrol

PyPICI

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 documentation
  • tests/ — Unit tests (pytest)
  • README.md, setup.py, pyproject.toml, LICENSE

🖼️ Visual Examples

MPPI UAV Trajectory Tracking (Batch, 3D, Animated)

UAV MPPI Tracking

Batch PID Control (Internal Plant)

PID with Internal Plant

Batch Step Response (Second-Order System)

Second Order Step Response

Nonlinear System Step Response (Batch)

Nonlinear Plant Step Response


📖 Quick Start

Batch PID Control of a Second-Order System

fromtorchcontrol.controllersimportPID, PIDCfgfromtorchcontrol.plantsimportInputOutputSystem, InputOutputSystemCfgimporttorchdt=0.01num_envs=16num= [1.0]
den= [1.0, 2.0, 1.0]
initial_states=torch.rand(num_envs, 1) *2plant_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

fromtorchcontrol.systemimportParametersfromtorchcontrol.plantsimportNonlinearSystem, NonlinearSystemCfgimporttorchdefnonlinear_oscillator(x, u, t, params):
k, c, alpha=params.k, params.c, params.alphax1, x2=x[:, 0], x[:, 1]
dx1=x2dx2=-k*x1-c*x2+alpha*x1**3+u.squeeze(-1)
returntorch.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_envs for 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 ControllerBase and registering a config
  • Add new plants by inheriting from PlantBase or using InputOutputSystem/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

About

torchcontrol is a parallel control system simulation and control library based on PyTorch, supporting RL, classical control, and GPU parallelism.

Resources

Contributing

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

torchcontrol

PyPICI

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 documentation
  • tests/ — Unit tests (pytest)
  • README.md, setup.py, pyproject.toml, LICENSE

🖼️ Visual Examples

MPPI UAV Trajectory Tracking (Batch, 3D, Animated)

UAV MPPI Tracking

Batch PID Control (Internal Plant)

PID with Internal Plant

Batch Step Response (Second-Order System)

Second Order Step Response

Nonlinear System Step Response (Batch)

Nonlinear Plant Step Response


📖 Quick Start

Batch PID Control of a Second-Order System

fromtorchcontrol.controllersimportPID, PIDCfgfromtorchcontrol.plantsimportInputOutputSystem, InputOutputSystemCfgimporttorchdt=0.01num_envs=16num= [1.0]
den= [1.0, 2.0, 1.0]
initial_states=torch.rand(num_envs, 1) *2plant_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

fromtorchcontrol.systemimportParametersfromtorchcontrol.plantsimportNonlinearSystem, NonlinearSystemCfgimporttorchdefnonlinear_oscillator(x, u, t, params):
k, c, alpha=params.k, params.c, params.alphax1, x2=x[:, 0], x[:, 1]
dx1=x2dx2=-k*x1-c*x2+alpha*x1**3+u.squeeze(-1)
returntorch.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_envs for 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 ControllerBase and registering a config
  • Add new plants by inheriting from PlantBase or using InputOutputSystem/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

About

torchcontrol is a parallel control system simulation and control library based on PyTorch, supporting RL, classical control, and GPU parallelism.

Resources

Contributing

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

torchcontrol

PyPICI

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 documentation
  • tests/ — Unit tests (pytest)
  • README.md, setup.py, pyproject.toml, LICENSE

🖼️ Visual Examples

MPPI UAV Trajectory Tracking (Batch, 3D, Animated)

UAV MPPI Tracking

Batch PID Control (Internal Plant)

PID with Internal Plant

Batch Step Response (Second-Order System)

Second Order Step Response

Nonlinear System Step Response (Batch)

Nonlinear Plant Step Response


📖 Quick Start

Batch PID Control of a Second-Order System

fromtorchcontrol.controllersimportPID, PIDCfgfromtorchcontrol.plantsimportInputOutputSystem, InputOutputSystemCfgimporttorchdt=0.01num_envs=16num= [1.0]
den= [1.0, 2.0, 1.0]
initial_states=torch.rand(num_envs, 1) *2plant_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

fromtorchcontrol.systemimportParametersfromtorchcontrol.plantsimportNonlinearSystem, NonlinearSystemCfgimporttorchdefnonlinear_oscillator(x, u, t, params):
k, c, alpha=params.k, params.c, params.alphax1, x2=x[:, 0], x[:, 1]
dx1=x2dx2=-k*x1-c*x2+alpha*x1**3+u.squeeze(-1)
returntorch.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_envs for 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 ControllerBase and registering a config
  • Add new plants by inheriting from PlantBase or using InputOutputSystem/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

About

torchcontrol is a parallel control system simulation and control library based on PyTorch, supporting RL, classical control, and GPU parallelism.

Resources

Contributing

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

torchcontrol

PyPICI

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 documentation
  • tests/ — Unit tests (pytest)
  • README.md, setup.py, pyproject.toml, LICENSE

🖼️ Visual Examples

MPPI UAV Trajectory Tracking (Batch, 3D, Animated)

UAV MPPI Tracking

Batch PID Control (Internal Plant)

PID with Internal Plant

Batch Step Response (Second-Order System)

Second Order Step Response

Nonlinear System Step Response (Batch)

Nonlinear Plant Step Response


📖 Quick Start

Batch PID Control of a Second-Order System

fromtorchcontrol.controllersimportPID, PIDCfgfromtorchcontrol.plantsimportInputOutputSystem, InputOutputSystemCfgimporttorchdt=0.01num_envs=16num= [1.0]
den= [1.0, 2.0, 1.0]
initial_states=torch.rand(num_envs, 1) *2plant_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

fromtorchcontrol.systemimportParametersfromtorchcontrol.plantsimportNonlinearSystem, NonlinearSystemCfgimporttorchdefnonlinear_oscillator(x, u, t, params):
k, c, alpha=params.k, params.c, params.alphax1, x2=x[:, 0], x[:, 1]
dx1=x2dx2=-k*x1-c*x2+alpha*x1**3+u.squeeze(-1)
returntorch.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_envs for 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 ControllerBase and registering a config
  • Add new plants by inheriting from PlantBase or using InputOutputSystem/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

About

torchcontrol is a parallel control system simulation and control library based on PyTorch, supporting RL, classical control, and GPU parallelism.

Resources

Contributing

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

torchcontrol

PyPICI

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 documentation
  • tests/ — Unit tests (pytest)
  • README.md, setup.py, pyproject.toml, LICENSE

🖼️ Visual Examples

MPPI UAV Trajectory Tracking (Batch, 3D, Animated)

UAV MPPI Tracking

Batch PID Control (Internal Plant)

PID with Internal Plant

Batch Step Response (Second-Order System)

Second Order Step Response

Nonlinear System Step Response (Batch)

Nonlinear Plant Step Response


📖 Quick Start

Batch PID Control of a Second-Order System

fromtorchcontrol.controllersimportPID, PIDCfgfromtorchcontrol.plantsimportInputOutputSystem, InputOutputSystemCfgimporttorchdt=0.01num_envs=16num= [1.0]
den= [1.0, 2.0, 1.0]
initial_states=torch.rand(num_envs, 1) *2plant_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

fromtorchcontrol.systemimportParametersfromtorchcontrol.plantsimportNonlinearSystem, NonlinearSystemCfgimporttorchdefnonlinear_oscillator(x, u, t, params):
k, c, alpha=params.k, params.c, params.alphax1, x2=x[:, 0], x[:, 1]
dx1=x2dx2=-k*x1-c*x2+alpha*x1**3+u.squeeze(-1)
returntorch.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_envs for 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 ControllerBase and registering a config
  • Add new plants by inheriting from PlantBase or using InputOutputSystem/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

About

torchcontrol is a parallel control system simulation and control library based on PyTorch, supporting RL, classical control, and GPU parallelism.

Resources

Contributing

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

torchcontrol

PyPICI

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 documentation
  • tests/ — Unit tests (pytest)
  • README.md, setup.py, pyproject.toml, LICENSE

🖼️ Visual Examples

MPPI UAV Trajectory Tracking (Batch, 3D, Animated)

UAV MPPI Tracking

Batch PID Control (Internal Plant)

PID with Internal Plant

Batch Step Response (Second-Order System)

Second Order Step Response

Nonlinear System Step Response (Batch)

Nonlinear Plant Step Response


📖 Quick Start

Batch PID Control of a Second-Order System

fromtorchcontrol.controllersimportPID, PIDCfgfromtorchcontrol.plantsimportInputOutputSystem, InputOutputSystemCfgimporttorchdt=0.01num_envs=16num= [1.0]
den= [1.0, 2.0, 1.0]
initial_states=torch.rand(num_envs, 1) *2plant_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

fromtorchcontrol.systemimportParametersfromtorchcontrol.plantsimportNonlinearSystem, NonlinearSystemCfgimporttorchdefnonlinear_oscillator(x, u, t, params):
k, c, alpha=params.k, params.c, params.alphax1, x2=x[:, 0], x[:, 1]
dx1=x2dx2=-k*x1-c*x2+alpha*x1**3+u.squeeze(-1)
returntorch.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_envs for 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 ControllerBase and registering a config
  • Add new plants by inheriting from PlantBase or using InputOutputSystem/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

About

torchcontrol is a parallel control system simulation and control library based on PyTorch, supporting RL, classical control, and GPU parallelism.

Resources

Contributing

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

torchcontrol

PyPICI

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 documentation
  • tests/ — Unit tests (pytest)
  • README.md, setup.py, pyproject.toml, LICENSE

🖼️ Visual Examples

MPPI UAV Trajectory Tracking (Batch, 3D, Animated)

UAV MPPI Tracking

Batch PID Control (Internal Plant)

PID with Internal Plant

Batch Step Response (Second-Order System)

Second Order Step Response

Nonlinear System Step Response (Batch)

Nonlinear Plant Step Response


📖 Quick Start

Batch PID Control of a Second-Order System

fromtorchcontrol.controllersimportPID, PIDCfgfromtorchcontrol.plantsimportInputOutputSystem, InputOutputSystemCfgimporttorchdt=0.01num_envs=16num= [1.0]
den= [1.0, 2.0, 1.0]
initial_states=torch.rand(num_envs, 1) *2plant_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

fromtorchcontrol.systemimportParametersfromtorchcontrol.plantsimportNonlinearSystem, NonlinearSystemCfgimporttorchdefnonlinear_oscillator(x, u, t, params):
k, c, alpha=params.k, params.c, params.alphax1, x2=x[:, 0], x[:, 1]
dx1=x2dx2=-k*x1-c*x2+alpha*x1**3+u.squeeze(-1)
returntorch.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_envs for 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 ControllerBase and registering a config
  • Add new plants by inheriting from PlantBase or using InputOutputSystem/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

About

torchcontrol is a parallel control system simulation and control library based on PyTorch, supporting RL, classical control, and GPU parallelism.

Resources

Contributing

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages