|
|
--- |
|
|
license: mit |
|
|
language: |
|
|
- en |
|
|
tags: |
|
|
- model-predictive-control |
|
|
- mpc |
|
|
- pytorch |
|
|
- aerospace |
|
|
- flight-control |
|
|
- boeing-747 |
|
|
- learned-dynamics |
|
|
- neural-network |
|
|
- continuous-control |
|
|
- gymnasium |
|
|
library_name: tensoraerospace |
|
|
pipeline_tag: reinforcement-learning |
|
|
model-index: |
|
|
- name: MPC-OneStepMLP-B747-PitchControl |
|
|
results: |
|
|
- task: |
|
|
type: model-predictive-control |
|
|
name: Pitch Angle Tracking Control |
|
|
dataset: |
|
|
type: custom |
|
|
name: Boeing 747 Longitudinal Dynamics Simulation |
|
|
metrics: |
|
|
- type: overshoot |
|
|
value: 0.27 |
|
|
name: Overshoot (%) |
|
|
- type: settling_time |
|
|
value: 1.40 |
|
|
name: Settling Time (s) |
|
|
- type: rise_time |
|
|
value: 0.80 |
|
|
name: Rise Time (s) |
|
|
- type: peak_time |
|
|
value: 1.70 |
|
|
name: Peak Time (s) |
|
|
- type: static_error |
|
|
value: 0.038 |
|
|
name: Static Error |
|
|
- type: oscillation_count |
|
|
value: 5 |
|
|
name: Oscillation Count |
|
|
- type: performance_index |
|
|
value: 72.62 |
|
|
name: Performance Index |
|
|
- type: iae |
|
|
value: 41.25 |
|
|
name: IAE |
|
|
- type: ise |
|
|
value: 147.43 |
|
|
name: ISE |
|
|
- type: itae |
|
|
value: 33.99 |
|
|
name: ITAE |
|
|
- type: dynamics_loss |
|
|
value: 8.69e-6 |
|
|
name: Dynamics Model MSE Loss |
|
|
--- |
|
|
|
|
|
# TorchMPC with Learned Dynamics (OneStepMLP) for Boeing 747 Pitch Angle Control |
|
|
|
|
|
<div align="center"> |
|
|
|
|
|
 |
