tahamajs's picture
download
raw
111 kB
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "UxK08xN_wco-"
},
"source": [
"# HW5: Model Predictive Control\n",
"\n",
"> - Full Name: Taha Majlesi\n",
"> - Student ID: 810101504\n",
"\n",
"[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/DeepRLCourse/Homework-5-Questions/blob/main/MPC.ipynb)\n",
"[![Open In kaggle](https://kaggle.com/static/images/open-in-kaggle.svg)](https://kaggle.com/kernels/welcome?src=https://raw.githubusercontent.com/DeepRLCourse/Homework-5-Questions/main/MPC.ipynb)\n",
"\n",
"## Overview\n",
"\n",
"Here the goal is to use **MPC** for [gymnasium environments](https://gymnasium.farama.org/).\n",
"More specificly we focus on the [Pendulum](https://gymnasium.farama.org/environments/classic_control/pendulum/) environment and try to solve it using [mpc.pytorch](https://locuslab.github.io/mpc.pytorch/).\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"cellView": "form",
"id": "SBD13rNwmXpx"
},
"outputs": [],
"source": [
"# @title Imports\n",
"\n",
"# Stuff you (might) need\n",
"import random\n",
"import numpy as np\n",
"import gymnasium as gym\n",
"\n",
"import torch\n",
"from torch import nn\n",
"import torch.autograd\n",
"from tqdm.notebook import trange\n",
"import math\n",
"\n",
"# Stuff used for visualization\n",
"from matplotlib import pyplot as plt\n",
"from gymnasium.wrappers import RecordVideo\n",
"import base64\n",
"import imageio\n",
"from IPython.display import HTML\n",
"import warnings\n",
"\n",
"warnings.filterwarnings(\"ignore\")"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"cellView": "form",
"id": "Avcbl8VMmgm1"
},
"outputs": [],
"source": [
"# @title Visualization Functions\n",
"\n",
"\n",
"def embed_mp4(filename):\n",
" video = open(filename, \"rb\").read()\n",
" b64 = base64.b64encode(video)\n",
" tag = \"\"\"\n",
" <video width=\"640\" height=\"480\" controls>\n",
" <source src=\"data:video/mp4;base64,{0}\" type=\"video/mp4\">\n",
" Your browser does not support the video tag.\n",
" </video>\"\"\".format(\n",
" b64.decode()\n",
" )\n",
"\n",
" return HTML(tag)\n",
"\n",
"\n",
"def plot_results(rewards, actions):\n",
" plt.plot(rewards, label=\"Rewards\")\n",
" plt.plot(actions, label=\"Actions\")\n",
" plt.legend()\n",
" plt.title(f\"Total reward: {sum(rewards):.2f}\")\n",
" plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "qTS3Lm1nWiMK"
},
"source": [
"# Explore the Environment (25 points)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "yyCz0lxFWsFv"
},
"source": [
"To better understand the environment, let's first see what a random agent does.\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 533,
"referenced_widgets": [
"c48f9ad4e3214bbe8d7518441bd56339",
"8fca041fb7a54f198e86951c5468434b",
"e31240662e47413f93d3db20b230b701",
"884ea4976a7543d38937c8c8a8ca6414",
"e4ef931db4dd47dd855291b4d4cfe584",
"4d1a6ace29c043b191691c182e1e1fd1",
"cfc793ef3ee648bbb3b77d9ccfd0e8ea",
"300f0a5bade84684942da27934e1e0b5",
"d51aaee7e0874f8c98b468dfce881fc6",
"a9c7183dcac64c7dba06525a831bf135",
"318ed47730304069a2978696d0e58fd7"
]
},
"id": "xZI6WO4bmgjS",
"outputId": "65a6a700-b1f4-4940-b9c8-b32a9a7f2558"
},
"outputs": [
{
"ename": "DependencyNotInstalled",
"evalue": "moviepy is not installed, run `pip install \"gymnasium[other]\"`",
"output_type": "error",
"traceback": [
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
"\u001b[31mModuleNotFoundError\u001b[39m Traceback (most recent call last)",
"\u001b[36mFile \u001b[39m\u001b[32m~/Documents/uni/DRL/.venv/lib/python3.13/site-packages/gymnasium/utils/save_video.py:13\u001b[39m\n\u001b[32m 12\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m---> \u001b[39m\u001b[32m13\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mmoviepy\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mvideo\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mio\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mImageSequenceClip\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m ImageSequenceClip\n\u001b[32m 14\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mImportError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n",
"\u001b[31mModuleNotFoundError\u001b[39m: No module named 'moviepy'",
"\nThe above exception was the direct cause of the following exception:\n",
"\u001b[31mDependencyNotInstalled\u001b[39m Traceback (most recent call last)",
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[3]\u001b[39m\u001b[32m, line 6\u001b[39m\n\u001b[32m 4\u001b[39m \u001b[38;5;66;03m# Create a directory to save the video\u001b[39;00m\n\u001b[32m 5\u001b[39m video_directory = \u001b[33m\"\u001b[39m\u001b[33mrandom_videos\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m6\u001b[39m env = \u001b[43mRecordVideo\u001b[49m\u001b[43m(\u001b[49m\u001b[43menv\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvideo_directory\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 8\u001b[39m \u001b[38;5;66;03m# Set the number of steps to record\u001b[39;00m\n\u001b[32m 9\u001b[39m num_steps = \u001b[32m500\u001b[39m\n",
"\u001b[36mFile \u001b[39m\u001b[32m~/Documents/uni/DRL/.venv/lib/python3.13/site-packages/gymnasium/wrappers/rendering.py:282\u001b[39m, in \u001b[36mRecordVideo.__init__\u001b[39m\u001b[34m(self, env, video_folder, episode_trigger, step_trigger, video_length, name_prefix, fps, disable_logger, gc_trigger)\u001b[39m\n\u001b[32m 276\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 277\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mRender mode is \u001b[39m\u001b[38;5;132;01m{\u001b[39;00menv.render_mode\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m, which is incompatible with RecordVideo.\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 278\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mInitialize your environment with a render_mode that returns an image, such as rgb_array.\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 279\u001b[39m )\n\u001b[32m 281\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m episode_trigger \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m step_trigger \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m282\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mgymnasium\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mutils\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01msave_video\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m capped_cubic_video_schedule\n\u001b[32m 284\u001b[39m episode_trigger = capped_cubic_video_schedule\n\u001b[32m 286\u001b[39m \u001b[38;5;28mself\u001b[39m.episode_trigger = episode_trigger\n",
"\u001b[36mFile \u001b[39m\u001b[32m~/Documents/uni/DRL/.venv/lib/python3.13/site-packages/gymnasium/utils/save_video.py:15\u001b[39m\n\u001b[32m 13\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mmoviepy\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mvideo\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mio\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mImageSequenceClip\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m ImageSequenceClip\n\u001b[32m 14\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mImportError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m---> \u001b[39m\u001b[32m15\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m gym.error.DependencyNotInstalled(\n\u001b[32m 16\u001b[39m \u001b[33m'\u001b[39m\u001b[33mmoviepy is not installed, run `pip install \u001b[39m\u001b[33m\"\u001b[39m\u001b[33mgymnasium[other]\u001b[39m\u001b[33m\"\u001b[39m\u001b[33m`\u001b[39m\u001b[33m'\u001b[39m\n\u001b[32m 17\u001b[39m ) \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01me\u001b[39;00m\n\u001b[32m 20\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mcapped_cubic_video_schedule\u001b[39m(episode_id: \u001b[38;5;28mint\u001b[39m) -> \u001b[38;5;28mbool\u001b[39m:\n\u001b[32m 21\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33mr\u001b[39m\u001b[33;03m\"\"\"The default episode trigger.\u001b[39;00m\n\u001b[32m 22\u001b[39m \n\u001b[32m 23\u001b[39m \u001b[33;03m This function will trigger recordings at the episode indices :math:`\\{0, 1, 4, 8, 27, ..., k^3, ..., 729, 1000, 2000, 3000, ...\\}`\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 29\u001b[39m \u001b[33;03m If to apply a video schedule number\u001b[39;00m\n\u001b[32m 30\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n",
"\u001b[31mDependencyNotInstalled\u001b[39m: moviepy is not installed, run `pip install \"gymnasium[other]\"`"
]
}
],
"source": [
"# Initialize the pendulum environment with video recording enabled\n",
"env = gym.make(\"Pendulum-v1\", render_mode=\"rgb_array\")\n",
"\n",
"# Create a directory to save the video\n",
"video_directory = \"random_videos\"\n",
"env = RecordVideo(env, video_directory)\n",
"\n",
"# Set the number of steps to record\n",
"num_steps = 500\n",
"\n",
"# Reset the environment to get the initial state\n",
"state, _ = env.reset()\n",
"\n",
"for _ in (pbar := trange(num_steps)):\n",
" # Sample a random action\n",
" action = env.action_space.sample()\n",
"\n",
" # Step the environment\n",
" state, reward, terminated, truncated, info = env.step(action)\n",
"\n",
" # Render the environment\n",
" env.render()\n",
"\n",
" # If done reset and get new state\n",
" if terminated or truncated:\n",
" state, _ = env.reset()\n",
"\n",
" pbar.set_description(f\"Action = {action[0]:.2f} | Reward = {reward:.2f}\")\n",
"\n",
"# Close the environment to finalize the video\n",
"env.close()\n",
"\n",
"# Show the video\n",
"embed_mp4(f\"{video_directory}/rl-video-episode-0.mp4\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "-8SUlhUHWvbC"
},
"source": [
"The goal of the [Pendulum](https://gymnasium.farama.org/environments/classic_control/pendulum/) environment in [Gymnasium](https://gymnasium.farama.org/) is to swing a pendulum to an upright position and keep it balanced there.\n",
"In this environment, you control a torque that can be applied to the pendulum.\n",
"The objective is to apply the right amount of torque to swing the pendulum up and maintain its upright position.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "wIGVVtRU2kY4"
},
"source": [
"## Simulation Tools\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "s7oVXleZ2rY8"
},
"source": [
"Both the `angle_normalize` function and the `PendulumDynamics` class are fundamental components for accurately simulating, analyzing, and controlling the pendulum system.\n",
"They ensure consistency in angle representation and provide a realistic model of the pendulum's behavior, enabling effective control strategies.\n",
"\n",
"We use the `angle_normalize` function for:\n",
"\n",
"- **Consistency**: When dealing with angles, it's important to keep them within a standard range to ensure consistency in calculations.\n",
"- **Handling Wrapping**: Angles can wrap around when they exceed $2\\pi$ or drop below $-2\\pi$. Normalizing angles helps avoid confusion and errors that can arise from angle wrapping.\n",
"\n",
"And we use the `PendulumDynamics` class for:\n",
"\n",
"- **Modeling Physical Behavior**: The `PendulumDynamics` class models the physical behavior of the pendulum.\n",
"- **Simulation and Control**: This class allows us to simulate the pendulum's response to different actions, which is crucial for designing and testing control algorithms.\n",
"- **Optimization**: Understanding the dynamics of the pendulum helps in optimizing the control inputs. The class encapsulates the physics involved, enabling us to apply control techniques like Model Predictive Control (MPC) to achieve the desired behavior.\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"id": "N9y8iJ0u2Lgp"
},
"outputs": [],
"source": [
"class PendulumDynamics(nn.Module):\n",
" def forward(self, state, action):\n",
" th = state[:, 0].view(-1, 1)\n",
" thdot = state[:, 1].view(-1, 1)\n",
"\n",
" g = 10 # default value of the environment (not 9.81)\n",
" m = 1\n",
" l = 1\n",
" dt = 0.05\n",
"\n",
" u = action\n",
" u = torch.clamp(u, -2, 2)\n",
"\n",
" newthdot = (\n",
" thdot\n",
" + (-3 * g / (2 * l) * torch.sin(th + np.pi) + 3.0 / (m * l**2) * u) * dt\n",
" )\n",
" newth = th + newthdot * dt\n",
" newthdot = torch.clamp(newthdot, -8, 8)\n",
"\n",
" state = torch.cat((angle_normalize(newth), newthdot), dim=1)\n",
" return state\n",
"\n",
"\n",
"def angle_normalize(x):\n",
" return ((x + math.pi) % (2 * math.pi)) - math.pi"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "eSb9nKlw4Gra"
},
"source": [
"# Model Predictive Control (50 points)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "yc8yKVti4tMp"
},
"source": [
"[mpc.pytorch](https://locuslab.github.io/mpc.pytorch/) is a library that provides a fast and differentiable [Model Predictive Control](https://en.wikipedia.org/wiki/Model_predictive_control) (MPC) solver for PyTorch. It was developed by researchers at [LocusLab](https://locuslab.github.io/) and is designed to integrate seamlessly with PyTorch, allowing for efficient and flexible control of dynamic systems.\n",
"\n",
"If you are interested to learn more, check out [OptNet](https://arxiv.org/abs/1703.00443) and [Differentiable MPC](https://arxiv.org/abs/1810.13400).\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "PfDVMqgi5kax"
},
"source": [
"## Quick Setup\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "qU9dpT0C5nFg"
},
"source": [
"In order to install this library you can use `pip`:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "HEyJ0SPi4W28"
},
"outputs": [],
"source": [
"! pip install mpc"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "J9Ev1gLC5uGd"
},
"source": [
"While `mpc` offers a lot, in this notebook we are going to focus only on the core features.\n",
"To learn more checkout the [GitHub repository](https://github.com/locuslab/mpc.pytorch) of this project.\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"id": "euuwSTJ14WO-"
},
"outputs": [],
"source": [
"from mpc import mpc"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "tf0ALVu7Ggsh"
},
"source": [
"## The Cost Function\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "l9pgPno8GjFV"
},
"source": [
"The `define_swingup_goal` function creates a cost function that the MPC algorithm uses to determine the optimal control actions to achieve the desired pendulum swing-up task.\n",
"It considers both the desired state (upright and stationary) and penalizes large control inputs to ensure smooth control actions.\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"id": "13hsSR8cGLzA"
},
"outputs": [],
"source": [
"def define_swingup_goal():\n",
" goal_weights = torch.tensor((1.0, 0.1)) # Weights for theta and theta_dot\n",
" goal_state = torch.tensor((0.0, 0.0)) # Desired state (theta=0, theta_dot=0)\n",
" ctrl_penalty = 0.001\n",
" q = torch.cat((goal_weights, ctrl_penalty * torch.ones(1))) # Combined weights\n",
" px = -torch.sqrt(goal_weights) * goal_state\n",
" p = torch.cat((px, torch.zeros(1)))\n",
" Q = torch.diag(q).repeat(TIMESTEPS, N_BATCH, 1, 1) # Cost matrix\n",
" p = p.repeat(TIMESTEPS, N_BATCH, 1)\n",
" return mpc.QuadCost(Q, p) # Quadratic cost"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "4ILZGtcdLeFb"
},
"source": [
"## Running MPC\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "JskzIJuLMpoe"
},
"source": [
"To run the MPC, in each iteration:\n",
"\n",
"1. First you obtain the current state of the environment and convert it to a tensor.\n",
"2. Then you recreate the MPC controller using the updated `u_init` and calculate the optimal control actions based on the current state, dynamics, and cost function.\n",
"3. Next you take the first planned action and update `u_init` with the remaining actions.\n",
"4. Finally you take a step in the environment and store the rewards and actions.\n",
"\n",
"Remember that `u_init` serves as the initial guess for the control inputs.\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"id": "tE45H5NI05Q_"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Exception ignored in: <function RecordVideo.__del__ at 0x10fad0b80>\n",
"Traceback (most recent call last):\n",
" File \"/Users/tahamajs/Documents/uni/DRL/.venv/lib/python3.13/site-packages/gymnasium/wrappers/rendering.py\", line 433, in __del__\n",
" if len(self.recorded_frames) > 0:\n",
"AttributeError: 'RecordVideo' object has no attribute 'recorded_frames'\n"
]
},
{
"ename": "DependencyNotInstalled",
"evalue": "moviepy is not installed, run `pip install \"gymnasium[other]\"`",
"output_type": "error",
"traceback": [
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
"\u001b[31mModuleNotFoundError\u001b[39m Traceback (most recent call last)",
"\u001b[36mFile \u001b[39m\u001b[32m~/Documents/uni/DRL/.venv/lib/python3.13/site-packages/gymnasium/utils/save_video.py:13\u001b[39m\n\u001b[32m 12\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m---> \u001b[39m\u001b[32m13\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mmoviepy\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mvideo\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mio\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mImageSequenceClip\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m ImageSequenceClip\n\u001b[32m 14\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mImportError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n",
"\u001b[31mModuleNotFoundError\u001b[39m: No module named 'moviepy'",
"\nThe above exception was the direct cause of the following exception:\n",
"\u001b[31mDependencyNotInstalled\u001b[39m Traceback (most recent call last)",
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[6]\u001b[39m\u001b[32m, line 11\u001b[39m\n\u001b[32m 9\u001b[39m env = gym.make(\u001b[33m\"\u001b[39m\u001b[33mPendulum-v1\u001b[39m\u001b[33m\"\u001b[39m, render_mode=\u001b[33m\"\u001b[39m\u001b[33mrgb_array\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 10\u001b[39m video_directory = \u001b[33m\"\u001b[39m\u001b[33mmpc_videoss\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m---> \u001b[39m\u001b[32m11\u001b[39m env = \u001b[43mRecordVideo\u001b[49m\u001b[43m(\u001b[49m\u001b[43menv\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvideo_directory\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 12\u001b[39m env.reset() \u001b[38;5;66;03m# Reset the underlying environment\u001b[39;00m\n\u001b[32m 13\u001b[39m env.unwrapped.state = [np.pi, \u001b[32m1\u001b[39m] \u001b[38;5;66;03m# Environment must start in downward position\u001b[39;00m\n",
"\u001b[36mFile \u001b[39m\u001b[32m~/Documents/uni/DRL/.venv/lib/python3.13/site-packages/gymnasium/wrappers/rendering.py:282\u001b[39m, in \u001b[36mRecordVideo.__init__\u001b[39m\u001b[34m(self, env, video_folder, episode_trigger, step_trigger, video_length, name_prefix, fps, disable_logger, gc_trigger)\u001b[39m\n\u001b[32m 276\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 277\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mRender mode is \u001b[39m\u001b[38;5;132;01m{\u001b[39;00menv.render_mode\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m, which is incompatible with RecordVideo.\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 278\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mInitialize your environment with a render_mode that returns an image, such as rgb_array.\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 279\u001b[39m )\n\u001b[32m 281\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m episode_trigger \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m step_trigger \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m282\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mgymnasium\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mutils\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01msave_video\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m capped_cubic_video_schedule\n\u001b[32m 284\u001b[39m episode_trigger = capped_cubic_video_schedule\n\u001b[32m 286\u001b[39m \u001b[38;5;28mself\u001b[39m.episode_trigger = episode_trigger\n",
"\u001b[36mFile \u001b[39m\u001b[32m~/Documents/uni/DRL/.venv/lib/python3.13/site-packages/gymnasium/utils/save_video.py:15\u001b[39m\n\u001b[32m 13\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mmoviepy\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mvideo\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mio\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mImageSequenceClip\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m ImageSequenceClip\n\u001b[32m 14\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mImportError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m---> \u001b[39m\u001b[32m15\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m gym.error.DependencyNotInstalled(\n\u001b[32m 16\u001b[39m \u001b[33m'\u001b[39m\u001b[33mmoviepy is not installed, run `pip install \u001b[39m\u001b[33m\"\u001b[39m\u001b[33mgymnasium[other]\u001b[39m\u001b[33m\"\u001b[39m\u001b[33m`\u001b[39m\u001b[33m'\u001b[39m\n\u001b[32m 17\u001b[39m ) \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01me\u001b[39;00m\n\u001b[32m 20\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mcapped_cubic_video_schedule\u001b[39m(episode_id: \u001b[38;5;28mint\u001b[39m) -> \u001b[38;5;28mbool\u001b[39m:\n\u001b[32m 21\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33mr\u001b[39m\u001b[33;03m\"\"\"The default episode trigger.\u001b[39;00m\n\u001b[32m 22\u001b[39m \n\u001b[32m 23\u001b[39m \u001b[33;03m This function will trigger recordings at the episode indices :math:`\\{0, 1, 4, 8, 27, ..., k^3, ..., 729, 1000, 2000, 3000, ...\\}`\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 29\u001b[39m \u001b[33;03m If to apply a video schedule number\u001b[39;00m\n\u001b[32m 30\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n",
"\u001b[31mDependencyNotInstalled\u001b[39m: moviepy is not installed, run `pip install \"gymnasium[other]\"`"
]
}
],
"source": [
"# Select the hyperparameters\n",
"RUN_ITER = 200 # Number of iterations to run MPC\n",
"TIMESTEPS = 10 # MPC horizon length\n",
"N_BATCH = 1 # Batch size for MPC\n",
"LQR_ITER = 5 # Number of LQR iterations for convergence\n",
"\n",
"\n",
"# Setup the environmnet\n",
"env = gym.make(\"Pendulum-v1\", render_mode=\"rgb_array\")\n",
"video_directory = \"mpc_videoss\"\n",
"env = RecordVideo(env, video_directory)\n",
"env.reset() # Reset the underlying environment\n",
"env.unwrapped.state = [np.pi, 1] # Environment must start in downward position\n",
"\n",
"\n",
"# Define the cost function and initialize u\n",
"cost = define_swingup_goal()\n",
"u_init = None\n",
"\n",
"\n",
"# Run MPC\n",
"rewards, actions = [], []\n",
"for _ in (pbar := trange(RUN_ITER)):\n",
" state = env.unwrapped.state.copy()\n",
" state = torch.tensor(state).view(1, -1)\n",
" # recreate controller using updated u_init (kind of wasteful right?)\n",
" ctrl = mpc.MPC(\n",
" 2,\n",
" 1,\n",
" TIMESTEPS,\n",
" u_lower=-2.0,\n",
" u_upper=+2.0,\n",
" lqr_iter=LQR_ITER,\n",
" exit_unconverged=False,\n",
" eps=1e-2,\n",
" n_batch=N_BATCH,\n",
" backprop=False,\n",
" verbose=0,\n",
" u_init=u_init,\n",
" grad_method=mpc.GradMethods.AUTO_DIFF,\n",
" )\n",
"\n",
" # compute action based on current state, dynamics, and cost\n",
" nominal_states, nominal_actions, nominal_objs = ctrl(\n",
" state, cost, PendulumDynamics()\n",
" )\n",
"\n",
" # Take first planned action\n",
" action = nominal_actions[0, 0, 0].item()\n",
"\n",
" # Update u_init\n",
" u_init = torch.cat((nominal_actions[1:], torch.zeros(1, N_BATCH, 1)), dim=0)\n",
"\n",
" # Take a step in the environment\n",
" state, reward, terminated, truncated, info = env.step([action])\n",
"\n",
" # Store the latest action and reward\n",
" actions.append(action)\n",
" rewards.append(reward)\n",
"\n",
" pbar.set_description(f\"Action = {actions[-1]:.2f} | Reward = {rewards[-1]:.2f}\")\n",
" env.render()\n",
"\n",
"env.close()\n",
"\n",
"# Plot the results\n",
"plot_results(rewards, actions)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 501
},
"id": "4FX9ANmENtUO",
"outputId": "4a8b39a3-7499-481f-c9b8-fd5880df3563"
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <video width=\"640\" height=\"480\" controls>\n",
" <source src=\"data:video/mp4;base64,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AA8oY3R0cwAAAAAAAAHjAAAAAgAABAAAAAABAAAGAAAAAAEAAAIAAAAAAwAABAAAAAABAAAGAAAAAAEAAAIAAAAAAgAABAAAAAABAAAGAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAAEAAAEAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAwAABAAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAYAAAAAAQAAAgAAAAABAAAIAAAAAAIAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAYAAAAAAQAAAgAAAAABAAAEAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAABQAABAAAAAABAAAIAAAAAAIAAAIAAAAAAgAABAAAAAABAAAIAAAAAAIAAAIAAAAAAQAABAAAAAABAAAGAAAAAAEAAAIAAAAAAQAABAAAAAABAAAGAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAABgAAAAABAAACAAAAAAEAAAQAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAQAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAIAAAQAAAAAHHN0c2MAAAAAAAAAAQAAAAEAAAH1AAAAAQAAB+hzdHN6AAAAAAAAAAAAAAH1AAAFVQAABWQAAAGsAAAAwQAAAUkAAAFPAAABmwAAAfYAAACqAAABYAAAAVwAAAGOAAAAagAAACEAAACFAAAAQQAAAEgAAADYAAAA3gAAARMAAAEfAAAEqwAAAcwAAADHAAABHAAAAbYAAAH+AAAB5AAAAtEAAAH3AAABPQAAAQoAAAGxAAAA3AAAAeIAAAC7AAAApQAAAN0AAABcAAAAVgAAAEIAAAGRAAAArgAAAGkAAAClAAAB4wAAAMwAAAFmAAAEHwAAAkYAAAEdAAABjQAAAYQAAAHlAAACLAAAAfYAAAHFAAADWgAAAfUAAAG7AAAC9AAAAs0AAAKGAAABfQAAAOkAAAHsAAAC0wAAAN4AAAGaAAACEAAAAMcAAAH8AAABVwAAAN0AAADuAAABnwAAAJ0AAACXAAAAbwAAASgAAABTAAAAVgAAAEIAAABiAAAAMAAAAFAAAACWAAAARAAAACYAAAAoAAAAbQAAACkAAAAaAAAAHwAAADAAAAAcAAAAFAAAABkAAAA6AAAAHgAAABoAAAAUAAAAOwAAABsAAAAZAAAAFAAAABwAAAAWAAAAFAAAABQAAAAcAAAAFgAAABQAAAAUAAAAHAAAABYAAAAUAAAAFAAAABwAAAAWAAAAFAAAABQAAAAcAAAAFgAAABQAAAAUAAAAHAAAABYAAAAUAAAAFAAAABwAAAAWAAAAFAAAABQAAAAcAAAAFgAAABQAAAAUAAAAHAAAABYAAAAUAAAAFAAAABwAAAAWAAAAFAAAABQAAAAoAAAAFgAAABQAAAAUAAAAHQAAABYAAAAUAAAAFAAAABwAAAAWAAAAFAAAABQAAAAcAAAAFgAAABQAAAAUAAAANQAAABYAAAAUAAAAFAAAACQAAAAWAAAAFAAAABQAAAAoAAAAFgAAABQAAAAUAAAAVAAAABwAAAAaAAAAEwAAABwAAAAVAAAAEwAAABMAAABIAAAAHQAAABMAAAAaAAAAHAAAABYAAAAUAAAAFAAAABwAAAAWAAAAFAAAABQAAAAiAAAAFgAAABQAAAAUAAAATgAAABwAAAAaAAAAFAAAABwAAAAWAAAAFAAAABQAAABEAAAAHQAAABQAAAAaAAAAHwAAABYAAAAUAAAAEwAAABwAAAAVAAAAEwAAABMAAAAcAAAAFQAAABMAAAATAAAAHAAAABUAAAATAAAAEwAAAFAAAAAbAAAAGQAAABMAAAAcAAAAFQAAABMAAAATAAAAUQAAABwAAAAZAAAAFAAAACQAAAAWAAAAFAAAABQAAAAhAAAAFgAAABQAAAAUAAAAHAAAABYAAAAUAAAAFAAAAmIAAAAfAAAAEwAAABQAAAATAAAAHAAAABUAAAATAAAAEwAAABwAAAAVAAAAEwAAABMAAAAcAAAAFQAAABMAAAATAAAAHAAAABUAAAATAAAAEwAAACUAAAAVAAAAEwAAABMAAAAiAAAAFQAAABMAAAATAAAATQAAABwAAAATAAAAGgAAABwAAAAYAAAAEwAAABMAAAAcAAAAGAAAABMAAAATAAAAHAAAABgAAAATAAAAEwAAAEAAAAAdAAAAEwAAABoAAAAcAAAAGAAAABMAAAATAAAAHAAAABgAAAATAAAAEwAAABwAAAAYAAAAEwAAABMAAAAcAAAAGAAAABMAAAATAAAASgAAAB0AAAAZAAAAFQAAACAAAAAYAAAAFQAAABUAAABNAAAAHQAAABoAAAAVAAAAHAAAABgAAAAVAAAAFQAAABwAAAAYAAAAFQAAABUAAAAcAAAAGAAAABUAAAAVAAAAHAAAABgAAAAVAAAAFQAAABwAAAAYAAAAFQAAABUAAAAcAAAAGAAAABUAAAAVAAAAHAAAABgAAAAVAAAAFQAAABwAAAAYAAAAFQAAABUAAAAcAAAAGAAAABUAAAAVAAAAHAAAABgAAAAVAAAAFQAAABwAAAAYAAAAFQAAABUAAABPAAAAHQAAABoAAAAVAAAAIAAAABgAAAAVAAAAFQAAABwAAAAYAAAAFQAAABUAAAAcAAAAGAAAABUAAAAVAAAASAAAAB0AAAAaAAAAFQAAABwAAAAYAAAAFQAAABUAAAAcAAAAGAAAABUAAAAVAAAAHAAAABgAAAAVAAAAFQAAAE4AAAAdAAAAFQAAABoAAAAeAAAAGAAAABUAAAAUAAAASQAAAB0AAAAUAAAAGgAAABwAAAAWAAAAEwAAABMAAAAcAAAAFgAAABMAAAATAAAAHAAAABYAAAATAAAAEwAAABwAAAAWAAAAEwAAABMAAAAcAAAAFgAAABMAAAATAAAAHAAAABYAAAATAAAAEwAAABwAAAAWAAAAEwAAABMAAAAcAAAAFgAAABMAAAATAAAAHAAAABYAAAATAAAAEwAAABwAAAAWAAAAEwAAABMAAAAcAAAAFgAAABMAAAATAAAATAAAAB0AAAATAAAAGgAAABwAAAAYAAAAFAAAABQAAAAcAAAAGAAAABQAAAAUAAAAHAAAABgAAAAUAAAAFAAAADwAAAAdAAAAFAAAABoAAAAcAAAAGAAAABQAAAAUAAAAHAAAABgAAAAUAAAAFAAAABwAAAAYAAAAFAAAABQAAAAcAAAAGAAAABQAAAAUAAAANQAAAB0AAAAaAAAAFQAAABsAAAGMAAAAFHN0Y28AAAAAAAAAAQAAADAAAABhdWR0YQAAAFltZXRhAAAAAAAAACFoZGxyAAAAAAAAAABtZGlyYXBwbAAAAAAAAAAAAAAAACxpbHN0AAAAJKl0b28AAAAcZGF0YQAAAAEAAAAATGF2ZjYxLjEuMTAw\" type=\"video/mp4\">\n",
" Your browser does not support the video tag.\n",
" </video>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Show the policy learned\n",
"embed_mp4(f\"{video_directory}/rl-video-episode-0.mp4\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "jskFvBFHLido"
},
"source": [
"# Questions (25 points)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "9Pk2jwFVNzTZ"
},
"source": [
"Based on your experiments, answer the following questions:\n",
"\n",
"- How does the number of LQR iterations affect the MPC?\n",
"- What if we didn't have access to the model dynamics? Could we still use MPC?\n",
"- Do `TIMESTEPS` or `N_BATCH` matter here? Explain.\n",
"- Why do you think we chose to set the initial state of the environment to the downward position?\n",
"- As time progresses (later iterations) what happens to the actions and rewards? Why?\n",
"\n",
"`Your Answers:`\n",
"\n",
"**1. How does the number of LQR iterations affect the MPC?**\n",
"\n",
"The number of LQR iterations determines how well the MPC controller converges to the optimal solution. More LQR iterations generally lead to better convergence and more accurate control actions, but at the cost of increased computational time. With too few iterations, the controller might not converge properly and could produce suboptimal actions. However, there's a diminishing returns effect - beyond a certain point, additional iterations provide minimal improvement.\n",
"\n",
"**2. What if we didn't have access to the model dynamics? Could we still use MPC?**\n",
"\n",
"No, traditional MPC requires an accurate model of the system dynamics to predict future states and optimize control actions. Without the model dynamics, we cannot:\n",
"\n",
"- Predict how the system will evolve under different control inputs\n",
"- Solve the optimization problem that MPC relies on\n",
"- Plan ahead effectively\n",
"\n",
"However, we could potentially use data-driven approaches like:\n",
"\n",
"- Learning the dynamics model from data (model learning)\n",
"- Using neural networks to approximate the dynamics\n",
"- Model-free reinforcement learning methods instead\n",
"\n",
"**3. Do `TIMESTEPS` or `N_BATCH` matter here? Explain.**\n",
"\n",
"Yes, both parameters significantly affect MPC performance:\n",
"\n",
"- **TIMESTEPS**: This is the prediction horizon length. A longer horizon allows the controller to plan further ahead, which is crucial for tasks like swing-up where the pendulum needs to build momentum over multiple steps. However, longer horizons increase computational cost and may lead to less accurate long-term predictions.\n",
"\n",
"- **N_BATCH**: This determines how many parallel optimization problems are solved. In this single-agent case, N_BATCH=1 is appropriate. Larger batch sizes would be useful for multi-agent scenarios or when solving multiple related control problems simultaneously, but they increase computational requirements.\n",
"\n",
"**4. Why do you think we chose to set the initial state of the environment to the downward position?**\n",
"\n",
"We set the initial state to the downward position (θ=π, θ̇=1) because:\n",
"\n",
"- This represents the most challenging starting condition for the swing-up task\n",
"- It tests the controller's ability to perform the complete swing-up maneuver from the worst-case scenario\n",
"- Starting from rest (θ=π, θ̇=0) would be easier but less representative of real-world scenarios\n",
"- It demonstrates the controller's capability to handle the full range of the pendulum's motion\n",
"\n",
"**5. As time progresses (later iterations) what happens to the actions and rewards? Why?**\n",
"\n",
"As the MPC controller progresses:\n",
"\n",
"- **Actions**: Initially, actions are large and aggressive to build momentum for swing-up. As the pendulum approaches the upright position, actions become smaller and more precise for stabilization. Eventually, actions oscillate around small values to maintain balance.\n",
"\n",
"- **Rewards**: Rewards start very negative (around -16) due to the pendulum being far from the goal state. As the controller successfully swings up the pendulum, rewards improve significantly. Once the pendulum is balanced upright, rewards stabilize around higher values (closer to 0), with small fluctuations due to the continuous control needed to maintain balance.\n",
"\n",
"This behavior occurs because the MPC controller is optimizing for the swing-up and balance task, transitioning from large corrective actions to fine-tuning control as the system approaches the desired state.\n"
]
}
],
"metadata": {
"colab": {
"collapsed_sections": [
"UxK08xN_wco-",
"qTS3Lm1nWiMK",
"ErwP00DkW_L6",
"GJHiYFIiX6OJ"
],
"provenance": [],
"toc_visible": true
},
"kernelspec": {
"display_name": ".venv",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.1"
},
"widgets": {
"application/vnd.jupyter.widget-state+json": {
"300f0a5bade84684942da27934e1e0b5": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"318ed47730304069a2978696d0e58fd7": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "DescriptionStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
"description_width": ""
}
},
"4d1a6ace29c043b191691c182e1e1fd1": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"884ea4976a7543d38937c8c8a8ca6414": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HTMLModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "HTMLModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "HTMLView",
"description": "",
"description_tooltip": null,
"layout": "IPY_MODEL_a9c7183dcac64c7dba06525a831bf135",
"placeholder": "​",
"style": "IPY_MODEL_318ed47730304069a2978696d0e58fd7",
"value": " 500/500 [00:13&lt;00:00, 93.26it/s]"
}
},
"8fca041fb7a54f198e86951c5468434b": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HTMLModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "HTMLModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "HTMLView",
"description": "",
"description_tooltip": null,
"layout": "IPY_MODEL_4d1a6ace29c043b191691c182e1e1fd1",
"placeholder": "​",
"style": "IPY_MODEL_cfc793ef3ee648bbb3b77d9ccfd0e8ea",
"value": "Action = -0.83 | Reward = -7.56: 100%"
}
},
"a9c7183dcac64c7dba06525a831bf135": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"c48f9ad4e3214bbe8d7518441bd56339": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HBoxModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "HBoxModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "HBoxView",
"box_style": "",
"children": [
"IPY_MODEL_8fca041fb7a54f198e86951c5468434b",
"IPY_MODEL_e31240662e47413f93d3db20b230b701",
"IPY_MODEL_884ea4976a7543d38937c8c8a8ca6414"
],
"layout": "IPY_MODEL_e4ef931db4dd47dd855291b4d4cfe584"
}
},
"cfc793ef3ee648bbb3b77d9ccfd0e8ea": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "DescriptionStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
"description_width": ""
}
},
"d51aaee7e0874f8c98b468dfce881fc6": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "ProgressStyleModel",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "ProgressStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
"bar_color": null,
"description_width": ""
}
},
"e31240662e47413f93d3db20b230b701": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "FloatProgressModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "FloatProgressModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "ProgressView",
"bar_style": "success",
"description": "",
"description_tooltip": null,
"layout": "IPY_MODEL_300f0a5bade84684942da27934e1e0b5",
"max": 500,
"min": 0,
"orientation": "horizontal",
"style": "IPY_MODEL_d51aaee7e0874f8c98b468dfce881fc6",
"value": 500
}
},
"e4ef931db4dd47dd855291b4d4cfe584": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
}
}
}
},
"nbformat": 4,
"nbformat_minor": 0
}

Xet Storage Details

Size:
111 kB
·
Xet hash:
6abc7834b6dbcfb1f5fdc2d3c597d3a78bab3d780f807e73be3d490c09350e8b

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.