MCT411: Hybrid Control | Fall 2025 | Team 14
Ain Shams University — Faculty of Engineering, Mechatronics Department
This repository contains the MATLAB/Simulink implementation of a hybrid control system for the Furuta (Rotary Inverted) Pendulum — a nonlinear, underactuated mechatronic benchmark system. The control architecture combines two distinct strategies:
- Energy-Based Swing-Up Controller — pumps energy into the pendulum to drive it from the natural downward-stable position to the upright equilibrium.
- Linear Quadratic Regulator (LQR) — takes over once the pendulum is near upright, maintaining stability against small disturbances.
The full system is validated through both MATLAB/Simulink simulation and Hardware-in-the-Loop (HIL) testing on a physical prototype.
| Name | ID | Contribution |
|---|---|---|
| Abdelghaffar Essam Abdelghaffar | 2100428 | Mechanical Design, LQR Implementation |
| Ingy Ahmed Sherif | 2100648 | LQR Implementation, Simulation Setup |
| Kareem Saleh Hassan | 2100909 | Mechanical Design, Swing-Up Implementation |
| Mariam Mohamed El Sebaey | 2100260 | Swing-Up Implementation, Simulation Setup |
The Furuta Pendulum consists of two arms whose rotary axes are perpendicular to each other:
- Arm 1 (Table/Rotor): Horizontal arm driven by a DC motor. Angle: θ₁
- Arm 2 (Pendulum): Vertical free-swinging arm attached to the end of Arm 1. Angle: θ₂
The system is underactuated — only one torque input (the motor) controls two degrees of freedom.
| Component | Specification |
|---|---|
| Microcontroller | ESP32 |
| Motor Driver | H-Bridge (bidirectional) |
| Motor Encoder | 600 PPR (horizontal arm θ₁) |
| Pendulum Encoder | High-resolution (pendulum angle θ₂) |
| Power Supply | 12 V DC |
| Host Interface | USB/Serial → MATLAB/Simulink HIL |
| Parameter | Symbol | Value |
|---|---|---|
| Pendulum mass | mᵣ | 0.018 kg |
| Pendulum COM to rotation axis | lᵣ | 0.0638 m |
| Pendulum moment of inertia | Jᵣ | 9.83 × 10⁻⁵ kg·m² |
| Table rotation axis to pendulum pivot | lₜ | 0.07 m |
| Rotor moment of inertia | J_motor | 0.0024 kg·m² |
| Motor resistance | Rₐ | 5.8466 Ω |
| Motor constants | kₜ = k_b | 0.048 V/rpm |
| Armature inductance | Lₐ | 9.15 × 10⁻⁴ H |
Friction coefficients (motor, pendulum, table) were identified via parameter estimation rather than theoretical derivation.
x = [θ₁ θ̇₁ θ₂ θ̇₂]ᵀ
The controller injects energy by oscillating the horizontal arm, guided by the difference between the current pendulum energy and the target energy at the upright equilibrium:
E = ½ Jᵣ θ̇₁² + mᵣ g lᵣ (1 + cos θ₁)
Eᵣ = 2 mᵣ g lᵣ
u = sat( k_swing · (Eᵣ − E) · θ̇₁ · cos θ₁ )
The nonlinear Simscape Multibody model is linearized at the upright equilibrium using Simulink Model Linearizer, yielding the state-space matrices used for LQR design:
ẋ = Ax + Bu
LQR Cost Function:
J = ∫₀^∞ (xᵀQx + uᵀRu) dt
Tuned Weights:
Q = diag([1, 0.1, 100, 10])
R = 100
Resulting Gain:
K = [−0.0100 −0.0857 1.5880 0.1478]
u(t) = −K x(t)
A Stateflow chart manages transitions between control modes:
Swing_Up ──(|θ₂| ≤ 15°, |θ̇₂| ≤ 7)──► LQR
▲ │
│ │ (|θ̇₂| ≥ 25 or timeout)
│ ▼
└────────(safe)────────────────── Recovery
| State | Condition |
|---|---|
| Swing_Up | Default; energy injection active |
| LQR | |θ₂| ≤ 15° and |θ̇₂| ≤ 7 rad/s |
| Recovery | |θ₂| ≥ 110° or speed exceeded; motor halted |
furuta-pendulum/
├── Simulink/
│ ├── SwingUp_Model.slx # Energy-based swing-up subsystem
│ ├── LQR_Model.slx # LQR balancing subsystem
│ ├── FullSystem_Model.slx # Complete hybrid model with Stateflow
│ └── Pendulum_SimMechanics.slx # Simscape Multibody physical model
├── MATLAB/
│ ├── parameters.m # System physical parameters
│ ├── lqr_design.m # LQR gain computation (K, Q, R)
│ └── linearize_model.m # Linearization script
├── ESP32/
│ └── firmware/ # Microcontroller code for HIL
├── Results/
│ ├── simulation_results.png
│ └── real_life_results.png
├── Report/
│ └── T14_Hybrid_Project_Report.pdf
└── README.md
- MATLAB R2022b or later
- Simulink
- Simscape & Simscape Multibody toolboxes
- Control System Toolbox (for
lqr()) - Stateflow
-
Clone the repository:
git clone https://github.com/<your-org>/furuta-pendulum.git cd furuta-pendulum
-
Open MATLAB and run the parameter initialization script:
run('MATLAB/parameters.m') -
Open and run the full Simulink model:
open('Simulink/FullSystem_Model.slx') -
Press Run in Simulink. Observe the four scopes:
PendAngle,PendVel,MotorAngle,MotorVel.
- Flash the ESP32 firmware from
ESP32/firmware/. - Connect via USB to the host PC.
- In Simulink, configure the serial port in the ESP32 communication block.
- Run the model in External Mode for real-time HIL control.
| Metric | Simulation | Real-Life |
|---|---|---|
| Swing-up success | ✅ | ✅ |
| LQR stabilization | ✅ | ✅ |
| Settling time | ~7 s | ~12 s |
| Post-stabilization oscillations | Low | Slightly higher |
The discrepancies between simulation and real-life results are attributed to unmodeled joint backlash, high-frequency friction, and minor actuation delays.
| Requirement | Specification |
|---|---|
| Swing-Up | Move pendulum to upright |
| Stabilization | Maintain upright via LQR |
| Sampling rate | ≥ 0.1 kHz |
| Torque limits | Motor saturation constraints |
| Robustness | Against small disturbances |
- B. Yao, "Modeling of Rotary Inverted Pendulum," 2022.
- K. J. Åström & K. Furuta, "Swinging up a pendulum by energy control," Automatica, 2000.
This project is submitted as academic coursework for MCT411 at Ain Shams University. All rights reserved by the authors.