|
|
|
|
|
**Model Predictive Control with Neural Network Dynamics for Longitudinal Aircraft Control** |
|
|
|
|
|
[](https://github.com/TensorAeroSpace/TensorAeroSpace) |
|
|
[](https://opensource.org/licenses/MIT) |
|
|
[](https://pytorch.org/) |
|
|
|
|
|
</div> |
|
|
|
|
|
## Model Description |
|
|
|
|
|
This model combines **Model Predictive Control (MPC)** with a **learned neural network dynamics model (OneStepMLP)** to control the pitch angle (θ) of a **Boeing 747** aircraft in a longitudinal flight dynamics simulation. The approach first learns the aircraft dynamics from exploration data, then uses gradient-based MPC optimization to compute optimal control actions for reference tracking. |
|
|
|
|
|
 |
|
|
|
|
|
### Key Features |
|
|
|
|
|
- **Data-driven dynamics**: Learns one-step transition model f(x, u) → Δx from exploration data |
|
|
- **Gradient-based MPC**: Differentiable optimization through learned dynamics |
|
|
- **Step response optimization**: Custom cost function for overshoot/settling time minimization |
|
|
- **Warm-starting**: Efficient action sequence initialization across timesteps |
|
|
|
|
|
### Intended Uses |
|
|
|
|
|
- **Primary Use**: Automatic pitch angle tracking and stabilization for Boeing 747 aircraft simulation |
|
|
- **Research Applications**: Benchmarking learning-based MPC algorithms for aerospace control systems |
|
|
- **Educational**: Learning MPC concepts with neural network dynamics in aerospace applications |
|
|
- **Hybrid Control**: Can be combined with analytical models for robust flight control |
|
|
|
|
|
## Model Architecture |
|
|
|
|
|
### Dynamics Model (OneStepMLP) |
|
|
|
|
|
The dynamics model predicts state transitions using a multi-layer perceptron: |
|
|
|
|
|
| Layer | Configuration | |
|
|
|-------|---------------| |
|
|
| Input | 5 (state_dim=4 + action_dim=1) | |
|
|
| Hidden 1 | Linear(5, 256) + ReLU | |
|
|
| Hidden 2 | Linear(256, 256) + ReLU | |
|
|
| Output | Linear(256, 4) | |
|
|
| Mode | Predict Δx (delta dynamics) | |
|
|
|
|
|
**Total Parameters**: ~70K |
|
|
|
|
|
### MPC Controller |
|
|
|
|
|
| Parameter | Value | |
|
|
|-----------|-------| |
|
|
| Horizon | 20 steps | |
|
|
| Iterations per step | 60 | |
|
|
| Optimizer | Adam | |
|
|
| MPC Learning Rate | 0.02 | |
|
|
| Warm Start | Enabled | |
|
|
| Track Best | Enabled | |
|
|
|
|
|
### State Space |
|
|
|
|
|
The observation vector consists of 4 states representing the longitudinal dynamics: |
|
|
|
|
|
| Index | State | Description | Units | |
|
|
|-------|-------|-------------|-------| |
|
|
| 0 | u | Forward velocity perturbation | m/s (rad internally) | |
|
|
| 1 | w | Vertical velocity perturbation | m/s (rad internally) | |
|
|
| 2 | q | Pitch rate | rad/s | |
|
|
| 3 | θ | Pitch angle (tracking target) | rad | |
|
|
|
|
|
### Action Space |
|
|
|
|
|
| Dimension | Description | Range | Rate Limit | |
|
|
|-----------|-------------|-------|------------| |
|
|
| 1 | Elevator deflection | [-25°, 25°] | ±10°/step | |
|
|
|
|
|
## Training Details |
|
|
|
|
|
### Data Collection |
|
|
|
|
|
| Parameter | Value | |
|
|
|-----------|-------| |
|
|
| Collection Episodes | 1500 | |
|
|
| Transitions Collected | 297,000 | |
|
|
| Exploration Strategy | Multi-signal exploration | |
|
|
| Signal Types | random_steps, unit_step, multi_step, ramp, sinusoid, multisine, chirp, square_wave, triangular_wave, sawtooth, doublet, pulse, gaussian_pulse, exponential, damped_sinusoid | |
|
|
| Action Amplitude | 100% of action space | |
|
|
|
|
|
### Dynamics Training |
|
|
|
|
|
| Parameter | Value | |
|
|
|-----------|-------| |
|
|
| Epochs | 120 | |
|
|
| Batch Size | 2048 | |
|
|
| Learning Rate | 1e-4 | |
|
|
| Loss Function | MSE | |
|
|
| Final Loss | 8.69e-6 | |
|
|
| Normalization | Enabled | |
|
|
|
|
|
### MPC Cost Weights |
|
|
|
|
|
| Weight | Value | Description | |
|
|
|--------|-------|-------------| |
|
|
| W_θ | 2000.0 | Pitch tracking weight | |
|
|
| W_q | 0.2 | Pitch rate weight | |
|
|
| W_action | 0.01 | Control effort weight | |
|
|
| W_Δu | 5.0 | Control rate weight | |
|
|
| Terminal | 10.0 | Terminal cost multiplier | |
|
|
|
|
|
### Step Response Cost Configuration |
|
|
|
|
|
| Parameter | Value | |
|
|
|-----------|-------| |
|
|
| W_overshoot | 8,000 | |
|
|
| W_settle | 8,000 | |
|
|
| W_sse_steady | 40,000 | |
|
|
| W_time | 800 | |
|
|
| W_osc | 500 | |
|
|
| W_jerk | 50 | |
|
|
| Overshoot limit | 0.05° | |
|
|
| Settle band | 0.10° | |
|
|
| Settle time target | 1.0 s | |
|
|
|
|
|
### Environment Configuration |
|
|
|
|
|
| Parameter | Value | |
|
|
|-----------|-------| |
|
|
| Environment | `LinearLongitudinalB747-v0` | |
|
|
| Time Step (dt) | 0.1 s | |
|
|
| Episode Duration | 20 s | |
|
|
| Initial State | [0, 0, 0, 0] | |
|
|
| Reference Signal | Step function | |
|
|
| Step Amplitude | 1.0° | |
|
|
| Step Time | 5.0 s | |
|
|
|
|
|
### Training Infrastructure |
|
|
|
|
|
- **Hardware**: CUDA GPU (recommended) / CPU |
|
|
- **Framework**: PyTorch 2.0+ |
|
|
- **Compile Mode**: reduce-overhead (CUDA only) |
|
|
|
|
|
## Evaluation Results |
|
|
|
|
|
### Performance Metrics |
|
|
|
|
|
| Metric | Value | |
|
|
|--------|-------| |
|
|
| **Overshoot** | 0.27% | |
|
|
| **Settling Time (±5%)** | 1.40 s | |
|
|
| **Rise Time** | 0.80 s | |
|
|
| **Peak Time** | 1.70 s | |
|
|
| **Static Error** | 0.038 | |
|
|
| **Oscillation Count** | 5 | |
|
|
| **Performance Index** | 72.62 | |
|
|
| **Damping Degree** | -0.002 | |
|
|
|
|
|
### Integral Criteria |
|
|
|
|
|
| Criterion | Value | |
|
|
|-----------|-------| |
|
|
| IAE (Integral Absolute Error) | 41.25 | |
|
|
| ISE (Integral Squared Error) | 147.43 | |
|
|
| ITAE (Integral Time-weighted Absolute Error) | 33.99 | |
|
|
|
|
|
### Step Response Characteristics |
|
|
|
|
|
The MPC controller demonstrates good step tracking performance with: |
|
|
- ✅ Very low overshoot (~0.27%) |
|
|
- ✅ Fast settling time (1.4s) |
|
|
- ✅ Quick rise time (0.8s) |
|
|
- ⚠️ Some oscillations (5 cycles) |
|
|
- ⚠️ Small static error (0.038) |
|
|
|
|
|
## Usage |
|
|
|
|
|
### Installation |
|
|
|
|
|
```bash |
|
|
pip install tensoraerospace |
|
|
``` |
|
|
|
|
|
### Quick Start |
|
|
|
|
|
```python |
|
|
import numpy as np |
|
|
import gymnasium as gym |
|
|
import torch |
|
|
from tensoraerospace.signals.standart import unit_step |
|
|
from tensoraerospace.agent.mpc import MPCAgent |
|
|
|
|
|
def pick_device() -> str: |
|
|
if torch.cuda.is_available(): |
|
|
return "cuda" |
|
|
if hasattr(torch.backends, "mps") and torch.backends.mps.is_available(): |
|
|
return "mps" |
|
|
return "cpu" |
|
|
|
|
|
# Setup environment |
|
|
DT = 0.1 |
|
|
TN = 20.0 |
|
|
N_STEPS = int(TN / DT) + 1 |
|
|
T = np.arange(N_STEPS, dtype=np.float32) * DT |
|
|
|
|
|
# Create step reference signal (1 degree step at t=5s) |
|
|
reference_signal = unit_step( |
|
|
tp=T, |
|
|
degree=1.0, |
|
|
time_step=5.0, |
|
|
output_rad=True, |
|
|
).reshape(1, -1) |
|
|
|
|
|
env = gym.make( |
|
|
"LinearLongitudinalB747-v0", |
|
|
number_time_steps=N_STEPS, |
|
|
initial_state=np.array([[0.0], [0.0], [0.0], [0.0]], dtype=np.float32), |
|
|
reference_signal=reference_signal, |
|
|
dt=DT, |
|
|
) |
|
|
|
|
|
# Load pretrained agent |
|
|
agent = MPCAgent.from_pretrained("TensorAeroSpace/torchmpc-mlp-b747-step-response") |
|
|
agent.env = env |
|
|
agent.to_device(pick_device()) |
|
|
|
|
|
# Run evaluation |
|
|
_ = env.reset() |
|
|
agent.reset() |
|
|
|
|
|
ref_theta_rad = reference_signal[0] |
|
|
x_ref = np.zeros((21, 4), dtype=np.float32) # horizon + 1 |
|
|
|
|
|
for step in range(N_STEPS - 2): |
|
|
k = int(env.unwrapped.current_step) |
|
|
x0 = np.asarray(env.unwrapped.model.xt, dtype=np.float32).reshape(-1) |
|
|
|
|
|
# Set reference for horizon |
|
|
ref_k = float(ref_theta_rad[min(k, len(ref_theta_rad) - 1)]) |
|
|
x_ref[:, 3] = ref_k |
|
|
|
|
|
action = agent.select_action(x0, x_ref=x_ref) |
|
|
obs, reward, terminated, truncated, info = env.step(action) |
|
|
|
|
|
if terminated or truncated: |
|
|
break |
|
|
``` |
|
|
|
|
|
### Custom Dynamics Training |
|
|
|
|
|
```python |
|
|
# Collect exploration data |
|
|
agent.collect_data( |
|
|
num_episodes=1500, |
|
|
max_steps=199, |
|
|
exploration="signals", |
|
|
signal_kinds=["random_steps", "sinusoid", "chirp", ...], |
|
|
dt=0.1, |
|
|
action_amplitude_frac=1.0, |
|
|
) |
|
|
|
|
|
# Train dynamics model |
|
|
metrics = agent.train_dynamics( |
|
|
epochs=120, |
|
|
batch_size=2048, |
|
|
loss="mse", |
|
|
) |
|
|
print(f"Final dynamics loss: {metrics['loss']:.2e}") |
|
|
``` |
|
|
|
|
|
## Comparison with Other Methods |
|
|
|
|
|
| Method | Overshoot | Settling Time | Rise Time | Static Error | |
|
|
|--------|-----------|---------------|-----------|--------------| |
|
|
| **MPC-MLP** | 0.27% | 1.40 s | 0.80 s | 0.038 | |
|
|
| DSAC | 0.99% | 0.40 s | 0.40 s | 0.0002 | |
|
|
| PID (tuned) | ~5% | ~2.0 s | ~1.0 s | ~0 | |
|
|
|
|
|
## Limitations |
|
|
|
|
|
- **Fixed Aircraft Model**: Trained specifically on Boeing 747 longitudinal dynamics; may not generalize to other aircraft |
|
|
- **Step Reference Focus**: Optimized for step reference tracking; performance on other signal types may vary |
|
|
- **Simulation Gap**: Trained in simulation; real-world deployment would require additional validation |
|
|
- **Computational Cost**: MPC optimization at each step requires more computation than pure RL policies |
|
|
- **Linear Dynamics**: Based on linearized aircraft model around trim conditions |
|
|
- **Some Oscillations**: The controller exhibits 5 oscillation cycles during settling |
|
|
|
|
|
## Ethical Considerations |
|
|
|
|
|
- **Not for Real Flight Control**: This model is for research and educational purposes only. It should NOT be used for actual aircraft control systems without extensive testing, certification, and regulatory approval. |
|
|
- **Simulation Only**: All training and evaluation performed in simulation environments. |
|
|
|
|
|
## Citation |
|
|
|
|
|
If you use this model in your research, please cite: |
|
|
|
|
|
```bibtex |
|
|
@software{tensoraerospace2024, |
|
|
title = {TensorAeroSpace: Advanced Aerospace Control Systems \& Reinforcement Learning Framework}, |
|
|
author = {TensorAeroSpace Team}, |
|
|
year = {2024}, |
|
|
url = {https://github.com/TensorAeroSpace/TensorAeroSpace}, |
|
|
license = {MIT} |
|
|
} |
|
|
``` |
|
|
|
|
|
## Model Card Authors |
|
|
|
|
|
TensorAeroSpace Team |
|
|
|
|
|
## Model Card Contact |
|
|
|
|
|
- **GitHub**: [TensorAeroSpace/TensorAeroSpace](https://github.com/TensorAeroSpace/TensorAeroSpace) |
|
|
- **Documentation**: [tensoraerospace.readthedocs.io](https://tensoraerospace.readthedocs.io/) |
|
|
- **Hugging Face**: [TensorAeroSpace](https://huggingface.co/TensorAeroSpace) |
|
|
``` |
|
|
|