diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..2d6156c2af21384bc540f6f8542ca2310b9e31b3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,58 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# Virtual Environment +venv/ +ENV/ +.venv +# Note: env/ is our project folder, not a virtual environment + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# Jupyter Notebook +.ipynb_checkpoints + +# PyTorch +*.pth +*.pt + +# Model checkpoints and logs +models/*.pkl +models/*.h5 +models/*.ckpt +logs/ +runs/ +wandb/ + +# Environment variables +.env +.env.local + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..40fd5b1e6a1381dbb53613bf7a597ded6a49dda3 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,22 @@ +FROM pytorch/pytorch:2.0.1-cuda11.7-cudnn8-runtime + +# Install system dependencies for PyBullet/OpenGL +RUN apt-get update && apt-get install -y \ + libgl1-mesa-glx \ + libglib2.0-0 \ + git \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /app + +# Copy requirements and install +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt +RUN pip install huggingface_hub + +# Copy project files +COPY . . + +# Default command (can be overridden in Space settings) +# Expects HF_TOKEN and REPO_ID env vars to be set in the Space +CMD ["python", "train_hf.py", "--repo_id", "ylop/neuro-flyt-3d", "--steps", "500000"] diff --git a/README.md b/README.md index 5f9b5a60d8a4f556a7bdc24baecdc6b6b5900a51..98192adb9c2a7980f8b2cce29890f4b83d4c615c 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,34 @@ ---- -title: Team 22 -emoji: 🌍 -colorFrom: indigo -colorTo: gray -sdk: docker -pinned: false -license: mit ---- - -Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference +# Project Neuro-Flyt 3D + +**Goal:** Build a verifiable 3D Drone Control verification demo using Liquid Neural Networks. + +## Installation + +1. **Clone the repository** (if you haven't already). +2. **Install dependencies:** + ```bash + pip install -r requirements.txt + ``` + *Note: You may need to install `opensimplex` and `ncps` manually if they are not in `requirements.txt` yet.* + ```bash + pip install opensimplex ncps + ``` + +## Usage + +### Run the Demo +To launch the 3D visualization with the "Antigravity" hurricane effect: +```bash +./run_demo.sh +``` + +### Verify Physics +To verify that the wind field is generating non-zero forces: +```bash +python test_physics.py +``` + +## Project Structure +- `env/drone_3d.py`: Custom PyFlyt environment with 3D Perlin noise wind field. +- `models/liquid_ppo.py`: PPO agent with LTC (Liquid Time-Constant) feature extractor. +- `demo_3d.py`: Main visualization script. diff --git a/README_HF.md b/README_HF.md new file mode 100644 index 0000000000000000000000000000000000000000..c93478a4a52892095aa15841d237e2c548f984dc --- /dev/null +++ b/README_HF.md @@ -0,0 +1,79 @@ +# Deploying Neuro-Flyt 3D to Hugging Face Spaces + +This guide explains how to use your organization's GPUs on Hugging Face to train the Neuro-Flyt 3D model. + +## Prerequisites +1. A Hugging Face Account. +2. An Organization with GPU billing enabled (or a personal account with GPU access). +3. A Write Access Token (Settings -> Access Tokens). + +## Steps + +### 1. Create a New Space +1. Go to [huggingface.co/new-space](https://huggingface.co/new-space). +2. **Owner:** Select your Organization. +3. **Space Name:** `neuro-flyt-training` (or similar). +4. **SDK:** Select **Docker**. +5. **Space Hardware:** Select a GPU instance (e.g., **T4 small** or **A10G**). + +### 2. Configure Secrets +In the Space settings, go to **Settings -> Variables and secrets**. +Add the following **Secret**: +- `HF_TOKEN`: Your Write Access Token (starts with `hf_...`). + +### 3. Deploy Code +You can deploy by pushing the code to the Space's Git repository. + +```bash +# 1. Install git-lfs if needed +git lfs install + +# 2. Clone your Space (replace with your actual repo URL) +git clone https://huggingface.co/spaces/YOUR_ORG/neuro-flyt-training +cd neuro-flyt-training + +# 3. Copy project files +cp -r /path/to/Drone-go-brrrrr/* . + +# 4. Push to Space +git add . +git commit -m "Deploy training job" +git push +``` + +### 4. Monitor Training +- Go to the **App** tab in your Space. +- You will see the training logs in real-time. +- The training will run for 500,000 steps. + +### 5. Access Trained Model +- Once finished, the script will automatically push the trained model (`liquid_ppo_drone_final.zip`) to your Model Repository (defined in `train_hf.py` or via arguments). +- You can then download this model and use it locally with `demo_3d.py`. + +## Customization +- **Repo ID:** Edit `Dockerfile` or `train_hf.py` to change the target Model Repository ID (`--repo_id`). +- **Steps:** Change `--steps` in `Dockerfile` to adjust training duration. + +## Hardware & Training Recommendations + +### Which GPU? +* **A100 Large (80GB):** **The Ultimate Choice.** If you want to train for 5M+ episodes in the shortest time possible, pick this. We have optimized the code to use **16 Parallel Environments** and **Large Batch Sizes (4096)** to fully saturate the A100. +* **A10G Large (24GB):** **Excellent Value.** Very fast and capable. It will handle the parallel training easily and is much cheaper than the A100. +* **T4 (16GB):** **Budget Option.** It will work, but you won't see the massive speedup from the parallelization as clearly as with the Ampere cards (A10/A100). + +### Efficiency Optimization (Implemented) +To ensure the GPU doesn't sit idle, we have updated `train_hf.py` to: +1. **Parallel Physics:** Run **16 Drones** simultaneously on the CPU. +2. **Large Batches:** Process **4096 samples** at once on the GPU. +3. **Result:** Training is ~10-15x faster than the standard script. + +### How Many Episodes? +The environment `max_steps` is 1000. +* **Minimum (Proof of Concept):** **500,000 Steps** (500 Episodes). The drone will learn to hover and roughly follow the target. +* **Recommended (Robust):** **1,000,000 - 2,000,000 Steps** (1000 - 2000 Episodes). This allows the Liquid Network to fully adapt to the random wind turbulence and master the physics. +* **High Performance:** **5,000,000+ Steps**. For "perfect" flight control. + +### Efficiency Tip +Reinforcement Learning is often CPU-bound (physics simulation). To train efficiently: +1. Use a Space with **many CPU vCores** (8+) to run environments in parallel. +2. Use the **A10G** GPU to handle the heavy math of the Liquid Time-Constant (LTC) cells. diff --git a/debug_imports.py b/debug_imports.py new file mode 100644 index 0000000000000000000000000000000000000000..f15d00d655b25b29eeba876c55356ec76c0f549d --- /dev/null +++ b/debug_imports.py @@ -0,0 +1,31 @@ +import sys +print(f"Python version: {sys.version}") +try: + import numpy + print("Numpy imported") +except ImportError as e: + print(f"Numpy failed: {e}") + +try: + import gymnasium + print("Gymnasium imported") +except ImportError as e: + print(f"Gymnasium failed: {e}") + +try: + import PyFlyt + print("PyFlyt imported") +except ImportError as e: + print(f"PyFlyt failed: {e}") + +try: + import opensimplex + print("Opensimplex imported") +except ImportError as e: + print(f"Opensimplex failed: {e}") + +try: + import ncps + print("Ncps imported") +except ImportError as e: + print(f"Ncps failed: {e}") diff --git a/demo/__init__.py b/demo/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..c0ad8bbdbaaec94227a7a3a1be744c6bdaa996a8 --- /dev/null +++ b/demo/__init__.py @@ -0,0 +1,2 @@ +"""Demo and visualization scripts.""" + diff --git a/demo/visualize_drone.py b/demo/visualize_drone.py new file mode 100644 index 0000000000000000000000000000000000000000..4bfc374e637300e7712b93808230cdb93c61dfe6 --- /dev/null +++ b/demo/visualize_drone.py @@ -0,0 +1,425 @@ +""" +Visual demonstration of the drone environment using Pygame. + +This script loads a trained model and visualizes the drone navigating +through the environment with wind forces. +""" + +import os +import sys +import pygame +import numpy as np +from typing import Optional + +# Add project root to path +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from env.drone_env import DroneWindEnv +from stable_baselines3 import PPO + + +# Pygame constants +WINDOW_WIDTH = 800 +WINDOW_HEIGHT = 600 +FPS = 30 + +# Color definitions +BLACK = (0, 0, 0) +WHITE = (255, 255, 255) +RED = (255, 0, 0) +GREEN = (0, 255, 0) +BLUE = (0, 0, 255) +YELLOW = (255, 255, 0) +CYAN = (0, 255, 255) +MAGENTA = (255, 0, 255) +GRAY = (128, 128, 128) +DARK_GRAY = (64, 64, 64) +ORANGE = (255, 165, 0) + + +class DroneVisualizer: + """Pygame-based visualizer for the drone environment.""" + + def __init__(self, env: DroneWindEnv, model: Optional[PPO] = None): + """ + Initialize the visualizer. + + Args: + env: DroneWindEnv instance + model: Optional trained PPO model (if None, uses random actions) + """ + self.env = env + self.model = model + + # Initialize Pygame + pygame.init() + self.screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) + pygame.display.set_caption("Drone RL - Visual Demonstration") + self.clock = pygame.time.Clock() + self.font = pygame.font.Font(None, 24) + self.small_font = pygame.font.Font(None, 18) + + # World to screen scaling + # Environment is [0, 1] x [0, 1], we'll use most of the screen + self.world_margin = 50 + self.world_width = WINDOW_WIDTH - 2 * self.world_margin + self.world_height = WINDOW_HEIGHT - 2 * self.world_margin + + def world_to_screen(self, x: float, y: float) -> tuple[int, int]: + """Convert world coordinates [0,1] to screen coordinates.""" + screen_x = int(self.world_margin + x * self.world_width) + # Flip y-axis (world y=0 is bottom, screen y=0 is top) + screen_y = int(WINDOW_HEIGHT - self.world_margin - y * self.world_height) + return screen_x, screen_y + + def draw_drone(self, x: float, y: float, vx: float, vy: float): + """Draw the drone as a circle with velocity vector.""" + screen_x, screen_y = self.world_to_screen(x, y) + + # Draw drone body (circle) + drone_radius = 15 + pygame.draw.circle(self.screen, CYAN, (screen_x, screen_y), drone_radius) + pygame.draw.circle(self.screen, BLUE, (screen_x, screen_y), drone_radius, 2) + + # Draw velocity vector + if abs(vx) > 0.01 or abs(vy) > 0.01: + # Scale velocity for visualization + scale = 30 + end_x = screen_x + int(vx * scale) + end_y = screen_y - int(vy * scale) # Flip y for screen + pygame.draw.line(self.screen, YELLOW, (screen_x, screen_y), (end_x, end_y), 3) + # Draw arrowhead + if abs(vx) > 0.01 or abs(vy) > 0.01: + angle = np.arctan2(-vy, vx) # Negative vy because screen y is flipped + arrow_size = 8 + arrow_x1 = end_x - arrow_size * np.cos(angle - np.pi / 6) + arrow_y1 = end_y - arrow_size * np.sin(angle - np.pi / 6) + arrow_x2 = end_x - arrow_size * np.cos(angle + np.pi / 6) + arrow_y2 = end_y - arrow_size * np.sin(angle + np.pi / 6) + pygame.draw.line(self.screen, YELLOW, (end_x, end_y), (int(arrow_x1), int(arrow_y1)), 2) + pygame.draw.line(self.screen, YELLOW, (end_x, end_y), (int(arrow_x2), int(arrow_y2)), 2) + + def draw_wind(self, wind_x: float, wind_y: float): + """Draw wind arrows indicating direction.""" + # Draw fewer, clearer wind arrows + grid_size = 6 + for i in range(grid_size): + for j in range(grid_size): + x = (i + 0.5) / grid_size + y = (j + 0.5) / grid_size + screen_x, screen_y = self.world_to_screen(x, y) + + # Draw wind arrow + if abs(wind_x) > 0.01 or abs(wind_y) > 0.01: + scale = 25 + end_x = screen_x + int(wind_x * scale) + end_y = screen_y - int(wind_y * scale) # Flip y + + # Color based on wind strength + wind_strength = abs(wind_x) + abs(wind_y) + if wind_strength < 1.0: + color = GREEN + elif wind_strength < 1.5: + color = YELLOW + else: + color = ORANGE + + # Draw arrow line + pygame.draw.line(self.screen, color, (screen_x, screen_y), (end_x, end_y), 3) + + # Draw arrowhead + if abs(wind_x) > 0.01 or abs(wind_y) > 0.01: + angle = np.arctan2(-wind_y, wind_x) # Negative y because screen y is flipped + arrow_size = 10 + arrow_x1 = end_x - arrow_size * np.cos(angle - np.pi / 6) + arrow_y1 = end_y - arrow_size * np.sin(angle - np.pi / 6) + arrow_x2 = end_x - arrow_size * np.cos(angle + np.pi / 6) + arrow_y2 = end_y - arrow_size * np.sin(angle + np.pi / 6) + pygame.draw.polygon(self.screen, color, [ + (end_x, end_y), + (int(arrow_x1), int(arrow_y1)), + (int(arrow_x2), int(arrow_y2)) + ]) + + def draw_boundaries(self): + """Draw the world boundaries.""" + # Top boundary + top_left = self.world_to_screen(0, 1) + top_right = self.world_to_screen(1, 1) + pygame.draw.line(self.screen, RED, top_left, top_right, 3) + + # Bottom boundary + bot_left = self.world_to_screen(0, 0) + bot_right = self.world_to_screen(1, 0) + pygame.draw.line(self.screen, RED, bot_left, bot_right, 3) + + # Left boundary + pygame.draw.line(self.screen, RED, top_left, bot_left, 3) + + # Right boundary + pygame.draw.line(self.screen, RED, top_right, bot_right, 3) + + def draw_target_zone(self, target_spawned: bool = True): + """Draw the target zone (box) that the drone needs to reach.""" + from env.drone_env import TARGET_X_MIN, TARGET_X_MAX, TARGET_Y_MIN, TARGET_Y_MAX, TARGET_SPAWN_DELAY + + # Only draw if target has spawned + if not target_spawned: + return + + # Get screen coordinates for target zone corners + top_left = self.world_to_screen(TARGET_X_MIN, TARGET_Y_MAX) + top_right = self.world_to_screen(TARGET_X_MAX, TARGET_Y_MAX) + bot_left = self.world_to_screen(TARGET_X_MIN, TARGET_Y_MIN) + bot_right = self.world_to_screen(TARGET_X_MAX, TARGET_Y_MIN) + + # Draw target zone as a semi-transparent box + # Create a surface for transparency + target_surface = pygame.Surface((WINDOW_WIDTH, WINDOW_HEIGHT)) + target_surface.set_alpha(100) # Semi-transparent + + # Draw filled rectangle + rect = pygame.Rect( + top_left[0], top_left[1], + top_right[0] - top_left[0], + bot_left[1] - top_left[1] + ) + pygame.draw.rect(target_surface, MAGENTA, rect) + self.screen.blit(target_surface, (0, 0)) + + # Draw border + pygame.draw.line(self.screen, MAGENTA, top_left, top_right, 3) + pygame.draw.line(self.screen, MAGENTA, top_right, bot_right, 3) + pygame.draw.line(self.screen, MAGENTA, bot_right, bot_left, 3) + pygame.draw.line(self.screen, MAGENTA, bot_left, top_left, 3) + + # Draw label + label_x = (top_left[0] + top_right[0]) // 2 + label_y = (top_left[1] + bot_left[1]) // 2 + text = self.small_font.render("TARGET", True, WHITE) + text_rect = text.get_rect(center=(label_x, label_y)) + self.screen.blit(text, text_rect) + + def draw_info(self, step: int, reward: float, action: Optional[int] = None, in_target: bool = False): + """Draw information text.""" + y_offset = 10 + + # Step count + text = self.font.render(f"Step: {step}", True, WHITE) + self.screen.blit(text, (10, y_offset)) + y_offset += 30 + + # Reward + text = self.font.render(f"Reward: {reward:.2f}", True, WHITE) + self.screen.blit(text, (10, y_offset)) + y_offset += 30 + + # In target zone status + target_color = GREEN if in_target else GRAY + target_text = "IN TARGET ZONE!" if in_target else "Not in target" + text = self.font.render(target_text, True, target_color) + self.screen.blit(text, (10, y_offset)) + y_offset += 30 + + # Position + text = self.small_font.render(f"Position: ({self.env.x:.2f}, {self.env.y:.2f})", True, WHITE) + self.screen.blit(text, (10, y_offset)) + y_offset += 25 + + # Velocity + text = self.small_font.render(f"Velocity: ({self.env.vx:.2f}, {self.env.vy:.2f})", True, WHITE) + self.screen.blit(text, (10, y_offset)) + y_offset += 25 + + # Wind + text = self.small_font.render(f"Wind: ({self.env.wind_x:.2f}, {self.env.wind_y:.2f})", True, GREEN) + self.screen.blit(text, (10, y_offset)) + y_offset += 25 + + # Action + if action is not None: + action_names = ["No thrust", "Up", "Down", "Left", "Right"] + text = self.small_font.render(f"Action: {action_names[action]}", True, YELLOW) + self.screen.blit(text, (10, y_offset)) + y_offset += 25 + + # Model info + if self.model is not None: + text = self.small_font.render("Mode: AI Agent (Liquid NN)", True, CYAN) + else: + text = self.small_font.render("Mode: Random Actions", True, GRAY) + self.screen.blit(text, (10, y_offset)) + + def run(self, max_steps: int = 500, speed: float = 1.0): + """ + Run the visualization. + + Args: + max_steps: Maximum number of steps to run + speed: Speed multiplier (1.0 = normal, higher = faster) + """ + obs, info = self.env.reset() + done = False + truncated = False + step_count = 0 + action = None + + running = True + paused = False + + while running and step_count < max_steps: + # Handle events + for event in pygame.event.get(): + if event.type == pygame.QUIT: + running = False + elif event.type == pygame.KEYDOWN: + if event.key == pygame.K_SPACE: + paused = not paused + elif event.key == pygame.K_r: + # Reset + obs, info = self.env.reset() + done = False + truncated = False + step_count = 0 + elif event.key == pygame.K_ESCAPE: + running = False + + if not paused and not done and not truncated: + # Get action + if self.model is not None: + action, _ = self.model.predict(obs, deterministic=True) + else: + action = self.env.action_space.sample() + + # Step environment + obs, reward, done, truncated, info = self.env.step(action) + step_count += 1 + in_target = info.get("in_target", False) + target_spawned = info.get("target_spawned", False) + + # Draw everything + self.screen.fill(BLACK) + + # Draw boundaries + self.draw_boundaries() + + # Draw target zone (only if spawned) + target_spawned_current = info.get("target_spawned", self.env.step_count >= 50) if not paused else False + self.draw_target_zone(target_spawned=target_spawned_current) + + # Draw wind arrows + self.draw_wind(self.env.wind_x, self.env.wind_y) + + # Draw drone + self.draw_drone(self.env.x, self.env.y, self.env.vx, self.env.vy) + + # Get in_target from info if available, otherwise compute + if not paused and 'in_target' in locals(): + current_in_target = in_target + else: + from env.drone_env import TARGET_X_MIN, TARGET_X_MAX, TARGET_Y_MIN, TARGET_Y_MAX + current_in_target = ( + TARGET_X_MIN <= self.env.x <= TARGET_X_MAX and + TARGET_Y_MIN <= self.env.y <= TARGET_Y_MAX + ) + + # Draw info + self.draw_info(step_count, reward if not paused else 0, action, current_in_target) + + # Draw pause indicator + if paused: + text = self.font.render("PAUSED (SPACE to resume)", True, YELLOW) + text_rect = text.get_rect(center=(WINDOW_WIDTH // 2, 30)) + self.screen.blit(text, text_rect) + + # Draw controls + controls_y = WINDOW_HEIGHT - 80 + controls = [ + "SPACE: Pause/Resume", + "R: Reset", + "ESC: Quit" + ] + for i, control in enumerate(controls): + text = self.small_font.render(control, True, GRAY) + self.screen.blit(text, (10, controls_y + i * 20)) + + pygame.display.flip() + + # Control speed + if not paused: + self.clock.tick(FPS * speed) + else: + self.clock.tick(10) + + # Auto-reset on done/truncated + if (done or truncated) and not paused: + pygame.time.wait(1000) # Wait 1 second before reset + obs, info = self.env.reset() + done = False + truncated = False + step_count = 0 + + pygame.quit() + + +def main(): + """Main function to run the visualization.""" + import argparse + + parser = argparse.ArgumentParser(description="Visualize drone environment") + parser.add_argument( + "--model-path", + type=str, + default="models/liquid_policy.zip", + help="Path to trained model (default: models/liquid_policy.zip)" + ) + parser.add_argument( + "--random", + action="store_true", + help="Use random actions instead of trained model" + ) + parser.add_argument( + "--max-steps", + type=int, + default=500, + help="Maximum steps per episode (default: 500)" + ) + parser.add_argument( + "--speed", + type=float, + default=1.0, + help="Animation speed multiplier (default: 1.0)" + ) + + args = parser.parse_args() + + # Create environment + env = DroneWindEnv() + + # Load model if specified + model = None + if not args.random: + if os.path.exists(args.model_path): + print(f"Loading model from {args.model_path}...") + model = PPO.load(args.model_path, env=env) + print("Model loaded successfully!") + else: + print(f"Model not found at {args.model_path}, using random actions") + + # Create visualizer + visualizer = DroneVisualizer(env, model) + + # Run visualization + print("\nStarting visualization...") + print("Controls:") + print(" SPACE: Pause/Resume") + print(" R: Reset episode") + print(" ESC: Quit") + print() + + visualizer.run(max_steps=args.max_steps, speed=args.speed) + + +if __name__ == "__main__": + main() + diff --git a/demo_3d.py b/demo_3d.py new file mode 100644 index 0000000000000000000000000000000000000000..509fe600173dd3c1ec9c42bf12b202a3bb2919d6 --- /dev/null +++ b/demo_3d.py @@ -0,0 +1,72 @@ +import numpy as np +import time +import os +import matplotlib.pyplot as plt +from mpl_toolkits.mplot3d import Axes3D +from env.drone_3d import Drone3DEnv +from models.liquid_ppo import make_liquid_ppo +from stable_baselines3 import PPO + +def run_demo(): + print("Initializing Project Neuro-Flyt 3D Demo (Matplotlib Mode)...") + + env = Drone3DEnv(render_mode="human", wind_scale=5.0, wind_speed=2.0) + + model_path = "liquid_ppo_drone_final.zip" + if os.path.exists(model_path): + print(f"Loading trained model from {model_path}...") + model = PPO.load(model_path, env=env) + else: + print("No trained model found. Using untrained Liquid Brain.") + model = make_liquid_ppo(env, verbose=1) + + print("\n=== DEMO STARTING ===") + + obs, info = env.reset() + + # Setup Plot + fig = plt.figure(figsize=(10, 8)) + ax = fig.add_subplot(111, projection='3d') + + from matplotlib.animation import FuncAnimation + + def update(frame): + nonlocal obs, info + action, _ = model.predict(obs, deterministic=True) + obs, reward, term, trunc, info = env.step(action) + + ax.clear() + ax.set_xlim(-20, 20) + ax.set_ylim(-20, 20) + ax.set_zlim(0, 20) + ax.set_xlabel('X') + ax.set_ylabel('Y') + ax.set_zlabel('Z') + ax.set_title(f'Neuro-Flyt 3D | Step: {frame}') + + pos = obs[0:3] + wind = info.get("wind", np.zeros(3)) + + # Draw Drone + ax.scatter(pos[0], pos[1], pos[2], c='blue', s=100, label='Drone') + + # Draw Wind Vector + ax.quiver(pos[0], pos[1], pos[2], wind[0], wind[1], wind[2], length=1.0, color='red', label='Wind Force') + + # Draw Target + ax.scatter(0, 0, 10, c='green', marker='x', s=100, label='Target') + + ax.legend() + + if term or trunc: + obs, info = env.reset() + + print("Generating Animation (demo.gif)...") + anim = FuncAnimation(fig, update, frames=200, interval=50) + anim.save('demo.gif', writer='pillow', fps=20) + print("Animation saved to demo.gif") + + env.close() + +if __name__ == "__main__": + run_demo() diff --git a/demo_interactive.py b/demo_interactive.py new file mode 100644 index 0000000000000000000000000000000000000000..e14ce6f3fc02cc86119877f0385cd1c4524e863b --- /dev/null +++ b/demo_interactive.py @@ -0,0 +1,124 @@ +import numpy as np +import time +import os +import matplotlib.pyplot as plt +from matplotlib.gridspec import GridSpec +from env.drone_3d import Drone3DEnv +from models.liquid_ppo import make_liquid_ppo +from stable_baselines3 import PPO + +def run_interactive_demo(): + print("Initializing Interactive Dashboard...") + + env = Drone3DEnv(render_mode="human", wind_scale=5.0, wind_speed=2.0) + + model_path = "liquid_ppo_drone_final.zip" + if os.path.exists(model_path): + print(f"Loading trained model from {model_path}...") + model = PPO.load(model_path, env=env) + else: + print("No trained model found. Using untrained Liquid Brain.") + model = make_liquid_ppo(env, verbose=1) + + obs, info = env.reset() + + # Setup Dashboard + plt.ion() + fig = plt.figure(figsize=(14, 8)) + gs = GridSpec(2, 2, width_ratios=[2, 1]) + + # 3D View (Left, spanning both rows) + ax_3d = fig.add_subplot(gs[:, 0], projection='3d') + + # Altitude Plot (Top Right) + ax_alt = fig.add_subplot(gs[0, 1]) + ax_alt.set_title("Altitude (Z)") + ax_alt.set_ylim(0, 15) + ax_alt.set_xlim(0, 100) + line_alt, = ax_alt.plot([], [], 'b-') + + # Wind Speed Plot (Bottom Right) + ax_wind = fig.add_subplot(gs[1, 1]) + ax_wind.set_title("Wind Magnitude") + ax_wind.set_ylim(0, 10) + ax_wind.set_xlim(0, 100) + line_wind, = ax_wind.plot([], [], 'r-') + + # Data Buffers + history_len = 100 + alt_history = [10.0] * history_len + wind_history = [0.0] * history_len + + print("\n=== DASHBOARD LIVE ===") + print("Close the window to exit.") + + try: + step = 0 + while True: + # Predict & Step + action, _ = model.predict(obs, deterministic=True) + obs, reward, term, trunc, info = env.step(action) + + # Update Data + pos = obs[0:3] + wind = info.get("wind", np.zeros(3)) + wind_mag = np.linalg.norm(wind) + + alt_history.append(pos[2]) + alt_history.pop(0) + wind_history.append(wind_mag) + wind_history.pop(0) + + # --- Render 3D View --- + ax_3d.clear() + ax_3d.set_xlim(-20, 20) + ax_3d.set_ylim(-20, 20) + ax_3d.set_zlim(0, 20) + ax_3d.set_xlabel('X') + ax_3d.set_ylabel('Y') + ax_3d.set_zlabel('Z') + ax_3d.set_title(f'Neuro-Flyt 3D | Step: {step}') + + # Drone + ax_3d.scatter(pos[0], pos[1], pos[2], c='blue', s=100, label='Drone') + # Wind Vector + ax_3d.quiver(pos[0], pos[1], pos[2], wind[0], wind[1], wind[2], length=1.0, color='red', label='Wind') + + # Target + target = info.get("target", np.array([0, 0, 10.0])) + ax_3d.scatter(target[0], target[1], target[2], c='green', marker='x', s=100, label='Target') + ax_3d.legend(loc='upper left') + + # --- Render Stats --- + line_alt.set_ydata(alt_history) + line_alt.set_xdata(range(history_len)) + + line_wind.set_ydata(wind_history) + line_wind.set_xdata(range(history_len)) + + # Stats Text + stats = f"Alt: {pos[2]:.2f}m\nWind: {wind_mag:.2f} N\nDrift: {np.linalg.norm(pos[:2]):.2f}m" + ax_3d.text2D(0.05, 0.95, stats, transform=ax_3d.transAxes, fontsize=12, bbox=dict(facecolor='white', alpha=0.7)) + + plt.draw() + plt.pause(0.01) + + if term or trunc: + obs, info = env.reset() + + step += 1 + + # Check if window is closed + if not plt.fignum_exists(fig.number): + break + + except KeyboardInterrupt: + print("Interrupted.") + except Exception as e: + print(f"Error: {e}") + finally: + plt.close() + env.close() + +if __name__ == "__main__": + run_interactive_demo() diff --git a/demo_log.txt b/demo_log.txt new file mode 100644 index 0000000000000000000000000000000000000000..4edfb68a00b4872b410ae53822fcbe329075807b --- /dev/null +++ b/demo_log.txt @@ -0,0 +1,43 @@ +Initializing Project Neuro-Flyt 3D Demo (Matplotlib Mode)... +No trained model found. Using untrained Liquid Brain. +Using cpu device +Wrapping the env with a `Monitor` wrapper +Wrapping the env in a DummyVecEnv. +Traceback (most recent call last): + File "/home/ylop/Documents/drone go brr/Drone-go-brrrrr/Drone-go-brrrrr/demo_3d.py", line 72, in + run_demo() + ~~~~~~~~^^ + File "/home/ylop/Documents/drone go brr/Drone-go-brrrrr/Drone-go-brrrrr/demo_3d.py", line 21, in run_demo + model = make_liquid_ppo(env, verbose=1) + File "/home/ylop/Documents/drone go brr/Drone-go-brrrrr/Drone-go-brrrrr/models/liquid_ppo.py", line 67, in make_liquid_ppo + model = PPO( + "MlpPolicy", + ...<9 lines>... + clip_range=0.2, + ) + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/ppo/ppo.py", line 171, in __init__ + self._setup_model() + ~~~~~~~~~~~~~~~~~^^ + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/ppo/ppo.py", line 174, in _setup_model + super()._setup_model() + ~~~~~~~~~~~~~~~~~~~~^^ + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/common/on_policy_algorithm.py", line 135, in _setup_model + self.policy = self.policy_class( # type: ignore[assignment] + ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + self.observation_space, self.action_space, self.lr_schedule, use_sde=self.use_sde, **self.policy_kwargs + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ) + ^ + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/common/policies.py", line 507, in __init__ + self.features_extractor = self.make_features_extractor() + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^ + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/common/policies.py", line 120, in make_features_extractor + return self.features_extractor_class(self.observation_space, **self.features_extractor_kwargs) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ylop/Documents/drone go brr/Drone-go-brrrrr/Drone-go-brrrrr/models/liquid_ppo.py", line 18, in __init__ + self.features_dim = features_dim + ^^^^^^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/torch/nn/modules/module.py", line 2071, in __setattr__ + super().__setattr__(name, value) + ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^ +AttributeError: property 'features_dim' of 'LTCFeatureExtractor' object has no setter diff --git a/demo_log_2.txt b/demo_log_2.txt new file mode 100644 index 0000000000000000000000000000000000000000..8c246db6fc8504c61f59e8c14ee2becaf2db56f2 --- /dev/null +++ b/demo_log_2.txt @@ -0,0 +1,43 @@ +Initializing Project Neuro-Flyt 3D Demo (Matplotlib Mode)... +No trained model found. Using untrained Liquid Brain. +Using cpu device +Wrapping the env with a `Monitor` wrapper +Wrapping the env in a DummyVecEnv. +Traceback (most recent call last): + File "/home/ylop/Documents/drone go brr/Drone-go-brrrrr/Drone-go-brrrrr/demo_3d.py", line 72, in + run_demo() + ~~~~~~~~^^ + File "/home/ylop/Documents/drone go brr/Drone-go-brrrrr/Drone-go-brrrrr/demo_3d.py", line 21, in run_demo + model = make_liquid_ppo(env, verbose=1) + File "/home/ylop/Documents/drone go brr/Drone-go-brrrrr/Drone-go-brrrrr/models/liquid_ppo.py", line 67, in make_liquid_ppo + model = PPO( + "MlpPolicy", + ...<9 lines>... + clip_range=0.2, + ) + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/ppo/ppo.py", line 171, in __init__ + self._setup_model() + ~~~~~~~~~~~~~~~~~^^ + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/ppo/ppo.py", line 174, in _setup_model + super()._setup_model() + ~~~~~~~~~~~~~~~~~~~~^^ + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/common/on_policy_algorithm.py", line 135, in _setup_model + self.policy = self.policy_class( # type: ignore[assignment] + ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + self.observation_space, self.action_space, self.lr_schedule, use_sde=self.use_sde, **self.policy_kwargs + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ) + ^ + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/common/policies.py", line 507, in __init__ + self.features_extractor = self.make_features_extractor() + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^ + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/common/policies.py", line 120, in make_features_extractor + return self.features_extractor_class(self.observation_space, **self.features_extractor_kwargs) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ylop/Documents/drone go brr/Drone-go-brrrrr/Drone-go-brrrrr/models/liquid_ppo.py", line 22, in __init__ + wiring = AutoNCP(features_dim, output_size=features_dim) + File "/home/ylop/.local/lib/python3.14/site-packages/ncps/wirings/wirings.py", line 622, in __init__ + raise ValueError( + f"Output size must be less than the number of units-2 (given {units} units, {output_size} output size)" + ) +ValueError: Output size must be less than the number of units-2 (given 32 units, 32 output size) diff --git a/demo_log_3.txt b/demo_log_3.txt new file mode 100644 index 0000000000000000000000000000000000000000..961b62dc25b84acaba2a23db07b5d661da76a0a0 --- /dev/null +++ b/demo_log_3.txt @@ -0,0 +1,87 @@ +Initializing Project Neuro-Flyt 3D Demo (Matplotlib Mode)... +No trained model found. Using untrained Liquid Brain. +Using cpu device +Wrapping the env with a `Monitor` wrapper +Wrapping the env in a DummyVecEnv. + +=== DEMO STARTING === +Generating Animation (demo.gif)... +Traceback (most recent call last): + File "/home/ylop/.local/lib/python3.14/site-packages/matplotlib/animation.py", line 224, in saving + yield self + File "/home/ylop/.local/lib/python3.14/site-packages/matplotlib/animation.py", line 1109, in save + anim._init_draw() # Clear the initial frame + ~~~~~~~~~~~~~~~^^ + File "/home/ylop/.local/lib/python3.14/site-packages/matplotlib/animation.py", line 1770, in _init_draw + self._draw_frame(frame_data) + ~~~~~~~~~~~~~~~~^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/matplotlib/animation.py", line 1789, in _draw_frame + self._drawn_artists = self._func(framedata, *self._args) + ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ylop/Documents/drone go brr/Drone-go-brrrrr/Drone-go-brrrrr/demo_3d.py", line 35, in update + action, _ = model.predict(obs, deterministic=True) + ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/common/base_class.py", line 557, in predict + return self.policy.predict(observation, state, episode_start, deterministic) + ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/common/policies.py", line 368, in predict + actions = self._predict(obs_tensor, deterministic=deterministic) + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/common/policies.py", line 717, in _predict + return self.get_distribution(observation).get_actions(deterministic=deterministic) + ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/common/policies.py", line 750, in get_distribution + features = super().extract_features(obs, self.pi_features_extractor) + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/common/policies.py", line 131, in extract_features + return features_extractor(preprocessed_obs) + File "/home/ylop/.local/lib/python3.14/site-packages/torch/nn/modules/module.py", line 1775, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/torch/nn/modules/module.py", line 1786, in _call_impl + return forward_call(*args, **kwargs) + File "/home/ylop/Documents/drone go brr/Drone-go-brrrrr/Drone-go-brrrrr/models/liquid_ppo.py", line 54, in forward + output, self.hx = self.ltc(observations, self.hx) + ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/torch/nn/modules/module.py", line 1775, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/torch/nn/modules/module.py", line 1786, in _call_impl + return forward_call(*args, **kwargs) + File "/home/ylop/.local/lib/python3.14/site-packages/ncps/torch/ltc.py", line 185, in forward + h_out, h_state = self.rnn_cell.forward(inputs, h_state, ts) + ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/ncps/torch/ltc_cell.py", line 282, in forward + next_state = self._ode_solver(inputs, states, elapsed_time) + File "/home/ylop/.local/lib/python3.14/site-packages/ncps/torch/ltc_cell.py", line 230, in _ode_solver + w_activation = w_param * self._sigmoid( + ~~~~~~~~~~~~~^ + v_pre, self._params["mu"], self._params["sigma"] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ) + ^ + File "/home/ylop/.local/lib/python3.14/site-packages/ncps/torch/ltc_cell.py", line 199, in _sigmoid + mues = v_pre - mu + ~~~~~~^~~~ +RuntimeError: The size of tensor a (32) must match the size of tensor b (48) at non-singleton dimension 1 + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/home/ylop/Documents/drone go brr/Drone-go-brrrrr/Drone-go-brrrrr/demo_3d.py", line 72, in + run_demo() + ~~~~~~~~^^ + File "/home/ylop/Documents/drone go brr/Drone-go-brrrrr/Drone-go-brrrrr/demo_3d.py", line 66, in run_demo + anim.save('demo.gif', writer='pillow', fps=20) + ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/matplotlib/animation.py", line 1098, in save + with (writer.saving(self._fig, filename, dpi), + ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/lib64/python3.14/contextlib.py", line 162, in __exit__ + self.gen.throw(value) + ~~~~~~~~~~~~~~^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/matplotlib/animation.py", line 226, in saving + self.finish() + ~~~~~~~~~~~^^ + File "/home/ylop/.local/lib/python3.14/site-packages/matplotlib/animation.py", line 506, in finish + self._frames[0].save( + ~~~~~~~~~~~~^^^ +IndexError: list index out of range diff --git a/demo_log_4.txt b/demo_log_4.txt new file mode 100644 index 0000000000000000000000000000000000000000..961b62dc25b84acaba2a23db07b5d661da76a0a0 --- /dev/null +++ b/demo_log_4.txt @@ -0,0 +1,87 @@ +Initializing Project Neuro-Flyt 3D Demo (Matplotlib Mode)... +No trained model found. Using untrained Liquid Brain. +Using cpu device +Wrapping the env with a `Monitor` wrapper +Wrapping the env in a DummyVecEnv. + +=== DEMO STARTING === +Generating Animation (demo.gif)... +Traceback (most recent call last): + File "/home/ylop/.local/lib/python3.14/site-packages/matplotlib/animation.py", line 224, in saving + yield self + File "/home/ylop/.local/lib/python3.14/site-packages/matplotlib/animation.py", line 1109, in save + anim._init_draw() # Clear the initial frame + ~~~~~~~~~~~~~~~^^ + File "/home/ylop/.local/lib/python3.14/site-packages/matplotlib/animation.py", line 1770, in _init_draw + self._draw_frame(frame_data) + ~~~~~~~~~~~~~~~~^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/matplotlib/animation.py", line 1789, in _draw_frame + self._drawn_artists = self._func(framedata, *self._args) + ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ylop/Documents/drone go brr/Drone-go-brrrrr/Drone-go-brrrrr/demo_3d.py", line 35, in update + action, _ = model.predict(obs, deterministic=True) + ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/common/base_class.py", line 557, in predict + return self.policy.predict(observation, state, episode_start, deterministic) + ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/common/policies.py", line 368, in predict + actions = self._predict(obs_tensor, deterministic=deterministic) + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/common/policies.py", line 717, in _predict + return self.get_distribution(observation).get_actions(deterministic=deterministic) + ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/common/policies.py", line 750, in get_distribution + features = super().extract_features(obs, self.pi_features_extractor) + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/common/policies.py", line 131, in extract_features + return features_extractor(preprocessed_obs) + File "/home/ylop/.local/lib/python3.14/site-packages/torch/nn/modules/module.py", line 1775, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/torch/nn/modules/module.py", line 1786, in _call_impl + return forward_call(*args, **kwargs) + File "/home/ylop/Documents/drone go brr/Drone-go-brrrrr/Drone-go-brrrrr/models/liquid_ppo.py", line 54, in forward + output, self.hx = self.ltc(observations, self.hx) + ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/torch/nn/modules/module.py", line 1775, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/torch/nn/modules/module.py", line 1786, in _call_impl + return forward_call(*args, **kwargs) + File "/home/ylop/.local/lib/python3.14/site-packages/ncps/torch/ltc.py", line 185, in forward + h_out, h_state = self.rnn_cell.forward(inputs, h_state, ts) + ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/ncps/torch/ltc_cell.py", line 282, in forward + next_state = self._ode_solver(inputs, states, elapsed_time) + File "/home/ylop/.local/lib/python3.14/site-packages/ncps/torch/ltc_cell.py", line 230, in _ode_solver + w_activation = w_param * self._sigmoid( + ~~~~~~~~~~~~~^ + v_pre, self._params["mu"], self._params["sigma"] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ) + ^ + File "/home/ylop/.local/lib/python3.14/site-packages/ncps/torch/ltc_cell.py", line 199, in _sigmoid + mues = v_pre - mu + ~~~~~~^~~~ +RuntimeError: The size of tensor a (32) must match the size of tensor b (48) at non-singleton dimension 1 + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/home/ylop/Documents/drone go brr/Drone-go-brrrrr/Drone-go-brrrrr/demo_3d.py", line 72, in + run_demo() + ~~~~~~~~^^ + File "/home/ylop/Documents/drone go brr/Drone-go-brrrrr/Drone-go-brrrrr/demo_3d.py", line 66, in run_demo + anim.save('demo.gif', writer='pillow', fps=20) + ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/matplotlib/animation.py", line 1098, in save + with (writer.saving(self._fig, filename, dpi), + ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/lib64/python3.14/contextlib.py", line 162, in __exit__ + self.gen.throw(value) + ~~~~~~~~~~~~~~^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/matplotlib/animation.py", line 226, in saving + self.finish() + ~~~~~~~~~~~^^ + File "/home/ylop/.local/lib/python3.14/site-packages/matplotlib/animation.py", line 506, in finish + self._frames[0].save( + ~~~~~~~~~~~~^^^ +IndexError: list index out of range diff --git a/demo_log_5.txt b/demo_log_5.txt new file mode 100644 index 0000000000000000000000000000000000000000..a3588e31fe7f6918dfd394611d877cf93e626aff --- /dev/null +++ b/demo_log_5.txt @@ -0,0 +1,9 @@ +Initializing Project Neuro-Flyt 3D Demo (Matplotlib Mode)... +No trained model found. Using untrained Liquid Brain. +Using cpu device +Wrapping the env with a `Monitor` wrapper +Wrapping the env in a DummyVecEnv. + +=== DEMO STARTING === +Generating Animation (demo.gif)... +Animation saved to demo.gif diff --git a/deploy_log.txt b/deploy_log.txt new file mode 100644 index 0000000000000000000000000000000000000000..a40e65e1740dd4ca7263df4604b7b169ddc2fe20 --- /dev/null +++ b/deploy_log.txt @@ -0,0 +1,254 @@ +Cloning Space... +Cloning into 'hf_deploy'... +Copying files... +sending incremental file list +.gitignore + 536 100% 0.00kB/s 0:00:00 536 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=76/78) +Dockerfile + 622 100% 607.42kB/s 0:00:00 622 100% 607.42kB/s 0:00:00 (xfr#2, to-chk=75/78) +README.md + 924 100% 902.34kB/s 0:00:00 924 100% 902.34kB/s 0:00:00 (xfr#3, to-chk=74/78) +README_HF.md + 3,598 100% 3.43MB/s 0:00:00 3,598 100% 3.43MB/s 0:00:00 (xfr#4, to-chk=73/78) +debug_imports.py + 620 100% 605.47kB/s 0:00:00 620 100% 605.47kB/s 0:00:00 (xfr#5, to-chk=72/78) +demo.gif + 32,768 4% 31.25MB/s 0:00:00 692,490 100% 330.20MB/s 0:00:00 (xfr#6, to-chk=71/78) +demo_3d.py + 2,198 100% 715.49kB/s 0:00:00 2,198 100% 715.49kB/s 0:00:00 (xfr#7, to-chk=70/78) +demo_interactive.py + 4,050 100% 1.29MB/s 0:00:00 4,050 100% 1.29MB/s 0:00:00 (xfr#8, to-chk=69/78) +demo_log.txt + 2,580 100% 839.84kB/s 0:00:00 2,580 100% 839.84kB/s 0:00:00 (xfr#9, to-chk=68/78) +demo_log_2.txt + 2,652 100% 863.28kB/s 0:00:00 2,652 100% 863.28kB/s 0:00:00 (xfr#10, to-chk=67/78) +demo_log_3.txt + 5,276 100% 1.68MB/s 0:00:00 5,276 100% 1.68MB/s 0:00:00 (xfr#11, to-chk=66/78) +demo_log_4.txt + 5,276 100% 1.68MB/s 0:00:00 5,276 100% 1.68MB/s 0:00:00 (xfr#12, to-chk=65/78) +demo_log_5.txt + 295 100% 96.03kB/s 0:00:00 295 100% 96.03kB/s 0:00:00 (xfr#13, to-chk=64/78) +deploy_log.txt + 1,740 100% 566.41kB/s 0:00:00 1,740 100% 566.41kB/s 0:00:00 (xfr#14, to-chk=63/78) +install_log.txt + 14,311 100% 4.55MB/s 0:00:00 14,311 100% 4.55MB/s 0:00:00 (xfr#15, to-chk=62/78) +interactive_log.txt + 236 100% 76.82kB/s 0:00:00 236 100% 76.82kB/s 0:00:00 (xfr#16, to-chk=61/78) +main.py + 4,348 100% 1.38MB/s 0:00:00 4,348 100% 1.38MB/s 0:00:00 (xfr#17, to-chk=60/78) +output.txt + 281 100% 91.47kB/s 0:00:00 281 100% 91.47kB/s 0:00:00 (xfr#18, to-chk=59/78) +pip_log.txt + 5,014 100% 1.59MB/s 0:00:00 5,014 100% 1.59MB/s 0:00:00 (xfr#19, to-chk=58/78) +pybullet_bin_log.txt + 223 100% 72.59kB/s 0:00:00 223 100% 72.59kB/s 0:00:00 (xfr#20, to-chk=57/78) +pybullet_log.txt + 32,768 25% 10.42MB/s 0:00:00 129,509 100% 30.88MB/s 0:00:00 (xfr#21, to-chk=56/78) +pygame_log.txt + 219 100% 53.47kB/s 0:00:00 219 100% 53.47kB/s 0:00:00 (xfr#22, to-chk=55/78) +requirements.txt + 194 100% 47.36kB/s 0:00:00 194 100% 47.36kB/s 0:00:00 (xfr#23, to-chk=54/78) +run_demo.sh + 178 100% 43.46kB/s 0:00:00 178 100% 43.46kB/s 0:00:00 (xfr#24, to-chk=53/78) +setup.sh + 978 100% 238.77kB/s 0:00:00 978 100% 238.77kB/s 0:00:00 (xfr#25, to-chk=52/78) +test_log.txt + 964 100% 235.35kB/s 0:00:00 964 100% 235.35kB/s 0:00:00 (xfr#26, to-chk=51/78) +test_physics.py + 1,311 100% 320.07kB/s 0:00:00 1,311 100% 320.07kB/s 0:00:00 (xfr#27, to-chk=50/78) +test_random_1.txt + 318 100% 77.64kB/s 0:00:00 318 100% 77.64kB/s 0:00:00 (xfr#28, to-chk=49/78) +test_random_2.txt + 315 100% 76.90kB/s 0:00:00 315 100% 76.90kB/s 0:00:00 (xfr#29, to-chk=48/78) +test_result_final.txt + 263 100% 64.21kB/s 0:00:00 263 100% 64.21kB/s 0:00:00 (xfr#30, to-chk=47/78) +test_success.txt + 263 100% 64.21kB/s 0:00:00 263 100% 64.21kB/s 0:00:00 (xfr#31, to-chk=46/78) +train.py + 1,205 100% 294.19kB/s 0:00:00 1,205 100% 294.19kB/s 0:00:00 (xfr#32, to-chk=45/78) +train_hf.py + 2,277 100% 555.91kB/s 0:00:00 2,277 100% 555.91kB/s 0:00:00 (xfr#33, to-chk=44/78) +train_log_500k.txt + 32,768 39% 7.81MB/s 0:00:00 83,713 100% 19.96MB/s 0:00:00 (xfr#34, to-chk=43/78) +train_log_full.txt + 3,044 100% 743.16kB/s 0:00:00 3,044 100% 743.16kB/s 0:00:00 (xfr#35, to-chk=42/78) +train_log_retry.txt + 14,709 100% 3.51MB/s 0:00:00 14,709 100% 3.51MB/s 0:00:00 (xfr#36, to-chk=41/78) +checkpoints/ +checkpoints/liquid_ppo_drone_100000_steps.zip + 32,768 9% 6.25MB/s 0:00:00 361,759 100% 57.50MB/s 0:00:00 (xfr#37, to-chk=33/78) +checkpoints/liquid_ppo_drone_10000_steps.zip + 32,768 9% 4.46MB/s 0:00:00 358,037 100% 48.78MB/s 0:00:00 (xfr#38, to-chk=32/78) +checkpoints/liquid_ppo_drone_110000_steps.zip + 32,768 9% 3.91MB/s 0:00:00 361,803 100% 38.34MB/s 0:00:00 (xfr#39, to-chk=31/78) +checkpoints/liquid_ppo_drone_120000_steps.zip + 32,768 9% 3.12MB/s 0:00:00 361,803 100% 34.50MB/s 0:00:00 (xfr#40, to-chk=30/78) +checkpoints/liquid_ppo_drone_130000_steps.zip + 32,768 9% 2.60MB/s 0:00:00 361,803 100% 28.75MB/s 0:00:00 (xfr#41, to-chk=29/78) +checkpoints/liquid_ppo_drone_140000_steps.zip + 32,768 9% 2.40MB/s 0:00:00 361,803 100% 24.65MB/s 0:00:00 (xfr#42, to-chk=28/78) +checkpoints/liquid_ppo_drone_150000_steps.zip + 32,768 9% 2.08MB/s 0:00:00 361,813 100% 23.00MB/s 0:00:00 (xfr#43, to-chk=27/78) +checkpoints/liquid_ppo_drone_160000_steps.zip + 32,768 9% 1.84MB/s 0:00:00 361,803 100% 20.30MB/s 0:00:00 (xfr#44, to-chk=26/78) +checkpoints/liquid_ppo_drone_170000_steps.zip + 32,768 9% 1.74MB/s 0:00:00 361,803 100% 18.16MB/s 0:00:00 (xfr#45, to-chk=25/78) +checkpoints/liquid_ppo_drone_180000_steps.zip + 32,768 9% 1.56MB/s 0:00:00 361,803 100% 16.43MB/s 0:00:00 (xfr#46, to-chk=24/78) +checkpoints/liquid_ppo_drone_20000_steps.zip + 32,768 9% 1.42MB/s 0:00:00 358,453 100% 14.86MB/s 0:00:00 (xfr#47, to-chk=23/78) +checkpoints/liquid_ppo_drone_30000_steps.zip + 32,768 9% 1.30MB/s 0:00:00 358,866 100% 14.26MB/s 0:00:00 (xfr#48, to-chk=22/78) +checkpoints/liquid_ppo_drone_40000_steps.zip + 32,768 9% 1.20MB/s 0:00:00 359,278 100% 13.18MB/s 0:00:00 (xfr#49, to-chk=21/78) +checkpoints/liquid_ppo_drone_50000_steps.zip + 32,768 9% 1.12MB/s 0:00:00 359,694 100% 11.83MB/s 0:00:00 (xfr#50, to-chk=20/78) +checkpoints/liquid_ppo_drone_60000_steps.zip + 32,768 9% 1.04MB/s 0:00:00 360,106 100% 11.08MB/s 0:00:00 (xfr#51, to-chk=19/78) +checkpoints/liquid_ppo_drone_70000_steps.zip + 32,768 9% 969.70kB/s 0:00:00 360,518 100% 10.11MB/s 0:00:00 (xfr#52, to-chk=18/78) +checkpoints/liquid_ppo_drone_80000_steps.zip + 32,768 9% 888.89kB/s 0:00:00 360,934 100% 9.30MB/s 0:00:00 (xfr#53, to-chk=17/78) +checkpoints/liquid_ppo_drone_90000_steps.zip + 32,768 9% 842.11kB/s 0:00:00 361,356 100% 8.84MB/s 0:00:00 (xfr#54, to-chk=16/78) +demo/ +demo/__init__.py + 39 100% 0.98kB/s 0:00:00 39 100% 0.98kB/s 0:00:00 (xfr#55, to-chk=15/78) +demo/visualize_drone.py + 16,089 100% 402.87kB/s 0:00:00 16,089 100% 402.87kB/s 0:00:00 (xfr#56, to-chk=14/78) +env/ +env/__init__.py + 62 100% 1.55kB/s 0:00:00 62 100% 1.55kB/s 0:00:00 (xfr#57, to-chk=13/78) +env/drone_3d.py + 5,304 100% 132.81kB/s 0:00:00 5,304 100% 132.81kB/s 0:00:00 (xfr#58, to-chk=12/78) +env/drone_env.py + 10,099 100% 252.88kB/s 0:00:00 10,099 100% 252.88kB/s 0:00:00 (xfr#59, to-chk=11/78) +eval/ +eval/__init__.py + 41 100% 1.03kB/s 0:00:00 41 100% 1.03kB/s 0:00:00 (xfr#60, to-chk=10/78) +eval/eval_liquid_policy.py + 5,742 100% 143.78kB/s 0:00:00 5,742 100% 143.78kB/s 0:00:00 (xfr#61, to-chk=9/78) +eval/eval_mlp_baseline.py + 5,570 100% 139.47kB/s 0:00:00 5,570 100% 139.47kB/s 0:00:00 (xfr#62, to-chk=8/78) +models/ +models/__init__.py + 44 100% 1.10kB/s 0:00:00 44 100% 1.10kB/s 0:00:00 (xfr#63, to-chk=7/78) +models/liquid_cell.py + 3,168 100% 79.33kB/s 0:00:00 3,168 100% 79.33kB/s 0:00:00 (xfr#64, to-chk=6/78) +models/liquid_policy.py + 2,690 100% 67.36kB/s 0:00:00 2,690 100% 67.36kB/s 0:00:00 (xfr#65, to-chk=5/78) +models/liquid_ppo.py + 4,141 100% 103.69kB/s 0:00:00 4,141 100% 103.69kB/s 0:00:00 (xfr#66, to-chk=4/78) +train/ +train/__init__.py + 39 100% 0.98kB/s 0:00:00 39 100% 0.98kB/s 0:00:00 (xfr#67, to-chk=3/78) +train/train_liquid_ppo.py + 6,619 100% 165.74kB/s 0:00:00 6,619 100% 165.74kB/s 0:00:00 (xfr#68, to-chk=2/78) +train/train_mlp_ppo.py + 4,442 100% 111.23kB/s 0:00:00 4,442 100% 111.23kB/s 0:00:00 (xfr#69, to-chk=1/78) +utils/ +utils/__init__.py + 38 100% 0.95kB/s 0:00:00 38 100% 0.95kB/s 0:00:00 (xfr#70, to-chk=0/78) + +sent 7,551,292 bytes received 1,390 bytes 15,105,364.00 bytes/sec +total size is 7,542,644 speedup is 1.00 +[main 8ef522c] Deploy Neuro-Flyt 3D Training + 70 files changed, 9247 insertions(+), 10 deletions(-) + create mode 100644 .gitignore + create mode 100644 Dockerfile + create mode 100644 README_HF.md + create mode 100644 checkpoints/liquid_ppo_drone_100000_steps.zip + create mode 100644 checkpoints/liquid_ppo_drone_10000_steps.zip + create mode 100644 checkpoints/liquid_ppo_drone_110000_steps.zip + create mode 100644 checkpoints/liquid_ppo_drone_120000_steps.zip + create mode 100644 checkpoints/liquid_ppo_drone_130000_steps.zip + create mode 100644 checkpoints/liquid_ppo_drone_140000_steps.zip + create mode 100644 checkpoints/liquid_ppo_drone_150000_steps.zip + create mode 100644 checkpoints/liquid_ppo_drone_160000_steps.zip + create mode 100644 checkpoints/liquid_ppo_drone_170000_steps.zip + create mode 100644 checkpoints/liquid_ppo_drone_180000_steps.zip + create mode 100644 checkpoints/liquid_ppo_drone_20000_steps.zip + create mode 100644 checkpoints/liquid_ppo_drone_30000_steps.zip + create mode 100644 checkpoints/liquid_ppo_drone_40000_steps.zip + create mode 100644 checkpoints/liquid_ppo_drone_50000_steps.zip + create mode 100644 checkpoints/liquid_ppo_drone_60000_steps.zip + create mode 100644 checkpoints/liquid_ppo_drone_70000_steps.zip + create mode 100644 checkpoints/liquid_ppo_drone_80000_steps.zip + create mode 100644 checkpoints/liquid_ppo_drone_90000_steps.zip + create mode 100644 debug_imports.py + create mode 100644 demo.gif + create mode 100644 demo/__init__.py + create mode 100644 demo/visualize_drone.py + create mode 100644 demo_3d.py + create mode 100644 demo_interactive.py + create mode 100644 demo_log.txt + create mode 100644 demo_log_2.txt + create mode 100644 demo_log_3.txt + create mode 100644 demo_log_4.txt + create mode 100644 demo_log_5.txt + create mode 100644 deploy_log.txt + create mode 100644 env/__init__.py + create mode 100644 env/drone_3d.py + create mode 100644 env/drone_env.py + create mode 100644 eval/__init__.py + create mode 100644 eval/eval_liquid_policy.py + create mode 100644 eval/eval_mlp_baseline.py + create mode 100644 install_log.txt + create mode 100644 interactive_log.txt + create mode 100644 main.py + create mode 100644 models/__init__.py + create mode 100644 models/liquid_cell.py + create mode 100644 models/liquid_policy.py + create mode 100644 models/liquid_ppo.py + create mode 100644 output.txt + create mode 100644 pip_log.txt + create mode 100644 pybullet_bin_log.txt + create mode 100644 pybullet_log.txt + create mode 100644 pygame_log.txt + create mode 100644 requirements.txt + create mode 100755 run_demo.sh + create mode 100755 setup.sh + create mode 100644 test_log.txt + create mode 100644 test_physics.py + create mode 100644 test_random_1.txt + create mode 100644 test_random_2.txt + create mode 100644 test_result_final.txt + create mode 100644 test_success.txt + create mode 100644 train.py + create mode 100644 train/__init__.py + create mode 100644 train/train_liquid_ppo.py + create mode 100644 train/train_mlp_ppo.py + create mode 100644 train_hf.py + create mode 100644 train_log_500k.txt + create mode 100644 train_log_full.txt + create mode 100644 train_log_retry.txt + create mode 100644 utils/__init__.py +remote: ------------------------------------------------------------------------- +remote: Your push was rejected because it contains binary files. +remote: Please use https://huggingface.co/docs/hub/xet to store binary files. +remote: See also: https://huggingface.co/docs/hub/xet/using-xet-storage#git +remote:  +remote: Offending files: +remote:  - checkpoints/liquid_ppo_drone_100000_steps.zip (ref: refs/heads/main) +remote:  - checkpoints/liquid_ppo_drone_10000_steps.zip (ref: refs/heads/main) +remote:  - checkpoints/liquid_ppo_drone_110000_steps.zip (ref: refs/heads/main) +remote:  - checkpoints/liquid_ppo_drone_120000_steps.zip (ref: refs/heads/main) +remote:  - checkpoints/liquid_ppo_drone_130000_steps.zip (ref: refs/heads/main) +remote:  - checkpoints/liquid_ppo_drone_140000_steps.zip (ref: refs/heads/main) +remote:  - checkpoints/liquid_ppo_drone_150000_steps.zip (ref: refs/heads/main) +remote:  - checkpoints/liquid_ppo_drone_160000_steps.zip (ref: refs/heads/main) +remote:  - checkpoints/liquid_ppo_drone_170000_steps.zip (ref: refs/heads/main) +remote:  - checkpoints/liquid_ppo_drone_180000_steps.zip (ref: refs/heads/main) +remote:  - checkpoints/liquid_ppo_drone_20000_steps.zip (ref: refs/heads/main) +remote:  - checkpoints/liquid_ppo_drone_30000_steps.zip (ref: refs/heads/main) +remote:  - checkpoints/liquid_ppo_drone_40000_steps.zip (ref: refs/heads/main) +remote:  - checkpoints/liquid_ppo_drone_50000_steps.zip (ref: refs/heads/main) +remote:  - checkpoints/liquid_ppo_drone_60000_steps.zip (ref: refs/heads/main) +remote:  - checkpoints/liquid_ppo_drone_70000_steps.zip (ref: refs/heads/main) +remote:  - checkpoints/liquid_ppo_drone_80000_steps.zip (ref: refs/heads/main) +remote:  - checkpoints/liquid_ppo_drone_90000_steps.zip (ref: refs/heads/main) +remote:  - demo.gif (ref: refs/heads/main) +remote: ------------------------------------------------------------------------- +To https://huggingface.co/spaces/iteratehack/neuro-flyt-training + ! [remote rejected] main -> main (pre-receive hook declined) +error: failed to push some refs to 'https://huggingface.co/spaces/iteratehack/neuro-flyt-training' diff --git a/deploy_log_2.txt b/deploy_log_2.txt new file mode 100644 index 0000000000000000000000000000000000000000..cbff767401254dd9b7f5ed84a8d397755462024a --- /dev/null +++ b/deploy_log_2.txt @@ -0,0 +1,183 @@ +Cloning Space... +Cloning into 'hf_deploy'... +Copying files... +sending incremental file list +.gitignore + 536 100% 0.00kB/s 0:00:00 536 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=57/59) +Dockerfile + 622 100% 607.42kB/s 0:00:00 622 100% 607.42kB/s 0:00:00 (xfr#2, to-chk=56/59) +README.md + 924 100% 902.34kB/s 0:00:00 924 100% 902.34kB/s 0:00:00 (xfr#3, to-chk=55/59) +README_HF.md + 3,598 100% 3.43MB/s 0:00:00 3,598 100% 3.43MB/s 0:00:00 (xfr#4, to-chk=54/59) +debug_imports.py + 620 100% 605.47kB/s 0:00:00 620 100% 605.47kB/s 0:00:00 (xfr#5, to-chk=53/59) +demo_3d.py + 2,198 100% 2.10MB/s 0:00:00 2,198 100% 2.10MB/s 0:00:00 (xfr#6, to-chk=52/59) +demo_interactive.py + 4,050 100% 3.86MB/s 0:00:00 4,050 100% 3.86MB/s 0:00:00 (xfr#7, to-chk=51/59) +demo_log.txt + 2,580 100% 2.46MB/s 0:00:00 2,580 100% 2.46MB/s 0:00:00 (xfr#8, to-chk=50/59) +demo_log_2.txt + 2,652 100% 2.53MB/s 0:00:00 2,652 100% 2.53MB/s 0:00:00 (xfr#9, to-chk=49/59) +demo_log_3.txt + 5,276 100% 5.03MB/s 0:00:00 5,276 100% 5.03MB/s 0:00:00 (xfr#10, to-chk=48/59) +demo_log_4.txt + 5,276 100% 5.03MB/s 0:00:00 5,276 100% 5.03MB/s 0:00:00 (xfr#11, to-chk=47/59) +demo_log_5.txt + 295 100% 288.09kB/s 0:00:00 295 100% 288.09kB/s 0:00:00 (xfr#12, to-chk=46/59) +deploy_log.txt + 15,625 100% 14.90MB/s 0:00:00 15,625 100% 14.90MB/s 0:00:00 (xfr#13, to-chk=45/59) +deploy_log_2.txt + 1,746 100% 1.67MB/s 0:00:00 1,746 100% 1.67MB/s 0:00:00 (xfr#14, to-chk=44/59) +install_log.txt + 14,311 100% 13.65MB/s 0:00:00 14,311 100% 13.65MB/s 0:00:00 (xfr#15, to-chk=43/59) +interactive_log.txt + 236 100% 230.47kB/s 0:00:00 236 100% 230.47kB/s 0:00:00 (xfr#16, to-chk=42/59) +main.py + 4,348 100% 4.15MB/s 0:00:00 4,348 100% 4.15MB/s 0:00:00 (xfr#17, to-chk=41/59) +output.txt + 281 100% 274.41kB/s 0:00:00 281 100% 274.41kB/s 0:00:00 (xfr#18, to-chk=40/59) +pip_log.txt + 5,014 100% 4.78MB/s 0:00:00 5,014 100% 4.78MB/s 0:00:00 (xfr#19, to-chk=39/59) +pybullet_bin_log.txt + 223 100% 217.77kB/s 0:00:00 223 100% 217.77kB/s 0:00:00 (xfr#20, to-chk=38/59) +pybullet_log.txt + 32,768 25% 31.25MB/s 0:00:00 129,509 100% 123.51MB/s 0:00:00 (xfr#21, to-chk=37/59) +pygame_log.txt + 219 100% 213.87kB/s 0:00:00 219 100% 213.87kB/s 0:00:00 (xfr#22, to-chk=36/59) +requirements.txt + 194 100% 189.45kB/s 0:00:00 194 100% 189.45kB/s 0:00:00 (xfr#23, to-chk=35/59) +run_demo.sh + 178 100% 173.83kB/s 0:00:00 178 100% 173.83kB/s 0:00:00 (xfr#24, to-chk=34/59) +setup.sh + 978 100% 955.08kB/s 0:00:00 978 100% 955.08kB/s 0:00:00 (xfr#25, to-chk=33/59) +test_log.txt + 964 100% 941.41kB/s 0:00:00 964 100% 941.41kB/s 0:00:00 (xfr#26, to-chk=32/59) +test_physics.py + 1,311 100% 1.25MB/s 0:00:00 1,311 100% 1.25MB/s 0:00:00 (xfr#27, to-chk=31/59) +test_random_1.txt + 318 100% 310.55kB/s 0:00:00 318 100% 310.55kB/s 0:00:00 (xfr#28, to-chk=30/59) +test_random_2.txt + 315 100% 307.62kB/s 0:00:00 315 100% 307.62kB/s 0:00:00 (xfr#29, to-chk=29/59) +test_result_final.txt + 263 100% 256.84kB/s 0:00:00 263 100% 256.84kB/s 0:00:00 (xfr#30, to-chk=28/59) +test_success.txt + 263 100% 128.42kB/s 0:00:00 263 100% 128.42kB/s 0:00:00 (xfr#31, to-chk=27/59) +train.py + 1,205 100% 588.38kB/s 0:00:00 1,205 100% 588.38kB/s 0:00:00 (xfr#32, to-chk=26/59) +train_hf.py + 2,277 100% 1.09MB/s 0:00:00 2,277 100% 1.09MB/s 0:00:00 (xfr#33, to-chk=25/59) +train_log_500k.txt + 32,768 39% 15.62MB/s 0:00:00 83,713 100% 39.92MB/s 0:00:00 (xfr#34, to-chk=24/59) +train_log_full.txt + 3,044 100% 1.45MB/s 0:00:00 3,044 100% 1.45MB/s 0:00:00 (xfr#35, to-chk=23/59) +train_log_retry.txt + 14,709 100% 7.01MB/s 0:00:00 14,709 100% 7.01MB/s 0:00:00 (xfr#36, to-chk=22/59) +demo/ +demo/__init__.py + 39 100% 19.04kB/s 0:00:00 39 100% 19.04kB/s 0:00:00 (xfr#37, to-chk=15/59) +demo/visualize_drone.py + 16,089 100% 7.67MB/s 0:00:00 16,089 100% 7.67MB/s 0:00:00 (xfr#38, to-chk=14/59) +env/ +env/__init__.py + 62 100% 30.27kB/s 0:00:00 62 100% 30.27kB/s 0:00:00 (xfr#39, to-chk=13/59) +env/drone_3d.py + 5,304 100% 2.53MB/s 0:00:00 5,304 100% 2.53MB/s 0:00:00 (xfr#40, to-chk=12/59) +env/drone_env.py + 10,099 100% 4.82MB/s 0:00:00 10,099 100% 4.82MB/s 0:00:00 (xfr#41, to-chk=11/59) +eval/ +eval/__init__.py + 41 100% 20.02kB/s 0:00:00 41 100% 20.02kB/s 0:00:00 (xfr#42, to-chk=10/59) +eval/eval_liquid_policy.py + 5,742 100% 2.74MB/s 0:00:00 5,742 100% 2.74MB/s 0:00:00 (xfr#43, to-chk=9/59) +eval/eval_mlp_baseline.py + 5,570 100% 2.66MB/s 0:00:00 5,570 100% 2.66MB/s 0:00:00 (xfr#44, to-chk=8/59) +models/ +models/__init__.py + 44 100% 21.48kB/s 0:00:00 44 100% 21.48kB/s 0:00:00 (xfr#45, to-chk=7/59) +models/liquid_cell.py + 3,168 100% 1.51MB/s 0:00:00 3,168 100% 1.51MB/s 0:00:00 (xfr#46, to-chk=6/59) +models/liquid_policy.py + 2,690 100% 1.28MB/s 0:00:00 2,690 100% 1.28MB/s 0:00:00 (xfr#47, to-chk=5/59) +models/liquid_ppo.py + 4,141 100% 1.32MB/s 0:00:00 4,141 100% 1.32MB/s 0:00:00 (xfr#48, to-chk=4/59) +train/ +train/__init__.py + 39 100% 12.70kB/s 0:00:00 39 100% 12.70kB/s 0:00:00 (xfr#49, to-chk=3/59) +train/train_liquid_ppo.py + 6,619 100% 2.10MB/s 0:00:00 6,619 100% 2.10MB/s 0:00:00 (xfr#50, to-chk=2/59) +train/train_mlp_ppo.py + 4,442 100% 1.41MB/s 0:00:00 4,442 100% 1.41MB/s 0:00:00 (xfr#51, to-chk=1/59) +utils/ +utils/__init__.py + 38 100% 12.37kB/s 0:00:00 38 100% 12.37kB/s 0:00:00 (xfr#52, to-chk=0/59) + +sent 377,911 bytes received 1,040 bytes 757,902.00 bytes/sec +total size is 372,344 speedup is 0.98 +[main ae22fc1] Deploy Neuro-Flyt 3D Training + 52 files changed, 9501 insertions(+), 10 deletions(-) + create mode 100644 .gitignore + create mode 100644 Dockerfile + create mode 100644 README_HF.md + create mode 100644 debug_imports.py + create mode 100644 demo/__init__.py + create mode 100644 demo/visualize_drone.py + create mode 100644 demo_3d.py + create mode 100644 demo_interactive.py + create mode 100644 demo_log.txt + create mode 100644 demo_log_2.txt + create mode 100644 demo_log_3.txt + create mode 100644 demo_log_4.txt + create mode 100644 demo_log_5.txt + create mode 100644 deploy_log.txt + create mode 100644 deploy_log_2.txt + create mode 100644 env/__init__.py + create mode 100644 env/drone_3d.py + create mode 100644 env/drone_env.py + create mode 100644 eval/__init__.py + create mode 100644 eval/eval_liquid_policy.py + create mode 100644 eval/eval_mlp_baseline.py + create mode 100644 install_log.txt + create mode 100644 interactive_log.txt + create mode 100644 main.py + create mode 100644 models/__init__.py + create mode 100644 models/liquid_cell.py + create mode 100644 models/liquid_policy.py + create mode 100644 models/liquid_ppo.py + create mode 100644 output.txt + create mode 100644 pip_log.txt + create mode 100644 pybullet_bin_log.txt + create mode 100644 pybullet_log.txt + create mode 100644 pygame_log.txt + create mode 100644 requirements.txt + create mode 100755 run_demo.sh + create mode 100755 setup.sh + create mode 100644 test_log.txt + create mode 100644 test_physics.py + create mode 100644 test_random_1.txt + create mode 100644 test_random_2.txt + create mode 100644 test_result_final.txt + create mode 100644 test_success.txt + create mode 100644 train.py + create mode 100644 train/__init__.py + create mode 100644 train/train_liquid_ppo.py + create mode 100644 train/train_mlp_ppo.py + create mode 100644 train_hf.py + create mode 100644 train_log_500k.txt + create mode 100644 train_log_full.txt + create mode 100644 train_log_retry.txt + create mode 100644 utils/__init__.py +remote: ------------------------------------------------------------------------- +remote: Your push was accepted, but with warnings:  +remote: - Warning: empty or missing yaml metadata in repo card +remote: help: https://huggingface.co/docs/hub/spaces-config-reference +remote: ------------------------------------------------------------------------- +remote: ------------------------------------------------------------------------- +remote: Please find the documentation at: +remote: https://huggingface.co/docs/hub/model-cards#model-card-metadata +remote:  +remote: ------------------------------------------------------------------------- +To https://huggingface.co/spaces/iteratehack/neuro-flyt-training + c98f107..ae22fc1 main -> main +Deployment Complete! diff --git a/deploy_team22_log.txt b/deploy_team22_log.txt new file mode 100644 index 0000000000000000000000000000000000000000..0e2fb76ca4a077e90f0cb7409a9845fac3592ab1 --- /dev/null +++ b/deploy_team22_log.txt @@ -0,0 +1,32 @@ +Cloning Space... +Cloning into 'hf_deploy'... +Copying files... +sending incremental file list +.gitignore + 536 100% 0.00kB/s 0:00:00 536 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=58/60) +Dockerfile + 622 100% 607.42kB/s 0:00:00 622 100% 607.42kB/s 0:00:00 (xfr#2, to-chk=57/60) +README.md + 924 100% 902.34kB/s 0:00:00 924 100% 902.34kB/s 0:00:00 (xfr#3, to-chk=56/60) +README_HF.md + 3,598 100% 3.43MB/s 0:00:00 3,598 100% 3.43MB/s 0:00:00 (xfr#4, to-chk=55/60) +debug_imports.py + 620 100% 605.47kB/s 0:00:00 620 100% 605.47kB/s 0:00:00 (xfr#5, to-chk=54/60) +demo_3d.py + 2,198 100% 2.10MB/s 0:00:00 2,198 100% 2.10MB/s 0:00:00 (xfr#6, to-chk=53/60) +demo_interactive.py + 4,050 100% 3.86MB/s 0:00:00 4,050 100% 3.86MB/s 0:00:00 (xfr#7, to-chk=52/60) +demo_log.txt + 2,580 100% 2.46MB/s 0:00:00 2,580 100% 2.46MB/s 0:00:00 (xfr#8, to-chk=51/60) +demo_log_2.txt + 2,652 100% 2.53MB/s 0:00:00 2,652 100% 2.53MB/s 0:00:00 (xfr#9, to-chk=50/60) +demo_log_3.txt + 5,276 100% 5.03MB/s 0:00:00 5,276 100% 5.03MB/s 0:00:00 (xfr#10, to-chk=49/60) +demo_log_4.txt + 5,276 100% 5.03MB/s 0:00:00 5,276 100% 5.03MB/s 0:00:00 (xfr#11, to-chk=48/60) +demo_log_5.txt + 295 100% 288.09kB/s 0:00:00 295 100% 288.09kB/s 0:00:00 (xfr#12, to-chk=47/60) +deploy_log.txt + 15,625 100% 14.90MB/s 0:00:00 15,625 100% 14.90MB/s 0:00:00 (xfr#13, to-chk=46/60) +deploy_log_2.txt + 9,919 100% 9.46MB/s 0:00:00 9,919 100% 9.46MB/s 0:00:00 (xfr#14, to-chk=45/60) diff --git a/env/__init__.py b/env/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..9d4d3c9f0f09bc4f01511103f55b008c38cea76a --- /dev/null +++ b/env/__init__.py @@ -0,0 +1,2 @@ +"""Environment modules for custom gymnasium environments.""" + diff --git a/env/drone_3d.py b/env/drone_3d.py new file mode 100644 index 0000000000000000000000000000000000000000..7a6e6131ea1dc8c627724f5827153334cf7b6666 --- /dev/null +++ b/env/drone_3d.py @@ -0,0 +1,143 @@ +import numpy as np +import gymnasium as gym +from opensimplex import OpenSimplex +import time + +# Try to import PyFlyt, else fallback +try: + from PyFlyt.gym_envs.quadx_envs.quadx_waypoints_env import QuadXWaypointsEnv + PYFLYT_AVAILABLE = True +except ImportError: + PYFLYT_AVAILABLE = False + # Create a dummy base class if PyFlyt is missing + class QuadXWaypointsEnv(gym.Env): + metadata = {"render_modes": ["human", "rgb_array"]} + def __init__(self, render_mode=None): + self.render_mode = render_mode + +class WindField: + def __init__(self, seed=42, scale=0.1, speed=1.0): + self.noise = OpenSimplex(seed=seed) + self.scale = scale + self.speed = speed + self.time_offset = 0.0 + + def get_wind(self, x, y, z, dt): + self.time_offset += dt * self.speed + u = self.noise.noise4(x * self.scale, y * self.scale, z * self.scale, self.time_offset) + v = self.noise.noise4(x * self.scale + 100, y * self.scale + 100, z * self.scale, self.time_offset) + w = self.noise.noise4(x * self.scale + 200, y * self.scale + 200, z * self.scale, self.time_offset) + return np.array([u, v, w]) + +class Drone3DEnv(gym.Env): + def __init__(self, render_mode=None, wind_scale=10.0, wind_speed=1.0): + super().__init__() + self.render_mode = render_mode + self.wind_field = WindField(scale=0.05, speed=wind_speed) + self.wind_strength = wind_scale + + # Define spaces + # Obs: [x, y, z, roll, pitch, yaw, u, v, w, p, q, r] + self.observation_space = gym.spaces.Box(low=-np.inf, high=np.inf, shape=(12,), dtype=np.float32) + # Action: [motor1, motor2, motor3, motor4] or [thrust, roll, pitch, yaw] + # We'll assume simple [thrust_x, thrust_y, thrust_z, yaw] for the mock + self.action_space = gym.spaces.Box(low=-1, high=1, shape=(4,), dtype=np.float32) + + self.state = np.zeros(12) + self.dt = 0.05 + self.step_count = 0 + self.max_steps = 1000 + + def reset(self, seed=None, options=None): + super().reset(seed=seed) + self.state = np.zeros(12) + self.state[2] = 10.0 # Start at 10m height + self.step_count = 0 + + # Randomize Target + # x, y in [-5, 5], z in [5, 15] + self.target = np.random.uniform(low=[-5, -5, 5], high=[5, 5, 15]) + + # Randomize Wind + # We can just re-initialize the noise with a random seed + new_seed = np.random.randint(0, 10000) + self.wind_field = WindField(seed=new_seed, scale=0.05, speed=self.wind_field.speed) + + return self.state.astype(np.float32), {} + + def step(self, action): + self.step_count += 1 + + # Unpack state + pos = self.state[0:3] + vel = self.state[6:9] + + # Get Wind + raw_wind = self.wind_field.get_wind(pos[0], pos[1], pos[2], self.dt) + wind_force = raw_wind * self.wind_strength + + # Simple Kinematics (Double Integrator) + # Action is roughly acceleration command + # We need enough authority to fight gravity (9.81) + wind + # Let's say max thrust is 20 m/s^2 (~2G) + # Action [-1, 1] -> [-20, 20] ? + # No, usually thrust is positive 0..Max. + # But for simplified "QuadX" control often inputs are roll/pitch/yaw/thrust. + # Here we are abstracting to "Force/Accel command in 3D". + # Let's map action [-1, 1] to [-15, 15] acceleration. + accel = action[:3] * 15.0 + + # Gravity + gravity = np.array([0, 0, -9.81]) + + # Total Force = Control + Wind + Gravity + # Note: We REMOVED the "anti-gravity" offset. + # The agent MUST output positive Z acceleration to hover. + # If action[2] is 0, accel[2] is 0, and it falls due to gravity. + total_accel = accel + wind_force + gravity + + # Update State + vel += total_accel * self.dt + pos += vel * self.dt + + # Floor collision + if pos[2] < 0: + pos[2] = 0 + vel[2] = 0 # Crash stop + + # Drag (Damping) + vel *= 0.95 + + self.state[0:3] = pos + self.state[6:9] = vel + + # Reward: Stay close to Target + dist = np.linalg.norm(pos - self.target) + + # Smoothness: Penalty for high velocity (instability) + vel_mag = np.linalg.norm(vel) + + # Components: + # 1. Distance Reward: Higher is better (closer to 0) + r_dist = -dist + + # 2. Stability Penalty: Penalize erratic high-speed movements if far from target + # But we need speed to get there. Let's just penalize extreme speed. + r_vel = -0.01 * vel_mag + + # 3. Survival Reward: Bonus for not crashing + r_survive = 0.1 + + reward = r_dist + r_vel + r_survive + + # Terminate if crashed or too far + term = False # Let it crash and stay on floor + trunc = self.step_count >= self.max_steps + + info = {"wind": wind_force, "target": self.target} + + return self.state.astype(np.float32), reward, term, trunc, info + + def render(self): + # We will handle rendering in the demo script using matplotlib + pass diff --git a/env/drone_env.py b/env/drone_env.py new file mode 100644 index 0000000000000000000000000000000000000000..2a8ccd61dd7da472c6ab3249c5abcbde2bfc6a20 --- /dev/null +++ b/env/drone_env.py @@ -0,0 +1,286 @@ +""" +A 2D drone environment with dynamic wind forces for reinforcement learning. +The drone can apply discrete thrust actions while being affected by smoothly varying wind. +The goal is to navigate and survive within the bounded world. +""" + +import numpy as np +import gymnasium as gym +from gymnasium import spaces +from typing import Optional, Tuple, Dict, Any + + +# Constants +DT = 0.1 # Time step +MAX_VEL = 2.0 # Maximum velocity magnitude +WIND_MAX = 2.0 # Maximum wind magnitude +WIND_SMOOTHING = 0.05 # Wind interpolation rate toward target +WIND_TARGET_INTERVAL = 50 # Steps between sampling new wind target +MAX_STEPS = 500 # Maximum episode length +POSITION_MIN = 0.0 # Minimum position (x, y) +POSITION_MAX = 1.0 # Maximum position (x, y) +THRUST = 0.25 # Thrust magnitude per action (slightly higher for control authority) + +# Target zone (box) constants +TARGET_X_MIN = 0.7 # Target box left edge +TARGET_X_MAX = 0.9 # Target box right edge +TARGET_Y_MIN = 0.3 # Target box bottom edge +TARGET_Y_MAX = 0.7 # Target box top edge +TARGET_REWARD = 2.0 # Bonus reward for being in target zone +TARGET_SPAWN_DELAY = 50 # Steps before target zone appears (after wind starts) + +# Stabilization and shaping +DRAG_COEFF = 0.3 # Linear velocity drag coefficient +SPEED_PENALTY_COEFF = 0.05 # Penalize high speeds to encourage smooth control +EDGE_MARGIN = 0.06 # Margin near boundaries where penalty increases +EDGE_PENALTY_COEFF = 0.5 # Strength of boundary proximity penalty + + +class DroneWindEnv(gym.Env): + """ + A 2D drone environment with dynamic wind. + + Observation: [x, y, vx, vy, wind_x, wind_y] + Action: Discrete(5) - 0: no thrust, 1: up, 2: down, 3: left, 4: right + """ + + metadata = {"render_modes": ["human", "rgb_array"], "render_fps": 10} + + def __init__(self): + super().__init__() + + # Observation space: [x, y, vx, vy, wind_x, wind_y] + self.observation_space = spaces.Box( + low=np.array([POSITION_MIN, POSITION_MIN, -MAX_VEL, -MAX_VEL, -WIND_MAX, -WIND_MAX], dtype=np.float32), + high=np.array([POSITION_MAX, POSITION_MAX, MAX_VEL, MAX_VEL, WIND_MAX, WIND_MAX], dtype=np.float32), + dtype=np.float32 + ) + + # Action space: 5 discrete thrust directions + self.action_space = spaces.Discrete(5) + + # Internal state + self.x: float = 0.0 + self.y: float = 0.0 + self.vx: float = 0.0 + self.vy: float = 0.0 + self.wind_x: float = 0.0 + self.wind_y: float = 0.0 + self.wind_target_x: float = 0.0 + self.wind_target_y: float = 0.0 + self.step_count: int = 0 + + def reset( + self, + *, + seed: Optional[int] = None, + options: Optional[Dict[str, Any]] = None + ) -> Tuple[np.ndarray, Dict[str, Any]]: + """ + Reset the environment to initial state. + + Args: + seed: Optional random seed + options: Optional reset options + + Returns: + observation: Initial observation array + info: Empty info dict + """ + # Always call super().reset to ensure seeding and np_random are initialized + super().reset(seed=seed) + + # Initialize state + self.x = 0.1 + self.y = 0.5 + self.vx = 0.0 + self.vy = 0.0 + self.wind_x = 0.0 + self.wind_y = 0.0 + self.wind_target_x = 0.0 + self.wind_target_y = 0.0 + self.step_count = 0 + + # Build observation + obs = self._get_observation() + info = {} + + return obs, info + + def step(self, action: int) -> Tuple[np.ndarray, float, bool, bool, Dict[str, Any]]: + """ + Execute one environment step. + + Args: + action: Discrete action (0-4) + + Returns: + observation: New observation array + reward: Reward for this step + terminated: Whether episode ended due to boundary crash + truncated: Whether episode ended due to max steps + info: Info dict with step_count + """ + # Increment step count + self.step_count += 1 + + # Update wind model + self._update_wind() + + # Apply physics update + self._apply_physics(action) + + # Compute reward + base_reward = 1.0 # Survival reward + + # Check if drone is in target zone (only if target has spawned) + target_spawned = self.step_count >= TARGET_SPAWN_DELAY + in_target = False + if target_spawned: + in_target = ( + TARGET_X_MIN <= self.x <= TARGET_X_MAX and + TARGET_Y_MIN <= self.y <= TARGET_Y_MAX + ) + target_bonus = TARGET_REWARD if in_target else 0.0 + + # Speed penalty (discourage excessive velocity) + speed_sq = self.vx * self.vx + self.vy * self.vy + speed_penalty = -SPEED_PENALTY_COEFF * float(speed_sq) + # Boundary proximity penalty (discourage hovering near walls) + dist_left = self.x - POSITION_MIN + dist_right = POSITION_MAX - self.x + dist_bottom = self.y - POSITION_MIN + dist_top = POSITION_MAX - self.y + min_dist = min(dist_left, dist_right, dist_bottom, dist_top) + edge_penalty = 0.0 + if min_dist < EDGE_MARGIN: + edge_penalty = -EDGE_PENALTY_COEFF * (EDGE_MARGIN - float(min_dist)) / EDGE_MARGIN + + reward = base_reward + target_bonus + speed_penalty + edge_penalty + + # Check termination (boundary crash) + terminated = ( + self.x <= POSITION_MIN or + self.x >= POSITION_MAX or + self.y <= POSITION_MIN or + self.y >= POSITION_MAX + ) + + # Check truncation (max steps) + truncated = self.step_count >= MAX_STEPS + + # Build observation + obs = self._get_observation() + + # Check if in target zone (only if target has spawned) + target_spawned = self.step_count >= TARGET_SPAWN_DELAY + in_target = False + if target_spawned: + in_target = ( + TARGET_X_MIN <= self.x <= TARGET_X_MAX and + TARGET_Y_MIN <= self.y <= TARGET_Y_MAX + ) + info = {"step_count": self.step_count, "in_target": in_target, "target_spawned": target_spawned} + + return obs, reward, terminated, truncated, info + + def _update_wind(self) -> None: + """Update wind by smoothly moving toward target, resampling target periodically.""" + # Resample wind target every WIND_TARGET_INTERVAL steps + if self.step_count % WIND_TARGET_INTERVAL == 0: + self.wind_target_x = self.np_random.uniform(-WIND_MAX, WIND_MAX) + self.wind_target_y = self.np_random.uniform(-WIND_MAX, WIND_MAX) + + # Smoothly interpolate wind toward target + self.wind_x += WIND_SMOOTHING * (self.wind_target_x - self.wind_x) + self.wind_y += WIND_SMOOTHING * (self.wind_target_y - self.wind_y) + + # Clamp wind to bounds + self.wind_x = np.clip(self.wind_x, -WIND_MAX, WIND_MAX) + self.wind_y = np.clip(self.wind_y, -WIND_MAX, WIND_MAX) + + def _apply_physics(self, action: int) -> None: + """Apply physics update: convert action to thrust, update velocity and position.""" + # Convert action to thrust vector + if action == 0: # No thrust + ax, ay = 0.0, 0.0 + elif action == 1: # Thrust up + ax, ay = 0.0, THRUST + elif action == 2: # Thrust down + ax, ay = 0.0, -THRUST + elif action == 3: # Thrust left + ax, ay = -THRUST, 0.0 + elif action == 4: # Thrust right + ax, ay = THRUST, 0.0 + else: + raise ValueError(f"Invalid action: {action}. Must be in [0, 4]") + + # Update velocity with thrust and wind + self.vx = self.vx + ax + self.wind_x * DT + self.vy = self.vy + ay + self.wind_y * DT + # Apply linear drag (proportional to velocity) for stability + self.vx -= DRAG_COEFF * self.vx * DT + self.vy -= DRAG_COEFF * self.vy * DT + + # Clamp velocity + self.vx = np.clip(self.vx, -MAX_VEL, MAX_VEL) + self.vy = np.clip(self.vy, -MAX_VEL, MAX_VEL) + + # Update position + self.x = self.x + self.vx * DT + self.y = self.y + self.vy * DT + + # Clamp position to bounds + self.x = np.clip(self.x, POSITION_MIN, POSITION_MAX) + self.y = np.clip(self.y, POSITION_MIN, POSITION_MAX) + + def _get_observation(self) -> np.ndarray: + """Build observation array from current state.""" + return np.array( + [self.x, self.y, self.vx, self.vy, self.wind_x, self.wind_y], + dtype=np.float32 + ) + + def render(self) -> None: + """ + Render the environment state (stub implementation for Phase 1). + Prints state to stdout. + """ + print( + f"Step {self.step_count}: " + f"x={self.x:.2f}, y={self.y:.2f}, " + f"vx={self.vx:.2f}, vy={self.vy:.2f}, " + f"wind=({self.wind_x:.2f}, {self.wind_y:.2f})" + ) + + +def make_drone_env() -> DroneWindEnv: + """Helper function to create a DroneWindEnv instance.""" + return DroneWindEnv() + + +if __name__ == "__main__": + # Manual test block + print("Testing DroneWindEnv...") + print("=" * 60) + + env = make_drone_env() + obs, info = env.reset(seed=42) + print(f"Initial observation: {obs}") + print() + + for t in range(200): + action = env.action_space.sample() + obs, reward, terminated, truncated, info = env.step(action) + env.render() + + if terminated: + print(f"\nEpisode terminated at step {t} (boundary crash)") + break + if truncated: + print(f"\nEpisode truncated at step {t} (max steps reached)") + break + + print("=" * 60) + print("Test completed!") + diff --git a/eval/__init__.py b/eval/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..c623217351236fa50cfc31ff7c7ad6fa2e61a9e5 --- /dev/null +++ b/eval/__init__.py @@ -0,0 +1,2 @@ +"""Evaluation scripts and utilities.""" + diff --git a/eval/eval_liquid_policy.py b/eval/eval_liquid_policy.py new file mode 100644 index 0000000000000000000000000000000000000000..be7b63179918049deee65eba320d64563b61565d --- /dev/null +++ b/eval/eval_liquid_policy.py @@ -0,0 +1,177 @@ +""" +Evaluate a trained PPO Liquid Neural Network policy on the DroneWindEnv environment. + +This script loads a saved PPO model with liquid policy and runs evaluation episodes, +printing statistics about average reward and episode length. +""" + +import os +import sys +import argparse +import numpy as np +from stable_baselines3 import PPO + +# Add project root to path +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from env.drone_env import DroneWindEnv + + +def main(): + """Main evaluation function.""" + parser = argparse.ArgumentParser(description="Evaluate PPO Liquid NN agent on DroneWindEnv") + parser.add_argument( + "--model-path", + type=str, + default="models/liquid_policy.zip", + help="Path to the trained model (default: models/liquid_policy.zip)" + ) + parser.add_argument( + "--episodes", + type=int, + default=10, + help="Number of evaluation episodes (default: 10)" + ) + parser.add_argument( + "--render", + action="store_true", + help="Print environment state to console during evaluation" + ) + parser.add_argument( + "--seed", + type=int, + default=None, + help="Random seed for evaluation (default: None)" + ) + + args = parser.parse_args() + + print("=" * 60) + print("Evaluating PPO Liquid NN Agent on DroneWindEnv") + print("=" * 60) + print(f"Model path: {args.model_path}") + print(f"Number of episodes: {args.episodes}") + print("=" * 60) + + # Check if model file exists + if not os.path.exists(args.model_path): + print(f"\nError: Model file not found at {args.model_path}") + print("Please train a model first using:") + print(" python train/train_liquid_ppo.py") + return + + # Create environment + print("\nCreating environment...") + env = DroneWindEnv() + + # Load the model + print(f"Loading model from {args.model_path}...") + try: + model = PPO.load(args.model_path, env=env) + print("Model loaded successfully!") + except Exception as e: + print(f"\nError loading model: {e}") + return + + # Run evaluation episodes + print(f"\nRunning {args.episodes} evaluation episodes...") + print("-" * 60) + + rewards = [] + episode_lengths = [] + + for episode in range(args.episodes): + obs, info = env.reset(seed=args.seed) + done = False + truncated = False + total_reward = 0.0 + step_count = 0 + + if args.render: + print(f"\nEpisode {episode + 1}:") + env.render() + + while not (done or truncated): + # Get action from the model (deterministic) + action, _ = model.predict(obs, deterministic=True) + + # Step the environment + obs, reward, done, truncated, info = env.step(action) + + total_reward += reward + step_count += 1 + + if args.render: + env.render() + + rewards.append(total_reward) + episode_lengths.append(step_count) + + status = "terminated" if done else "truncated" + print(f"Episode {episode + 1}: Reward = {total_reward:.2f}, " + f"Length = {step_count} steps ({status})") + + # Print statistics + print("\n" + "=" * 60) + print("Evaluation Results") + print("=" * 60) + print(f"Average reward: {np.mean(rewards):.2f} ± {np.std(rewards):.2f}") + print(f"Average episode length: {np.mean(episode_lengths):.1f} ± {np.std(episode_lengths):.1f}") + print(f"Average survival time: {np.mean(episode_lengths):.1f} steps") + print(f"Min reward: {np.min(rewards):.2f}") + print(f"Max reward: {np.max(rewards):.2f}") + print(f"Min episode length: {np.min(episode_lengths)}") + print(f"Max episode length: {np.max(episode_lengths)}") + print("=" * 60) + + # Print per-episode rewards + print("\nPer-episode rewards:") + for i, reward in enumerate(rewards, 1): + print(f" Episode {i}: {reward:.2f}") + + # Optional: Try to plot if matplotlib is available + try: + import matplotlib.pyplot as plt + + plt.figure(figsize=(10, 5)) + + # Plot 1: Episode rewards + plt.subplot(1, 2, 1) + plt.plot(range(1, len(rewards) + 1), rewards, 'o-', linewidth=2, markersize=6) + plt.axhline(y=np.mean(rewards), color='r', linestyle='--', label=f'Mean: {np.mean(rewards):.2f}') + plt.xlabel('Episode') + plt.ylabel('Total Reward') + plt.title('Episode Rewards (Liquid NN)') + plt.grid(True, alpha=0.3) + plt.legend() + + # Plot 2: Episode lengths + plt.subplot(1, 2, 2) + plt.plot(range(1, len(episode_lengths) + 1), episode_lengths, 's-', + linewidth=2, markersize=6, color='green') + plt.axhline(y=np.mean(episode_lengths), color='r', linestyle='--', + label=f'Mean: {np.mean(episode_lengths):.1f}') + plt.xlabel('Episode') + plt.ylabel('Episode Length') + plt.title('Episode Lengths (Liquid NN)') + plt.grid(True, alpha=0.3) + plt.legend() + + plt.tight_layout() + plt.savefig('eval_liquid_results.png', dpi=150, bbox_inches='tight') + print("\n✓ Evaluation plots saved to eval_liquid_results.png") + print(" (Close the plot window to continue)") + plt.show(block=False) + plt.pause(2) # Show for 2 seconds + plt.close() + + except ImportError: + # Matplotlib not available, skip plotting + pass + except Exception as e: + print(f"\nNote: Could not generate plots: {e}") + + +if __name__ == "__main__": + main() + diff --git a/eval/eval_mlp_baseline.py b/eval/eval_mlp_baseline.py new file mode 100644 index 0000000000000000000000000000000000000000..ce2f0d777b31f8820aa3ca9113cfdc6948d36fc3 --- /dev/null +++ b/eval/eval_mlp_baseline.py @@ -0,0 +1,176 @@ +""" +Evaluate a trained PPO MLP baseline on the DroneWindEnv environment. + +This script loads a saved PPO model and runs evaluation episodes, +printing statistics about average reward and episode length. +""" + +import os +import sys +import argparse +import numpy as np +from stable_baselines3 import PPO + +# Add project root to path +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from env.drone_env import DroneWindEnv + + +def main(): + """Main evaluation function.""" + parser = argparse.ArgumentParser(description="Evaluate PPO agent on DroneWindEnv") + parser.add_argument( + "--model-path", + type=str, + default="models/mlp_baseline.zip", + help="Path to the trained model (default: models/mlp_baseline.zip)" + ) + parser.add_argument( + "--episodes", + type=int, + default=10, + help="Number of evaluation episodes (default: 10)" + ) + parser.add_argument( + "--render", + action="store_true", + help="Print environment state to console during evaluation" + ) + parser.add_argument( + "--seed", + type=int, + default=None, + help="Random seed for evaluation (default: None)" + ) + + args = parser.parse_args() + + print("=" * 60) + print("Evaluating PPO Agent on DroneWindEnv") + print("=" * 60) + print(f"Model path: {args.model_path}") + print(f"Number of episodes: {args.episodes}") + print("=" * 60) + + # Check if model file exists + if not os.path.exists(args.model_path): + print(f"\nError: Model file not found at {args.model_path}") + print("Please train a model first using:") + print(" python train/train_mlp_ppo.py") + return + + # Create environment + print("\nCreating environment...") + env = DroneWindEnv() + + # Load the model + print(f"Loading model from {args.model_path}...") + try: + model = PPO.load(args.model_path, env=env) + print("Model loaded successfully!") + except Exception as e: + print(f"\nError loading model: {e}") + return + + # Run evaluation episodes + print(f"\nRunning {args.episodes} evaluation episodes...") + print("-" * 60) + + rewards = [] + episode_lengths = [] + + for episode in range(args.episodes): + obs, info = env.reset(seed=args.seed) + done = False + truncated = False + total_reward = 0.0 + step_count = 0 + + if args.render: + print(f"\nEpisode {episode + 1}:") + env.render() + + while not (done or truncated): + # Get action from the model (deterministic) + action, _ = model.predict(obs, deterministic=True) + + # Step the environment + obs, reward, done, truncated, info = env.step(action) + + total_reward += reward + step_count += 1 + + if args.render: + env.render() + + rewards.append(total_reward) + episode_lengths.append(step_count) + + status = "terminated" if done else "truncated" + print(f"Episode {episode + 1}: Reward = {total_reward:.2f}, " + f"Length = {step_count} steps ({status})") + + # Print statistics + print("\n" + "=" * 60) + print("Evaluation Results") + print("=" * 60) + print(f"Average reward: {np.mean(rewards):.2f} ± {np.std(rewards):.2f}") + print(f"Average episode length: {np.mean(episode_lengths):.1f} ± {np.std(episode_lengths):.1f}") + print(f"Min reward: {np.min(rewards):.2f}") + print(f"Max reward: {np.max(rewards):.2f}") + print(f"Min episode length: {np.min(episode_lengths)}") + print(f"Max episode length: {np.max(episode_lengths)}") + print("=" * 60) + + # Print per-episode rewards + print("\nPer-episode rewards:") + for i, reward in enumerate(rewards, 1): + print(f" Episode {i}: {reward:.2f}") + + # Optional: Try to plot if matplotlib is available + try: + import matplotlib.pyplot as plt + + plt.figure(figsize=(10, 5)) + + # Plot 1: Episode rewards + plt.subplot(1, 2, 1) + plt.plot(range(1, len(rewards) + 1), rewards, 'o-', linewidth=2, markersize=6) + plt.axhline(y=np.mean(rewards), color='r', linestyle='--', label=f'Mean: {np.mean(rewards):.2f}') + plt.xlabel('Episode') + plt.ylabel('Total Reward') + plt.title('Episode Rewards') + plt.grid(True, alpha=0.3) + plt.legend() + + # Plot 2: Episode lengths + plt.subplot(1, 2, 2) + plt.plot(range(1, len(episode_lengths) + 1), episode_lengths, 's-', + linewidth=2, markersize=6, color='green') + plt.axhline(y=np.mean(episode_lengths), color='r', linestyle='--', + label=f'Mean: {np.mean(episode_lengths):.1f}') + plt.xlabel('Episode') + plt.ylabel('Episode Length') + plt.title('Episode Lengths') + plt.grid(True, alpha=0.3) + plt.legend() + + plt.tight_layout() + plt.savefig('eval_results.png', dpi=150, bbox_inches='tight') + print("\n✓ Evaluation plots saved to eval_results.png") + print(" (Close the plot window to continue)") + plt.show(block=False) + plt.pause(2) # Show for 2 seconds + plt.close() + + except ImportError: + # Matplotlib not available, skip plotting + pass + except Exception as e: + print(f"\nNote: Could not generate plots: {e}") + + +if __name__ == "__main__": + main() + diff --git a/install_log.txt b/install_log.txt new file mode 100644 index 0000000000000000000000000000000000000000..fe75d35beef508a3b7bc5b2c7719eb609f8faaf1 --- /dev/null +++ b/install_log.txt @@ -0,0 +1,197 @@ +Defaulting to user installation because normal site-packages is not writeable +Collecting PyFlyt + Downloading pyflyt-0.29.0-py3-none-any.whl.metadata (5.2 kB) +Downloading pyflyt-0.29.0-py3-none-any.whl (215 kB) +Installing collected packages: PyFlyt +Successfully installed PyFlyt-0.29.0 +Defaulting to user installation because normal site-packages is not writeable +Requirement already satisfied: numpy in /usr/lib64/python3.14/site-packages (2.3.5) +Collecting gymnasium + Using cached gymnasium-1.2.2-py3-none-any.whl.metadata (10 kB) +Collecting opensimplex + Downloading opensimplex-0.4.5.1-py3-none-any.whl.metadata (10 kB) +Collecting ncps + Downloading ncps-1.0.1-py3-none-any.whl.metadata (702 bytes) +Collecting stable-baselines3 + Downloading stable_baselines3-2.7.0-py3-none-any.whl.metadata (4.8 kB) +Collecting rich + Downloading rich-14.2.0-py3-none-any.whl.metadata (18 kB) +Collecting tqdm + Downloading tqdm-4.67.1-py3-none-any.whl.metadata (57 kB) +Collecting cloudpickle>=1.2.0 (from gymnasium) + Downloading cloudpickle-3.1.2-py3-none-any.whl.metadata (7.1 kB) +Requirement already satisfied: typing-extensions>=4.3.0 in /usr/lib/python3.14/site-packages (from gymnasium) (4.15.0) +Collecting farama-notifications>=0.0.1 (from gymnasium) + Downloading Farama_Notifications-0.0.4-py3-none-any.whl.metadata (558 bytes) +Collecting future (from ncps) + Downloading future-1.0.0-py3-none-any.whl.metadata (4.0 kB) +Requirement already satisfied: packaging in /usr/lib/python3.14/site-packages (from ncps) (25.0) +Collecting torch<3.0,>=2.3 (from stable-baselines3) + Using cached torch-2.9.1-cp314-cp314-manylinux_2_28_x86_64.whl.metadata (30 kB) +Collecting pandas (from stable-baselines3) + Downloading pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.metadata (91 kB) +Collecting matplotlib (from stable-baselines3) + Downloading matplotlib-3.10.7-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.metadata (11 kB) +Collecting filelock (from torch<3.0,>=2.3->stable-baselines3) + Downloading filelock-3.20.0-py3-none-any.whl.metadata (2.1 kB) +Requirement already satisfied: setuptools in /usr/lib/python3.14/site-packages (from torch<3.0,>=2.3->stable-baselines3) (78.1.1) +Collecting sympy>=1.13.3 (from torch<3.0,>=2.3->stable-baselines3) + Downloading sympy-1.14.0-py3-none-any.whl.metadata (12 kB) +Collecting networkx>=2.5.1 (from torch<3.0,>=2.3->stable-baselines3) + Downloading networkx-3.6-py3-none-any.whl.metadata (6.8 kB) +Requirement already satisfied: jinja2 in /usr/lib/python3.14/site-packages (from torch<3.0,>=2.3->stable-baselines3) (3.1.6) +Collecting fsspec>=0.8.5 (from torch<3.0,>=2.3->stable-baselines3) + Downloading fsspec-2025.10.0-py3-none-any.whl.metadata (10 kB) +Collecting nvidia-cuda-nvrtc-cu12==12.8.93 (from torch<3.0,>=2.3->stable-baselines3) + Downloading nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl.metadata (1.7 kB) +Collecting nvidia-cuda-runtime-cu12==12.8.90 (from torch<3.0,>=2.3->stable-baselines3) + Downloading nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (1.7 kB) +Collecting nvidia-cuda-cupti-cu12==12.8.90 (from torch<3.0,>=2.3->stable-baselines3) + Downloading nvidia_cuda_cupti_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (1.7 kB) +Collecting nvidia-cudnn-cu12==9.10.2.21 (from torch<3.0,>=2.3->stable-baselines3) + Downloading nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_x86_64.whl.metadata (1.8 kB) +Collecting nvidia-cublas-cu12==12.8.4.1 (from torch<3.0,>=2.3->stable-baselines3) + Downloading nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_x86_64.whl.metadata (1.7 kB) +Collecting nvidia-cufft-cu12==11.3.3.83 (from torch<3.0,>=2.3->stable-baselines3) + Downloading nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (1.7 kB) +Collecting nvidia-curand-cu12==10.3.9.90 (from torch<3.0,>=2.3->stable-baselines3) + Downloading nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_x86_64.whl.metadata (1.7 kB) +Collecting nvidia-cusolver-cu12==11.7.3.90 (from torch<3.0,>=2.3->stable-baselines3) + Downloading nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_x86_64.whl.metadata (1.8 kB) +Collecting nvidia-cusparse-cu12==12.5.8.93 (from torch<3.0,>=2.3->stable-baselines3) + Downloading nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (1.8 kB) +Collecting nvidia-cusparselt-cu12==0.7.1 (from torch<3.0,>=2.3->stable-baselines3) + Downloading nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_x86_64.whl.metadata (7.0 kB) +Collecting nvidia-nccl-cu12==2.27.5 (from torch<3.0,>=2.3->stable-baselines3) + Downloading nvidia_nccl_cu12-2.27.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (2.0 kB) +Collecting nvidia-nvshmem-cu12==3.3.20 (from torch<3.0,>=2.3->stable-baselines3) + Downloading nvidia_nvshmem_cu12-3.3.20-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (2.1 kB) +Collecting nvidia-nvtx-cu12==12.8.90 (from torch<3.0,>=2.3->stable-baselines3) + Downloading nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (1.8 kB) +Collecting nvidia-nvjitlink-cu12==12.8.93 (from torch<3.0,>=2.3->stable-baselines3) + Downloading nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl.metadata (1.7 kB) +Collecting nvidia-cufile-cu12==1.13.1.3 (from torch<3.0,>=2.3->stable-baselines3) + Downloading nvidia_cufile_cu12-1.13.1.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (1.7 kB) +Collecting triton==3.5.1 (from torch<3.0,>=2.3->stable-baselines3) + Downloading triton-3.5.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.metadata (1.7 kB) +Collecting markdown-it-py>=2.2.0 (from rich) + Downloading markdown_it_py-4.0.0-py3-none-any.whl.metadata (7.3 kB) +Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/lib/python3.14/site-packages (from rich) (2.19.1) +Collecting mdurl~=0.1 (from markdown-it-py>=2.2.0->rich) + Downloading mdurl-0.1.2-py3-none-any.whl.metadata (1.6 kB) +Collecting mpmath<1.4,>=1.1.0 (from sympy>=1.13.3->torch<3.0,>=2.3->stable-baselines3) + Downloading mpmath-1.3.0-py3-none-any.whl.metadata (8.6 kB) +Requirement already satisfied: MarkupSafe>=2.0 in /usr/lib64/python3.14/site-packages (from jinja2->torch<3.0,>=2.3->stable-baselines3) (3.0.2) +Collecting contourpy>=1.0.1 (from matplotlib->stable-baselines3) + Downloading contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.metadata (5.5 kB) +Collecting cycler>=0.10 (from matplotlib->stable-baselines3) + Using cached cycler-0.12.1-py3-none-any.whl.metadata (3.8 kB) +Collecting fonttools>=4.22.0 (from matplotlib->stable-baselines3) + Downloading fonttools-4.61.0-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl.metadata (113 kB) +Collecting kiwisolver>=1.3.1 (from matplotlib->stable-baselines3) + Downloading kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (6.3 kB) +Requirement already satisfied: pillow>=8 in /usr/lib64/python3.14/site-packages (from matplotlib->stable-baselines3) (11.3.0) +Requirement already satisfied: pyparsing>=3 in /usr/lib/python3.14/site-packages (from matplotlib->stable-baselines3) (3.1.2) +Requirement already satisfied: python-dateutil>=2.7 in /usr/lib/python3.14/site-packages (from matplotlib->stable-baselines3) (2.9.0.post0) +Requirement already satisfied: six>=1.5 in /usr/lib/python3.14/site-packages (from python-dateutil>=2.7->matplotlib->stable-baselines3) (1.17.0) +Collecting pytz>=2020.1 (from pandas->stable-baselines3) + Downloading pytz-2025.2-py2.py3-none-any.whl.metadata (22 kB) +Collecting tzdata>=2022.7 (from pandas->stable-baselines3) + Downloading tzdata-2025.2-py2.py3-none-any.whl.metadata (1.4 kB) +Downloading gymnasium-1.2.2-py3-none-any.whl (952 kB) + ━━ 9… 1… eta 0:0… + kB M… +Downloading opensimplex-0.4.5.1-py3-none-any.whl (267 kB) +Downloading ncps-1.0.1-py3-none-any.whl (60 kB) +Downloading stable_baselines3-2.7.0-py3-none-any.whl (187 kB) +Downloading torch-2.9.1-cp314-cp314-manylinux_2_28_x86_64.whl (899.7 MB) + ━━ 8… 2… eta 0:0… + MB M… +Downloading nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_x86_64.whl (594.3 MB) + ━━ 5… 2… eta 0:0… + MB M… +Downloading nvidia_cuda_cupti_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (10.2 MB) + ━━ 1… 3… eta 0:0… + MB M… +Downloading nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl (88.0 MB) + ━━ 8… 3… eta 0:0… + MB M… +Downloading nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (954 kB) + ━━ 9… 2… eta 0:0… + kB M… +Downloading nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_x86_64.whl (706.8 MB) + ━━ 7… 2… eta 0:0… + MB M… +Downloading nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (193.1 MB) + ━━ 1… 1… eta 0:0… + MB M… +Downloading nvidia_cufile_cu12-1.13.1.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (1.2 MB) + ━━ 1… 7… eta 0:0… + MB M… +Downloading nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_x86_64.whl (63.6 MB) + ━━ 6… 1… eta 0:0… + MB M… +Downloading nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_x86_64.whl (267.5 MB) + ━━ 2… 1… eta 0:0… + MB M… +Downloading nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (288.2 MB) + ━━ 2… 1… eta 0:0… + MB M… +Downloading nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_x86_64.whl (287.2 MB) + ━━ 2… 2… eta 0:0… + MB M… +Downloading nvidia_nccl_cu12-2.27.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (322.3 MB) + ━━ 3… 1… eta 0:0… + MB M… +Downloading nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl (39.3 MB) + ━━ 3… 1… eta 0:0… + MB M… +Downloading nvidia_nvshmem_cu12-3.3.20-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (124.7 MB) + ━━ 1… 1… eta 0:0… + MB M… +Downloading nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (89 kB) +Downloading triton-3.5.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (170.5 MB) + ━━ 1… 3… eta 0:0… + MB M… +Downloading rich-14.2.0-py3-none-any.whl (243 kB) +Downloading tqdm-4.67.1-py3-none-any.whl (78 kB) +Downloading cloudpickle-3.1.2-py3-none-any.whl (22 kB) +Downloading Farama_Notifications-0.0.4-py3-none-any.whl (2.5 kB) +Downloading fsspec-2025.10.0-py3-none-any.whl (200 kB) +Downloading markdown_it_py-4.0.0-py3-none-any.whl (87 kB) +Downloading mdurl-0.1.2-py3-none-any.whl (10.0 kB) +Downloading networkx-3.6-py3-none-any.whl (2.1 MB) + ━━ 2… 3… eta 0:0… + MB M… +Downloading sympy-1.14.0-py3-none-any.whl (6.3 MB) + ━━ 6… 3… eta 0:0… + MB M… +Downloading mpmath-1.3.0-py3-none-any.whl (536 kB) + ━━ 5… 1… eta 0:0… + kB M… +Downloading filelock-3.20.0-py3-none-any.whl (16 kB) +Downloading future-1.0.0-py3-none-any.whl (491 kB) +Downloading matplotlib-3.10.7-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (9.8 MB) + ━━ 9… 3… eta 0:0… + MB M… +Downloading contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (363 kB) +Using cached cycler-0.12.1-py3-none-any.whl (8.3 kB) +Downloading fonttools-4.61.0-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl (4.9 MB) + ━━ 4… 3… eta 0:0… + MB M… +Downloading kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (1.5 MB) + ━━ 1… 2… eta 0:0… + MB M… +Downloading pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (12.3 MB) + ━━ 1… 3… eta 0:0… + MB M… +Downloading pytz-2025.2-py2.py3-none-any.whl (509 kB) +Downloading tzdata-2025.2-py2.py3-none-any.whl (347 kB) +Installing collected packages: pytz, nvidia-cusparselt-cu12, mpmath, farama-notifications, tzdata, triton, tqdm, sympy, opensimplex, nvidia-nvtx-cu12, nvidia-nvshmem-cu12, nvidia-nvjitlink-cu12, nvidia-nccl-cu12, nvidia-curand-cu12, nvidia-cufile-cu12, nvidia-cuda-runtime-cu12, nvidia-cuda-nvrtc-cu12, nvidia-cuda-cupti-cu12, nvidia-cublas-cu12, networkx, mdurl, kiwisolver, future, fsspec, fonttools, filelock, cycler, contourpy, cloudpickle, pandas, nvidia-cusparse-cu12, nvidia-cufft-cu12, nvidia-cudnn-cu12, ncps, matplotlib, markdown-it-py, gymnasium, rich, nvidia-cusolver-cu12, torch, stable-baselines3 + +ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. +pyflyt 0.29.0 requires numba, which is not installed. +pyflyt 0.29.0 requires pettingzoo, which is not installed. +pyflyt 0.29.0 requires pybullet, which is not installed. +pyflyt 0.29.0 requires numpy<2.0.0, but you have numpy 2.3.5 which is incompatible. +Successfully installed cloudpickle-3.1.2 contourpy-1.3.3 cycler-0.12.1 farama-notifications-0.0.4 filelock-3.20.0 fonttools-4.61.0 fsspec-2025.10.0 future-1.0.0 gymnasium-1.2.2 kiwisolver-1.4.9 markdown-it-py-4.0.0 matplotlib-3.10.7 mdurl-0.1.2 mpmath-1.3.0 ncps-1.0.1 networkx-3.6 nvidia-cublas-cu12-12.8.4.1 nvidia-cuda-cupti-cu12-12.8.90 nvidia-cuda-nvrtc-cu12-12.8.93 nvidia-cuda-runtime-cu12-12.8.90 nvidia-cudnn-cu12-9.10.2.21 nvidia-cufft-cu12-11.3.3.83 nvidia-cufile-cu12-1.13.1.3 nvidia-curand-cu12-10.3.9.90 nvidia-cusolver-cu12-11.7.3.90 nvidia-cusparse-cu12-12.5.8.93 nvidia-cusparselt-cu12-0.7.1 nvidia-nccl-cu12-2.27.5 nvidia-nvjitlink-cu12-12.8.93 nvidia-nvshmem-cu12-3.3.20 nvidia-nvtx-cu12-12.8.90 opensimplex-0.4.5.1 pandas-2.3.3 pytz-2025.2 rich-14.2.0 stable-baselines3-2.7.0 sympy-1.14.0 torch-2.9.1 tqdm-4.67.1 triton-3.5.1 tzdata-2025.2 diff --git a/interactive_log.txt b/interactive_log.txt new file mode 100644 index 0000000000000000000000000000000000000000..3a385fb3bd9755979f561b9bc64fba99fe55a5b9 --- /dev/null +++ b/interactive_log.txt @@ -0,0 +1,8 @@ +Initializing Interactive Dashboard... +No trained model found. Using untrained Liquid Brain. +Using cpu device +Wrapping the env with a `Monitor` wrapper +Wrapping the env in a DummyVecEnv. + +=== DASHBOARD LIVE === +Close the window to exit. diff --git a/main.py b/main.py new file mode 100644 index 0000000000000000000000000000000000000000..b0bf9b5df2b702eba6c03cc57d5128c27112b8ee --- /dev/null +++ b/main.py @@ -0,0 +1,144 @@ +""" +Main entry point for the Drone RL project. +Tests imports and basic functionality. +""" + +import sys +import numpy as np + +print("=" * 50) +print("Drone RL Project - Import Test") +print("=" * 50) + +# Test PyTorch +try: + import torch + print(f"✓ PyTorch {torch.__version__} imported successfully") + print(f" CUDA available: {torch.cuda.is_available()}") +except ImportError as e: + print(f"✗ PyTorch import failed: {e}") + sys.exit(1) + +# Test NumPy +try: + print(f"✓ NumPy {np.__version__} imported successfully") +except ImportError as e: + print(f"✗ NumPy import failed: {e}") + sys.exit(1) + +# Test Gymnasium +try: + import gymnasium as gym + print(f"✓ Gymnasium {gym.__version__} imported successfully") + + # Test creating a simple environment + try: + env = gym.make("CartPole-v1") + print(f"✓ Gymnasium environment 'CartPole-v1' created successfully") + env.close() + except Exception as e: + print(f"⚠ Could not create test environment: {e}") +except ImportError as e: + print(f"✗ Gymnasium import failed: {e}") + sys.exit(1) + +# Test Stable-Baselines3 +try: + import stable_baselines3 + print(f"✓ Stable-Baselines3 imported successfully") +except ImportError as e: + print(f"⚠ Stable-Baselines3 import failed: {e}") + print(" (This is optional, you can use cleanrl instead)") + +# Test Pygame +pygame_works = False +try: + import pygame + print(f"✓ Pygame {pygame.__version__} imported successfully") + + # Try to initialize pygame + try: + pygame.init() + print("✓ Pygame initialized successfully") + + # Create a test window + screen = pygame.display.set_mode((640, 480)) + pygame.display.set_caption("Drone RL - Pygame Test") + print("✓ Pygame window created successfully") + print(" Window should be visible. Close it to continue...") + + # Keep window open briefly, then close + import time + clock = pygame.time.Clock() + running = True + start_time = time.time() + + while running and (time.time() - start_time) < 2.0: # Show for 2 seconds + for event in pygame.event.get(): + if event.type == pygame.QUIT: + running = False + + screen.fill((50, 50, 50)) # Dark gray background + font = pygame.font.Font(None, 36) + text = font.render("Pygame Works!", True, (255, 255, 255)) + text_rect = text.get_rect(center=(320, 240)) + screen.blit(text, text_rect) + pygame.display.flip() + clock.tick(60) + + pygame.quit() + pygame_works = True + print("✓ Pygame window test completed successfully") + + except Exception as e: + print(f"⚠ Pygame initialization failed: {e}") + pygame.quit() + +except ImportError as e: + print(f"✗ Pygame import failed: {e}") + +# Fallback to matplotlib if pygame failed +if not pygame_works: + print("\n" + "=" * 50) + print("Falling back to matplotlib animation...") + print("=" * 50) + try: + import matplotlib.pyplot as plt + import matplotlib.animation as animation + + print("✓ Matplotlib imported successfully") + + # Create a simple animation + fig, ax = plt.subplots() + ax.set_xlim(0, 10) + ax.set_ylim(0, 10) + ax.set_title("Drone RL - Matplotlib Test") + + line, = ax.plot([], [], 'o-', lw=2) + + def animate(frame): + x = np.linspace(0, 10, 100) + y = np.sin(x + frame * 0.1) * 5 + 5 + line.set_data(x, y) + return line, + + anim = animation.FuncAnimation(fig, animate, frames=100, interval=50, blit=True) + print("✓ Matplotlib animation created") + print(" Animation window should be visible. Close it to continue...") + plt.show(block=False) + + # Keep it open briefly + import time + time.sleep(2) + plt.close() + + print("✓ Matplotlib animation test completed successfully") + + except ImportError as e: + print(f"✗ Matplotlib import failed: {e}") + print(" Please install matplotlib: pip install matplotlib") + +print("\n" + "=" * 50) +print("All tests completed!") +print("=" * 50) + diff --git a/models/__init__.py b/models/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..9bc785697064dd8896bc7dc33bb74b8455252935 --- /dev/null +++ b/models/__init__.py @@ -0,0 +1,2 @@ +"""Model definitions and architectures.""" + diff --git a/models/liquid_cell.py b/models/liquid_cell.py new file mode 100644 index 0000000000000000000000000000000000000000..2f7ef8151884783a168fdc153c5e5a6af470cb33 --- /dev/null +++ b/models/liquid_cell.py @@ -0,0 +1,86 @@ +""" +Liquid Neural Network Cell - Discrete-time approximation of continuous-time dynamics. + +Implements a liquid cell with learnable per-neuron time constants. +The cell updates hidden state using a differential equation approximation. +""" + +import torch +import torch.nn as nn +import torch.nn.functional as F + + +class LiquidCell(nn.Module): + """ + A discrete-time liquid neural network cell. + + Hidden state update rule: + h_{t+1,i} = h_{t,i} + dt / tau_i * ( tanh( W_hh[i]·h_t + W_xh[i]·x_t + b[i] ) - h_{t,i} ) + + where tau_i is a learnable per-neuron time constant. + + Args: + hidden_size: Number of hidden neurons + input_size: Size of input vector + dt: Time step for discrete approximation (default: 0.1) + """ + + def __init__(self, hidden_size: int, input_size: int, dt: float = 0.1): + super().__init__() + self.hidden_size = hidden_size + self.input_size = input_size + self.dt = dt + + # Recurrent weight matrix: (hidden_size, hidden_size) + self.W_hh = nn.Parameter(torch.randn(hidden_size, hidden_size) * 0.1) + + # Input weight matrix: (hidden_size, input_size) + self.W_xh = nn.Parameter(torch.randn(hidden_size, input_size) * 0.1) + + # Bias vector: (hidden_size,) + self.b = nn.Parameter(torch.zeros(hidden_size)) + + # Raw time constants (will be transformed to positive values) + # Shape: (hidden_size,) + self.tau_raw = nn.Parameter(torch.ones(hidden_size)) + + def forward(self, h: torch.Tensor, x: torch.Tensor) -> torch.Tensor: + """ + Forward pass through the liquid cell. + + Args: + h: Hidden state tensor of shape (batch, hidden_size) + x: Input tensor of shape (batch, input_size) + + Returns: + Next hidden state tensor of shape (batch, hidden_size) + """ + # Compute time constants: tau = softplus(tau_raw) + 1e-3 + # This ensures tau is always positive + tau = F.softplus(self.tau_raw) + 1e-3 + + # Compute preactivation: + # preact = tanh( W_hh @ h^T + W_xh @ x^T + b ) + # Using batch matrix multiplication + + # W_hh @ h^T: (hidden_size, hidden_size) @ (hidden_size, batch) -> (hidden_size, batch) + # Then transpose to (batch, hidden_size) + h_proj = torch.matmul(h, self.W_hh.t()) # (batch, hidden_size) + + # W_xh @ x^T: (hidden_size, input_size) @ (input_size, batch) -> (hidden_size, batch) + # Then transpose to (batch, hidden_size) + x_proj = torch.matmul(x, self.W_xh.t()) # (batch, hidden_size) + + # Add bias and apply tanh + preact = torch.tanh(h_proj + x_proj + self.b) # (batch, hidden_size) + + # Update hidden state: + # h_next = h + dt * (preact - h) / tau + # tau is (hidden_size,), so we need to broadcast + h_next = h + self.dt * (preact - h) / tau.unsqueeze(0) # (batch, hidden_size) + + # Clamp to reasonable range for stability + h_next = torch.clamp(h_next, -5.0, 5.0) + + return h_next + diff --git a/models/liquid_policy.py b/models/liquid_policy.py new file mode 100644 index 0000000000000000000000000000000000000000..411cfd568513276530aa3c49c8527a57bf0f7380 --- /dev/null +++ b/models/liquid_policy.py @@ -0,0 +1,81 @@ +""" +Liquid Neural Network Policy for Stable-Baselines3. + +Implements a custom feature extractor using LiquidCell that can be used +with PPO and other SB3 algorithms. +""" + +import torch +import torch.nn as nn +import gymnasium as gym +from stable_baselines3.common.torch_layers import BaseFeaturesExtractor + +from models.liquid_cell import LiquidCell + + +class LiquidFeatureExtractor(BaseFeaturesExtractor): + """ + Feature extractor using a Liquid Neural Network cell. + + This extractor processes observations through a liquid cell to produce + rich temporal features suitable for policy/value networks. + + Args: + observation_space: Gymnasium observation space + features_dim: Output feature dimension (default: 32) + hidden_size: Number of hidden neurons in liquid cell (default: 32) + dt: Time step for liquid cell (default: 0.1) + """ + + def __init__( + self, + observation_space: gym.Space, + features_dim: int = 32, + hidden_size: int = 32, + dt: float = 0.1, + ): + super().__init__(observation_space, features_dim) + + # Get observation dimension + if isinstance(observation_space, gym.spaces.Box): + obs_dim = observation_space.shape[0] + else: + raise ValueError(f"Unsupported observation space: {observation_space}") + + self.hidden_size = hidden_size + self.dt = dt + + # Input projection layer: maps observation to hidden space + self.input_layer = nn.Linear(obs_dim, hidden_size) + + # Liquid cell: processes hidden state + self.liquid_cell = LiquidCell(hidden_size, hidden_size, dt) + + # Output projection: maps liquid cell output to feature dimension + self.output_layer = nn.Linear(hidden_size, features_dim) + + def forward(self, observations: torch.Tensor) -> torch.Tensor: + """ + Forward pass through the liquid feature extractor. + + Args: + observations: Input tensor of shape (batch, obs_dim) + + Returns: + Feature tensor of shape (batch, features_dim) + """ + # Project input to hidden space and apply tanh + x = torch.tanh(self.input_layer(observations)) # (batch, hidden_size) + + # Initialize hidden state from input + h = x + + # Apply one liquid cell step + # The liquid cell uses both the hidden state and the input + h = self.liquid_cell(h, x) # (batch, hidden_size) + + # Project to output feature dimension + features = self.output_layer(h) # (batch, features_dim) + + return features + diff --git a/models/liquid_ppo.py b/models/liquid_ppo.py new file mode 100644 index 0000000000000000000000000000000000000000..adff1b276cebb06acae106c45f2ea92fa5b367f5 --- /dev/null +++ b/models/liquid_ppo.py @@ -0,0 +1,100 @@ +import torch +import torch.nn as nn +import gymnasium as gym +from stable_baselines3 import PPO +from stable_baselines3.common.torch_layers import BaseFeaturesExtractor +from stable_baselines3.common.env_util import make_vec_env +from stable_baselines3.common.vec_env import SubprocVecEnv +from ncps.torch import LTC +from ncps.wirings import AutoNCP +from env.drone_3d import Drone3DEnv + +class LTCFeatureExtractor(BaseFeaturesExtractor): + """ + Custom Feature Extractor using Liquid Time-Constant (LTC) Cells. + This allows the agent to handle irregular time-steps and stiff dynamics better than standard MLPs or LSTMs. + """ + def __init__(self, observation_space: gym.spaces.Box, features_dim: int = 32): + super().__init__(observation_space, features_dim) + + input_size = observation_space.shape[0] + # self.features_dim is already set by super().__init__ + + # Neural Circuit Policy (NCP) wiring for structured connectivity + # We use a small wiring to keep inference fast (< 10ms) + # AutoNCP requires units > output_size. Let's use 48 units for 32 outputs. + wiring = AutoNCP(48, output_size=features_dim) + + self.ltc = LTC(input_size, wiring, batch_first=True) + + # Hidden state for the LTC + self.hx = None + + def forward(self, observations: torch.Tensor) -> torch.Tensor: + # LTC expects (batch, time, features) + # SB3 provides (batch, features), so we add a time dimension + if observations.dim() == 2: + observations = observations.unsqueeze(1) + + # Initialize hidden state if needed or if batch size changes + batch_size = observations.size(0) + if self.hx is None or self.hx.size(0) != batch_size: + self.hx = torch.zeros(batch_size, self.ltc.state_size, device=observations.device) + + # Forward pass through LTC + # Note: In a real recurrent setting with SB3, we'd need to manage hidden states + # more carefully (e.g. using RecurrentPPO from sb3-contrib). + # For this demo, we are using a simplified approach where we treat the LTC + # as a stateful feature extractor that maintains state between calls within a batch. + # However, standard PPO assumes stateless policies. + # To make this truly "Liquid" in a standard PPO loop without sb3-contrib, + # we approximate by running the LTC on the current step. + # A better approach for production would be RecurrentPPO. + # Given the constraints and the goal of a "demo", we will use the LTC + # but reset state if we detect a new episode (which is hard here). + # So we will let the LTC evolve. + + # Detach hidden state from previous graph to prevent "backward through graph a second time" error + if self.hx is not None: + self.hx = self.hx.detach() + + output, self.hx = self.ltc(observations, self.hx) + + # Remove time dimension + return output.squeeze(1) + +def make_liquid_ppo(env, verbose=1): + """ + Factory function to create a PPO agent with Liquid Brain. + """ + # Parallel Environments for High-Performance Training + # A100/A10G are data hungry. We need to run physics on many CPU cores to feed them. + # We will use 16 parallel environments. + n_envs = 16 + env = make_vec_env( + lambda: Drone3DEnv(render_mode=None, wind_scale=10.0, wind_speed=5.0), + n_envs=n_envs, + vec_env_cls=SubprocVecEnv + ) + + # Create Model with optimized hyperparameters for A100 + policy_kwargs = dict( + features_extractor_class=LTCFeatureExtractor, + features_extractor_kwargs=dict(features_dim=32), + ) + + model = PPO( + "MlpPolicy", + env, + policy_kwargs=policy_kwargs, + verbose=1, + learning_rate=3e-4, + n_steps=2048, # 2048 * 16 = 32,768 steps per update + batch_size=4096, # Large batch size for A100 + n_epochs=10, + gamma=0.99, + gae_lambda=0.95, + clip_range=0.2, + device="cuda" # Force CUDA + ) + return model diff --git a/output.txt b/output.txt new file mode 100644 index 0000000000000000000000000000000000000000..275fb65d505d8c5b94c7d8ba6bb2bb6db5702cc9 --- /dev/null +++ b/output.txt @@ -0,0 +1,6 @@ +Python version: 3.14.0 (main, Oct 17 2025, 00:00:00) [GCC 15.2.1 20251022 (Red Hat 15.2.1-3)] +Numpy imported +Gymnasium failed: No module named 'gymnasium' +PyFlyt failed: No module named 'PyFlyt' +Opensimplex failed: No module named 'opensimplex' +Ncps failed: No module named 'ncps' diff --git a/pip_log.txt b/pip_log.txt new file mode 100644 index 0000000000000000000000000000000000000000..8a8321df5d046b407fd5621d8333edaf033fda9c --- /dev/null +++ b/pip_log.txt @@ -0,0 +1,93 @@ +Defaulting to user installation because normal site-packages is not writeable +Collecting torch>=2.0.0 (from -r requirements.txt (line 1)) + Using cached torch-2.9.1-cp314-cp314-manylinux_2_28_x86_64.whl.metadata (30 kB) +Collecting gymnasium>=0.29.0 (from -r requirements.txt (line 2)) + Using cached gymnasium-1.2.2-py3-none-any.whl.metadata (10 kB) +Collecting pygame>=2.5.0 (from -r requirements.txt (line 3)) + Using cached pygame-2.6.1.tar.gz (14.8 MB) + Installing build dependencies: started + Installing build dependencies: finished with status 'done' + Getting requirements to build wheel: started + Getting requirements to build wheel: finished with status 'error' + error: subprocess-exited-with-error + + × Getting requirements to build wheel did not run successfully. + │ exit code: 1 + ╰─> [67 lines of output] + Skipping Cython compilation + + + WARNING, No "Setup" File Exists, Running "buildconfig/config.py" + Using UNIX configuration... + + /bin/sh: line 1: dpkg-architecture: command not found + /bin/sh: line 1: gcc: command not found + /bin/sh: line 1: gcc: command not found + /bin/sh: line 1: sdl2-config: command not found + /bin/sh: line 1: sdl2-config: command not found + /bin/sh: line 1: sdl2-config: command not found + Package freetype2 was not found in the pkg-config search path. + Perhaps you should add the directory containing `freetype2.pc' + to the PKG_CONFIG_PATH environment variable + Package 'freetype2' not found + Package freetype2 was not found in the pkg-config search path. + Perhaps you should add the directory containing `freetype2.pc' + to the PKG_CONFIG_PATH environment variable + Package 'freetype2' not found + Package freetype2 was not found in the pkg-config search path. + Perhaps you should add the directory containing `freetype2.pc' + to the PKG_CONFIG_PATH environment variable + Package 'freetype2' not found + /bin/sh: line 1: freetype-config: command not found + /bin/sh: line 1: freetype-config: command not found + /bin/sh: line 1: freetype-config: command not found + + Hunting dependencies... + WARNING: "sdl2-config" failed! + WARNING: "pkg-config freetype2" failed! + WARNING: "freetype-config" failed! + + --- + For help with compilation see: + https://www.pygame.org/wiki/Compilation + To contribute to pygame development see: + https://www.pygame.org/contribute.html + --- + + Traceback (most recent call last): + File "/usr/lib/python3.14/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 389, in + main() + ~~~~^^ + File "/usr/lib/python3.14/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 373, in main + json_out["return_val"] = hook(**hook_input["kwargs"]) + ~~~~^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/lib/python3.14/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 143, in get_requires_for_build_wheel + return hook(config_settings) + File "/tmp/pip-build-env-9_tn2xvg/overlay/lib/python3.14/site-packages/setuptools/build_meta.py", line 331, in get_requires_for_build_wheel + return self._get_build_requires(config_settings, requirements=[]) + ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/tmp/pip-build-env-9_tn2xvg/overlay/lib/python3.14/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires + self.run_setup() + ~~~~~~~~~~~~~~^^ + File "/tmp/pip-build-env-9_tn2xvg/overlay/lib/python3.14/site-packages/setuptools/build_meta.py", line 512, in run_setup + super().run_setup(setup_script=setup_script) + ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/tmp/pip-build-env-9_tn2xvg/overlay/lib/python3.14/site-packages/setuptools/build_meta.py", line 317, in run_setup + exec(code, locals()) + ~~~~^^^^^^^^^^^^^^^^ + File "", line 432, in + File "/tmp/pip-install-tmizgydo/pygame_66dd0a904d484e059768cb5e32cd4cf6/buildconfig/config.py", line 234, in main + deps = CFG.main(**kwds, auto_config=auto) + File "/tmp/pip-install-tmizgydo/pygame_66dd0a904d484e059768cb5e32cd4cf6/buildconfig/config_unix.py", line 245, in main + raise RuntimeError('Unable to run "sdl-config". Please make sure a development version of SDL is installed.') + RuntimeError: Unable to run "sdl-config". Please make sure a development version of SDL is installed. + [end of output] + + note: This error originates from a subprocess, and is likely not a problem with pip. +error: subprocess-exited-with-error + +× Getting requirements to build wheel did not run successfully. +│ exit code: 1 +╰─> See above for output. + +note: This error originates from a subprocess, and is likely not a problem with pip. diff --git a/pybullet_bin_log.txt b/pybullet_bin_log.txt new file mode 100644 index 0000000000000000000000000000000000000000..09d85e92a046d1a83b36feeea71c3ab6263c9f31 --- /dev/null +++ b/pybullet_bin_log.txt @@ -0,0 +1,3 @@ +Defaulting to user installation because normal site-packages is not writeable +ERROR: Could not find a version that satisfies the requirement pybullet (from versions: none) +ERROR: No matching distribution found for pybullet diff --git a/pybullet_log.txt b/pybullet_log.txt new file mode 100644 index 0000000000000000000000000000000000000000..67d5ebf28acced697f87dee265ddd657853c24f2 --- /dev/null +++ b/pybullet_log.txt @@ -0,0 +1,3611 @@ +Defaulting to user installation because normal site-packages is not writeable +Collecting pybullet + Using cached pybullet-3.2.7.tar.gz (80.5 MB) + Installing build dependencies: started + Installing build dependencies: finished with status 'done' + Getting requirements to build wheel: started + Getting requirements to build wheel: finished with status 'done' + Preparing metadata (pyproject.toml): started + Preparing metadata (pyproject.toml): finished with status 'done' +Building wheels for collected packages: pybullet + Building wheel for pybullet (pyproject.toml): started + Building wheel for pybullet (pyproject.toml): finished with status 'error' + error: subprocess-exited-with-error + + × Building wheel for pybullet (pyproject.toml) did not run successfully. + │ exit code: 1 + ╰─> [3588 lines of output] + /tmp/pip-build-env-iv1htwpv/overlay/lib/python3.14/site-packages/setuptools/dist.py:759: SetuptoolsDeprecationWarning: License classifiers are deprecated. + !! + + ******************************************************************************** + Please consider removing the following classifiers in favor of a SPDX license expression: + + License :: OSI Approved :: zlib/libpng License + + See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details. + ******************************************************************************** + + !! + self._finalize_license_expression() + linux-x86_64 + numpy is disabled. getCameraImage maybe slower. + found resource files: 3568 + -- uvmap.png + -- torus_deform.urdf + -- textured_sphere_smooth.obj + -- textured_sphere_smooth.mtl + -- tex256.png + -- terrain.obj + -- teddy_vhacd.urdf + -- teddy_large.urdf + -- teddy2_VHACD_CHs.obj + -- stone.obj + -- stone.mtl + -- stadium_no_collision.sdf + -- stadium.sdf + -- spherical_joint_limit.urdf + -- sphere_with_restitution.urdf + -- sphere_transparent.urdf + -- sphere_smooth.obj + -- sphere_smooth.mtl + -- sphere_small.urdf + -- sphere_1cm.urdf + -- sphere8cube.urdf + -- sphere2red_nocol.urdf + -- sphere2red.urdf + -- sphere2.urdf + -- soccerball.urdf + -- soccerball.obj + -- soccerball.mtl + -- samurai_monastry.obj + -- samurai_monastry.mtl + -- samurai.urdf + -- r2d2.urdf + -- pr2_gripper.urdf + -- plane_transparent.urdf + -- plane_transparent.obj + -- plane_transparent.mtl + -- plane_stadium.sdf + -- plane_implicit.urdf + -- plane100.urdf + -- plane100.obj + -- plane.urdf + -- plane.obj + -- plane.mtl + -- pendulum5.urdf + -- l_finger_tip.stl + -- l_finger_collision.stl + -- l_finger.stl + -- duck_vhacd.urdf + -- duck_vhacd.obj + -- duckCM.png + -- duck.obj + -- duck.mtl + -- duck.dae + -- cube_small.urdf + -- cube_rotate.urdf + -- cube_no_rotation.urdf + -- cube_collisionfilter.urdf + -- cube.urdf + -- cube.png + -- cube.obj + -- colors16.png + -- cloth_z_up.urdf + -- cloth_z_up.obj + -- cloth_z_up.mtl + -- checker_huge.gif + -- checker_grid.jpg + -- checker_blue.png + -- cartpole.urdf + -- bunny.obj + -- block.urdf + -- TwoJointRobot_wo_fixedJoints.urdf + -- TwoJointRobot_w_fixedJoints.urdf + -- xarm/xarm6_with_gripper.urdf + -- xarm/xarm6_robot_white.urdf + -- xarm/xarm6_robot.urdf + -- xarm/link6_com.urdf + -- xarm/link6.urdf + -- xarm/link5_com.urdf + -- xarm/link5.urdf + -- xarm/link4_com.urdf + -- xarm/link4.urdf + -- xarm/link3_com.urdf + -- xarm/link3.urdf + -- xarm/link2_com.urdf + -- xarm/link2.urdf + -- xarm/link1_com.urdf + -- xarm/link1.urdf + -- xarm/base_com.urdf + -- xarm/base.urdf + -- xarm/xarm_gripper/meshes/right_outer_knuckle.STL + -- xarm/xarm_gripper/meshes/right_inner_knuckle.STL + -- xarm/xarm_gripper/meshes/right_finger.STL + -- xarm/xarm_gripper/meshes/left_outer_knuckle.STL + -- xarm/xarm_gripper/meshes/left_inner_knuckle.STL + -- xarm/xarm_gripper/meshes/left_finger.STL + -- xarm/xarm_gripper/meshes/base_link.STL + -- xarm/xarm_description/meshes/xarm6/visual/link6.stl + -- xarm/xarm_description/meshes/xarm6/visual/link5.stl + -- xarm/xarm_description/meshes/xarm6/visual/link4.stl + -- xarm/xarm_description/meshes/xarm6/visual/link3.stl + -- xarm/xarm_description/meshes/xarm6/visual/link2.stl + -- xarm/xarm_description/meshes/xarm6/visual/link1.stl + -- xarm/xarm_description/meshes/xarm6/visual/base.stl + -- xarm/xarm_description/meshes/xarm6/collision/link6_vhacd.obj + -- xarm/xarm_description/meshes/xarm6/collision/link6.mtl + -- xarm/xarm_description/meshes/xarm6/collision/link5_vhacd.obj + -- xarm/xarm_description/meshes/xarm6/collision/link5.mtl + -- xarm/xarm_description/meshes/xarm6/collision/link4_vhacd.obj + -- xarm/xarm_description/meshes/xarm6/collision/link4.mtl + -- xarm/xarm_description/meshes/xarm6/collision/link3_vhacd.obj + -- xarm/xarm_description/meshes/xarm6/collision/link3.mtl + -- xarm/xarm_description/meshes/xarm6/collision/link2_vhacd2.obj + -- xarm/xarm_description/meshes/xarm6/collision/link2_vhacd2.mtl + -- xarm/xarm_description/meshes/xarm6/collision/link2_vhacd.obj + -- xarm/xarm_description/meshes/xarm6/collision/link2.mtl + -- xarm/xarm_description/meshes/xarm6/collision/link1_vhacd.obj + -- xarm/xarm_description/meshes/xarm6/collision/link1.mtl + -- xarm/xarm_description/meshes/xarm6/collision/base_vhacd.obj + -- xarm/xarm_description/meshes/xarm6/collision/base.mtl + -- urdf/mug_col.obj + -- urdf/mug.urdf + -- urdf/mug.obj + -- tray/traybox.urdf + -- tray/tray_textured4.obj + -- tray/tray_textured4.mtl + -- tray/tray_textured2.urdf + -- tray/tray_textured2.obj + -- tray/tray_textured2.mtl + -- tray/tray_textured.obj + -- tray/tray_textured.mtl + -- tray/tray.urdf + -- tray/tray.jpg + -- toys/shape_sorter.obj + -- toys/shape_sorter.mtl + -- toys/prism.obj + -- toys/prism.mtl + -- toys/cylinder.obj + -- toys/cylinder.mtl + -- toys/cube.obj + -- toys/cube.mtl + -- toys/concave_box.urdf + -- toys/concave_box.obj + -- toys/concave_box.mtl + -- torus/torus_textured.obj + -- torus/torus_textured.mtl + -- testdata/test_imu_state_estimator/timestamp.npy + -- testdata/test_imu_state_estimator/motor_velocities.npy + -- testdata/test_imu_state_estimator/jacobians.npy + -- testdata/test_imu_state_estimator/gyroscope.npy + -- testdata/test_imu_state_estimator/feet_contact_forces.npy + -- testdata/test_imu_state_estimator/estimated_velocities.npy + -- testdata/test_imu_state_estimator/accelerometer.npy + -- table_square/table_square.urdf + -- table_square/table.obj + -- table_square/table.mtl + -- table_square/checker_grid.jpg + -- table/table.urdf + -- table/table.png + -- table/table.obj + -- table/table.mtl + -- roboschool/models_outdoor/stadium/stadium_grass.jpg + -- roboschool/models_outdoor/stadium/stadium.obj + -- roboschool/models_outdoor/stadium/stadium.mtl + -- roboschool/models_outdoor/stadium/part2.obj + -- roboschool/models_outdoor/stadium/part1.obj + -- roboschool/models_outdoor/stadium/part0.obj + -- random_urdfs/999/999.urdf + -- random_urdfs/999/999.obj + -- random_urdfs/999/999.mtl + -- random_urdfs/998/998.urdf + -- random_urdfs/998/998.obj + -- random_urdfs/998/998.mtl + -- random_urdfs/997/997.urdf + -- random_urdfs/997/997.obj + -- random_urdfs/997/997.mtl + -- random_urdfs/996/996.urdf + -- random_urdfs/996/996.obj + -- random_urdfs/996/996.mtl + -- random_urdfs/995/995.urdf + -- random_urdfs/995/995.obj + -- random_urdfs/995/995.mtl + -- random_urdfs/994/994.urdf + -- random_urdfs/994/994.obj + -- random_urdfs/994/994.mtl + -- random_urdfs/993/993.urdf + -- random_urdfs/993/993.obj + -- random_urdfs/993/993.mtl + -- random_urdfs/992/992.urdf + -- random_urdfs/992/992.obj + -- random_urdfs/992/992.mtl + -- random_urdfs/991/991.urdf + -- random_urdfs/991/991.obj + -- random_urdfs/991/991.mtl + -- random_urdfs/990/990.urdf + -- random_urdfs/990/990.obj + -- random_urdfs/990/990.mtl + -- random_urdfs/989/989.urdf + -- random_urdfs/989/989.obj + -- random_urdfs/989/989.mtl + -- random_urdfs/988/988.urdf + -- random_urdfs/988/988.obj + -- random_urdfs/988/988.mtl + -- random_urdfs/987/987.urdf + -- random_urdfs/987/987.obj + -- random_urdfs/987/987.mtl + -- random_urdfs/986/986.urdf + -- random_urdfs/986/986.obj + -- random_urdfs/986/986.mtl + -- random_urdfs/985/985.urdf + -- random_urdfs/985/985.obj + -- random_urdfs/985/985.mtl + -- random_urdfs/984/984.urdf + -- random_urdfs/984/984.obj + -- random_urdfs/984/984.mtl + -- random_urdfs/983/983.urdf + -- random_urdfs/983/983.obj + -- random_urdfs/983/983.mtl + -- random_urdfs/982/982.urdf + -- random_urdfs/982/982.obj + -- random_urdfs/982/982.mtl + -- random_urdfs/981/981.urdf + -- random_urdfs/981/981.obj + -- random_urdfs/981/981.mtl + -- random_urdfs/980/980.urdf + -- random_urdfs/980/980.obj + -- random_urdfs/980/980.mtl + -- random_urdfs/979/979.urdf + -- random_urdfs/979/979.obj + -- random_urdfs/979/979.mtl + -- random_urdfs/978/978.urdf + -- random_urdfs/978/978.obj + -- random_urdfs/978/978.mtl + -- random_urdfs/977/977.urdf + -- random_urdfs/977/977.obj + -- random_urdfs/977/977.mtl + -- random_urdfs/976/976.urdf + -- random_urdfs/976/976.obj + -- random_urdfs/976/976.mtl + -- random_urdfs/975/975.urdf + -- random_urdfs/975/975.obj + -- random_urdfs/975/975.mtl + -- random_urdfs/974/974.urdf + -- random_urdfs/974/974.obj + -- random_urdfs/974/974.mtl + -- random_urdfs/973/973.urdf + -- random_urdfs/973/973.obj + -- random_urdfs/973/973.mtl + -- random_urdfs/972/972.urdf + -- random_urdfs/972/972.obj + -- random_urdfs/972/972.mtl + -- random_urdfs/971/971.urdf + -- random_urdfs/971/971.obj + -- random_urdfs/971/971.mtl + -- random_urdfs/970/970.urdf + -- random_urdfs/970/970.obj + -- random_urdfs/970/970.mtl + -- random_urdfs/969/969.urdf + -- random_urdfs/969/969.obj + -- random_urdfs/969/969.mtl + -- random_urdfs/968/968.urdf + -- random_urdfs/968/968.obj + -- random_urdfs/968/968.mtl + -- random_urdfs/967/967.urdf + -- random_urdfs/967/967.obj + -- random_urdfs/967/967.mtl + -- random_urdfs/966/966.urdf + -- random_urdfs/966/966.obj + -- random_urdfs/966/966.mtl + -- random_urdfs/965/965.urdf + -- random_urdfs/965/965.obj + -- random_urdfs/965/965.mtl + -- random_urdfs/964/964.urdf + -- random_urdfs/964/964.obj + -- random_urdfs/964/964.mtl + -- random_urdfs/963/963.urdf + -- random_urdfs/963/963.obj + -- random_urdfs/963/963.mtl + -- random_urdfs/962/962.urdf + -- random_urdfs/962/962.obj + -- random_urdfs/962/962.mtl + -- random_urdfs/961/961.urdf + -- random_urdfs/961/961.obj + -- random_urdfs/961/961.mtl + -- random_urdfs/960/960.urdf + -- random_urdfs/960/960.obj + -- random_urdfs/960/960.mtl + -- random_urdfs/959/959.urdf + -- random_urdfs/959/959.obj + -- random_urdfs/959/959.mtl + -- random_urdfs/958/958.urdf + -- random_urdfs/958/958.obj + -- random_urdfs/958/958.mtl + -- random_urdfs/957/957.urdf + -- random_urdfs/957/957.obj + -- random_urdfs/957/957.mtl + -- random_urdfs/956/956.urdf + -- random_urdfs/956/956.obj + -- random_urdfs/956/956.mtl + -- random_urdfs/955/955.urdf + -- random_urdfs/955/955.obj + -- random_urdfs/955/955.mtl + -- random_urdfs/954/954.urdf + -- random_urdfs/954/954.obj + -- random_urdfs/954/954.mtl + -- random_urdfs/953/953.urdf + -- random_urdfs/953/953.obj + -- random_urdfs/953/953.mtl + -- random_urdfs/952/952.urdf + -- random_urdfs/952/952.obj + -- random_urdfs/952/952.mtl + -- random_urdfs/951/951.urdf + -- random_urdfs/951/951.obj + -- random_urdfs/951/951.mtl + -- random_urdfs/950/950.urdf + -- random_urdfs/950/950.obj + -- random_urdfs/950/950.mtl + -- random_urdfs/949/949.urdf + -- random_urdfs/949/949.obj + -- random_urdfs/949/949.mtl + -- random_urdfs/948/948.urdf + -- random_urdfs/948/948.obj + -- random_urdfs/948/948.mtl + -- random_urdfs/947/947.urdf + -- random_urdfs/947/947.obj + -- random_urdfs/947/947.mtl + -- random_urdfs/946/946.urdf + -- random_urdfs/946/946.obj + -- random_urdfs/946/946.mtl + -- random_urdfs/945/945.urdf + -- random_urdfs/945/945.obj + -- random_urdfs/945/945.mtl + -- random_urdfs/944/944.urdf + -- random_urdfs/944/944.obj + -- random_urdfs/944/944.mtl + -- random_urdfs/943/943.urdf + -- random_urdfs/943/943.obj + -- random_urdfs/943/943.mtl + -- random_urdfs/942/942.urdf + -- random_urdfs/942/942.obj + -- random_urdfs/942/942.mtl + -- random_urdfs/941/941.urdf + -- random_urdfs/941/941.obj + -- random_urdfs/941/941.mtl + -- random_urdfs/940/940.urdf + -- random_urdfs/940/940.obj + -- random_urdfs/940/940.mtl + -- random_urdfs/939/939.urdf + -- random_urdfs/939/939.obj + -- random_urdfs/939/939.mtl + -- random_urdfs/938/938.urdf + -- random_urdfs/938/938.obj + -- random_urdfs/938/938.mtl + -- random_urdfs/937/937.urdf + -- random_urdfs/937/937.obj + -- random_urdfs/937/937.mtl + -- random_urdfs/936/936.urdf + -- random_urdfs/936/936.obj + -- random_urdfs/936/936.mtl + -- random_urdfs/935/935.urdf + -- random_urdfs/935/935.obj + -- random_urdfs/935/935.mtl + -- random_urdfs/934/934.urdf + -- random_urdfs/934/934.obj + -- random_urdfs/934/934.mtl + -- random_urdfs/933/933.urdf + -- random_urdfs/933/933.obj + -- random_urdfs/933/933.mtl + -- random_urdfs/932/932.urdf + -- random_urdfs/932/932.obj + -- random_urdfs/932/932.mtl + -- random_urdfs/931/931.urdf + -- random_urdfs/931/931.obj + -- random_urdfs/931/931.mtl + -- random_urdfs/930/930.urdf + -- random_urdfs/930/930.obj + -- random_urdfs/930/930.mtl + -- random_urdfs/929/929.urdf + -- random_urdfs/929/929.obj + -- random_urdfs/929/929.mtl + -- random_urdfs/928/928.urdf + -- random_urdfs/928/928.obj + -- random_urdfs/928/928.mtl + -- random_urdfs/927/927.urdf + -- random_urdfs/927/927.obj + -- random_urdfs/927/927.mtl + -- random_urdfs/926/926.urdf + -- random_urdfs/926/926.obj + -- random_urdfs/926/926.mtl + -- random_urdfs/925/925.urdf + -- random_urdfs/925/925.obj + -- random_urdfs/925/925.mtl + -- random_urdfs/924/924.urdf + -- random_urdfs/924/924.obj + -- random_urdfs/924/924.mtl + -- random_urdfs/923/923.urdf + -- random_urdfs/923/923.obj + -- random_urdfs/923/923.mtl + -- random_urdfs/922/922.urdf + -- random_urdfs/922/922.obj + -- random_urdfs/922/922.mtl + -- random_urdfs/921/921.urdf + -- random_urdfs/921/921.obj + -- random_urdfs/921/921.mtl + -- random_urdfs/920/920.urdf + -- random_urdfs/920/920.obj + -- random_urdfs/920/920.mtl + -- random_urdfs/919/919.urdf + -- random_urdfs/919/919.obj + -- random_urdfs/919/919.mtl + -- random_urdfs/918/918.urdf + -- random_urdfs/918/918.obj + -- random_urdfs/918/918.mtl + -- random_urdfs/917/917.urdf + -- random_urdfs/917/917.obj + -- random_urdfs/917/917.mtl + -- random_urdfs/916/916.urdf + -- random_urdfs/916/916.obj + -- random_urdfs/916/916.mtl + -- random_urdfs/915/915.urdf + -- random_urdfs/915/915.obj + -- random_urdfs/915/915.mtl + -- random_urdfs/914/914.urdf + -- random_urdfs/914/914.obj + -- random_urdfs/914/914.mtl + -- random_urdfs/913/913.urdf + -- random_urdfs/913/913.obj + -- random_urdfs/913/913.mtl + -- random_urdfs/912/912.urdf + -- random_urdfs/912/912.obj + -- random_urdfs/912/912.mtl + -- random_urdfs/911/911.urdf + -- random_urdfs/911/911.obj + -- random_urdfs/911/911.mtl + -- random_urdfs/910/910.urdf + -- random_urdfs/910/910.obj + -- random_urdfs/910/910.mtl + -- random_urdfs/909/909.urdf + -- random_urdfs/909/909.obj + -- random_urdfs/909/909.mtl + -- random_urdfs/908/908.urdf + -- random_urdfs/908/908.obj + -- random_urdfs/908/908.mtl + -- random_urdfs/907/907.urdf + -- random_urdfs/907/907.obj + -- random_urdfs/907/907.mtl + -- random_urdfs/906/906.urdf + -- random_urdfs/906/906.obj + -- random_urdfs/906/906.mtl + -- random_urdfs/905/905.urdf + -- random_urdfs/905/905.obj + -- random_urdfs/905/905.mtl + -- random_urdfs/904/904.urdf + -- random_urdfs/904/904.obj + -- random_urdfs/904/904.mtl + -- random_urdfs/903/903.urdf + -- random_urdfs/903/903.obj + -- random_urdfs/903/903.mtl + -- random_urdfs/902/902.urdf + -- random_urdfs/902/902.obj + -- random_urdfs/902/902.mtl + -- random_urdfs/901/901.urdf + -- random_urdfs/901/901.obj + -- random_urdfs/901/901.mtl + -- random_urdfs/900/900.urdf + -- random_urdfs/900/900.obj + -- random_urdfs/900/900.mtl + -- random_urdfs/899/899.urdf + -- random_urdfs/899/899.obj + -- random_urdfs/899/899.mtl + -- random_urdfs/898/898.urdf + -- random_urdfs/898/898.obj + -- random_urdfs/898/898.mtl + -- random_urdfs/897/897.urdf + -- random_urdfs/897/897.obj + -- random_urdfs/897/897.mtl + -- random_urdfs/896/896.urdf + -- random_urdfs/896/896.obj + -- random_urdfs/896/896.mtl + -- random_urdfs/895/895.urdf + -- random_urdfs/895/895.obj + -- random_urdfs/895/895.mtl + -- random_urdfs/894/894.urdf + -- random_urdfs/894/894.obj + -- random_urdfs/894/894.mtl + -- random_urdfs/893/893.urdf + -- random_urdfs/893/893.obj + -- random_urdfs/893/893.mtl + -- random_urdfs/892/892.urdf + -- random_urdfs/892/892.obj + -- random_urdfs/892/892.mtl + -- random_urdfs/891/891.urdf + -- random_urdfs/891/891.obj + -- random_urdfs/891/891.mtl + -- random_urdfs/890/890.urdf + -- random_urdfs/890/890.obj + -- random_urdfs/890/890.mtl + -- random_urdfs/889/889.urdf + -- random_urdfs/889/889.obj + -- random_urdfs/889/889.mtl + -- random_urdfs/888/888.urdf + -- random_urdfs/888/888.obj + -- random_urdfs/888/888.mtl + -- random_urdfs/887/887.urdf + -- random_urdfs/887/887.obj + -- random_urdfs/887/887.mtl + -- random_urdfs/886/886.urdf + -- random_urdfs/886/886.obj + -- random_urdfs/886/886.mtl + -- random_urdfs/885/885.urdf + -- random_urdfs/885/885.obj + -- random_urdfs/885/885.mtl + -- random_urdfs/884/884.urdf + -- random_urdfs/884/884.obj + -- random_urdfs/884/884.mtl + -- random_urdfs/883/883.urdf + -- random_urdfs/883/883.obj + -- random_urdfs/883/883.mtl + -- random_urdfs/882/882.urdf + -- random_urdfs/882/882.obj + -- random_urdfs/882/882.mtl + -- random_urdfs/881/881.urdf + -- random_urdfs/881/881.obj + -- random_urdfs/881/881.mtl + -- random_urdfs/880/880.urdf + -- random_urdfs/880/880.obj + -- random_urdfs/880/880.mtl + -- random_urdfs/879/879.urdf + -- random_urdfs/879/879.obj + -- random_urdfs/879/879.mtl + -- random_urdfs/878/878.urdf + -- random_urdfs/878/878.obj + -- random_urdfs/878/878.mtl + -- random_urdfs/877/877.urdf + -- random_urdfs/877/877.obj + -- random_urdfs/877/877.mtl + -- random_urdfs/876/876.urdf + -- random_urdfs/876/876.obj + -- random_urdfs/876/876.mtl + -- random_urdfs/875/875.urdf + -- random_urdfs/875/875.obj + -- random_urdfs/875/875.mtl + -- random_urdfs/874/874.urdf + -- random_urdfs/874/874.obj + -- random_urdfs/874/874.mtl + -- random_urdfs/873/873.urdf + -- random_urdfs/873/873.obj + -- random_urdfs/873/873.mtl + -- random_urdfs/872/872.urdf + -- random_urdfs/872/872.obj + -- random_urdfs/872/872.mtl + -- random_urdfs/871/871.urdf + -- random_urdfs/871/871.obj + -- random_urdfs/871/871.mtl + -- random_urdfs/870/870.urdf + -- random_urdfs/870/870.obj + -- random_urdfs/870/870.mtl + -- random_urdfs/869/869.urdf + -- random_urdfs/869/869.obj + -- random_urdfs/869/869.mtl + -- random_urdfs/868/868.urdf + -- random_urdfs/868/868.obj + -- random_urdfs/868/868.mtl + -- random_urdfs/867/867.urdf + -- random_urdfs/867/867.obj + -- random_urdfs/867/867.mtl + -- random_urdfs/866/866.urdf + -- random_urdfs/866/866.obj + -- random_urdfs/866/866.mtl + -- random_urdfs/865/865.urdf + -- random_urdfs/865/865.obj + -- random_urdfs/865/865.mtl + -- random_urdfs/864/864.urdf + -- random_urdfs/864/864.obj + -- random_urdfs/864/864.mtl + -- random_urdfs/863/863.urdf + -- random_urdfs/863/863.obj + -- random_urdfs/863/863.mtl + -- random_urdfs/862/862.urdf + -- random_urdfs/862/862.obj + -- random_urdfs/862/862.mtl + -- random_urdfs/861/861.urdf + -- random_urdfs/861/861.obj + -- random_urdfs/861/861.mtl + -- random_urdfs/860/860.urdf + -- random_urdfs/860/860.obj + -- random_urdfs/860/860.mtl + -- random_urdfs/859/859.urdf + -- random_urdfs/859/859.obj + -- random_urdfs/859/859.mtl + -- random_urdfs/858/858.urdf + -- random_urdfs/858/858.obj + -- random_urdfs/858/858.mtl + -- random_urdfs/857/857.urdf + -- random_urdfs/857/857.obj + -- random_urdfs/857/857.mtl + -- random_urdfs/856/856.urdf + -- random_urdfs/856/856.obj + -- random_urdfs/856/856.mtl + -- random_urdfs/855/855.urdf + -- random_urdfs/855/855.obj + -- random_urdfs/855/855.mtl + -- random_urdfs/854/854.urdf + -- random_urdfs/854/854.obj + -- random_urdfs/854/854.mtl + -- random_urdfs/853/853.urdf + -- random_urdfs/853/853.obj + -- random_urdfs/853/853.mtl + -- random_urdfs/852/852.urdf + -- random_urdfs/852/852.obj + -- random_urdfs/852/852.mtl + -- random_urdfs/851/851.urdf + -- random_urdfs/851/851.obj + -- random_urdfs/851/851.mtl + -- random_urdfs/850/850.urdf + -- random_urdfs/850/850.obj + -- random_urdfs/850/850.mtl + -- random_urdfs/849/849.urdf + -- random_urdfs/849/849.obj + -- random_urdfs/849/849.mtl + -- random_urdfs/848/848.urdf + -- random_urdfs/848/848.obj + -- random_urdfs/848/848.mtl + -- random_urdfs/847/847.urdf + -- random_urdfs/847/847.obj + -- random_urdfs/847/847.mtl + -- random_urdfs/846/846.urdf + -- random_urdfs/846/846.obj + -- random_urdfs/846/846.mtl + -- random_urdfs/845/845.urdf + -- random_urdfs/845/845.obj + -- random_urdfs/845/845.mtl + -- random_urdfs/844/844.urdf + -- random_urdfs/844/844.obj + -- random_urdfs/844/844.mtl + -- random_urdfs/843/843.urdf + -- random_urdfs/843/843.obj + -- random_urdfs/843/843.mtl + -- random_urdfs/842/842.urdf + -- random_urdfs/842/842.obj + -- random_urdfs/842/842.mtl + -- random_urdfs/841/841.urdf + -- random_urdfs/841/841.obj + -- random_urdfs/841/841.mtl + -- random_urdfs/840/840.urdf + -- random_urdfs/840/840.obj + -- random_urdfs/840/840.mtl + -- random_urdfs/839/839.urdf + -- random_urdfs/839/839.obj + -- random_urdfs/839/839.mtl + -- random_urdfs/838/838.urdf + -- random_urdfs/838/838.obj + -- random_urdfs/838/838.mtl + -- random_urdfs/837/837.urdf + -- random_urdfs/837/837.obj + -- random_urdfs/837/837.mtl + -- random_urdfs/836/836.urdf + -- random_urdfs/836/836.obj + -- random_urdfs/836/836.mtl + -- random_urdfs/835/835.urdf + -- random_urdfs/835/835.obj + -- random_urdfs/835/835.mtl + -- random_urdfs/834/834.urdf + -- random_urdfs/834/834.obj + -- random_urdfs/834/834.mtl + -- random_urdfs/833/833.urdf + -- random_urdfs/833/833.obj + -- random_urdfs/833/833.mtl + -- random_urdfs/832/832.urdf + -- random_urdfs/832/832.obj + -- random_urdfs/832/832.mtl + -- random_urdfs/831/831.urdf + -- random_urdfs/831/831.obj + -- random_urdfs/831/831.mtl + -- random_urdfs/830/830.urdf + -- random_urdfs/830/830.obj + -- random_urdfs/830/830.mtl + -- random_urdfs/829/829.urdf + -- random_urdfs/829/829.obj + -- random_urdfs/829/829.mtl + -- random_urdfs/828/828.urdf + -- random_urdfs/828/828.obj + -- random_urdfs/828/828.mtl + -- random_urdfs/827/827.urdf + -- random_urdfs/827/827.obj + -- random_urdfs/827/827.mtl + -- random_urdfs/826/826.urdf + -- random_urdfs/826/826.obj + -- random_urdfs/826/826.mtl + -- random_urdfs/825/825.urdf + -- random_urdfs/825/825.obj + -- random_urdfs/825/825.mtl + -- random_urdfs/824/824.urdf + -- random_urdfs/824/824.obj + -- random_urdfs/824/824.mtl + -- random_urdfs/823/823.urdf + -- random_urdfs/823/823.obj + -- random_urdfs/823/823.mtl + -- random_urdfs/822/822.urdf + -- random_urdfs/822/822.obj + -- random_urdfs/822/822.mtl + -- random_urdfs/821/821.urdf + -- random_urdfs/821/821.obj + -- random_urdfs/821/821.mtl + -- random_urdfs/820/820.urdf + -- random_urdfs/820/820.obj + -- random_urdfs/820/820.mtl + -- random_urdfs/819/819.urdf + -- random_urdfs/819/819.obj + -- random_urdfs/819/819.mtl + -- random_urdfs/818/818.urdf + -- random_urdfs/818/818.obj + -- random_urdfs/818/818.mtl + -- random_urdfs/817/817.urdf + -- random_urdfs/817/817.obj + -- random_urdfs/817/817.mtl + -- random_urdfs/816/816.urdf + -- random_urdfs/816/816.obj + -- random_urdfs/816/816.mtl + -- random_urdfs/815/815.urdf + -- random_urdfs/815/815.obj + -- random_urdfs/815/815.mtl + -- random_urdfs/814/814.urdf + -- random_urdfs/814/814.obj + -- random_urdfs/814/814.mtl + -- random_urdfs/813/813.urdf + -- random_urdfs/813/813.obj + -- random_urdfs/813/813.mtl + -- random_urdfs/812/812.urdf + -- random_urdfs/812/812.obj + -- random_urdfs/812/812.mtl + -- random_urdfs/811/811.urdf + -- random_urdfs/811/811.obj + -- random_urdfs/811/811.mtl + -- random_urdfs/810/810.urdf + -- random_urdfs/810/810.obj + -- random_urdfs/810/810.mtl + -- random_urdfs/809/809.urdf + -- random_urdfs/809/809.obj + -- random_urdfs/809/809.mtl + -- random_urdfs/808/808.urdf + -- random_urdfs/808/808.obj + -- random_urdfs/808/808.mtl + -- random_urdfs/807/807.urdf + -- random_urdfs/807/807.obj + -- random_urdfs/807/807.mtl + -- random_urdfs/806/806.urdf + -- random_urdfs/806/806.obj + -- random_urdfs/806/806.mtl + -- random_urdfs/805/805.urdf + -- random_urdfs/805/805.obj + -- random_urdfs/805/805.mtl + -- random_urdfs/804/804.urdf + -- random_urdfs/804/804.obj + -- random_urdfs/804/804.mtl + -- random_urdfs/803/803.urdf + -- random_urdfs/803/803.obj + -- random_urdfs/803/803.mtl + -- random_urdfs/802/802.urdf + -- random_urdfs/802/802.obj + -- random_urdfs/802/802.mtl + -- random_urdfs/801/801.urdf + -- random_urdfs/801/801.obj + -- random_urdfs/801/801.mtl + -- random_urdfs/800/800.urdf + -- random_urdfs/800/800.obj + -- random_urdfs/800/800.mtl + -- random_urdfs/799/799.urdf + -- random_urdfs/799/799.obj + -- random_urdfs/799/799.mtl + -- random_urdfs/798/798.urdf + -- random_urdfs/798/798.obj + -- random_urdfs/798/798.mtl + -- random_urdfs/797/797.urdf + -- random_urdfs/797/797.obj + -- random_urdfs/797/797.mtl + -- random_urdfs/796/796.urdf + -- random_urdfs/796/796.obj + -- random_urdfs/796/796.mtl + -- random_urdfs/795/795.urdf + -- random_urdfs/795/795.obj + -- random_urdfs/795/795.mtl + -- random_urdfs/794/794.urdf + -- random_urdfs/794/794.obj + -- random_urdfs/794/794.mtl + -- random_urdfs/793/793.urdf + -- random_urdfs/793/793.obj + -- random_urdfs/793/793.mtl + -- random_urdfs/792/792.urdf + -- random_urdfs/792/792.obj + -- random_urdfs/792/792.mtl + -- random_urdfs/791/791.urdf + -- random_urdfs/791/791.obj + -- random_urdfs/791/791.mtl + -- random_urdfs/790/790.urdf + -- random_urdfs/790/790.obj + -- random_urdfs/790/790.mtl + -- random_urdfs/789/789.urdf + -- random_urdfs/789/789.obj + -- random_urdfs/789/789.mtl + -- random_urdfs/788/788.urdf + -- random_urdfs/788/788.obj + -- random_urdfs/788/788.mtl + -- random_urdfs/787/787.urdf + -- random_urdfs/787/787.obj + -- random_urdfs/787/787.mtl + -- random_urdfs/786/786.urdf + -- random_urdfs/786/786.obj + -- random_urdfs/786/786.mtl + -- random_urdfs/785/785.urdf + -- random_urdfs/785/785.obj + -- random_urdfs/785/785.mtl + -- random_urdfs/784/784.urdf + -- random_urdfs/784/784.obj + -- random_urdfs/784/784.mtl + -- random_urdfs/783/783.urdf + -- random_urdfs/783/783.obj + -- random_urdfs/783/783.mtl + -- random_urdfs/782/782.urdf + -- random_urdfs/782/782.obj + -- random_urdfs/782/782.mtl + -- random_urdfs/781/781.urdf + -- random_urdfs/781/781.obj + -- random_urdfs/781/781.mtl + -- random_urdfs/780/780.urdf + -- random_urdfs/780/780.obj + -- random_urdfs/780/780.mtl + -- random_urdfs/779/779.urdf + -- random_urdfs/779/779.obj + -- random_urdfs/779/779.mtl + -- random_urdfs/778/778.urdf + -- random_urdfs/778/778.obj + -- random_urdfs/778/778.mtl + -- random_urdfs/777/777.urdf + -- random_urdfs/777/777.obj + -- random_urdfs/777/777.mtl + -- random_urdfs/776/776.urdf + -- random_urdfs/776/776.obj + -- random_urdfs/776/776.mtl + -- random_urdfs/775/775.urdf + -- random_urdfs/775/775.obj + -- random_urdfs/775/775.mtl + -- random_urdfs/774/774.urdf + -- random_urdfs/774/774.obj + -- random_urdfs/774/774.mtl + -- random_urdfs/773/773.urdf + -- random_urdfs/773/773.obj + -- random_urdfs/773/773.mtl + -- random_urdfs/772/772.urdf + -- random_urdfs/772/772.obj + -- random_urdfs/772/772.mtl + -- random_urdfs/771/771.urdf + -- random_urdfs/771/771.obj + -- random_urdfs/771/771.mtl + -- random_urdfs/770/770.urdf + -- random_urdfs/770/770.obj + -- random_urdfs/770/770.mtl + -- random_urdfs/769/769.urdf + -- random_urdfs/769/769.obj + -- random_urdfs/769/769.mtl + -- random_urdfs/768/768.urdf + -- random_urdfs/768/768.obj + -- random_urdfs/768/768.mtl + -- random_urdfs/767/767.urdf + -- random_urdfs/767/767.obj + -- random_urdfs/767/767.mtl + -- random_urdfs/766/766.urdf + -- random_urdfs/766/766.obj + -- random_urdfs/766/766.mtl + -- random_urdfs/765/765.urdf + -- random_urdfs/765/765.obj + -- random_urdfs/765/765.mtl + -- random_urdfs/764/764.urdf + -- random_urdfs/764/764.obj + -- random_urdfs/764/764.mtl + -- random_urdfs/763/763.urdf + -- random_urdfs/763/763.obj + -- random_urdfs/763/763.mtl + -- random_urdfs/762/762.urdf + -- random_urdfs/762/762.obj + -- random_urdfs/762/762.mtl + -- random_urdfs/761/761.urdf + -- random_urdfs/761/761.obj + -- random_urdfs/761/761.mtl + -- random_urdfs/760/760.urdf + -- random_urdfs/760/760.obj + -- random_urdfs/760/760.mtl + -- random_urdfs/759/759.urdf + -- random_urdfs/759/759.obj + -- random_urdfs/759/759.mtl + -- random_urdfs/758/758.urdf + -- random_urdfs/758/758.obj + -- random_urdfs/758/758.mtl + -- random_urdfs/757/757.urdf + -- random_urdfs/757/757.obj + -- random_urdfs/757/757.mtl + -- random_urdfs/756/756.urdf + -- random_urdfs/756/756.obj + -- random_urdfs/756/756.mtl + -- random_urdfs/755/755.urdf + -- random_urdfs/755/755.obj + -- random_urdfs/755/755.mtl + -- random_urdfs/754/754.urdf + -- random_urdfs/754/754.obj + -- random_urdfs/754/754.mtl + -- random_urdfs/753/753.urdf + -- random_urdfs/753/753.obj + -- random_urdfs/753/753.mtl + -- random_urdfs/752/752.urdf + -- random_urdfs/752/752.obj + -- random_urdfs/752/752.mtl + -- random_urdfs/751/751.urdf + -- random_urdfs/751/751.obj + -- random_urdfs/751/751.mtl + -- random_urdfs/750/750.urdf + -- random_urdfs/750/750.obj + -- random_urdfs/750/750.mtl + -- random_urdfs/749/749.urdf + -- random_urdfs/749/749.obj + -- random_urdfs/749/749.mtl + -- random_urdfs/748/748.urdf + -- random_urdfs/748/748.obj + -- random_urdfs/748/748.mtl + -- random_urdfs/747/747.urdf + -- random_urdfs/747/747.obj + -- random_urdfs/747/747.mtl + -- random_urdfs/746/746.urdf + -- random_urdfs/746/746.obj + -- random_urdfs/746/746.mtl + -- random_urdfs/745/745.urdf + -- random_urdfs/745/745.obj + -- random_urdfs/745/745.mtl + -- random_urdfs/744/744.urdf + -- random_urdfs/744/744.obj + -- random_urdfs/744/744.mtl + -- random_urdfs/743/743.urdf + -- random_urdfs/743/743.obj + -- random_urdfs/743/743.mtl + -- random_urdfs/742/742.urdf + -- random_urdfs/742/742.obj + -- random_urdfs/742/742.mtl + -- random_urdfs/741/741.urdf + -- random_urdfs/741/741.obj + -- random_urdfs/741/741.mtl + -- random_urdfs/740/740.urdf + -- random_urdfs/740/740.obj + -- random_urdfs/740/740.mtl + -- random_urdfs/739/739.urdf + -- random_urdfs/739/739.obj + -- random_urdfs/739/739.mtl + -- random_urdfs/738/738.urdf + -- random_urdfs/738/738.obj + -- random_urdfs/738/738.mtl + -- random_urdfs/737/737.urdf + -- random_urdfs/737/737.obj + -- random_urdfs/737/737.mtl + -- random_urdfs/736/736.urdf + -- random_urdfs/736/736.obj + -- random_urdfs/736/736.mtl + -- random_urdfs/735/735.urdf + -- random_urdfs/735/735.obj + -- random_urdfs/735/735.mtl + -- random_urdfs/734/734.urdf + -- random_urdfs/734/734.obj + -- random_urdfs/734/734.mtl + -- random_urdfs/733/733.urdf + -- random_urdfs/733/733.obj + -- random_urdfs/733/733.mtl + -- random_urdfs/732/732.urdf + -- random_urdfs/732/732.obj + -- random_urdfs/732/732.mtl + -- random_urdfs/731/731.urdf + -- random_urdfs/731/731.obj + -- random_urdfs/731/731.mtl + -- random_urdfs/730/730.urdf + -- random_urdfs/730/730.obj + -- random_urdfs/730/730.mtl + -- random_urdfs/729/729.urdf + -- random_urdfs/729/729.obj + -- random_urdfs/729/729.mtl + -- random_urdfs/728/728.urdf + -- random_urdfs/728/728.obj + -- random_urdfs/728/728.mtl + -- random_urdfs/727/727.urdf + -- random_urdfs/727/727.obj + -- random_urdfs/727/727.mtl + -- random_urdfs/726/726.urdf + -- random_urdfs/726/726.obj + -- random_urdfs/726/726.mtl + -- random_urdfs/725/725.urdf + -- random_urdfs/725/725.obj + -- random_urdfs/725/725.mtl + -- random_urdfs/724/724.urdf + -- random_urdfs/724/724.obj + -- random_urdfs/724/724.mtl + -- random_urdfs/723/723.urdf + -- random_urdfs/723/723.obj + -- random_urdfs/723/723.mtl + -- random_urdfs/722/722.urdf + -- random_urdfs/722/722.obj + -- random_urdfs/722/722.mtl + -- random_urdfs/721/721.urdf + -- random_urdfs/721/721.obj + -- random_urdfs/721/721.mtl + -- random_urdfs/720/720.urdf + -- random_urdfs/720/720.obj + -- random_urdfs/720/720.mtl + -- random_urdfs/719/719.urdf + -- random_urdfs/719/719.obj + -- random_urdfs/719/719.mtl + -- random_urdfs/718/718.urdf + -- random_urdfs/718/718.obj + -- random_urdfs/718/718.mtl + -- random_urdfs/717/717.urdf + -- random_urdfs/717/717.obj + -- random_urdfs/717/717.mtl + -- random_urdfs/716/716.urdf + -- random_urdfs/716/716.obj + -- random_urdfs/716/716.mtl + -- random_urdfs/715/715.urdf + -- random_urdfs/715/715.obj + -- random_urdfs/715/715.mtl + -- random_urdfs/714/714.urdf + -- random_urdfs/714/714.obj + -- random_urdfs/714/714.mtl + -- random_urdfs/713/713.urdf + -- random_urdfs/713/713.obj + -- random_urdfs/713/713.mtl + -- random_urdfs/712/712.urdf + -- random_urdfs/712/712.obj + -- random_urdfs/712/712.mtl + -- random_urdfs/711/711.urdf + -- random_urdfs/711/711.obj + -- random_urdfs/711/711.mtl + -- random_urdfs/710/710.urdf + -- random_urdfs/710/710.obj + -- random_urdfs/710/710.mtl + -- random_urdfs/709/709.urdf + -- random_urdfs/709/709.obj + -- random_urdfs/709/709.mtl + -- random_urdfs/708/708.urdf + -- random_urdfs/708/708.obj + -- random_urdfs/708/708.mtl + -- random_urdfs/707/707.urdf + -- random_urdfs/707/707.obj + -- random_urdfs/707/707.mtl + -- random_urdfs/706/706.urdf + -- random_urdfs/706/706.obj + -- random_urdfs/706/706.mtl + -- random_urdfs/705/705.urdf + -- random_urdfs/705/705.obj + -- random_urdfs/705/705.mtl + -- random_urdfs/704/704.urdf + -- random_urdfs/704/704.obj + -- random_urdfs/704/704.mtl + -- random_urdfs/703/703.urdf + -- random_urdfs/703/703.obj + -- random_urdfs/703/703.mtl + -- random_urdfs/702/702.urdf + -- random_urdfs/702/702.obj + -- random_urdfs/702/702.mtl + -- random_urdfs/701/701.urdf + -- random_urdfs/701/701.obj + -- random_urdfs/701/701.mtl + -- random_urdfs/700/700.urdf + -- random_urdfs/700/700.obj + -- random_urdfs/700/700.mtl + -- random_urdfs/699/699.urdf + -- random_urdfs/699/699.obj + -- random_urdfs/699/699.mtl + -- random_urdfs/698/698.urdf + -- random_urdfs/698/698.obj + -- random_urdfs/698/698.mtl + -- random_urdfs/697/697.urdf + -- random_urdfs/697/697.obj + -- random_urdfs/697/697.mtl + -- random_urdfs/696/696.urdf + -- random_urdfs/696/696.obj + -- random_urdfs/696/696.mtl + -- random_urdfs/695/695.urdf + -- random_urdfs/695/695.obj + -- random_urdfs/695/695.mtl + -- random_urdfs/694/694.urdf + -- random_urdfs/694/694.obj + -- random_urdfs/694/694.mtl + -- random_urdfs/693/693.urdf + -- random_urdfs/693/693.obj + -- random_urdfs/693/693.mtl + -- random_urdfs/692/692.urdf + -- random_urdfs/692/692.obj + -- random_urdfs/692/692.mtl + -- random_urdfs/691/691.urdf + -- random_urdfs/691/691.obj + -- random_urdfs/691/691.mtl + -- random_urdfs/690/690.urdf + -- random_urdfs/690/690.obj + -- random_urdfs/690/690.mtl + -- random_urdfs/689/689.urdf + -- random_urdfs/689/689.obj + -- random_urdfs/689/689.mtl + -- random_urdfs/688/688.urdf + -- random_urdfs/688/688.obj + -- random_urdfs/688/688.mtl + -- random_urdfs/687/687.urdf + -- random_urdfs/687/687.obj + -- random_urdfs/687/687.mtl + -- random_urdfs/686/686.urdf + -- random_urdfs/686/686.obj + -- random_urdfs/686/686.mtl + -- random_urdfs/685/685.urdf + -- random_urdfs/685/685.obj + -- random_urdfs/685/685.mtl + -- random_urdfs/684/684.urdf + -- random_urdfs/684/684.obj + -- random_urdfs/684/684.mtl + -- random_urdfs/683/683.urdf + -- random_urdfs/683/683.obj + -- random_urdfs/683/683.mtl + -- random_urdfs/682/682.urdf + -- random_urdfs/682/682.obj + -- random_urdfs/682/682.mtl + -- random_urdfs/681/681.urdf + -- random_urdfs/681/681.obj + -- random_urdfs/681/681.mtl + -- random_urdfs/680/680.urdf + -- random_urdfs/680/680.obj + -- random_urdfs/680/680.mtl + -- random_urdfs/679/679.urdf + -- random_urdfs/679/679.obj + -- random_urdfs/679/679.mtl + -- random_urdfs/678/678.urdf + -- random_urdfs/678/678.obj + -- random_urdfs/678/678.mtl + -- random_urdfs/677/677.urdf + -- random_urdfs/677/677.obj + -- random_urdfs/677/677.mtl + -- random_urdfs/676/676.urdf + -- random_urdfs/676/676.obj + -- random_urdfs/676/676.mtl + -- random_urdfs/675/675.urdf + -- random_urdfs/675/675.obj + -- random_urdfs/675/675.mtl + -- random_urdfs/674/674.urdf + -- random_urdfs/674/674.obj + -- random_urdfs/674/674.mtl + -- random_urdfs/673/673.urdf + -- random_urdfs/673/673.obj + -- random_urdfs/673/673.mtl + -- random_urdfs/672/672.urdf + -- random_urdfs/672/672.obj + -- random_urdfs/672/672.mtl + -- random_urdfs/671/671.urdf + -- random_urdfs/671/671.obj + -- random_urdfs/671/671.mtl + -- random_urdfs/670/670.urdf + -- random_urdfs/670/670.obj + -- random_urdfs/670/670.mtl + -- random_urdfs/669/669.urdf + -- random_urdfs/669/669.obj + -- random_urdfs/669/669.mtl + -- random_urdfs/668/668.urdf + -- random_urdfs/668/668.obj + -- random_urdfs/668/668.mtl + -- random_urdfs/667/667.urdf + -- random_urdfs/667/667.obj + -- random_urdfs/667/667.mtl + -- random_urdfs/666/666.urdf + -- random_urdfs/666/666.obj + -- random_urdfs/666/666.mtl + -- random_urdfs/665/665.urdf + -- random_urdfs/665/665.obj + -- random_urdfs/665/665.mtl + -- random_urdfs/664/664.urdf + -- random_urdfs/664/664.obj + -- random_urdfs/664/664.mtl + -- random_urdfs/663/663.urdf + -- random_urdfs/663/663.obj + -- random_urdfs/663/663.mtl + -- random_urdfs/662/662.urdf + -- random_urdfs/662/662.obj + -- random_urdfs/662/662.mtl + -- random_urdfs/661/661.urdf + -- random_urdfs/661/661.obj + -- random_urdfs/661/661.mtl + -- random_urdfs/660/660.urdf + -- random_urdfs/660/660.obj + -- random_urdfs/660/660.mtl + -- random_urdfs/659/659.urdf + -- random_urdfs/659/659.obj + -- random_urdfs/659/659.mtl + -- random_urdfs/658/658.urdf + -- random_urdfs/658/658.obj + -- random_urdfs/658/658.mtl + -- random_urdfs/657/657.urdf + -- random_urdfs/657/657.obj + -- random_urdfs/657/657.mtl + -- random_urdfs/656/656.urdf + -- random_urdfs/656/656.obj + -- random_urdfs/656/656.mtl + -- random_urdfs/655/655.urdf + -- random_urdfs/655/655.obj + -- random_urdfs/655/655.mtl + -- random_urdfs/654/654.urdf + -- random_urdfs/654/654.obj + -- random_urdfs/654/654.mtl + -- random_urdfs/653/653.urdf + -- random_urdfs/653/653.obj + -- random_urdfs/653/653.mtl + -- random_urdfs/652/652.urdf + -- random_urdfs/652/652.obj + -- random_urdfs/652/652.mtl + -- random_urdfs/651/651.urdf + -- random_urdfs/651/651.obj + -- random_urdfs/651/651.mtl + -- random_urdfs/650/650.urdf + -- random_urdfs/650/650.obj + -- random_urdfs/650/650.mtl + -- random_urdfs/649/649.urdf + -- random_urdfs/649/649.obj + -- random_urdfs/649/649.mtl + -- random_urdfs/648/648.urdf + -- random_urdfs/648/648.obj + -- random_urdfs/648/648.mtl + -- random_urdfs/647/647.urdf + -- random_urdfs/647/647.obj + -- random_urdfs/647/647.mtl + -- random_urdfs/646/646.urdf + -- random_urdfs/646/646.obj + -- random_urdfs/646/646.mtl + -- random_urdfs/645/645.urdf + -- random_urdfs/645/645.obj + -- random_urdfs/645/645.mtl + -- random_urdfs/644/644.urdf + -- random_urdfs/644/644.obj + -- random_urdfs/644/644.mtl + -- random_urdfs/643/643.urdf + -- random_urdfs/643/643.obj + -- random_urdfs/643/643.mtl + -- random_urdfs/642/642.urdf + -- random_urdfs/642/642.obj + -- random_urdfs/642/642.mtl + -- random_urdfs/641/641.urdf + -- random_urdfs/641/641.obj + -- random_urdfs/641/641.mtl + -- random_urdfs/640/640.urdf + -- random_urdfs/640/640.obj + -- random_urdfs/640/640.mtl + -- random_urdfs/639/639.urdf + -- random_urdfs/639/639.obj + -- random_urdfs/639/639.mtl + -- random_urdfs/638/638.urdf + -- random_urdfs/638/638.obj + -- random_urdfs/638/638.mtl + -- random_urdfs/637/637.urdf + -- random_urdfs/637/637.obj + -- random_urdfs/637/637.mtl + -- random_urdfs/636/636.urdf + -- random_urdfs/636/636.obj + -- random_urdfs/636/636.mtl + -- random_urdfs/635/635.urdf + -- random_urdfs/635/635.obj + -- random_urdfs/635/635.mtl + -- random_urdfs/634/634.urdf + -- random_urdfs/634/634.obj + -- random_urdfs/634/634.mtl + -- random_urdfs/633/633.urdf + -- random_urdfs/633/633.obj + -- random_urdfs/633/633.mtl + -- random_urdfs/632/632.urdf + -- random_urdfs/632/632.obj + -- random_urdfs/632/632.mtl + -- random_urdfs/631/631.urdf + -- random_urdfs/631/631.obj + -- random_urdfs/631/631.mtl + -- random_urdfs/630/630.urdf + -- random_urdfs/630/630.obj + -- random_urdfs/630/630.mtl + -- random_urdfs/629/629.urdf + -- random_urdfs/629/629.obj + -- random_urdfs/629/629.mtl + -- random_urdfs/628/628.urdf + -- random_urdfs/628/628.obj + -- random_urdfs/628/628.mtl + -- random_urdfs/627/627.urdf + -- random_urdfs/627/627.obj + -- random_urdfs/627/627.mtl + -- random_urdfs/626/626.urdf + -- random_urdfs/626/626.obj + -- random_urdfs/626/626.mtl + -- random_urdfs/625/625.urdf + -- random_urdfs/625/625.obj + -- random_urdfs/625/625.mtl + -- random_urdfs/624/624.urdf + -- random_urdfs/624/624.obj + -- random_urdfs/624/624.mtl + -- random_urdfs/623/623.urdf + -- random_urdfs/623/623.obj + -- random_urdfs/623/623.mtl + -- random_urdfs/622/622.urdf + -- random_urdfs/622/622.obj + -- random_urdfs/622/622.mtl + -- random_urdfs/621/621.urdf + -- random_urdfs/621/621.obj + -- random_urdfs/621/621.mtl + -- random_urdfs/620/620.urdf + -- random_urdfs/620/620.obj + -- random_urdfs/620/620.mtl + -- random_urdfs/619/619.urdf + -- random_urdfs/619/619.obj + -- random_urdfs/619/619.mtl + -- random_urdfs/618/618.urdf + -- random_urdfs/618/618.obj + -- random_urdfs/618/618.mtl + -- random_urdfs/617/617.urdf + -- random_urdfs/617/617.obj + -- random_urdfs/617/617.mtl + -- random_urdfs/616/616.urdf + -- random_urdfs/616/616.obj + -- random_urdfs/616/616.mtl + -- random_urdfs/615/615.urdf + -- random_urdfs/615/615.obj + -- random_urdfs/615/615.mtl + -- random_urdfs/614/614.urdf + -- random_urdfs/614/614.obj + -- random_urdfs/614/614.mtl + -- random_urdfs/613/613.urdf + -- random_urdfs/613/613.obj + -- random_urdfs/613/613.mtl + -- random_urdfs/612/612.urdf + -- random_urdfs/612/612.obj + -- random_urdfs/612/612.mtl + -- random_urdfs/611/611.urdf + -- random_urdfs/611/611.obj + -- random_urdfs/611/611.mtl + -- random_urdfs/610/610.urdf + -- random_urdfs/610/610.obj + -- random_urdfs/610/610.mtl + -- random_urdfs/609/609.urdf + -- random_urdfs/609/609.obj + -- random_urdfs/609/609.mtl + -- random_urdfs/608/608.urdf + -- random_urdfs/608/608.obj + -- random_urdfs/608/608.mtl + -- random_urdfs/607/607.urdf + -- random_urdfs/607/607.obj + -- random_urdfs/607/607.mtl + -- random_urdfs/606/606.urdf + -- random_urdfs/606/606.obj + -- random_urdfs/606/606.mtl + -- random_urdfs/605/605.urdf + -- random_urdfs/605/605.obj + -- random_urdfs/605/605.mtl + -- random_urdfs/604/604.urdf + -- random_urdfs/604/604.obj + -- random_urdfs/604/604.mtl + -- random_urdfs/603/603.urdf + -- random_urdfs/603/603.obj + -- random_urdfs/603/603.mtl + -- random_urdfs/602/602.urdf + -- random_urdfs/602/602.obj + -- random_urdfs/602/602.mtl + -- random_urdfs/601/601.urdf + -- random_urdfs/601/601.obj + -- random_urdfs/601/601.mtl + -- random_urdfs/600/600.urdf + -- random_urdfs/600/600.obj + -- random_urdfs/600/600.mtl + -- random_urdfs/599/599.urdf + -- random_urdfs/599/599.obj + -- random_urdfs/599/599.mtl + -- random_urdfs/598/598.urdf + -- random_urdfs/598/598.obj + -- random_urdfs/598/598.mtl + -- random_urdfs/597/597.urdf + -- random_urdfs/597/597.obj + -- random_urdfs/597/597.mtl + -- random_urdfs/596/596.urdf + -- random_urdfs/596/596.obj + -- random_urdfs/596/596.mtl + -- random_urdfs/595/595.urdf + -- random_urdfs/595/595.obj + -- random_urdfs/595/595.mtl + -- random_urdfs/594/594.urdf + -- random_urdfs/594/594.obj + -- random_urdfs/594/594.mtl + -- random_urdfs/593/593.urdf + -- random_urdfs/593/593.obj + -- random_urdfs/593/593.mtl + -- random_urdfs/592/592.urdf + -- random_urdfs/592/592.obj + -- random_urdfs/592/592.mtl + -- random_urdfs/591/591.urdf + -- random_urdfs/591/591.obj + -- random_urdfs/591/591.mtl + -- random_urdfs/590/590.urdf + -- random_urdfs/590/590.obj + -- random_urdfs/590/590.mtl + -- random_urdfs/589/589.urdf + -- random_urdfs/589/589.obj + -- random_urdfs/589/589.mtl + -- random_urdfs/588/588.urdf + -- random_urdfs/588/588.obj + -- random_urdfs/588/588.mtl + -- random_urdfs/587/587.urdf + -- random_urdfs/587/587.obj + -- random_urdfs/587/587.mtl + -- random_urdfs/586/586.urdf + -- random_urdfs/586/586.obj + -- random_urdfs/586/586.mtl + -- random_urdfs/585/585.urdf + -- random_urdfs/585/585.obj + -- random_urdfs/585/585.mtl + -- random_urdfs/584/584.urdf + -- random_urdfs/584/584.obj + -- random_urdfs/584/584.mtl + -- random_urdfs/583/583.urdf + -- random_urdfs/583/583.obj + -- random_urdfs/583/583.mtl + -- random_urdfs/582/582.urdf + -- random_urdfs/582/582.obj + -- random_urdfs/582/582.mtl + -- random_urdfs/581/581.urdf + -- random_urdfs/581/581.obj + -- random_urdfs/581/581.mtl + -- random_urdfs/580/580.urdf + -- random_urdfs/580/580.obj + -- random_urdfs/580/580.mtl + -- random_urdfs/579/579.urdf + -- random_urdfs/579/579.obj + -- random_urdfs/579/579.mtl + -- random_urdfs/578/578.urdf + -- random_urdfs/578/578.obj + -- random_urdfs/578/578.mtl + -- random_urdfs/577/577.urdf + -- random_urdfs/577/577.obj + -- random_urdfs/577/577.mtl + -- random_urdfs/576/576.urdf + -- random_urdfs/576/576.obj + -- random_urdfs/576/576.mtl + -- random_urdfs/575/575.urdf + -- random_urdfs/575/575.obj + -- random_urdfs/575/575.mtl + -- random_urdfs/574/574.urdf + -- random_urdfs/574/574.obj + -- random_urdfs/574/574.mtl + -- random_urdfs/573/573.urdf + -- random_urdfs/573/573.obj + -- random_urdfs/573/573.mtl + -- random_urdfs/572/572.urdf + -- random_urdfs/572/572.obj + -- random_urdfs/572/572.mtl + -- random_urdfs/571/571.urdf + -- random_urdfs/571/571.obj + -- random_urdfs/571/571.mtl + -- random_urdfs/570/570.urdf + -- random_urdfs/570/570.obj + -- random_urdfs/570/570.mtl + -- random_urdfs/569/569.urdf + -- random_urdfs/569/569.obj + -- random_urdfs/569/569.mtl + -- random_urdfs/568/568.urdf + -- random_urdfs/568/568.obj + -- random_urdfs/568/568.mtl + -- random_urdfs/567/567.urdf + -- random_urdfs/567/567.obj + -- random_urdfs/567/567.mtl + -- random_urdfs/566/566.urdf + -- random_urdfs/566/566.obj + -- random_urdfs/566/566.mtl + -- random_urdfs/565/565.urdf + -- random_urdfs/565/565.obj + -- random_urdfs/565/565.mtl + -- random_urdfs/564/564.urdf + -- random_urdfs/564/564.obj + -- random_urdfs/564/564.mtl + -- random_urdfs/563/563.urdf + -- random_urdfs/563/563.obj + -- random_urdfs/563/563.mtl + -- random_urdfs/562/562.urdf + -- random_urdfs/562/562.obj + -- random_urdfs/562/562.mtl + -- random_urdfs/561/561.urdf + -- random_urdfs/561/561.obj + -- random_urdfs/561/561.mtl + -- random_urdfs/560/560.urdf + -- random_urdfs/560/560.obj + -- random_urdfs/560/560.mtl + -- random_urdfs/559/559.urdf + -- random_urdfs/559/559.obj + -- random_urdfs/559/559.mtl + -- random_urdfs/558/558.urdf + -- random_urdfs/558/558.obj + -- random_urdfs/558/558.mtl + -- random_urdfs/557/557.urdf + -- random_urdfs/557/557.obj + -- random_urdfs/557/557.mtl + -- random_urdfs/556/556.urdf + -- random_urdfs/556/556.obj + -- random_urdfs/556/556.mtl + -- random_urdfs/555/555.urdf + -- random_urdfs/555/555.obj + -- random_urdfs/555/555.mtl + -- random_urdfs/554/554.urdf + -- random_urdfs/554/554.obj + -- random_urdfs/554/554.mtl + -- random_urdfs/553/553.urdf + -- random_urdfs/553/553.obj + -- random_urdfs/553/553.mtl + -- random_urdfs/552/552.urdf + -- random_urdfs/552/552.obj + -- random_urdfs/552/552.mtl + -- random_urdfs/551/551.urdf + -- random_urdfs/551/551.obj + -- random_urdfs/551/551.mtl + -- random_urdfs/550/550.urdf + -- random_urdfs/550/550.obj + -- random_urdfs/550/550.mtl + -- random_urdfs/549/549.urdf + -- random_urdfs/549/549.obj + -- random_urdfs/549/549.mtl + -- random_urdfs/548/548.urdf + -- random_urdfs/548/548.obj + -- random_urdfs/548/548.mtl + -- random_urdfs/547/547.urdf + -- random_urdfs/547/547.obj + -- random_urdfs/547/547.mtl + -- random_urdfs/546/546.urdf + -- random_urdfs/546/546.obj + -- random_urdfs/546/546.mtl + -- random_urdfs/545/545.urdf + -- random_urdfs/545/545.obj + -- random_urdfs/545/545.mtl + -- random_urdfs/544/544.urdf + -- random_urdfs/544/544.obj + -- random_urdfs/544/544.mtl + -- random_urdfs/543/543.urdf + -- random_urdfs/543/543.obj + -- random_urdfs/543/543.mtl + -- random_urdfs/542/542.urdf + -- random_urdfs/542/542.obj + -- random_urdfs/542/542.mtl + -- random_urdfs/541/541.urdf + -- random_urdfs/541/541.obj + -- random_urdfs/541/541.mtl + -- random_urdfs/540/540.urdf + -- random_urdfs/540/540.obj + -- random_urdfs/540/540.mtl + -- random_urdfs/539/539.urdf + -- random_urdfs/539/539.obj + -- random_urdfs/539/539.mtl + -- random_urdfs/538/538.urdf + -- random_urdfs/538/538.obj + -- random_urdfs/538/538.mtl + -- random_urdfs/537/537.urdf + -- random_urdfs/537/537.obj + -- random_urdfs/537/537.mtl + -- random_urdfs/536/536.urdf + -- random_urdfs/536/536.obj + -- random_urdfs/536/536.mtl + -- random_urdfs/535/535.urdf + -- random_urdfs/535/535.obj + -- random_urdfs/535/535.mtl + -- random_urdfs/534/534.urdf + -- random_urdfs/534/534.obj + -- random_urdfs/534/534.mtl + -- random_urdfs/533/533.urdf + -- random_urdfs/533/533.obj + -- random_urdfs/533/533.mtl + -- random_urdfs/532/532.urdf + -- random_urdfs/532/532.obj + -- random_urdfs/532/532.mtl + -- random_urdfs/531/531.urdf + -- random_urdfs/531/531.obj + -- random_urdfs/531/531.mtl + -- random_urdfs/530/530.urdf + -- random_urdfs/530/530.obj + -- random_urdfs/530/530.mtl + -- random_urdfs/529/529.urdf + -- random_urdfs/529/529.obj + -- random_urdfs/529/529.mtl + -- random_urdfs/528/528.urdf + -- random_urdfs/528/528.obj + -- random_urdfs/528/528.mtl + -- random_urdfs/527/527.urdf + -- random_urdfs/527/527.obj + -- random_urdfs/527/527.mtl + -- random_urdfs/526/526.urdf + -- random_urdfs/526/526.obj + -- random_urdfs/526/526.mtl + -- random_urdfs/525/525.urdf + -- random_urdfs/525/525.obj + -- random_urdfs/525/525.mtl + -- random_urdfs/524/524.urdf + -- random_urdfs/524/524.obj + -- random_urdfs/524/524.mtl + -- random_urdfs/523/523.urdf + -- random_urdfs/523/523.obj + -- random_urdfs/523/523.mtl + -- random_urdfs/522/522.urdf + -- random_urdfs/522/522.obj + -- random_urdfs/522/522.mtl + -- random_urdfs/521/521.urdf + -- random_urdfs/521/521.obj + -- random_urdfs/521/521.mtl + -- random_urdfs/520/520.urdf + -- random_urdfs/520/520.obj + -- random_urdfs/520/520.mtl + -- random_urdfs/519/519.urdf + -- random_urdfs/519/519.obj + -- random_urdfs/519/519.mtl + -- random_urdfs/518/518.urdf + -- random_urdfs/518/518.obj + -- random_urdfs/518/518.mtl + -- random_urdfs/517/517.urdf + -- random_urdfs/517/517.obj + -- random_urdfs/517/517.mtl + -- random_urdfs/516/516.urdf + -- random_urdfs/516/516.obj + -- random_urdfs/516/516.mtl + -- random_urdfs/515/515.urdf + -- random_urdfs/515/515.obj + -- random_urdfs/515/515.mtl + -- random_urdfs/514/514.urdf + -- random_urdfs/514/514.obj + -- random_urdfs/514/514.mtl + -- random_urdfs/513/513.urdf + -- random_urdfs/513/513.obj + -- random_urdfs/513/513.mtl + -- random_urdfs/512/512.urdf + -- random_urdfs/512/512.obj + -- random_urdfs/512/512.mtl + -- random_urdfs/511/511.urdf + -- random_urdfs/511/511.obj + -- random_urdfs/511/511.mtl + -- random_urdfs/510/510.urdf + -- random_urdfs/510/510.obj + -- random_urdfs/510/510.mtl + -- random_urdfs/509/509.urdf + -- random_urdfs/509/509.obj + -- random_urdfs/509/509.mtl + -- random_urdfs/508/508.urdf + -- random_urdfs/508/508.obj + -- random_urdfs/508/508.mtl + -- random_urdfs/507/507.urdf + -- random_urdfs/507/507.obj + -- random_urdfs/507/507.mtl + -- random_urdfs/506/506.urdf + -- random_urdfs/506/506.obj + -- random_urdfs/506/506.mtl + -- random_urdfs/505/505.urdf + -- random_urdfs/505/505.obj + -- random_urdfs/505/505.mtl + -- random_urdfs/504/504.urdf + -- random_urdfs/504/504.obj + -- random_urdfs/504/504.mtl + -- random_urdfs/503/503.urdf + -- random_urdfs/503/503.obj + -- random_urdfs/503/503.mtl + -- random_urdfs/502/502.urdf + -- random_urdfs/502/502.obj + -- random_urdfs/502/502.mtl + -- random_urdfs/501/501.urdf + -- random_urdfs/501/501.obj + -- random_urdfs/501/501.mtl + -- random_urdfs/500/500.urdf + -- random_urdfs/500/500.obj + -- random_urdfs/500/500.mtl + -- random_urdfs/499/499.urdf + -- random_urdfs/499/499.obj + -- random_urdfs/499/499.mtl + -- random_urdfs/498/498.urdf + -- random_urdfs/498/498.obj + -- random_urdfs/498/498.mtl + -- random_urdfs/497/497.urdf + -- random_urdfs/497/497.obj + -- random_urdfs/497/497.mtl + -- random_urdfs/496/496.urdf + -- random_urdfs/496/496.obj + -- random_urdfs/496/496.mtl + -- random_urdfs/495/495.urdf + -- random_urdfs/495/495.obj + -- random_urdfs/495/495.mtl + -- random_urdfs/494/494.urdf + -- random_urdfs/494/494.obj + -- random_urdfs/494/494.mtl + -- random_urdfs/493/493.urdf + -- random_urdfs/493/493.obj + -- random_urdfs/493/493.mtl + -- random_urdfs/492/492.urdf + -- random_urdfs/492/492.obj + -- random_urdfs/492/492.mtl + -- random_urdfs/491/491.urdf + -- random_urdfs/491/491.obj + -- random_urdfs/491/491.mtl + -- random_urdfs/490/490.urdf + -- random_urdfs/490/490.obj + -- random_urdfs/490/490.mtl + -- random_urdfs/489/489.urdf + -- random_urdfs/489/489.obj + -- random_urdfs/489/489.mtl + -- random_urdfs/488/488.urdf + -- random_urdfs/488/488.obj + -- random_urdfs/488/488.mtl + -- random_urdfs/487/487.urdf + -- random_urdfs/487/487.obj + -- random_urdfs/487/487.mtl + -- random_urdfs/486/486.urdf + -- random_urdfs/486/486.obj + -- random_urdfs/486/486.mtl + -- random_urdfs/485/485.urdf + -- random_urdfs/485/485.obj + -- random_urdfs/485/485.mtl + -- random_urdfs/484/484.urdf + -- random_urdfs/484/484.obj + -- random_urdfs/484/484.mtl + -- random_urdfs/483/483.urdf + -- random_urdfs/483/483.obj + -- random_urdfs/483/483.mtl + -- random_urdfs/482/482.urdf + -- random_urdfs/482/482.obj + -- random_urdfs/482/482.mtl + -- random_urdfs/481/481.urdf + -- random_urdfs/481/481.obj + -- random_urdfs/481/481.mtl + -- random_urdfs/480/480.urdf + -- random_urdfs/480/480.obj + -- random_urdfs/480/480.mtl + -- random_urdfs/479/479.urdf + -- random_urdfs/479/479.obj + -- random_urdfs/479/479.mtl + -- random_urdfs/478/478.urdf + -- random_urdfs/478/478.obj + -- random_urdfs/478/478.mtl + -- random_urdfs/477/477.urdf + -- random_urdfs/477/477.obj + -- random_urdfs/477/477.mtl + -- random_urdfs/476/476.urdf + -- random_urdfs/476/476.obj + -- random_urdfs/476/476.mtl + -- random_urdfs/475/475.urdf + -- random_urdfs/475/475.obj + -- random_urdfs/475/475.mtl + -- random_urdfs/474/474.urdf + -- random_urdfs/474/474.obj + -- random_urdfs/474/474.mtl + -- random_urdfs/473/473.urdf + -- random_urdfs/473/473.obj + -- random_urdfs/473/473.mtl + -- random_urdfs/472/472.urdf + -- random_urdfs/472/472.obj + -- random_urdfs/472/472.mtl + -- random_urdfs/471/471.urdf + -- random_urdfs/471/471.obj + -- random_urdfs/471/471.mtl + -- random_urdfs/470/470.urdf + -- random_urdfs/470/470.obj + -- random_urdfs/470/470.mtl + -- random_urdfs/469/469.urdf + -- random_urdfs/469/469.obj + -- random_urdfs/469/469.mtl + -- random_urdfs/468/468.urdf + -- random_urdfs/468/468.obj + -- random_urdfs/468/468.mtl + -- random_urdfs/467/467.urdf + -- random_urdfs/467/467.obj + -- random_urdfs/467/467.mtl + -- random_urdfs/466/466.urdf + -- random_urdfs/466/466.obj + -- random_urdfs/466/466.mtl + -- random_urdfs/465/465.urdf + -- random_urdfs/465/465.obj + -- random_urdfs/465/465.mtl + -- random_urdfs/464/464.urdf + -- random_urdfs/464/464.obj + -- random_urdfs/464/464.mtl + -- random_urdfs/463/463.urdf + -- random_urdfs/463/463.obj + -- random_urdfs/463/463.mtl + -- random_urdfs/462/462.urdf + -- random_urdfs/462/462.obj + -- random_urdfs/462/462.mtl + -- random_urdfs/461/461.urdf + -- random_urdfs/461/461.obj + -- random_urdfs/461/461.mtl + -- random_urdfs/460/460.urdf + -- random_urdfs/460/460.obj + -- random_urdfs/460/460.mtl + -- random_urdfs/459/459.urdf + -- random_urdfs/459/459.obj + -- random_urdfs/459/459.mtl + -- random_urdfs/458/458.urdf + -- random_urdfs/458/458.obj + -- random_urdfs/458/458.mtl + -- random_urdfs/457/457.urdf + -- random_urdfs/457/457.obj + -- random_urdfs/457/457.mtl + -- random_urdfs/456/456.urdf + -- random_urdfs/456/456.obj + -- random_urdfs/456/456.mtl + -- random_urdfs/455/455.urdf + -- random_urdfs/455/455.obj + -- random_urdfs/455/455.mtl + -- random_urdfs/454/454.urdf + -- random_urdfs/454/454.obj + -- random_urdfs/454/454.mtl + -- random_urdfs/453/453.urdf + -- random_urdfs/453/453.obj + -- random_urdfs/453/453.mtl + -- random_urdfs/452/452.urdf + -- random_urdfs/452/452.obj + -- random_urdfs/452/452.mtl + -- random_urdfs/451/451.urdf + -- random_urdfs/451/451.obj + -- random_urdfs/451/451.mtl + -- random_urdfs/450/450.urdf + -- random_urdfs/450/450.obj + -- random_urdfs/450/450.mtl + -- random_urdfs/449/449.urdf + -- random_urdfs/449/449.obj + -- random_urdfs/449/449.mtl + -- random_urdfs/448/448.urdf + -- random_urdfs/448/448.obj + -- random_urdfs/448/448.mtl + -- random_urdfs/447/447.urdf + -- random_urdfs/447/447.obj + -- random_urdfs/447/447.mtl + -- random_urdfs/446/446.urdf + -- random_urdfs/446/446.obj + -- random_urdfs/446/446.mtl + -- random_urdfs/445/445.urdf + -- random_urdfs/445/445.obj + -- random_urdfs/445/445.mtl + -- random_urdfs/444/444.urdf + -- random_urdfs/444/444.obj + -- random_urdfs/444/444.mtl + -- random_urdfs/443/443.urdf + -- random_urdfs/443/443.obj + -- random_urdfs/443/443.mtl + -- random_urdfs/442/442.urdf + -- random_urdfs/442/442.obj + -- random_urdfs/442/442.mtl + -- random_urdfs/441/441.urdf + -- random_urdfs/441/441.obj + -- random_urdfs/441/441.mtl + -- random_urdfs/440/440.urdf + -- random_urdfs/440/440.obj + -- random_urdfs/440/440.mtl + -- random_urdfs/439/439.urdf + -- random_urdfs/439/439.obj + -- random_urdfs/439/439.mtl + -- random_urdfs/438/438.urdf + -- random_urdfs/438/438.obj + -- random_urdfs/438/438.mtl + -- random_urdfs/437/437.urdf + -- random_urdfs/437/437.obj + -- random_urdfs/437/437.mtl + -- random_urdfs/436/436.urdf + -- random_urdfs/436/436.obj + -- random_urdfs/436/436.mtl + -- random_urdfs/435/435.urdf + -- random_urdfs/435/435.obj + -- random_urdfs/435/435.mtl + -- random_urdfs/434/434.urdf + -- random_urdfs/434/434.obj + -- random_urdfs/434/434.mtl + -- random_urdfs/433/433.urdf + -- random_urdfs/433/433.obj + -- random_urdfs/433/433.mtl + -- random_urdfs/432/432.urdf + -- random_urdfs/432/432.obj + -- random_urdfs/432/432.mtl + -- random_urdfs/431/431.urdf + -- random_urdfs/431/431.obj + -- random_urdfs/431/431.mtl + -- random_urdfs/430/430.urdf + -- random_urdfs/430/430.obj + -- random_urdfs/430/430.mtl + -- random_urdfs/429/429.urdf + -- random_urdfs/429/429.obj + -- random_urdfs/429/429.mtl + -- random_urdfs/428/428.urdf + -- random_urdfs/428/428.obj + -- random_urdfs/428/428.mtl + -- random_urdfs/427/427.urdf + -- random_urdfs/427/427.obj + -- random_urdfs/427/427.mtl + -- random_urdfs/426/426.urdf + -- random_urdfs/426/426.obj + -- random_urdfs/426/426.mtl + -- random_urdfs/425/425.urdf + -- random_urdfs/425/425.obj + -- random_urdfs/425/425.mtl + -- random_urdfs/424/424.urdf + -- random_urdfs/424/424.obj + -- random_urdfs/424/424.mtl + -- random_urdfs/423/423.urdf + -- random_urdfs/423/423.obj + -- random_urdfs/423/423.mtl + -- random_urdfs/422/422.urdf + -- random_urdfs/422/422.obj + -- random_urdfs/422/422.mtl + -- random_urdfs/421/421.urdf + -- random_urdfs/421/421.obj + -- random_urdfs/421/421.mtl + -- random_urdfs/420/420.urdf + -- random_urdfs/420/420.obj + -- random_urdfs/420/420.mtl + -- random_urdfs/419/419.urdf + -- random_urdfs/419/419.obj + -- random_urdfs/419/419.mtl + -- random_urdfs/418/418.urdf + -- random_urdfs/418/418.obj + -- random_urdfs/418/418.mtl + -- random_urdfs/417/417.urdf + -- random_urdfs/417/417.obj + -- random_urdfs/417/417.mtl + -- random_urdfs/416/416.urdf + -- random_urdfs/416/416.obj + -- random_urdfs/416/416.mtl + -- random_urdfs/415/415.urdf + -- random_urdfs/415/415.obj + -- random_urdfs/415/415.mtl + -- random_urdfs/414/414.urdf + -- random_urdfs/414/414.obj + -- random_urdfs/414/414.mtl + -- random_urdfs/413/413.urdf + -- random_urdfs/413/413.obj + -- random_urdfs/413/413.mtl + -- random_urdfs/412/412.urdf + -- random_urdfs/412/412.obj + -- random_urdfs/412/412.mtl + -- random_urdfs/411/411.urdf + -- random_urdfs/411/411.obj + -- random_urdfs/411/411.mtl + -- random_urdfs/410/410.urdf + -- random_urdfs/410/410.obj + -- random_urdfs/410/410.mtl + -- random_urdfs/409/409.urdf + -- random_urdfs/409/409.obj + -- random_urdfs/409/409.mtl + -- random_urdfs/408/408.urdf + -- random_urdfs/408/408.obj + -- random_urdfs/408/408.mtl + -- random_urdfs/407/407.urdf + -- random_urdfs/407/407.obj + -- random_urdfs/407/407.mtl + -- random_urdfs/406/406.urdf + -- random_urdfs/406/406.obj + -- random_urdfs/406/406.mtl + -- random_urdfs/405/405.urdf + -- random_urdfs/405/405.obj + -- random_urdfs/405/405.mtl + -- random_urdfs/404/404.urdf + -- random_urdfs/404/404.obj + -- random_urdfs/404/404.mtl + -- random_urdfs/403/403.urdf + -- random_urdfs/403/403.obj + -- random_urdfs/403/403.mtl + -- random_urdfs/402/402.urdf + -- random_urdfs/402/402.obj + -- random_urdfs/402/402.mtl + -- random_urdfs/401/401.urdf + -- random_urdfs/401/401.obj + -- random_urdfs/401/401.mtl + -- random_urdfs/400/400.urdf + -- random_urdfs/400/400.obj + -- random_urdfs/400/400.mtl + -- random_urdfs/399/399.urdf + -- random_urdfs/399/399.obj + -- random_urdfs/399/399.mtl + -- random_urdfs/398/398.urdf + -- random_urdfs/398/398.obj + -- random_urdfs/398/398.mtl + -- random_urdfs/397/397.urdf + -- random_urdfs/397/397.obj + -- random_urdfs/397/397.mtl + -- random_urdfs/396/396.urdf + -- random_urdfs/396/396.obj + -- random_urdfs/396/396.mtl + -- random_urdfs/395/395.urdf + -- random_urdfs/395/395.obj + -- random_urdfs/395/395.mtl + -- random_urdfs/394/394.urdf + -- random_urdfs/394/394.obj + -- random_urdfs/394/394.mtl + -- random_urdfs/393/393.urdf + -- random_urdfs/393/393.obj + -- random_urdfs/393/393.mtl + -- random_urdfs/392/392.urdf + -- random_urdfs/392/392.obj + -- random_urdfs/392/392.mtl + -- random_urdfs/391/391.urdf + -- random_urdfs/391/391.obj + -- random_urdfs/391/391.mtl + -- random_urdfs/390/390.urdf + -- random_urdfs/390/390.obj + -- random_urdfs/390/390.mtl + -- random_urdfs/389/389.urdf + -- random_urdfs/389/389.obj + -- random_urdfs/389/389.mtl + -- random_urdfs/388/388.urdf + -- random_urdfs/388/388.obj + -- random_urdfs/388/388.mtl + -- random_urdfs/387/387.urdf + -- random_urdfs/387/387.obj + -- random_urdfs/387/387.mtl + -- random_urdfs/386/386.urdf + -- random_urdfs/386/386.obj + -- random_urdfs/386/386.mtl + -- random_urdfs/385/385.urdf + -- random_urdfs/385/385.obj + -- random_urdfs/385/385.mtl + -- random_urdfs/384/384.urdf + -- random_urdfs/384/384.obj + -- random_urdfs/384/384.mtl + -- random_urdfs/383/383.urdf + -- random_urdfs/383/383.obj + -- random_urdfs/383/383.mtl + -- random_urdfs/382/382.urdf + -- random_urdfs/382/382.obj + -- random_urdfs/382/382.mtl + -- random_urdfs/381/381.urdf + -- random_urdfs/381/381.obj + -- random_urdfs/381/381.mtl + -- random_urdfs/380/380.urdf + -- random_urdfs/380/380.obj + -- random_urdfs/380/380.mtl + -- random_urdfs/379/379.urdf + -- random_urdfs/379/379.obj + -- random_urdfs/379/379.mtl + -- random_urdfs/378/378.urdf + -- random_urdfs/378/378.obj + -- random_urdfs/378/378.mtl + -- random_urdfs/377/377.urdf + -- random_urdfs/377/377.obj + -- random_urdfs/377/377.mtl + -- random_urdfs/376/376.urdf + -- random_urdfs/376/376.obj + -- random_urdfs/376/376.mtl + -- random_urdfs/375/375.urdf + -- random_urdfs/375/375.obj + -- random_urdfs/375/375.mtl + -- random_urdfs/374/374.urdf + -- random_urdfs/374/374.obj + -- random_urdfs/374/374.mtl + -- random_urdfs/373/373.urdf + -- random_urdfs/373/373.obj + -- random_urdfs/373/373.mtl + -- random_urdfs/372/372.urdf + -- random_urdfs/372/372.obj + -- random_urdfs/372/372.mtl + -- random_urdfs/371/371.urdf + -- random_urdfs/371/371.obj + -- random_urdfs/371/371.mtl + -- random_urdfs/370/370.urdf + -- random_urdfs/370/370.obj + -- random_urdfs/370/370.mtl + -- random_urdfs/369/369.urdf + -- random_urdfs/369/369.obj + -- random_urdfs/369/369.mtl + -- random_urdfs/368/368.urdf + -- random_urdfs/368/368.obj + -- random_urdfs/368/368.mtl + -- random_urdfs/367/367.urdf + -- random_urdfs/367/367.obj + -- random_urdfs/367/367.mtl + -- random_urdfs/366/366.urdf + -- random_urdfs/366/366.obj + -- random_urdfs/366/366.mtl + -- random_urdfs/365/365.urdf + -- random_urdfs/365/365.obj + -- random_urdfs/365/365.mtl + -- random_urdfs/364/364.urdf + -- random_urdfs/364/364.obj + -- random_urdfs/364/364.mtl + -- random_urdfs/363/363.urdf + -- random_urdfs/363/363.obj + -- random_urdfs/363/363.mtl + -- random_urdfs/362/362.urdf + -- random_urdfs/362/362.obj + -- random_urdfs/362/362.mtl + -- random_urdfs/361/361.urdf + -- random_urdfs/361/361.obj + -- random_urdfs/361/361.mtl + -- random_urdfs/360/360.urdf + -- random_urdfs/360/360.obj + -- random_urdfs/360/360.mtl + -- random_urdfs/359/359.urdf + -- random_urdfs/359/359.obj + -- random_urdfs/359/359.mtl + -- random_urdfs/358/358.urdf + -- random_urdfs/358/358.obj + -- random_urdfs/358/358.mtl + -- random_urdfs/357/357.urdf + -- random_urdfs/357/357.obj + -- random_urdfs/357/357.mtl + -- random_urdfs/356/356.urdf + -- random_urdfs/356/356.obj + -- random_urdfs/356/356.mtl + -- random_urdfs/355/355.urdf + -- random_urdfs/355/355.obj + -- random_urdfs/355/355.mtl + -- random_urdfs/354/354.urdf + -- random_urdfs/354/354.obj + -- random_urdfs/354/354.mtl + -- random_urdfs/353/353.urdf + -- random_urdfs/353/353.obj + -- random_urdfs/353/353.mtl + -- random_urdfs/352/352.urdf + -- random_urdfs/352/352.obj + -- random_urdfs/352/352.mtl + -- random_urdfs/351/351.urdf + -- random_urdfs/351/351.obj + -- random_urdfs/351/351.mtl + -- random_urdfs/350/350.urdf + -- random_urdfs/350/350.obj + -- random_urdfs/350/350.mtl + -- random_urdfs/349/349.urdf + -- random_urdfs/349/349.obj + -- random_urdfs/349/349.mtl + -- random_urdfs/348/348.urdf + -- random_urdfs/348/348.obj + -- random_urdfs/348/348.mtl + -- random_urdfs/347/347.urdf + -- random_urdfs/347/347.obj + -- random_urdfs/347/347.mtl + -- random_urdfs/346/346.urdf + -- random_urdfs/346/346.obj + -- random_urdfs/346/346.mtl + -- random_urdfs/345/345.urdf + -- random_urdfs/345/345.obj + -- random_urdfs/345/345.mtl + -- random_urdfs/344/344.urdf + -- random_urdfs/344/344.obj + -- random_urdfs/344/344.mtl + -- random_urdfs/343/343.urdf + -- random_urdfs/343/343.obj + -- random_urdfs/343/343.mtl + -- random_urdfs/342/342.urdf + -- random_urdfs/342/342.obj + -- random_urdfs/342/342.mtl + -- random_urdfs/341/341.urdf + -- random_urdfs/341/341.obj + -- random_urdfs/341/341.mtl + -- random_urdfs/340/340.urdf + -- random_urdfs/340/340.obj + -- random_urdfs/340/340.mtl + -- random_urdfs/339/339.urdf + -- random_urdfs/339/339.obj + -- random_urdfs/339/339.mtl + -- random_urdfs/338/338.urdf + -- random_urdfs/338/338.obj + -- random_urdfs/338/338.mtl + -- random_urdfs/337/337.urdf + -- random_urdfs/337/337.obj + -- random_urdfs/337/337.mtl + -- random_urdfs/336/336.urdf + -- random_urdfs/336/336.obj + -- random_urdfs/336/336.mtl + -- random_urdfs/335/335.urdf + -- random_urdfs/335/335.obj + -- random_urdfs/335/335.mtl + -- random_urdfs/334/334.urdf + -- random_urdfs/334/334.obj + -- random_urdfs/334/334.mtl + -- random_urdfs/333/333.urdf + -- random_urdfs/333/333.obj + -- random_urdfs/333/333.mtl + -- random_urdfs/332/332.urdf + -- random_urdfs/332/332.obj + -- random_urdfs/332/332.mtl + -- random_urdfs/331/331.urdf + -- random_urdfs/331/331.obj + -- random_urdfs/331/331.mtl + -- random_urdfs/330/330.urdf + -- random_urdfs/330/330.obj + -- random_urdfs/330/330.mtl + -- random_urdfs/329/329.urdf + -- random_urdfs/329/329.obj + -- random_urdfs/329/329.mtl + -- random_urdfs/328/328.urdf + -- random_urdfs/328/328.obj + -- random_urdfs/328/328.mtl + -- random_urdfs/327/327.urdf + -- random_urdfs/327/327.obj + -- random_urdfs/327/327.mtl + -- random_urdfs/326/326.urdf + -- random_urdfs/326/326.obj + -- random_urdfs/326/326.mtl + -- random_urdfs/325/325.urdf + -- random_urdfs/325/325.obj + -- random_urdfs/325/325.mtl + -- random_urdfs/324/324.urdf + -- random_urdfs/324/324.obj + -- random_urdfs/324/324.mtl + -- random_urdfs/323/323.urdf + -- random_urdfs/323/323.obj + -- random_urdfs/323/323.mtl + -- random_urdfs/322/322.urdf + -- random_urdfs/322/322.obj + -- random_urdfs/322/322.mtl + -- random_urdfs/321/321.urdf + -- random_urdfs/321/321.obj + -- random_urdfs/321/321.mtl + -- random_urdfs/320/320.urdf + -- random_urdfs/320/320.obj + -- random_urdfs/320/320.mtl + -- random_urdfs/319/319.urdf + -- random_urdfs/319/319.obj + -- random_urdfs/319/319.mtl + -- random_urdfs/318/318.urdf + -- random_urdfs/318/318.obj + -- random_urdfs/318/318.mtl + -- random_urdfs/317/317.urdf + -- random_urdfs/317/317.obj + -- random_urdfs/317/317.mtl + -- random_urdfs/316/316.urdf + -- random_urdfs/316/316.obj + -- random_urdfs/316/316.mtl + -- random_urdfs/315/315.urdf + -- random_urdfs/315/315.obj + -- random_urdfs/315/315.mtl + -- random_urdfs/314/314.urdf + -- random_urdfs/314/314.obj + -- random_urdfs/314/314.mtl + -- random_urdfs/313/313.urdf + -- random_urdfs/313/313.obj + -- random_urdfs/313/313.mtl + -- random_urdfs/312/312.urdf + -- random_urdfs/312/312.obj + -- random_urdfs/312/312.mtl + -- random_urdfs/311/311.urdf + -- random_urdfs/311/311.obj + -- random_urdfs/311/311.mtl + -- random_urdfs/310/310.urdf + -- random_urdfs/310/310.obj + -- random_urdfs/310/310.mtl + -- random_urdfs/309/309.urdf + -- random_urdfs/309/309.obj + -- random_urdfs/309/309.mtl + -- random_urdfs/308/308.urdf + -- random_urdfs/308/308.obj + -- random_urdfs/308/308.mtl + -- random_urdfs/307/307.urdf + -- random_urdfs/307/307.obj + -- random_urdfs/307/307.mtl + -- random_urdfs/306/306.urdf + -- random_urdfs/306/306.obj + -- random_urdfs/306/306.mtl + -- random_urdfs/305/305.urdf + -- random_urdfs/305/305.obj + -- random_urdfs/305/305.mtl + -- random_urdfs/304/304.urdf + -- random_urdfs/304/304.obj + -- random_urdfs/304/304.mtl + -- random_urdfs/303/303.urdf + -- random_urdfs/303/303.obj + -- random_urdfs/303/303.mtl + -- random_urdfs/302/302.urdf + -- random_urdfs/302/302.obj + -- random_urdfs/302/302.mtl + -- random_urdfs/301/301.urdf + -- random_urdfs/301/301.obj + -- random_urdfs/301/301.mtl + -- random_urdfs/300/300.urdf + -- random_urdfs/300/300.obj + -- random_urdfs/300/300.mtl + -- random_urdfs/299/299.urdf + -- random_urdfs/299/299.obj + -- random_urdfs/299/299.mtl + -- random_urdfs/298/298.urdf + -- random_urdfs/298/298.obj + -- random_urdfs/298/298.mtl + -- random_urdfs/297/297.urdf + -- random_urdfs/297/297.obj + -- random_urdfs/297/297.mtl + -- random_urdfs/296/296.urdf + -- random_urdfs/296/296.obj + -- random_urdfs/296/296.mtl + -- random_urdfs/295/295.urdf + -- random_urdfs/295/295.obj + -- random_urdfs/295/295.mtl + -- random_urdfs/294/294.urdf + -- random_urdfs/294/294.obj + -- random_urdfs/294/294.mtl + -- random_urdfs/293/293.urdf + -- random_urdfs/293/293.obj + -- random_urdfs/293/293.mtl + -- random_urdfs/292/292.urdf + -- random_urdfs/292/292.obj + -- random_urdfs/292/292.mtl + -- random_urdfs/291/291.urdf + -- random_urdfs/291/291.obj + -- random_urdfs/291/291.mtl + -- random_urdfs/290/290.urdf + -- random_urdfs/290/290.obj + -- random_urdfs/290/290.mtl + -- random_urdfs/289/289.urdf + -- random_urdfs/289/289.obj + -- random_urdfs/289/289.mtl + -- random_urdfs/288/288.urdf + -- random_urdfs/288/288.obj + -- random_urdfs/288/288.mtl + -- random_urdfs/287/287.urdf + -- random_urdfs/287/287.obj + -- random_urdfs/287/287.mtl + -- random_urdfs/286/286.urdf + -- random_urdfs/286/286.obj + -- random_urdfs/286/286.mtl + -- random_urdfs/285/285.urdf + -- random_urdfs/285/285.obj + -- random_urdfs/285/285.mtl + -- random_urdfs/284/284.urdf + -- random_urdfs/284/284.obj + -- random_urdfs/284/284.mtl + -- random_urdfs/283/283.urdf + -- random_urdfs/283/283.obj + -- random_urdfs/283/283.mtl + -- random_urdfs/282/282.urdf + -- random_urdfs/282/282.obj + -- random_urdfs/282/282.mtl + -- random_urdfs/281/281.urdf + -- random_urdfs/281/281.obj + -- random_urdfs/281/281.mtl + -- random_urdfs/280/280.urdf + -- random_urdfs/280/280.obj + -- random_urdfs/280/280.mtl + -- random_urdfs/279/279.urdf + -- random_urdfs/279/279.obj + -- random_urdfs/279/279.mtl + -- random_urdfs/278/278.urdf + -- random_urdfs/278/278.obj + -- random_urdfs/278/278.mtl + -- random_urdfs/277/277.urdf + -- random_urdfs/277/277.obj + -- random_urdfs/277/277.mtl + -- random_urdfs/276/276.urdf + -- random_urdfs/276/276.obj + -- random_urdfs/276/276.mtl + -- random_urdfs/275/275.urdf + -- random_urdfs/275/275.obj + -- random_urdfs/275/275.mtl + -- random_urdfs/274/274.urdf + -- random_urdfs/274/274.obj + -- random_urdfs/274/274.mtl + -- random_urdfs/273/273.urdf + -- random_urdfs/273/273.obj + -- random_urdfs/273/273.mtl + -- random_urdfs/272/272.urdf + -- random_urdfs/272/272.obj + -- random_urdfs/272/272.mtl + -- random_urdfs/271/271.urdf + -- random_urdfs/271/271.obj + -- random_urdfs/271/271.mtl + -- random_urdfs/270/270.urdf + -- random_urdfs/270/270.obj + -- random_urdfs/270/270.mtl + -- random_urdfs/269/269.urdf + -- random_urdfs/269/269.obj + -- random_urdfs/269/269.mtl + -- random_urdfs/268/268.urdf + -- random_urdfs/268/268.obj + -- random_urdfs/268/268.mtl + -- random_urdfs/267/267.urdf + -- random_urdfs/267/267.obj + -- random_urdfs/267/267.mtl + -- random_urdfs/266/266.urdf + -- random_urdfs/266/266.obj + -- random_urdfs/266/266.mtl + -- random_urdfs/265/265.urdf + -- random_urdfs/265/265.obj + -- random_urdfs/265/265.mtl + -- random_urdfs/264/264.urdf + -- random_urdfs/264/264.obj + -- random_urdfs/264/264.mtl + -- random_urdfs/263/263.urdf + -- random_urdfs/263/263.obj + -- random_urdfs/263/263.mtl + -- random_urdfs/262/262.urdf + -- random_urdfs/262/262.obj + -- random_urdfs/262/262.mtl + -- random_urdfs/261/261.urdf + -- random_urdfs/261/261.obj + -- random_urdfs/261/261.mtl + -- random_urdfs/260/260.urdf + -- random_urdfs/260/260.obj + -- random_urdfs/260/260.mtl + -- random_urdfs/259/259.urdf + -- random_urdfs/259/259.obj + -- random_urdfs/259/259.mtl + -- random_urdfs/258/258.urdf + -- random_urdfs/258/258.obj + -- random_urdfs/258/258.mtl + -- random_urdfs/257/257.urdf + -- random_urdfs/257/257.obj + -- random_urdfs/257/257.mtl + -- random_urdfs/256/256.urdf + -- random_urdfs/256/256.obj + -- random_urdfs/256/256.mtl + -- random_urdfs/255/255.urdf + -- random_urdfs/255/255.obj + -- random_urdfs/255/255.mtl + -- random_urdfs/254/254.urdf + -- random_urdfs/254/254.obj + -- random_urdfs/254/254.mtl + -- random_urdfs/253/253.urdf + -- random_urdfs/253/253.obj + -- random_urdfs/253/253.mtl + -- random_urdfs/252/252.urdf + -- random_urdfs/252/252.obj + -- random_urdfs/252/252.mtl + -- random_urdfs/251/251.urdf + -- random_urdfs/251/251.obj + -- random_urdfs/251/251.mtl + -- random_urdfs/250/250.urdf + -- random_urdfs/250/250.obj + -- random_urdfs/250/250.mtl + -- random_urdfs/249/249.urdf + -- random_urdfs/249/249.obj + -- random_urdfs/249/249.mtl + -- random_urdfs/248/248.urdf + -- random_urdfs/248/248.obj + -- random_urdfs/248/248.mtl + -- random_urdfs/247/247.urdf + -- random_urdfs/247/247.obj + -- random_urdfs/247/247.mtl + -- random_urdfs/246/246.urdf + -- random_urdfs/246/246.obj + -- random_urdfs/246/246.mtl + -- random_urdfs/245/245.urdf + -- random_urdfs/245/245.obj + -- random_urdfs/245/245.mtl + -- random_urdfs/244/244.urdf + -- random_urdfs/244/244.obj + -- random_urdfs/244/244.mtl + -- random_urdfs/243/243.urdf + -- random_urdfs/243/243.obj + -- random_urdfs/243/243.mtl + -- random_urdfs/242/242.urdf + -- random_urdfs/242/242.obj + -- random_urdfs/242/242.mtl + -- random_urdfs/241/241.urdf + -- random_urdfs/241/241.obj + -- random_urdfs/241/241.mtl + -- random_urdfs/240/240.urdf + -- random_urdfs/240/240.obj + -- random_urdfs/240/240.mtl + -- random_urdfs/239/239.urdf + -- random_urdfs/239/239.obj + -- random_urdfs/239/239.mtl + -- random_urdfs/238/238.urdf + -- random_urdfs/238/238.obj + -- random_urdfs/238/238.mtl + -- random_urdfs/237/237.urdf + -- random_urdfs/237/237.obj + -- random_urdfs/237/237.mtl + -- random_urdfs/236/236.urdf + -- random_urdfs/236/236.obj + -- random_urdfs/236/236.mtl + -- random_urdfs/235/235.urdf + -- random_urdfs/235/235.obj + -- random_urdfs/235/235.mtl + -- random_urdfs/234/234.urdf + -- random_urdfs/234/234.obj + -- random_urdfs/234/234.mtl + -- random_urdfs/233/233.urdf + -- random_urdfs/233/233.obj + -- random_urdfs/233/233.mtl + -- random_urdfs/232/232.urdf + -- random_urdfs/232/232.obj + -- random_urdfs/232/232.mtl + -- random_urdfs/231/231.urdf + -- random_urdfs/231/231.obj + -- random_urdfs/231/231.mtl + -- random_urdfs/230/230.urdf + -- random_urdfs/230/230.obj + -- random_urdfs/230/230.mtl + -- random_urdfs/229/229.urdf + -- random_urdfs/229/229.obj + -- random_urdfs/229/229.mtl + -- random_urdfs/228/228.urdf + -- random_urdfs/228/228.obj + -- random_urdfs/228/228.mtl + -- random_urdfs/227/227.urdf + -- random_urdfs/227/227.obj + -- random_urdfs/227/227.mtl + -- random_urdfs/226/226.urdf + -- random_urdfs/226/226.obj + -- random_urdfs/226/226.mtl + -- random_urdfs/225/225.urdf + -- random_urdfs/225/225.obj + -- random_urdfs/225/225.mtl + -- random_urdfs/224/224.urdf + -- random_urdfs/224/224.obj + -- random_urdfs/224/224.mtl + -- random_urdfs/223/223.urdf + -- random_urdfs/223/223.obj + -- random_urdfs/223/223.mtl + -- random_urdfs/222/222.urdf + -- random_urdfs/222/222.obj + -- random_urdfs/222/222.mtl + -- random_urdfs/221/221.urdf + -- random_urdfs/221/221.obj + -- random_urdfs/221/221.mtl + -- random_urdfs/220/220.urdf + -- random_urdfs/220/220.obj + -- random_urdfs/220/220.mtl + -- random_urdfs/219/219.urdf + -- random_urdfs/219/219.obj + -- random_urdfs/219/219.mtl + -- random_urdfs/218/218.urdf + -- random_urdfs/218/218.obj + -- random_urdfs/218/218.mtl + -- random_urdfs/217/217.urdf + -- random_urdfs/217/217.obj + -- random_urdfs/217/217.mtl + -- random_urdfs/216/216.urdf + -- random_urdfs/216/216.obj + -- random_urdfs/216/216.mtl + -- random_urdfs/215/215.urdf + -- random_urdfs/215/215.obj + -- random_urdfs/215/215.mtl + -- random_urdfs/214/214.urdf + -- random_urdfs/214/214.obj + -- random_urdfs/214/214.mtl + -- random_urdfs/213/213.urdf + -- random_urdfs/213/213.obj + -- random_urdfs/213/213.mtl + -- random_urdfs/212/212.urdf + -- random_urdfs/212/212.obj + -- random_urdfs/212/212.mtl + -- random_urdfs/211/211.urdf + -- random_urdfs/211/211.obj + -- random_urdfs/211/211.mtl + -- random_urdfs/210/210.urdf + -- random_urdfs/210/210.obj + -- random_urdfs/210/210.mtl + -- random_urdfs/209/209.urdf + -- random_urdfs/209/209.obj + -- random_urdfs/209/209.mtl + -- random_urdfs/208/208.urdf + -- random_urdfs/208/208.obj + -- random_urdfs/208/208.mtl + -- random_urdfs/207/207.urdf + -- random_urdfs/207/207.obj + -- random_urdfs/207/207.mtl + -- random_urdfs/206/206.urdf + -- random_urdfs/206/206.obj + -- random_urdfs/206/206.mtl + -- random_urdfs/205/205.urdf + -- random_urdfs/205/205.obj + -- random_urdfs/205/205.mtl + -- random_urdfs/204/204.urdf + -- random_urdfs/204/204.obj + -- random_urdfs/204/204.mtl + -- random_urdfs/203/203.urdf + -- random_urdfs/203/203.obj + -- random_urdfs/203/203.mtl + -- random_urdfs/202/202.urdf + -- random_urdfs/202/202.obj + -- random_urdfs/202/202.mtl + -- random_urdfs/201/201.urdf + -- random_urdfs/201/201.obj + -- random_urdfs/201/201.mtl + -- random_urdfs/200/200.urdf + -- random_urdfs/200/200.obj + -- random_urdfs/200/200.mtl + -- random_urdfs/199/199.urdf + -- random_urdfs/199/199.obj + -- random_urdfs/199/199.mtl + -- random_urdfs/198/198.urdf + -- random_urdfs/198/198.obj + -- random_urdfs/198/198.mtl + -- random_urdfs/197/197.urdf + -- random_urdfs/197/197.obj + -- random_urdfs/197/197.mtl + -- random_urdfs/196/196.urdf + -- random_urdfs/196/196.obj + -- random_urdfs/196/196.mtl + -- random_urdfs/195/195.urdf + -- random_urdfs/195/195.obj + -- random_urdfs/195/195.mtl + -- random_urdfs/194/194.urdf + -- random_urdfs/194/194.obj + -- random_urdfs/194/194.mtl + -- random_urdfs/193/193.urdf + -- random_urdfs/193/193.obj + -- random_urdfs/193/193.mtl + -- random_urdfs/192/192.urdf + -- random_urdfs/192/192.obj + -- random_urdfs/192/192.mtl + -- random_urdfs/191/191.urdf + -- random_urdfs/191/191.obj + -- random_urdfs/191/191.mtl + -- random_urdfs/190/190.urdf + -- random_urdfs/190/190.obj + -- random_urdfs/190/190.mtl + -- random_urdfs/189/189.urdf + -- random_urdfs/189/189.obj + -- random_urdfs/189/189.mtl + -- random_urdfs/188/188.urdf + -- random_urdfs/188/188.obj + -- random_urdfs/188/188.mtl + -- random_urdfs/187/187.urdf + -- random_urdfs/187/187.obj + -- random_urdfs/187/187.mtl + -- random_urdfs/186/186.urdf + -- random_urdfs/186/186.obj + -- random_urdfs/186/186.mtl + -- random_urdfs/185/185.urdf + -- random_urdfs/185/185.obj + -- random_urdfs/185/185.mtl + -- random_urdfs/184/184.urdf + -- random_urdfs/184/184.obj + -- random_urdfs/184/184.mtl + -- random_urdfs/183/183.urdf + -- random_urdfs/183/183.obj + -- random_urdfs/183/183.mtl + -- random_urdfs/182/182.urdf + -- random_urdfs/182/182.obj + -- random_urdfs/182/182.mtl + -- random_urdfs/181/181.urdf + -- random_urdfs/181/181.obj + -- random_urdfs/181/181.mtl + -- random_urdfs/180/180.urdf + -- random_urdfs/180/180.obj + -- random_urdfs/180/180.mtl + -- random_urdfs/179/179.urdf + -- random_urdfs/179/179.obj + -- random_urdfs/179/179.mtl + -- random_urdfs/178/178.urdf + -- random_urdfs/178/178.obj + -- random_urdfs/178/178.mtl + -- random_urdfs/177/177.urdf + -- random_urdfs/177/177.obj + -- random_urdfs/177/177.mtl + -- random_urdfs/176/176.urdf + -- random_urdfs/176/176.obj + -- random_urdfs/176/176.mtl + -- random_urdfs/175/175.urdf + -- random_urdfs/175/175.obj + -- random_urdfs/175/175.mtl + -- random_urdfs/174/174.urdf + -- random_urdfs/174/174.obj + -- random_urdfs/174/174.mtl + -- random_urdfs/173/173.urdf + -- random_urdfs/173/173.obj + -- random_urdfs/173/173.mtl + -- random_urdfs/172/172.urdf + -- random_urdfs/172/172.obj + -- random_urdfs/172/172.mtl + -- random_urdfs/171/171.urdf + -- random_urdfs/171/171.obj + -- random_urdfs/171/171.mtl + -- random_urdfs/170/170.urdf + -- random_urdfs/170/170.obj + -- random_urdfs/170/170.mtl + -- random_urdfs/169/169.urdf + -- random_urdfs/169/169.obj + -- random_urdfs/169/169.mtl + -- random_urdfs/168/168.urdf + -- random_urdfs/168/168.obj + -- random_urdfs/168/168.mtl + -- random_urdfs/167/167.urdf + -- random_urdfs/167/167.obj + -- random_urdfs/167/167.mtl + -- random_urdfs/166/166.urdf + -- random_urdfs/166/166.obj + -- random_urdfs/166/166.mtl + -- random_urdfs/165/165.urdf + -- random_urdfs/165/165.obj + -- random_urdfs/165/165.mtl + -- random_urdfs/164/164.urdf + -- random_urdfs/164/164.obj + -- random_urdfs/164/164.mtl + -- random_urdfs/163/163.urdf + -- random_urdfs/163/163.obj + -- random_urdfs/163/163.mtl + -- random_urdfs/162/162.urdf + -- random_urdfs/162/162.obj + -- random_urdfs/162/162.mtl + -- random_urdfs/161/161.urdf + -- random_urdfs/161/161.obj + -- random_urdfs/161/161.mtl + -- random_urdfs/160/160.urdf + -- random_urdfs/160/160.obj + -- random_urdfs/160/160.mtl + -- random_urdfs/159/159.urdf + -- random_urdfs/159/159.obj + -- random_urdfs/159/159.mtl + -- random_urdfs/158/158.urdf + -- random_urdfs/158/158.obj + -- random_urdfs/158/158.mtl + -- random_urdfs/157/157.urdf + -- random_urdfs/157/157.obj + -- random_urdfs/157/157.mtl + -- random_urdfs/156/156.urdf + -- random_urdfs/156/156.obj + -- random_urdfs/156/156.mtl + -- random_urdfs/155/155.urdf + -- random_urdfs/155/155.obj + -- random_urdfs/155/155.mtl + -- random_urdfs/154/154.urdf + -- random_urdfs/154/154.obj + -- random_urdfs/154/154.mtl + -- random_urdfs/153/153.urdf + -- random_urdfs/153/153.obj + -- random_urdfs/153/153.mtl + -- random_urdfs/152/152.urdf + -- random_urdfs/152/152.obj + -- random_urdfs/152/152.mtl + -- random_urdfs/151/151.urdf + -- random_urdfs/151/151.obj + -- random_urdfs/151/151.mtl + -- random_urdfs/150/150.urdf + -- random_urdfs/150/150.obj + -- random_urdfs/150/150.mtl + -- random_urdfs/149/149.urdf + -- random_urdfs/149/149.obj + -- random_urdfs/149/149.mtl + -- random_urdfs/148/148.urdf + -- random_urdfs/148/148.obj + -- random_urdfs/148/148.mtl + -- random_urdfs/147/147.urdf + -- random_urdfs/147/147.obj + -- random_urdfs/147/147.mtl + -- random_urdfs/146/146.urdf + -- random_urdfs/146/146.obj + -- random_urdfs/146/146.mtl + -- random_urdfs/145/145.urdf + -- random_urdfs/145/145.obj + -- random_urdfs/145/145.mtl + -- random_urdfs/144/144.urdf + -- random_urdfs/144/144.obj + -- random_urdfs/144/144.mtl + -- random_urdfs/143/143.urdf + -- random_urdfs/143/143.obj + -- random_urdfs/143/143.mtl + -- random_urdfs/142/142.urdf + -- random_urdfs/142/142.obj + -- random_urdfs/142/142.mtl + -- random_urdfs/141/141.urdf + -- random_urdfs/141/141.obj + -- random_urdfs/141/141.mtl + -- random_urdfs/140/140.urdf + -- random_urdfs/140/140.obj + -- random_urdfs/140/140.mtl + -- random_urdfs/139/139.urdf + -- random_urdfs/139/139.obj + -- random_urdfs/139/139.mtl + -- random_urdfs/138/138.urdf + -- random_urdfs/138/138.obj + -- random_urdfs/138/138.mtl + -- random_urdfs/137/137.urdf + -- random_urdfs/137/137.obj + -- random_urdfs/137/137.mtl + -- random_urdfs/136/136.urdf + -- random_urdfs/136/136.obj + -- random_urdfs/136/136.mtl + -- random_urdfs/135/135.urdf + -- random_urdfs/135/135.obj + -- random_urdfs/135/135.mtl + -- random_urdfs/134/134.urdf + -- random_urdfs/134/134.obj + -- random_urdfs/134/134.mtl + -- random_urdfs/133/133.urdf + -- random_urdfs/133/133.obj + -- random_urdfs/133/133.mtl + -- random_urdfs/132/132.urdf + -- random_urdfs/132/132.obj + -- random_urdfs/132/132.mtl + -- random_urdfs/131/131.urdf + -- random_urdfs/131/131.obj + -- random_urdfs/131/131.mtl + -- random_urdfs/130/130.urdf + -- random_urdfs/130/130.obj + -- random_urdfs/130/130.mtl + -- random_urdfs/129/129.urdf + -- random_urdfs/129/129.obj + -- random_urdfs/129/129.mtl + -- random_urdfs/128/128.urdf + -- random_urdfs/128/128.obj + -- random_urdfs/128/128.mtl + -- random_urdfs/127/127.urdf + -- random_urdfs/127/127.obj + -- random_urdfs/127/127.mtl + -- random_urdfs/126/126.urdf + -- random_urdfs/126/126.obj + -- random_urdfs/126/126.mtl + -- random_urdfs/125/125.urdf + -- random_urdfs/125/125.obj + -- random_urdfs/125/125.mtl + -- random_urdfs/124/124.urdf + -- random_urdfs/124/124.obj + -- random_urdfs/124/124.mtl + -- random_urdfs/123/123.urdf + -- random_urdfs/123/123.obj + -- random_urdfs/123/123.mtl + -- random_urdfs/122/122.urdf + -- random_urdfs/122/122.obj + -- random_urdfs/122/122.mtl + -- random_urdfs/121/121.urdf + -- random_urdfs/121/121.obj + -- random_urdfs/121/121.mtl + -- random_urdfs/120/120.urdf + -- random_urdfs/120/120.obj + -- random_urdfs/120/120.mtl + -- random_urdfs/119/119.urdf + -- random_urdfs/119/119.obj + -- random_urdfs/119/119.mtl + -- random_urdfs/118/118.urdf + -- random_urdfs/118/118.obj + -- random_urdfs/118/118.mtl + -- random_urdfs/117/117.urdf + -- random_urdfs/117/117.obj + -- random_urdfs/117/117.mtl + -- random_urdfs/116/116.urdf + -- random_urdfs/116/116.obj + -- random_urdfs/116/116.mtl + -- random_urdfs/115/115.urdf + -- random_urdfs/115/115.obj + -- random_urdfs/115/115.mtl + -- random_urdfs/114/114.urdf + -- random_urdfs/114/114.obj + -- random_urdfs/114/114.mtl + -- random_urdfs/113/113.urdf + -- random_urdfs/113/113.obj + -- random_urdfs/113/113.mtl + -- random_urdfs/112/112.urdf + -- random_urdfs/112/112.obj + -- random_urdfs/112/112.mtl + -- random_urdfs/111/111.urdf + -- random_urdfs/111/111.obj + -- random_urdfs/111/111.mtl + -- random_urdfs/110/110.urdf + -- random_urdfs/110/110.obj + -- random_urdfs/110/110.mtl + -- random_urdfs/109/109.urdf + -- random_urdfs/109/109.obj + -- random_urdfs/109/109.mtl + -- random_urdfs/108/108.urdf + -- random_urdfs/108/108.obj + -- random_urdfs/108/108.mtl + -- random_urdfs/107/107.urdf + -- random_urdfs/107/107.obj + -- random_urdfs/107/107.mtl + -- random_urdfs/106/106.urdf + -- random_urdfs/106/106.obj + -- random_urdfs/106/106.mtl + -- random_urdfs/105/105.urdf + -- random_urdfs/105/105.obj + -- random_urdfs/105/105.mtl + -- random_urdfs/104/104.urdf + -- random_urdfs/104/104.obj + -- random_urdfs/104/104.mtl + -- random_urdfs/103/103.urdf + -- random_urdfs/103/103.obj + -- random_urdfs/103/103.mtl + -- random_urdfs/102/102.urdf + -- random_urdfs/102/102.obj + -- random_urdfs/102/102.mtl + -- random_urdfs/101/101.urdf + -- random_urdfs/101/101.obj + -- random_urdfs/101/101.mtl + -- random_urdfs/100/100.urdf + -- random_urdfs/100/100.obj + -- random_urdfs/100/100.mtl + -- random_urdfs/099/099.urdf + -- random_urdfs/099/099.obj + -- random_urdfs/099/099.mtl + -- random_urdfs/098/098.urdf + -- random_urdfs/098/098.obj + -- random_urdfs/098/098.mtl + -- random_urdfs/097/097.urdf + -- random_urdfs/097/097.obj + -- random_urdfs/097/097.mtl + -- random_urdfs/096/096.urdf + -- random_urdfs/096/096.obj + -- random_urdfs/096/096.mtl + -- random_urdfs/095/095.urdf + -- random_urdfs/095/095.obj + -- random_urdfs/095/095.mtl + -- random_urdfs/094/094.urdf + -- random_urdfs/094/094.obj + -- random_urdfs/094/094.mtl + -- random_urdfs/093/093.urdf + -- random_urdfs/093/093.obj + -- random_urdfs/093/093.mtl + -- random_urdfs/092/092.urdf + -- random_urdfs/092/092.obj + -- random_urdfs/092/092.mtl + -- random_urdfs/091/091.urdf + -- random_urdfs/091/091.obj + -- random_urdfs/091/091.mtl + -- random_urdfs/090/090.urdf + -- random_urdfs/090/090.obj + -- random_urdfs/090/090.mtl + -- random_urdfs/089/089.urdf + -- random_urdfs/089/089.obj + -- random_urdfs/089/089.mtl + -- random_urdfs/088/088.urdf + -- random_urdfs/088/088.obj + -- random_urdfs/088/088.mtl + -- random_urdfs/087/087.urdf + -- random_urdfs/087/087.obj + -- random_urdfs/087/087.mtl + -- random_urdfs/086/086.urdf + -- random_urdfs/086/086.obj + -- random_urdfs/086/086.mtl + -- random_urdfs/085/085.urdf + -- random_urdfs/085/085.obj + -- random_urdfs/085/085.mtl + -- random_urdfs/084/084.urdf + -- random_urdfs/084/084.obj + -- random_urdfs/084/084.mtl + -- random_urdfs/083/083.urdf + -- random_urdfs/083/083.obj + -- random_urdfs/083/083.mtl + -- random_urdfs/082/082.urdf + -- random_urdfs/082/082.obj + -- random_urdfs/082/082.mtl + -- random_urdfs/081/081.urdf + -- random_urdfs/081/081.obj + -- random_urdfs/081/081.mtl + -- random_urdfs/080/080.urdf + -- random_urdfs/080/080.obj + -- random_urdfs/080/080.mtl + -- random_urdfs/079/079.urdf + -- random_urdfs/079/079.obj + -- random_urdfs/079/079.mtl + -- random_urdfs/078/078.urdf + -- random_urdfs/078/078.obj + -- random_urdfs/078/078.mtl + -- random_urdfs/077/077.urdf + -- random_urdfs/077/077.obj + -- random_urdfs/077/077.mtl + -- random_urdfs/076/076.urdf + -- random_urdfs/076/076.obj + -- random_urdfs/076/076.mtl + -- random_urdfs/075/075.urdf + -- random_urdfs/075/075.obj + -- random_urdfs/075/075.mtl + -- random_urdfs/074/074.urdf + -- random_urdfs/074/074.obj + -- random_urdfs/074/074.mtl + -- random_urdfs/073/073.urdf + -- random_urdfs/073/073.obj + -- random_urdfs/073/073.mtl + -- random_urdfs/072/072.urdf + -- random_urdfs/072/072.obj + -- random_urdfs/072/072.mtl + -- random_urdfs/071/071.urdf + -- random_urdfs/071/071.obj + -- random_urdfs/071/071.mtl + -- random_urdfs/070/070.urdf + -- random_urdfs/070/070.obj + -- random_urdfs/070/070.mtl + -- random_urdfs/069/069.urdf + -- random_urdfs/069/069.obj + -- random_urdfs/069/069.mtl + -- random_urdfs/068/068.urdf + -- random_urdfs/068/068.obj + -- random_urdfs/068/068.mtl + -- random_urdfs/067/067.urdf + -- random_urdfs/067/067.obj + -- random_urdfs/067/067.mtl + -- random_urdfs/066/066.urdf + -- random_urdfs/066/066.obj + -- random_urdfs/066/066.mtl + -- random_urdfs/065/065.urdf + -- random_urdfs/065/065.obj + -- random_urdfs/065/065.mtl + -- random_urdfs/064/064.urdf + -- random_urdfs/064/064.obj + -- random_urdfs/064/064.mtl + -- random_urdfs/063/063.urdf + -- random_urdfs/063/063.obj + -- random_urdfs/063/063.mtl + -- random_urdfs/062/062.urdf + -- random_urdfs/062/062.obj + -- random_urdfs/062/062.mtl + -- random_urdfs/061/061.urdf + -- random_urdfs/061/061.obj + -- random_urdfs/061/061.mtl + -- random_urdfs/060/060.urdf + -- random_urdfs/060/060.obj + -- random_urdfs/060/060.mtl + -- random_urdfs/059/059.urdf + -- random_urdfs/059/059.obj + -- random_urdfs/059/059.mtl + -- random_urdfs/058/058.urdf + -- random_urdfs/058/058.obj + -- random_urdfs/058/058.mtl + -- random_urdfs/057/057.urdf + -- random_urdfs/057/057.obj + -- random_urdfs/057/057.mtl + -- random_urdfs/056/056.urdf + -- random_urdfs/056/056.obj + -- random_urdfs/056/056.mtl + -- random_urdfs/055/055.urdf + -- random_urdfs/055/055.obj + -- random_urdfs/055/055.mtl + -- random_urdfs/054/054.urdf + -- random_urdfs/054/054.obj + -- random_urdfs/054/054.mtl + -- random_urdfs/053/053.urdf + -- random_urdfs/053/053.obj + -- random_urdfs/053/053.mtl + -- random_urdfs/052/052.urdf + -- random_urdfs/052/052.obj + -- random_urdfs/052/052.mtl + -- random_urdfs/051/051.urdf + -- random_urdfs/051/051.obj + -- random_urdfs/051/051.mtl + -- random_urdfs/050/050.urdf + -- random_urdfs/050/050.obj + -- random_urdfs/050/050.mtl + -- random_urdfs/049/049.urdf + -- random_urdfs/049/049.obj + -- random_urdfs/049/049.mtl + -- random_urdfs/048/048.urdf + -- random_urdfs/048/048.obj + -- random_urdfs/048/048.mtl + -- random_urdfs/047/047.urdf + -- random_urdfs/047/047.obj + -- random_urdfs/047/047.mtl + -- random_urdfs/046/046.urdf + -- random_urdfs/046/046.obj + -- random_urdfs/046/046.mtl + -- random_urdfs/045/045.urdf + -- random_urdfs/045/045.obj + -- random_urdfs/045/045.mtl + -- random_urdfs/044/044.urdf + -- random_urdfs/044/044.obj + -- random_urdfs/044/044.mtl + -- random_urdfs/043/043.urdf + -- random_urdfs/043/043.obj + -- random_urdfs/043/043.mtl + -- random_urdfs/042/042.urdf + -- random_urdfs/042/042.obj + -- random_urdfs/042/042.mtl + -- random_urdfs/041/041.urdf + -- random_urdfs/041/041.obj + -- random_urdfs/041/041.mtl + -- random_urdfs/040/040.urdf + -- random_urdfs/040/040.obj + -- random_urdfs/040/040.mtl + -- random_urdfs/039/039.urdf + -- random_urdfs/039/039.obj + -- random_urdfs/039/039.mtl + -- random_urdfs/038/038.urdf + -- random_urdfs/038/038.obj + -- random_urdfs/038/038.mtl + -- random_urdfs/037/037.urdf + -- random_urdfs/037/037.obj + -- random_urdfs/037/037.mtl + -- random_urdfs/036/036.urdf + -- random_urdfs/036/036.obj + -- random_urdfs/036/036.mtl + -- random_urdfs/035/035.urdf + -- random_urdfs/035/035.obj + -- random_urdfs/035/035.mtl + -- random_urdfs/034/034.urdf + -- random_urdfs/034/034.obj + -- random_urdfs/034/034.mtl + -- random_urdfs/033/033.urdf + -- random_urdfs/033/033.obj + -- random_urdfs/033/033.mtl + -- random_urdfs/032/032.urdf + -- random_urdfs/032/032.obj + -- random_urdfs/032/032.mtl + -- random_urdfs/031/031.urdf + -- random_urdfs/031/031.obj + -- random_urdfs/031/031.mtl + -- random_urdfs/030/030.urdf + -- random_urdfs/030/030.obj + -- random_urdfs/030/030.mtl + -- random_urdfs/029/029.urdf + -- random_urdfs/029/029.obj + -- random_urdfs/029/029.mtl + -- random_urdfs/028/028.urdf + -- random_urdfs/028/028.obj + -- random_urdfs/028/028.mtl + -- random_urdfs/027/027.urdf + -- random_urdfs/027/027.obj + -- random_urdfs/027/027.mtl + -- random_urdfs/026/026.urdf + -- random_urdfs/026/026.obj + -- random_urdfs/026/026.mtl + -- random_urdfs/025/025.urdf + -- random_urdfs/025/025.obj + -- random_urdfs/025/025.mtl + -- random_urdfs/024/024.urdf + -- random_urdfs/024/024.obj + -- random_urdfs/024/024.mtl + -- random_urdfs/023/023.urdf + -- random_urdfs/023/023.obj + -- random_urdfs/023/023.mtl + -- random_urdfs/022/022.urdf + -- random_urdfs/022/022.obj + -- random_urdfs/022/022.mtl + -- random_urdfs/021/021.urdf + -- random_urdfs/021/021.obj + -- random_urdfs/021/021.mtl + -- random_urdfs/020/020.urdf + -- random_urdfs/020/020.obj + -- random_urdfs/020/020.mtl + -- random_urdfs/019/019.urdf + -- random_urdfs/019/019.obj + -- random_urdfs/019/019.mtl + -- random_urdfs/018/018.urdf + -- random_urdfs/018/018.obj + -- random_urdfs/018/018.mtl + -- random_urdfs/017/017.urdf + -- random_urdfs/017/017.obj + -- random_urdfs/017/017.mtl + -- random_urdfs/016/016.urdf + -- random_urdfs/016/016.obj + -- random_urdfs/016/016.mtl + -- random_urdfs/015/015.urdf + -- random_urdfs/015/015.obj + -- random_urdfs/015/015.mtl + -- random_urdfs/014/014.urdf + -- random_urdfs/014/014.obj + -- random_urdfs/014/014.mtl + -- random_urdfs/013/013.urdf + -- random_urdfs/013/013.obj + -- random_urdfs/013/013.mtl + -- random_urdfs/012/012.urdf + -- random_urdfs/012/012.obj + -- random_urdfs/012/012.mtl + -- random_urdfs/011/011.urdf + -- random_urdfs/011/011.obj + -- random_urdfs/011/011.mtl + -- random_urdfs/010/010.urdf + -- random_urdfs/010/010.obj + -- random_urdfs/010/010.mtl + -- random_urdfs/009/009.urdf + -- random_urdfs/009/009.obj + -- random_urdfs/009/009.mtl + -- random_urdfs/008/008.urdf + -- random_urdfs/008/008.obj + -- random_urdfs/008/008.mtl + -- random_urdfs/007/007.urdf + -- random_urdfs/007/007.obj + -- random_urdfs/007/007.mtl + -- random_urdfs/006/006.urdf + -- random_urdfs/006/006.obj + -- random_urdfs/006/006.mtl + -- random_urdfs/005/005.urdf + -- random_urdfs/005/005.obj + -- random_urdfs/005/005.mtl + -- random_urdfs/004/004.urdf + -- random_urdfs/004/004.obj + -- random_urdfs/004/004.mtl + -- random_urdfs/003/003.urdf + -- random_urdfs/003/003.obj + -- random_urdfs/003/003.mtl + -- random_urdfs/002/002.urdf + -- random_urdfs/002/002.obj + -- random_urdfs/002/002.mtl + -- random_urdfs/001/001.urdf + -- random_urdfs/001/001.obj + -- random_urdfs/001/001.mtl + -- random_urdfs/000/000.urdf + -- random_urdfs/000/000.obj + -- random_urdfs/000/000.mtl + -- racecar/racecar_differential.urdf + -- racecar/racecar.urdf + -- racecar/meshes/wheel.jpg + -- racecar/meshes/walker_racecourse.dae + -- racecar/meshes/right_steering_hinge.dae + -- racecar/meshes/right_steering_hinge.STL + -- racecar/meshes/right_rear_wheel.obj + -- racecar/meshes/right_rear_wheel.mtl + -- racecar/meshes/right_rear_wheel.dae + -- racecar/meshes/right_rear_wheel.STL + -- racecar/meshes/right_front_wheel.obj + -- racecar/meshes/right_front_wheel.mtl + -- racecar/meshes/right_front_wheel.dae + -- racecar/meshes/right_front_wheel.STL + -- racecar/meshes/parking_1.dae + -- racecar/meshes/left_steering_hinge.dae + -- racecar/meshes/left_steering_hinge.STL + -- racecar/meshes/left_rear_wheel.obj + -- racecar/meshes/left_rear_wheel.mtl + -- racecar/meshes/left_rear_wheel.dae + -- racecar/meshes/left_rear_wheel.STL + -- racecar/meshes/left_front_wheel.obj + -- racecar/meshes/left_front_wheel.mtl + -- racecar/meshes/left_front_wheel.dae + -- racecar/meshes/left_front_wheel.STL + -- racecar/meshes/hokuyo.obj + -- racecar/meshes/hokuyo.mtl + -- racecar/meshes/hokuyo.dae + -- racecar/meshes/cone.obj + -- racecar/meshes/cone.mtl + -- racecar/meshes/cone.dae + -- racecar/meshes/checker_blue.png + -- racecar/meshes/chassis_differential.STL + -- racecar/meshes/chassis.dae + -- racecar/meshes/chassis.STL + -- quadruped/vision60.urdf + -- quadruped/tmotor3.obj + -- quadruped/tmotor3.mtl + -- quadruped/t-motor.jpg + -- quadruped/spirit40newer.urdf + -- quadruped/spirit40.urdf + -- quadruped/quadruped.urdf + -- quadruped/minitaur_v1.urdf + -- quadruped/minitaur_single_motor.urdf + -- quadruped/minitaur_rainbow_dash_v1.urdf + -- quadruped/minitaur_rainbow_dash.urdf + -- quadruped/minitaur_fixed_knees.urdf + -- quadruped/minitaur_fixed_all.urdf + -- quadruped/minitaur_derpy.urdf + -- quadruped/minitaur.urdf + -- quadruped/microtaur/xm430w210.stl + -- quadruped/microtaur/xavier.stl + -- quadruped/microtaur/toe_brake.stl + -- quadruped/microtaur/plate.stl + -- quadruped/microtaur/microtaur.urdf + -- quadruped/microtaur/fr13_s102_lowerscaled.stl + -- quadruped/microtaur/fr13_s102.stl + -- quadruped/microtaur/fr12_h103_lowres.stl + -- quadruped/microtaur/fr12_h101.stl + -- quadruped/microtaur/d435i.stl + -- quadruped/microtaur/channel_6inch.stl + -- quadruped/microtaur/channel_4inch.stl + -- quadruped/microtaur/channel.stl + -- policies/ppo/minitaur_trotting_env/model.ckpt-14000000.meta + -- policies/ppo/minitaur_trotting_env/model.ckpt-14000000.index + -- policies/ppo/minitaur_trotting_env/model.ckpt-14000000.data-00000-of-00001 + -- policies/ppo/minitaur_trotting_env/config.yaml + -- policies/ppo/minitaur_reactive_env/model.ckpt-14000000.meta + -- policies/ppo/minitaur_reactive_env/model.ckpt-14000000.index + -- policies/ppo/minitaur_reactive_env/model.ckpt-14000000.data-00000-of-00001 + -- policies/ppo/minitaur_reactive_env/config.yaml + -- objects/mug_col.obj + -- objects/mug.urdf + -- objects/mug.obj + -- mjcf/walker2d.xml + -- mjcf/thrower.xml + -- mjcf/swimmer.xml + -- mjcf/striker.xml + -- mjcf/reacher.xml + -- mjcf/pusher.xml + -- mjcf/inverted_pendulum.xml + -- mjcf/inverted_double_pendulum.xml + -- mjcf/humanoid_symmetric_no_ground.xml + -- mjcf/humanoid_symmetric.xml + -- mjcf/humanoid_fixed.xml + -- mjcf/humanoid.xml + -- mjcf/hopper.xml + -- mjcf/hello_mjcf.xml + -- mjcf/half_cheetah.xml + -- mjcf/ground_plane.xml + -- mjcf/ground.xml + -- mjcf/cylinder_fromtoZ.xml + -- mjcf/cylinder_fromtoY.xml + -- mjcf/cylinder_fromtoX.xml + -- mjcf/cylinder.xml + -- mjcf/capsule_fromtoZ.xml + -- mjcf/capsule_fromtoY.xml + -- mjcf/capsule_fromtoX.xml + -- mjcf/capsule.xml + -- mjcf/ant.xml + -- mini_cheetah/mini_cheetah.urdf + -- mini_cheetah/meshes/mini_upper_link.obj + -- mini_cheetah/meshes/mini_lower_link.obj + -- mini_cheetah/meshes/mini_body.obj + -- mini_cheetah/meshes/mini_abad.obj + -- lego/lego_vhacd.obj + -- lego/lego.urdf + -- lego/lego.obj + -- laikago/upper_leg_right_vhacd.obj + -- laikago/upper_leg_right.obj + -- laikago/upper_leg_right.mtl + -- laikago/upper_leg_mirror_lores.obj + -- laikago/upper_leg_mirror2_lores.obj + -- laikago/upper_leg_mirror2.obj + -- laikago/upper_leg_mirror2.mtl + -- laikago/upper_leg_mirror.stl + -- laikago/upper_leg_mirror.obj + -- laikago/upper_leg_mirror.mtl + -- laikago/upper_leg_left_vhacd.obj + -- laikago/upper_leg_left_lores.obj + -- laikago/upper_leg_left2_lores.obj + -- laikago/upper_leg_left2.obj + -- laikago/upper_leg_left2.mtl + -- laikago/upper_leg_left.obj + -- laikago/upper_leg_left.mtl + -- laikago/upper_leg.stl + -- laikago/lower_leg_3_collision.stl + -- laikago/lower_leg_3.stl + -- laikago/lower_leg3_lores.obj + -- laikago/lower_leg3.obj + -- laikago/lower_leg3.mtl + -- laikago/license.txt + -- laikago/laikago_toes_zup_lores.urdf + -- laikago/laikago_toes_zup.urdf + -- laikago/laikago_toes_limits.urdf + -- laikago/laikago_toes.urdf + -- laikago/laikago_tex.jpg + -- laikago/laikago.urdf + -- laikago/hip_motor_mirror_lores.obj + -- laikago/hip_motor_mirror.stl + -- laikago/hip_motor_mirror.obj + -- laikago/hip_motor_mirror.mtl + -- laikago/hip_motor_lores.obj + -- laikago/hip_motor.stl + -- laikago/hip_motor.obj + -- laikago/hip_motor.mtl + -- laikago/data1.txt + -- laikago/chassis_zup_lores.obj + -- laikago/chassis_zup.obj + -- laikago/chassis_zup.mtl + -- laikago/chassis_vhacd_mod_zup.obj + -- laikago/chassis_vhacd_mod_zup.mtl + -- laikago/chassis_vhacd_mod.obj + -- laikago/chassis_vhacd.obj + -- laikago/chassis_mod.obj + -- laikago/chassis_mod.mtl + -- laikago/chassis.stl + -- laikago/chassis.obj + -- laikago/chassis.mtl + -- kuka_iiwa/model_vr_limits.urdf + -- kuka_iiwa/model_free_base.urdf + -- kuka_iiwa/model_for_sdf.urdf + -- kuka_iiwa/model2.sdf + -- kuka_iiwa/model.urdf + -- kuka_iiwa/model.sdf + -- kuka_iiwa/kuka_world.sdf + -- kuka_iiwa/kuka_with_gripper2.sdf + -- kuka_iiwa/kuka_with_gripper.sdf + -- kuka_iiwa/meshes/link_7.stl + -- kuka_iiwa/meshes/link_7.obj + -- kuka_iiwa/meshes/link_7.mtl + -- kuka_iiwa/meshes/link_6.stl + -- kuka_iiwa/meshes/link_6.obj + -- kuka_iiwa/meshes/link_6.mtl + -- kuka_iiwa/meshes/link_5.stl + -- kuka_iiwa/meshes/link_5.obj + -- kuka_iiwa/meshes/link_5.mtl + -- kuka_iiwa/meshes/link_4.stl + -- kuka_iiwa/meshes/link_4.obj + -- kuka_iiwa/meshes/link_4.mtl + -- kuka_iiwa/meshes/link_3.stl + -- kuka_iiwa/meshes/link_3.obj + -- kuka_iiwa/meshes/link_3.mtl + -- kuka_iiwa/meshes/link_2.stl + -- kuka_iiwa/meshes/link_2.obj + -- kuka_iiwa/meshes/link_2.mtl + -- kuka_iiwa/meshes/link_1.stl + -- kuka_iiwa/meshes/link_1.obj + -- kuka_iiwa/meshes/link_1.mtl + -- kuka_iiwa/meshes/link_0.stl + -- kuka_iiwa/meshes/link_0.obj + -- kuka_iiwa/meshes/link_0.mtl + -- kuka_iiwa/meshes/finger_tip_right.stl + -- kuka_iiwa/meshes/finger_tip_left.stl + -- kuka_iiwa/meshes/finger_base_right.stl + -- kuka_iiwa/meshes/finger_base_left.stl + -- kiva_shelf/model.sdf + -- kiva_shelf/meshes/pod_lowres.stl + -- jenga/jenga.urdf + -- jenga/jenga.png + -- jenga/jenga.obj + -- jenga/jenga.mtl + -- husky/husky.urdf + -- husky/meshes/wheel.stl + -- husky/meshes/user_rail.stl + -- husky/meshes/top_plate.stl + -- husky/meshes/bumper.stl + -- husky/meshes/base_link.stl + -- humanoid/humanoid.urdf + -- heightmaps/wm_height_out.png + -- heightmaps/readme.txt + -- heightmaps/ground2.txt + -- heightmaps/ground1.txt + -- heightmaps/ground0.txt + -- heightmaps/gimp_overlay_out.png + -- heightmaps/Maze.png + -- heightmaps/Image8x4.png + -- gripper/wsg50_with_r2d2_gripper.sdf + -- gripper/wsg50_one_motor_gripper_right_finger.urdf + -- gripper/wsg50_one_motor_gripper_no_finger.sdf + -- gripper/wsg50_one_motor_gripper_new_free_base.sdf + -- gripper/wsg50_one_motor_gripper_new.sdf + -- gripper/wsg50_one_motor_gripper_left_finger.urdf + -- gripper/wsg50_one_motor_gripper_free_base.sdf + -- gripper/wsg50_one_motor_gripper.sdf + -- gripper/meshes/l_gripper_tip_scaled.stl + -- gripper/meshes/WSG50_110.stl + -- gripper/meshes/WSG-FMF.stl + -- gripper/meshes/GUIDE_WSG50_110.stl + -- franka_panda/panda.urdf + -- franka_panda/LICENSE.txt + -- franka_panda/meshes/visual/link6.obj + -- franka_panda/meshes/visual/link6.mtl + -- franka_panda/meshes/visual/link5.obj + -- franka_panda/meshes/visual/link5.mtl + -- franka_panda/meshes/visual/link4.obj + -- franka_panda/meshes/visual/link4.mtl + -- franka_panda/meshes/visual/link3.obj + -- franka_panda/meshes/visual/link3.mtl + -- franka_panda/meshes/visual/link2.obj + -- franka_panda/meshes/visual/link2.mtl + -- franka_panda/meshes/visual/link1.obj + -- franka_panda/meshes/visual/link1.mtl + -- franka_panda/meshes/visual/hand.obj + -- franka_panda/meshes/visual/hand.mtl + -- franka_panda/meshes/visual/finger.obj + -- franka_panda/meshes/visual/finger.mtl + -- franka_panda/meshes/visual/colors.png + -- franka_panda/meshes/collision/link7.obj + -- franka_panda/meshes/collision/link6.obj + -- franka_panda/meshes/collision/link6.mtl + -- franka_panda/meshes/collision/link5.obj + -- franka_panda/meshes/collision/link4.obj + -- franka_panda/meshes/collision/link3.obj + -- franka_panda/meshes/collision/link2.obj + -- franka_panda/meshes/collision/link1.obj + -- franka_panda/meshes/collision/link0.obj + -- franka_panda/meshes/collision/hand.obj + -- franka_panda/meshes/collision/finger.obj + -- domino/license.txt + -- domino/domino.urdf + -- domino/domino.obj + -- domino/domino.mtl + -- domino/domino.jpg + -- differential/modelorigin.txt + -- differential/diff_stand.stl + -- differential/diff_spider_shaft.stl + -- differential/diff_spider.stl + -- differential/diff_side.stl + -- differential/diff_ring.urdf + -- differential/diff_ring.stl + -- differential/diff_rightshaft.stl + -- differential/diff_pinion.stl + -- differential/diff_motor_cover.stl + -- differential/diff_leftshaft.stl + -- differential/diff_carrier_cover.stl + -- differential/diff_carrier.stl + -- differential/diff_arm.stl + -- data/policies/humanoid3d/humanoid3d_walk_COMenabled.ckpt.index + -- data/policies/humanoid3d/humanoid3d_walk_COMenabled.ckpt.data-00000-of-00001 + -- data/policies/humanoid3d/humanoid3d_walk.ckpt.index + -- data/policies/humanoid3d/humanoid3d_walk.ckpt.data-00000-of-00001 + -- data/policies/humanoid3d/humanoid3d_spinkick.ckpt.index + -- data/policies/humanoid3d/humanoid3d_spinkick.ckpt.data-00000-of-00001 + -- data/policies/humanoid3d/humanoid3d_jump.ckpt.index + -- data/policies/humanoid3d/humanoid3d_jump.ckpt.data-00000-of-00001 + -- data/policies/humanoid3d/humanoid3d_backflip.ckpt.index + -- data/policies/humanoid3d/humanoid3d_backflip.ckpt.data-00000-of-00001 + -- data/motions/laikago_walk.txt + -- data/motions/humanoid3d_walk.txt + -- data/motions/humanoid3d_spinkick.txt + -- data/motions/humanoid3d_spin.txt + -- data/motions/humanoid3d_run.txt + -- data/motions/humanoid3d_roll.txt + -- data/motions/humanoid3d_punch.txt + -- data/motions/humanoid3d_kick.txt + -- data/motions/humanoid3d_jump.txt + -- data/motions/humanoid3d_getup_faceup.txt + -- data/motions/humanoid3d_getup_facedown.txt + -- data/motions/humanoid3d_dance_b.txt + -- data/motions/humanoid3d_dance_a.txt + -- data/motions/humanoid3d_crawl.txt + -- data/motions/humanoid3d_cartwheel.txt + -- data/motions/humanoid3d_backflip.txt + -- data/motions/walker/turn_right1.txt + -- data/motions/walker/turn_right0.txt + -- data/motions/walker/turn_left1.txt + -- data/motions/walker/turn_left0.txt + -- data/motions/walker/0walk_forward.txt + -- data/agents/ct_agent_humanoid_ppo.txt + -- configs_v2/wrappers/pmtg_wrapper_simplified_env.gin + -- configs_v2/wrappers/pmtg_wrapper_laikago.gin + -- configs_v2/wrappers/pmtg_wrapper_dict.gin + -- configs_v2/wrappers/pmtg_wrapper.gin + -- configs_v2/tasks/fwd_task_no_termination_simplified.gin + -- configs_v2/tasks/fwd_task_no_termination.gin + -- configs_v2/tasks/fwd_task_laikago.gin + -- configs_v2/tasks/fwd_task.gin + -- configs_v2/scenes/stair_scene.gin + -- configs_v2/scenes/simple_scene.gin + -- configs_v2/robots/minitaur.gin + -- configs_v2/robots/mini_cheetah.gin + -- configs_v2/robots/laikago.gin + -- configs_v2/base/mini_cheetah_with_imu.gin + -- configs_v2/base/laikago_with_imu.gin + -- configs_v2/base/laikago_reactive.gin + -- configs/minitaur_gym_env.gin + -- configs/minitaur_gym_config.gin + -- configs/laikago_walk_static_gait.gin + -- configs/laikago_reactive.gin + -- configs/laikago_mpc_two_camera_random_stepstone.gin + -- configs/laikago_mpc_stepstone.gin + -- configs/laikago_mpc_example_flat.gin + -- configs/laikago_gym_env.gin + -- configs/laikago_gym_config.gin + -- biped/biped2d_pybullet.urdf + -- bicycle/bike.urdf + -- bicycle/LICENSE.txt + -- bicycle/files/wheel_scaled.stl + -- bicycle/files/wheel_axels.stl + -- bicycle/files/handlebar_scaled.stl + -- bicycle/files/frame_scaled_right.stl + -- bicycle/files/frame_scaled_left.stl + -- bicycle/files/frame_scaled.stl + -- bicycle/files/bike_rack.stl + -- bicycle/files/all_pedal_parts.stl + -- args/train_humanoid3d_walker_args.txt + -- args/train_humanoid3d_walk_args.txt + -- args/train_humanoid3d_spinkick_args.txt + -- args/train_humanoid3d_spin_args.txt + -- args/train_humanoid3d_run_args.txt + -- args/train_humanoid3d_roll_args.txt + -- args/train_humanoid3d_punch_args.txt + -- args/train_humanoid3d_kick_args.txt + -- args/train_humanoid3d_jump_args.txt + -- args/train_humanoid3d_getup_faceup_args.txt + -- args/train_humanoid3d_getup_facedown_args.txt + -- args/train_humanoid3d_dance_b_args.txt + -- args/train_humanoid3d_dance_a_args.txt + -- args/train_humanoid3d_crawl_args.txt + -- args/train_humanoid3d_cartwheel_args.txt + -- args/train_humanoid3d_backflip_args.txt + -- args/run_humanoid3d_walker_args.txt + -- args/run_humanoid3d_walk_args.txt + -- args/run_humanoid3d_spinkick_args.txt + -- args/run_humanoid3d_spin_args.txt + -- args/run_humanoid3d_run_args.txt + -- args/run_humanoid3d_roll_args.txt + -- args/run_humanoid3d_punch_args.txt + -- args/run_humanoid3d_kick_args.txt + -- args/run_humanoid3d_jump_args.txt + -- args/run_humanoid3d_getup_faceup_args.txt + -- args/run_humanoid3d_getup_facedown_args.txt + -- args/run_humanoid3d_dance_b_args.txt + -- args/run_humanoid3d_dance_a_args.txt + -- args/run_humanoid3d_crawl_args.txt + -- args/run_humanoid3d_cartwheel_args.txt + -- args/run_humanoid3d_backflip_args.txt + -- args/kin_char_args.txt + -- aliengo/aliengo.urdf + -- aliengo/meshes/trunk.obj + -- aliengo/meshes/trunk.mtl + -- aliengo/meshes/thigh_mirror.obj + -- aliengo/meshes/thigh_mirror.mtl + -- aliengo/meshes/thigh.obj + -- aliengo/meshes/thigh.mtl + -- aliengo/meshes/hip.obj + -- aliengo/meshes/hip.mtl + -- aliengo/meshes/calf.obj + -- aliengo/meshes/calf.mtl + -- aliengo/meshes/aliengo.png + -- a1/a1.urdf + -- a1/meshes/trunk_A1.png + -- a1/meshes/trunk.obj + -- a1/meshes/trunk.mtl + -- a1/meshes/thigh_mirror.obj + -- a1/meshes/thigh_mirror.mtl + -- a1/meshes/thigh.obj + -- a1/meshes/thigh.mtl + -- a1/meshes/hip.obj + -- a1/meshes/hip.mtl + -- a1/meshes/calf.obj + -- a1/meshes/calf.mtl + packages + ['pybullet_utils', 'pybullet_robots', 'pybullet_examples', 'pybullet_envs', 'pybullet_data', 'pybullet_utils.examples', 'pybullet_robots.xarm', 'pybullet_robots.panda', 'pybullet_robots.laikago', 'pybullet_envs.stable_baselines', 'pybullet_envs.prediction', 'pybullet_envs.minitaur', 'pybullet_envs.examples', 'pybullet_envs.deep_mimic', 'pybullet_envs.bullet', 'pybullet_envs.baselines', 'pybullet_envs.agents', 'pybullet_envs.minitaur.vision', 'pybullet_envs.minitaur.robots', 'pybullet_envs.minitaur.envs_v2', 'pybullet_envs.minitaur.envs', 'pybullet_envs.minitaur.agents', 'pybullet_envs.minitaur.actuatornet', 'pybullet_envs.minitaur.robots.utilities', 'pybullet_envs.minitaur.robots.safety', 'pybullet_envs.minitaur.robots.safety.python', 'pybullet_envs.minitaur.envs_v2.utilities', 'pybullet_envs.minitaur.envs_v2.tasks', 'pybullet_envs.minitaur.envs_v2.sensors', 'pybullet_envs.minitaur.envs_v2.scenes', 'pybullet_envs.minitaur.envs_v2.examples', 'pybullet_envs.minitaur.envs_v2.evaluation', 'pybullet_envs.minitaur.envs_v2.env_wrappers', 'pybullet_envs.minitaur.envs.env_randomizers', 'pybullet_envs.minitaur.agents.trajectory_generator', 'pybullet_envs.minitaur.agents.tools', 'pybullet_envs.minitaur.agents.scripts', 'pybullet_envs.minitaur.agents.ppo', 'pybullet_envs.minitaur.agents.baseline_controller', 'pybullet_envs.deep_mimic.learning', 'pybullet_envs.deep_mimic.gym_env', 'pybullet_envs.deep_mimic.env', 'pybullet_envs.deep_mimic.learning.solvers', 'pybullet_envs.deep_mimic.learning.nets', 'pybullet_envs.agents.tools', 'pybullet_envs.agents.ppo', 'pybullet_data.testdata', 'pybullet_data.policies', 'pybullet_data.configs_v2', 'pybullet_data.configs', 'pybullet_data.testdata.test_imu_state_estimator', 'pybullet_data.policies.ppo', 'pybullet_data.policies.ppo.minitaur_trotting_env', 'pybullet_data.policies.ppo.minitaur_reactive_env', 'pybullet_data.configs_v2.wrappers', 'pybullet_data.configs_v2.tasks', 'pybullet_data.configs_v2.scenes', 'pybullet_data.configs_v2.robots', 'pybullet_data.configs_v2.base'] + ----- + error: command 'g++' failed: No such file or directory + [end of output] + + note: This error originates from a subprocess, and is likely not a problem with pip. + ERROR: Failed building wheel for pybullet +Failed to build pybullet +ERROR: Failed to build installable wheels for some pyproject.toml based projects (pybullet) diff --git a/pygame_log.txt b/pygame_log.txt new file mode 100644 index 0000000000000000000000000000000000000000..5085203d03e4edf056cd38a4bce44ede61eb5a55 --- /dev/null +++ b/pygame_log.txt @@ -0,0 +1,3 @@ +Defaulting to user installation because normal site-packages is not writeable +ERROR: Could not find a version that satisfies the requirement pygame (from versions: none) +ERROR: No matching distribution found for pygame diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..86ef75a26e471ce6572d0dcdfaf35471bef22d49 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,13 @@ +torch>=2.0.0 +gymnasium>=0.29.0 +pygame>=2.5.0 +numpy>=1.24.0 +stable-baselines3>=2.0.0 +matplotlib>=3.7.0 +tensorboard>=2.14.0 +tqdm>=4.65.0 +rich>=13.0.0 + +PyFlyt>=0.3.0 +opensimplex>=0.4.4 +ncps>=0.0.7 diff --git a/run_demo.sh b/run_demo.sh new file mode 100755 index 0000000000000000000000000000000000000000..96050122a5c57ae00fc0418083ef497773c3d6ec --- /dev/null +++ b/run_demo.sh @@ -0,0 +1,9 @@ +#!/bin/bash +set -e + +echo "=== Project Neuro-Flyt 3D Setup ===" +echo "Installing dependencies..." +pip install -r requirements.txt + +echo "=== Launching Demo ===" +python demo_3d.py diff --git a/setup.sh b/setup.sh new file mode 100755 index 0000000000000000000000000000000000000000..f4baf191e14750281a41566c445488ddb1c0824c --- /dev/null +++ b/setup.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# Setup script for Drone RL project + +echo "Setting up Drone RL project..." +echo "" + +# Check Python version +PYTHON_CMD="python3.10" +if ! command -v $PYTHON_CMD &> /dev/null; then + PYTHON_CMD="python3.11" +fi + +if ! command -v $PYTHON_CMD &> /dev/null; then + echo "Error: Python 3.10+ not found. Please install Python 3.10 or higher." + exit 1 +fi + +echo "Using: $($PYTHON_CMD --version)" +echo "" + +# Create virtual environment if it doesn't exist +if [ ! -d "venv" ]; then + echo "Creating virtual environment..." + $PYTHON_CMD -m venv venv +fi + +# Activate virtual environment +echo "Activating virtual environment..." +source venv/bin/activate + +# Upgrade pip +echo "Upgrading pip..." +pip install --upgrade pip + +# Install requirements +echo "Installing requirements..." +pip install -r requirements.txt + +echo "" +echo "Setup complete! To activate the environment, run:" +echo " source venv/bin/activate" +echo "" +echo "To test the setup, run:" +echo " python main.py" + diff --git a/test_log.txt b/test_log.txt new file mode 100644 index 0000000000000000000000000000000000000000..0ffcbab693af9ebfc14abfa4e925e9e22e5b66b6 --- /dev/null +++ b/test_log.txt @@ -0,0 +1,14 @@ +Testing Wind Physics... +Traceback (most recent call last): + File "/home/ylop/Documents/drone go brr/Drone-go-brrrrr/Drone-go-brrrrr/test_physics.py", line 41, in + test_wind_physics() + ~~~~~~~~~~~~~~~~~^^ + File "/home/ylop/Documents/drone go brr/Drone-go-brrrrr/Drone-go-brrrrr/test_physics.py", line 11, in test_wind_physics + obs, _, _, _, info = env.step(np.zeros(4)) # Hover action (approx) + ~~~~~~~~^^^^^^^^^^^^^ + File "/home/ylop/Documents/drone go brr/Drone-go-brrrrr/Drone-go-brrrrr/env/drone_3d.py", line 66, in step + raw_wind = self.wind_field.get_wind(pos[0], pos[1], pos[2], self.dt) + File "/home/ylop/Documents/drone go brr/Drone-go-brrrrr/Drone-go-brrrrr/env/drone_3d.py", line 27, in get_wind + u = self.noise.noise4d(x * self.scale, y * self.scale, z * self.scale, self.time_offset) + ^^^^^^^^^^^^^^^^^^ +AttributeError: 'OpenSimplex' object has no attribute 'noise4d'. Did you mean: 'noise4'? diff --git a/test_physics.py b/test_physics.py new file mode 100644 index 0000000000000000000000000000000000000000..a7c32242e8ebea6e3e14d5dbf39f398d55aabd13 --- /dev/null +++ b/test_physics.py @@ -0,0 +1,43 @@ +import numpy as np +import time +from env.drone_3d import Drone3DEnv + +def test_wind_physics(): + print("Testing Wind Physics...") + env = Drone3DEnv(render_mode=None, wind_scale=10.0, wind_speed=5.0) + env.reset() + + # 1. Test Non-Zero Wind + obs, _, _, _, info = env.step(np.zeros(4)) # Hover action (approx) + wind_0 = info.get("wind", np.zeros(3)) + target_0 = info.get("target", np.zeros(3)) + print(f"Initial Wind Vector: {wind_0}") + print(f"Target Location: {target_0}") + + if np.linalg.norm(wind_0) == 0: + print("WARNING: Wind vector is zero. Check noise generation.") + else: + print("SUCCESS: Wind vector is non-zero.") + + # 2. Test Temporal Variation + print("Stepping environment to test temporal variation...") + winds = [] + for _ in range(10): + _, _, _, _, info = env.step(np.zeros(4)) + winds.append(info["wind"]) + + winds = np.array(winds) + # Check if wind changes + diffs = np.diff(winds, axis=0) + mean_diff = np.mean(np.abs(diffs)) + print(f"Mean frame-to-frame wind change: {mean_diff:.4f}") + + if mean_diff > 0: + print("SUCCESS: Wind varies over time.") + else: + print("FAILURE: Wind is static.") + + print("Physics Test Complete.") + +if __name__ == "__main__": + test_wind_physics() diff --git a/test_random_1.txt b/test_random_1.txt new file mode 100644 index 0000000000000000000000000000000000000000..12c81703c11b82a7b4784e9ea08e8273525868f9 --- /dev/null +++ b/test_random_1.txt @@ -0,0 +1,8 @@ +Testing Wind Physics... +Initial Wind Vector: [ 2.32584927 -5.50170588 4.15986258] +Target Location: [-0.26455097 1.92920148 12.09442991] +SUCCESS: Wind vector is non-zero. +Stepping environment to test temporal variation... +Mean frame-to-frame wind change: 1.1686 +SUCCESS: Wind varies over time. +Physics Test Complete. diff --git a/test_random_2.txt b/test_random_2.txt new file mode 100644 index 0000000000000000000000000000000000000000..a8e7a423a987547b4c7338eb7443f0c2b1eee2b4 --- /dev/null +++ b/test_random_2.txt @@ -0,0 +1,8 @@ +Testing Wind Physics... +Initial Wind Vector: [2.32121281 1.08356691 0.06257384] +Target Location: [ 1.08129528 4.75833083 13.20958488] +SUCCESS: Wind vector is non-zero. +Stepping environment to test temporal variation... +Mean frame-to-frame wind change: 1.0202 +SUCCESS: Wind varies over time. +Physics Test Complete. diff --git a/test_result_final.txt b/test_result_final.txt new file mode 100644 index 0000000000000000000000000000000000000000..87758306a52c6e20293131d06b768995e62fb468 --- /dev/null +++ b/test_result_final.txt @@ -0,0 +1,7 @@ +Testing Wind Physics... +Initial Wind Vector: [ 1.25934332 -0.34450611 4.63735668] +SUCCESS: Wind vector is non-zero. +Stepping environment to test temporal variation... +Mean frame-to-frame wind change: 1.0813 +SUCCESS: Wind varies over time. +Physics Test Complete. diff --git a/test_success.txt b/test_success.txt new file mode 100644 index 0000000000000000000000000000000000000000..87758306a52c6e20293131d06b768995e62fb468 --- /dev/null +++ b/test_success.txt @@ -0,0 +1,7 @@ +Testing Wind Physics... +Initial Wind Vector: [ 1.25934332 -0.34450611 4.63735668] +SUCCESS: Wind vector is non-zero. +Stepping environment to test temporal variation... +Mean frame-to-frame wind change: 1.0813 +SUCCESS: Wind varies over time. +Physics Test Complete. diff --git a/train.py b/train.py new file mode 100644 index 0000000000000000000000000000000000000000..0c54e86403e9c0aa7d1bbaf4cb502a2f558224b7 --- /dev/null +++ b/train.py @@ -0,0 +1,35 @@ +import os +import gymnasium as gym +from stable_baselines3 import PPO +from stable_baselines3.common.callbacks import CheckpointCallback +from env.drone_3d import Drone3DEnv +from models.liquid_ppo import make_liquid_ppo + +def train(): + print("Setting up Training Environment...") + # Create environment + # We use a lower wind scale for training initially to help it learn + env = Drone3DEnv(render_mode=None, wind_scale=2.0, wind_speed=1.0) + + print("Creating Liquid PPO Agent...") + model = make_liquid_ppo(env, verbose=1) + + # Create checkpoints directory + os.makedirs("checkpoints", exist_ok=True) + checkpoint_callback = CheckpointCallback( + save_freq=10000, + save_path="./checkpoints/", + name_prefix="liquid_ppo_drone" + ) + + print("Starting Training (This may take a while)...") + # Training for 500,000 steps (500 episodes) as requested for proper convergence + total_timesteps = 500000 + model.learn(total_timesteps=total_timesteps, callback=checkpoint_callback) + + print("Training Complete.") + model.save("liquid_ppo_drone_final") + print("Model saved to 'liquid_ppo_drone_final.zip'") + +if __name__ == "__main__": + train() diff --git a/train/__init__.py b/train/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..382bc8b6108e4d15848cbf03215af6e264ff6f82 --- /dev/null +++ b/train/__init__.py @@ -0,0 +1,2 @@ +"""Training scripts and utilities.""" + diff --git a/train/train_liquid_ppo.py b/train/train_liquid_ppo.py new file mode 100644 index 0000000000000000000000000000000000000000..279df60181f3b542fb3a9cc95ef81ad394c8a6aa --- /dev/null +++ b/train/train_liquid_ppo.py @@ -0,0 +1,209 @@ +""" +Train a PPO agent with Liquid Neural Network policy on the DroneWindEnv environment. + +This script uses stable-baselines3 PPO with a Liquid Neural Network feature extractor +to train an agent to survive and navigate in the 2D drone environment with wind. +The trained model is saved to models/liquid_policy.zip and TensorBoard logs +are written to logs/ppo_liquid/. +""" + +import os +import sys +import argparse +from typing import Optional +import gymnasium as gym +from stable_baselines3 import PPO +from stable_baselines3.common.vec_env import DummyVecEnv +from stable_baselines3.common.monitor import Monitor + +# Add project root to path +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from env.drone_env import DroneWindEnv +from models.liquid_policy import LiquidFeatureExtractor + + +def make_env(seed: Optional[int] = None) -> gym.Env: + """ + Create and wrap a DroneWindEnv instance with Monitor. + + Args: + seed: Optional random seed for the environment + + Returns: + Wrapped Gymnasium environment + """ + env = DroneWindEnv() + env = Monitor(env) + if seed is not None: + env.reset(seed=seed) + return env + + +def make_vec_env(num_envs: int = 4) -> DummyVecEnv: + """ + Create a vectorized environment with multiple parallel instances. + + Args: + num_envs: Number of parallel environments + + Returns: + Vectorized environment + """ + def make_vec_env_fn(seed: Optional[int] = None): + def _init(): + return make_env(seed) + return _init + + vec_env = DummyVecEnv([make_vec_env_fn(seed=i) for i in range(num_envs)]) + return vec_env + + +def main(): + """Main training function.""" + parser = argparse.ArgumentParser(description="Train PPO agent with Liquid NN on DroneWindEnv") + parser.add_argument( + "--timesteps", + type=int, + default=100_000, + help="Total number of training timesteps (default: 100000)" + ) + parser.add_argument( + "--seed", + type=int, + default=0, + help="Random seed (default: 0)" + ) + parser.add_argument( + "--logdir", + type=str, + default="logs/ppo_liquid", + help="Directory for TensorBoard logs (default: logs/ppo_liquid)" + ) + parser.add_argument( + "--model-path", + type=str, + default="models/liquid_policy.zip", + help="Path to save the trained model (default: models/liquid_policy.zip)" + ) + parser.add_argument( + "--num-envs", + type=int, + default=4, + help="Number of parallel environments (default: 4)" + ) + parser.add_argument( + "--hidden-size", + type=int, + default=32, + help="Hidden size for liquid cell (default: 32)" + ) + parser.add_argument( + "--dt", + type=float, + default=0.1, + help="Time step for liquid cell (default: 0.1)" + ) + + args = parser.parse_args() + + # Create directories if they don't exist + os.makedirs(os.path.dirname(args.model_path), exist_ok=True) + os.makedirs(args.logdir, exist_ok=True) + + print("=" * 60) + print("Training PPO Agent with Liquid NN on DroneWindEnv") + print("=" * 60) + print(f"Total timesteps: {args.timesteps:,}") + print(f"Number of parallel environments: {args.num_envs}") + print(f"Liquid cell hidden size: {args.hidden_size}") + print(f"Liquid cell dt: {args.dt}") + print(f"Model will be saved to: {args.model_path}") + print(f"TensorBoard logs: {args.logdir}") + print("=" * 60) + + # Create vectorized environment + print("Creating vectorized environment...") + vec_env = make_vec_env(num_envs=args.num_envs) + + # Get observation space for feature extractor + obs_space = vec_env.observation_space + + # Configure policy with liquid feature extractor + policy_kwargs = dict( + features_extractor_class=LiquidFeatureExtractor, + features_extractor_kwargs=dict( + features_dim=args.hidden_size, + hidden_size=args.hidden_size, + dt=args.dt, + ), + net_arch=dict(pi=[64], vf=[64]), # Policy and value heads with 64 hidden units + ) + + # Create PPO agent + print("Initializing PPO agent with Liquid NN...") + model = PPO( + policy="MlpPolicy", + env=vec_env, + policy_kwargs=policy_kwargs, + n_steps=1024, + batch_size=64, + gamma=0.99, + learning_rate=3e-4, + gae_lambda=0.95, + clip_range=0.2, + ent_coef=0.01, + verbose=1, + tensorboard_log=args.logdir, + seed=args.seed, + ) + + # Training with curriculum (commented out for now - use fixed mild wind) + # For curriculum learning, you could do: + # + # # Phase 1: Mild wind (0-30k steps) + # if args.timesteps > 30000: + # print("Training phase 1: Mild wind (0-30k steps)...") + # model.learn(total_timesteps=30000, progress_bar=True) + # + # # Phase 2: Medium wind (30k-60k steps) + # if args.timesteps > 60000: + # print("Training phase 2: Medium wind (30k-60k steps)...") + # # Would need to recreate env with difficulty=1 + # model.learn(total_timesteps=30000, progress_bar=True, reset_num_timesteps=False) + # + # # Phase 3: Strong wind (60k+ steps) + # if args.timesteps > 60000: + # print("Training phase 3: Strong wind (60k+ steps)...") + # # Would need to recreate env with difficulty=2 + # model.learn(total_timesteps=args.timesteps - 60000, progress_bar=True, reset_num_timesteps=False) + # else: + # model.learn(total_timesteps=args.timesteps - 30000, progress_bar=True, reset_num_timesteps=False) + # else: + # model.learn(total_timesteps=args.timesteps, progress_bar=True) + + # For now, train on fixed mild wind + print("\nStarting training...") + model.learn( + total_timesteps=args.timesteps, + progress_bar=True + ) + + # Save the model + print(f"\nSaving model to {args.model_path}...") + model.save(args.model_path) + + print("\n" + "=" * 60) + print("Training completed successfully!") + print(f"Model saved to: {args.model_path}") + print(f"TensorBoard logs available at: {args.logdir}") + print("=" * 60) + print("\nTo view training progress, run:") + print(f" tensorboard --logdir {args.logdir}") + print("\nTo evaluate the model, run:") + print(f" python eval/eval_liquid_policy.py --model-path {args.model_path}") + + +if __name__ == "__main__": + main() + diff --git a/train/train_mlp_ppo.py b/train/train_mlp_ppo.py new file mode 100644 index 0000000000000000000000000000000000000000..3be8929ed50dab77557419f342261d52f582054f --- /dev/null +++ b/train/train_mlp_ppo.py @@ -0,0 +1,159 @@ +""" +Train a PPO agent with MLP policy on the DroneWindEnv environment. + +This script uses stable-baselines3 PPO with a 2-layer MLP (64, 64) to train +an agent to survive and navigate in the 2D drone environment with wind. +The trained model is saved to models/mlp_baseline.zip and TensorBoard logs +are written to logs/ppo_mlp/. +""" + +import os +import sys +import argparse +from typing import Optional +import gymnasium as gym +from stable_baselines3 import PPO +from stable_baselines3.common.vec_env import DummyVecEnv +from stable_baselines3.common.monitor import Monitor + +# Add project root to path +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from env.drone_env import DroneWindEnv + + +def make_env(seed: Optional[int] = None) -> gym.Env: + """ + Create and wrap a DroneWindEnv instance with Monitor. + + Args: + seed: Optional random seed for the environment + + Returns: + Wrapped Gymnasium environment + """ + env = DroneWindEnv() + env = Monitor(env) + if seed is not None: + env.reset(seed=seed) + return env + + +def make_vec_env(num_envs: int = 4) -> DummyVecEnv: + """ + Create a vectorized environment with multiple parallel instances. + + Args: + num_envs: Number of parallel environments + + Returns: + Vectorized environment + """ + def make_vec_env_fn(seed: Optional[int] = None): + def _init(): + return make_env(seed) + return _init + + vec_env = DummyVecEnv([make_vec_env_fn(seed=i) for i in range(num_envs)]) + return vec_env + + +def main(): + """Main training function.""" + parser = argparse.ArgumentParser(description="Train PPO agent on DroneWindEnv") + parser.add_argument( + "--timesteps", + type=int, + default=100_000, + help="Total number of training timesteps (default: 100000)" + ) + parser.add_argument( + "--seed", + type=int, + default=0, + help="Random seed (default: 0)" + ) + parser.add_argument( + "--logdir", + type=str, + default="logs/ppo_mlp", + help="Directory for TensorBoard logs (default: logs/ppo_mlp)" + ) + parser.add_argument( + "--model-path", + type=str, + default="models/mlp_baseline.zip", + help="Path to save the trained model (default: models/mlp_baseline.zip)" + ) + parser.add_argument( + "--num-envs", + type=int, + default=4, + help="Number of parallel environments (default: 4)" + ) + + args = parser.parse_args() + + # Create directories if they don't exist + os.makedirs(os.path.dirname(args.model_path), exist_ok=True) + os.makedirs(args.logdir, exist_ok=True) + + print("=" * 60) + print("Training PPO Agent on DroneWindEnv") + print("=" * 60) + print(f"Total timesteps: {args.timesteps:,}") + print(f"Number of parallel environments: {args.num_envs}") + print(f"Model will be saved to: {args.model_path}") + print(f"TensorBoard logs: {args.logdir}") + print("=" * 60) + + # Create vectorized environment + print("Creating vectorized environment...") + vec_env = make_vec_env(num_envs=args.num_envs) + + # Configure policy (2-layer MLP with 64 hidden units each) + policy_kwargs = dict(net_arch=[64, 64]) + + # Create PPO agent + print("Initializing PPO agent...") + model = PPO( + policy="MlpPolicy", + env=vec_env, + policy_kwargs=policy_kwargs, + n_steps=1024, + batch_size=64, + gamma=0.99, + learning_rate=3e-4, + gae_lambda=0.95, + clip_range=0.2, + ent_coef=0.0, + verbose=1, + tensorboard_log=args.logdir, + seed=args.seed, + ) + + # Train the agent + print("\nStarting training...") + model.learn( + total_timesteps=args.timesteps, + progress_bar=True + ) + + # Save the model + print(f"\nSaving model to {args.model_path}...") + model.save(args.model_path) + + print("\n" + "=" * 60) + print("Training completed successfully!") + print(f"Model saved to: {args.model_path}") + print(f"TensorBoard logs available at: {args.logdir}") + print("=" * 60) + print("\nTo view training progress, run:") + print(f" tensorboard --logdir {args.logdir}") + print("\nTo evaluate the model, run:") + print(f" python eval/eval_mlp_baseline.py --model-path {args.model_path}") + + +if __name__ == "__main__": + main() + diff --git a/train_hf.py b/train_hf.py new file mode 100644 index 0000000000000000000000000000000000000000..1dd1a0e3e51281c9fa6f53fe76f4da727bd3a6e6 --- /dev/null +++ b/train_hf.py @@ -0,0 +1,68 @@ +import os +import argparse +from huggingface_hub import HfApi, login +from stable_baselines3 import PPO +from stable_baselines3.common.callbacks import CheckpointCallback +from stable_baselines3.common.env_util import make_vec_env +from stable_baselines3.common.vec_env import SubprocVecEnv +from env.drone_3d import Drone3DEnv +from models.liquid_ppo import make_liquid_ppo, LTCFeatureExtractor + +def train_hf(repo_id, token, total_timesteps=500000): + print(f"Starting HF Training for Repo: {repo_id}") + + # Login to HF + if token: + login(token=token) + + # Create Optimized Model (Parallel Envs + A100 Tuning) + # Note: make_liquid_ppo now handles env creation internally for parallelism + model = make_liquid_ppo(None, verbose=1) + + # Checkpoint Callback + checkpoint_callback = CheckpointCallback( + save_freq=50000, + save_path='./checkpoints/', + name_prefix='liquid_ppo_drone' + ) + + print(f"Training for {total_timesteps} steps...") + model.learn(total_timesteps=total_timesteps, callback=checkpoint_callback) + + # Save Final Model + model_path = "liquid_ppo_drone_final.zip" + model.save(model_path) + print(f"Model saved to {model_path}") + + # Push to Hub + print("Pushing to Hugging Face Hub...") + api = HfApi() + + try: + # Create repo if it doesn't exist + api.create_repo(repo_id=repo_id, exist_ok=True) + + # Upload Model + api.upload_file( + path_or_fileobj=model_path, + path_in_repo="liquid_ppo_drone_final.zip", + repo_id=repo_id, + repo_type="model" + ) + print("Upload Complete!") + + except Exception as e: + print(f"Error uploading to Hub: {e}") + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--repo_id", type=str, required=True, help="HF Repo ID (e.g., username/neuro-flyt-3d)") + parser.add_argument("--token", type=str, help="HF Write Token") + parser.add_argument("--steps", type=int, default=500000, help="Total training steps") + + args = parser.parse_args() + + # Get token from env var if not provided + token = args.token or os.environ.get("HF_TOKEN") + + train_hf(args.repo_id, token, args.steps) diff --git a/train_log_500k.txt b/train_log_500k.txt new file mode 100644 index 0000000000000000000000000000000000000000..b65ed79052fb266ba5f3cc1431c6c70ba5c3ab4c --- /dev/null +++ b/train_log_500k.txt @@ -0,0 +1,1974 @@ +Setting up Training Environment... +Creating Liquid PPO Agent... +Using cpu device +Wrapping the env with a `Monitor` wrapper +Wrapping the env in a DummyVecEnv. +Starting Training (This may take a while)... +---------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.56e+04 | +| time/ | | +| fps | 608 | +| iterations | 1 | +| time_elapsed | 3 | +| total_timesteps | 2048 | +---------------------------------- +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.23e+04 | +| time/ | | +| fps | 177 | +| iterations | 2 | +| time_elapsed | 23 | +| total_timesteps | 4096 | +| train/ | | +| approx_kl | 0.0049500195 | +| clip_fraction | 0.0341 | +| clip_range | 0.2 | +| entropy_loss | -5.67 | +| explained_variance | -9.31e-05 | +| learning_rate | 0.0003 | +| loss | 1.15e+05 | +| n_updates | 10 | +| policy_gradient_loss | -0.00313 | +| std | 0.999 | +| value_loss | 1.99e+05 | +------------------------------------------ +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.19e+04 | +| time/ | | +| fps | 129 | +| iterations | 3 | +| time_elapsed | 47 | +| total_timesteps | 6144 | +| train/ | | +| approx_kl | 0.002073763 | +| clip_fraction | 0.00542 | +| clip_range | 0.2 | +| entropy_loss | -5.67 | +| explained_variance | 2.62e-05 | +| learning_rate | 0.0003 | +| loss | 5.71e+04 | +| n_updates | 20 | +| policy_gradient_loss | -0.000381 | +| std | 0.996 | +| value_loss | 1.15e+05 | +----------------------------------------- +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.28e+04 | +| time/ | | +| fps | 116 | +| iterations | 4 | +| time_elapsed | 70 | +| total_timesteps | 8192 | +| train/ | | +| approx_kl | 0.0047560623 | +| clip_fraction | 0.0275 | +| clip_range | 0.2 | +| entropy_loss | -5.64 | +| explained_variance | 8.34e-07 | +| learning_rate | 0.0003 | +| loss | 7.31e+04 | +| n_updates | 30 | +| policy_gradient_loss | -0.00268 | +| std | 0.988 | +| value_loss | 1.42e+05 | +------------------------------------------ +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.4e+04 | +| time/ | | +| fps | 93 | +| iterations | 5 | +| time_elapsed | 109 | +| total_timesteps | 10240 | +| train/ | | +| approx_kl | 0.004183922 | +| clip_fraction | 0.0234 | +| clip_range | 0.2 | +| entropy_loss | -5.62 | +| explained_variance | -4.77e-07 | +| learning_rate | 0.0003 | +| loss | 1.35e+05 | +| n_updates | 40 | +| policy_gradient_loss | -0.003 | +| std | 0.985 | +| value_loss | 2.21e+05 | +----------------------------------------- +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.28e+04 | +| time/ | | +| fps | 98 | +| iterations | 6 | +| time_elapsed | 125 | +| total_timesteps | 12288 | +| train/ | | +| approx_kl | 0.005293761 | +| clip_fraction | 0.0418 | +| clip_range | 0.2 | +| entropy_loss | -5.61 | +| explained_variance | -3.58e-07 | +| learning_rate | 0.0003 | +| loss | 1.32e+05 | +| n_updates | 50 | +| policy_gradient_loss | -0.00347 | +| std | 0.985 | +| value_loss | 2.86e+05 | +----------------------------------------- +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.41e+04 | +| time/ | | +| fps | 97 | +| iterations | 7 | +| time_elapsed | 146 | +| total_timesteps | 14336 | +| train/ | | +| approx_kl | 0.0050999783 | +| clip_fraction | 0.0295 | +| clip_range | 0.2 | +| entropy_loss | -5.59 | +| explained_variance | -7.15e-07 | +| learning_rate | 0.0003 | +| loss | 4.66e+04 | +| n_updates | 60 | +| policy_gradient_loss | -0.00355 | +| std | 0.974 | +| value_loss | 8.14e+04 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.6e+04 | +| time/ | | +| fps | 103 | +| iterations | 8 | +| time_elapsed | 158 | +| total_timesteps | 16384 | +| train/ | | +| approx_kl | 0.0042739166 | +| clip_fraction | 0.0147 | +| clip_range | 0.2 | +| entropy_loss | -5.57 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 1.64e+05 | +| n_updates | 70 | +| policy_gradient_loss | -0.0019 | +| std | 0.972 | +| value_loss | 3.31e+05 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.7e+04 | +| time/ | | +| fps | 108 | +| iterations | 9 | +| time_elapsed | 170 | +| total_timesteps | 18432 | +| train/ | | +| approx_kl | 0.0053871158 | +| clip_fraction | 0.0297 | +| clip_range | 0.2 | +| entropy_loss | -5.56 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 2.43e+05 | +| n_updates | 80 | +| policy_gradient_loss | -0.00304 | +| std | 0.972 | +| value_loss | 5.33e+05 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.81e+04 | +| time/ | | +| fps | 112 | +| iterations | 10 | +| time_elapsed | 181 | +| total_timesteps | 20480 | +| train/ | | +| approx_kl | 0.0035741455 | +| clip_fraction | 0.0138 | +| clip_range | 0.2 | +| entropy_loss | -5.56 | +| explained_variance | -1.19e-07 | +| learning_rate | 0.0003 | +| loss | 1.74e+05 | +| n_updates | 90 | +| policy_gradient_loss | -0.00138 | +| std | 0.971 | +| value_loss | 3.49e+05 | +------------------------------------------ +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.79e+04 | +| time/ | | +| fps | 116 | +| iterations | 11 | +| time_elapsed | 193 | +| total_timesteps | 22528 | +| train/ | | +| approx_kl | 0.004108442 | +| clip_fraction | 0.0245 | +| clip_range | 0.2 | +| entropy_loss | -5.56 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 2.53e+05 | +| n_updates | 100 | +| policy_gradient_loss | -0.00274 | +| std | 0.971 | +| value_loss | 5.84e+05 | +----------------------------------------- +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.84e+04 | +| time/ | | +| fps | 119 | +| iterations | 12 | +| time_elapsed | 205 | +| total_timesteps | 24576 | +| train/ | | +| approx_kl | 0.0057261223 | +| clip_fraction | 0.0375 | +| clip_range | 0.2 | +| entropy_loss | -5.53 | +| explained_variance | -1.19e-07 | +| learning_rate | 0.0003 | +| loss | 8.12e+04 | +| n_updates | 110 | +| policy_gradient_loss | -0.003 | +| std | 0.96 | +| value_loss | 1.72e+05 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.82e+04 | +| time/ | | +| fps | 122 | +| iterations | 13 | +| time_elapsed | 217 | +| total_timesteps | 26624 | +| train/ | | +| approx_kl | 0.0051155365 | +| clip_fraction | 0.0225 | +| clip_range | 0.2 | +| entropy_loss | -5.5 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 2.4e+05 | +| n_updates | 120 | +| policy_gradient_loss | -0.00331 | +| std | 0.955 | +| value_loss | 4.7e+05 | +------------------------------------------ +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.83e+04 | +| time/ | | +| fps | 125 | +| iterations | 14 | +| time_elapsed | 228 | +| total_timesteps | 28672 | +| train/ | | +| approx_kl | 0.005322621 | +| clip_fraction | 0.042 | +| clip_range | 0.2 | +| entropy_loss | -5.48 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 1.33e+05 | +| n_updates | 130 | +| policy_gradient_loss | -0.00404 | +| std | 0.952 | +| value_loss | 2.58e+05 | +----------------------------------------- +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.78e+04 | +| time/ | | +| fps | 127 | +| iterations | 15 | +| time_elapsed | 240 | +| total_timesteps | 30720 | +| train/ | | +| approx_kl | 0.006120109 | +| clip_fraction | 0.0588 | +| clip_range | 0.2 | +| entropy_loss | -5.46 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 1.32e+05 | +| n_updates | 140 | +| policy_gradient_loss | -0.00445 | +| std | 0.942 | +| value_loss | 2.73e+05 | +----------------------------------------- +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.79e+04 | +| time/ | | +| fps | 129 | +| iterations | 16 | +| time_elapsed | 253 | +| total_timesteps | 32768 | +| train/ | | +| approx_kl | 0.004814163 | +| clip_fraction | 0.0178 | +| clip_range | 0.2 | +| entropy_loss | -5.43 | +| explained_variance | 1.19e-07 | +| learning_rate | 0.0003 | +| loss | 5.79e+04 | +| n_updates | 150 | +| policy_gradient_loss | -0.000932 | +| std | 0.939 | +| value_loss | 1.42e+05 | +----------------------------------------- +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.82e+04 | +| time/ | | +| fps | 130 | +| iterations | 17 | +| time_elapsed | 266 | +| total_timesteps | 34816 | +| train/ | | +| approx_kl | 0.0027875581 | +| clip_fraction | 0.0163 | +| clip_range | 0.2 | +| entropy_loss | -5.43 | +| explained_variance | 1.19e-07 | +| learning_rate | 0.0003 | +| loss | 1.62e+05 | +| n_updates | 160 | +| policy_gradient_loss | -0.00144 | +| std | 0.94 | +| value_loss | 3.25e+05 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.84e+04 | +| time/ | | +| fps | 132 | +| iterations | 18 | +| time_elapsed | 277 | +| total_timesteps | 36864 | +| train/ | | +| approx_kl | 0.0035902325 | +| clip_fraction | 0.0154 | +| clip_range | 0.2 | +| entropy_loss | -5.43 | +| explained_variance | 1.19e-07 | +| learning_rate | 0.0003 | +| loss | 1.59e+05 | +| n_updates | 170 | +| policy_gradient_loss | -0.00172 | +| std | 0.942 | +| value_loss | 3.88e+05 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.83e+04 | +| time/ | | +| fps | 134 | +| iterations | 19 | +| time_elapsed | 289 | +| total_timesteps | 38912 | +| train/ | | +| approx_kl | 0.0044348813 | +| clip_fraction | 0.025 | +| clip_range | 0.2 | +| entropy_loss | -5.44 | +| explained_variance | -1.19e-07 | +| learning_rate | 0.0003 | +| loss | 1.36e+05 | +| n_updates | 180 | +| policy_gradient_loss | -0.00187 | +| std | 0.943 | +| value_loss | 2.4e+05 | +------------------------------------------ +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.77e+04 | +| time/ | | +| fps | 136 | +| iterations | 20 | +| time_elapsed | 300 | +| total_timesteps | 40960 | +| train/ | | +| approx_kl | 0.003115609 | +| clip_fraction | 0.0162 | +| clip_range | 0.2 | +| entropy_loss | -5.42 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 1.02e+05 | +| n_updates | 190 | +| policy_gradient_loss | -0.00152 | +| std | 0.936 | +| value_loss | 2.02e+05 | +----------------------------------------- +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.72e+04 | +| time/ | | +| fps | 136 | +| iterations | 21 | +| time_elapsed | 314 | +| total_timesteps | 43008 | +| train/ | | +| approx_kl | 0.0044121114 | +| clip_fraction | 0.0311 | +| clip_range | 0.2 | +| entropy_loss | -5.42 | +| explained_variance | -1.19e-07 | +| learning_rate | 0.0003 | +| loss | 4.9e+04 | +| n_updates | 200 | +| policy_gradient_loss | -0.00261 | +| std | 0.941 | +| value_loss | 1.09e+05 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.69e+04 | +| time/ | | +| fps | 138 | +| iterations | 22 | +| time_elapsed | 326 | +| total_timesteps | 45056 | +| train/ | | +| approx_kl | 0.0050966754 | +| clip_fraction | 0.0294 | +| clip_range | 0.2 | +| entropy_loss | -5.41 | +| explained_variance | 1.19e-07 | +| learning_rate | 0.0003 | +| loss | 5.13e+04 | +| n_updates | 210 | +| policy_gradient_loss | -0.00221 | +| std | 0.933 | +| value_loss | 1.11e+05 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.71e+04 | +| time/ | | +| fps | 139 | +| iterations | 23 | +| time_elapsed | 337 | +| total_timesteps | 47104 | +| train/ | | +| approx_kl | 0.0042023044 | +| clip_fraction | 0.0154 | +| clip_range | 0.2 | +| entropy_loss | -5.4 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 5.53e+04 | +| n_updates | 220 | +| policy_gradient_loss | -0.000932 | +| std | 0.934 | +| value_loss | 1.32e+05 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.74e+04 | +| time/ | | +| fps | 140 | +| iterations | 24 | +| time_elapsed | 348 | +| total_timesteps | 49152 | +| train/ | | +| approx_kl | 0.0060270163 | +| clip_fraction | 0.0548 | +| clip_range | 0.2 | +| entropy_loss | -5.4 | +| explained_variance | -1.19e-07 | +| learning_rate | 0.0003 | +| loss | 1.27e+05 | +| n_updates | 230 | +| policy_gradient_loss | -0.00514 | +| std | 0.932 | +| value_loss | 2.93e+05 | +------------------------------------------ +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.77e+04 | +| time/ | | +| fps | 141 | +| iterations | 25 | +| time_elapsed | 361 | +| total_timesteps | 51200 | +| train/ | | +| approx_kl | 0.003641401 | +| clip_fraction | 0.0161 | +| clip_range | 0.2 | +| entropy_loss | -5.4 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 1.7e+05 | +| n_updates | 240 | +| policy_gradient_loss | -0.00216 | +| std | 0.937 | +| value_loss | 3.48e+05 | +----------------------------------------- +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.79e+04 | +| time/ | | +| fps | 142 | +| iterations | 26 | +| time_elapsed | 372 | +| total_timesteps | 53248 | +| train/ | | +| approx_kl | 0.0040730843 | +| clip_fraction | 0.0225 | +| clip_range | 0.2 | +| entropy_loss | -5.41 | +| explained_variance | 5.96e-08 | +| learning_rate | 0.0003 | +| loss | 2.05e+05 | +| n_updates | 250 | +| policy_gradient_loss | -0.00147 | +| std | 0.934 | +| value_loss | 4.28e+05 | +------------------------------------------ +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.8e+04 | +| time/ | | +| fps | 143 | +| iterations | 27 | +| time_elapsed | 384 | +| total_timesteps | 55296 | +| train/ | | +| approx_kl | 0.003144626 | +| clip_fraction | 0.00791 | +| clip_range | 0.2 | +| entropy_loss | -5.42 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 1.71e+05 | +| n_updates | 260 | +| policy_gradient_loss | -0.00195 | +| std | 0.94 | +| value_loss | 3.93e+05 | +----------------------------------------- +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.83e+04 | +| time/ | | +| fps | 144 | +| iterations | 28 | +| time_elapsed | 397 | +| total_timesteps | 57344 | +| train/ | | +| approx_kl | 0.0052720373 | +| clip_fraction | 0.0272 | +| clip_range | 0.2 | +| entropy_loss | -5.42 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 1.75e+05 | +| n_updates | 270 | +| policy_gradient_loss | -0.00242 | +| std | 0.935 | +| value_loss | 3.07e+05 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.79e+04 | +| time/ | | +| fps | 145 | +| iterations | 29 | +| time_elapsed | 409 | +| total_timesteps | 59392 | +| train/ | | +| approx_kl | 0.0041839215 | +| clip_fraction | 0.0244 | +| clip_range | 0.2 | +| entropy_loss | -5.4 | +| explained_variance | 5.96e-08 | +| learning_rate | 0.0003 | +| loss | 1.79e+05 | +| n_updates | 280 | +| policy_gradient_loss | -0.00283 | +| std | 0.933 | +| value_loss | 3.86e+05 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.8e+04 | +| time/ | | +| fps | 145 | +| iterations | 30 | +| time_elapsed | 421 | +| total_timesteps | 61440 | +| train/ | | +| approx_kl | 0.0053371564 | +| clip_fraction | 0.0308 | +| clip_range | 0.2 | +| entropy_loss | -5.35 | +| explained_variance | -1.19e-07 | +| learning_rate | 0.0003 | +| loss | 3.19e+04 | +| n_updates | 290 | +| policy_gradient_loss | -0.00282 | +| std | 0.915 | +| value_loss | 6.26e+04 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.78e+04 | +| time/ | | +| fps | 146 | +| iterations | 31 | +| time_elapsed | 433 | +| total_timesteps | 63488 | +| train/ | | +| approx_kl | 0.0045930664 | +| clip_fraction | 0.0416 | +| clip_range | 0.2 | +| entropy_loss | -5.31 | +| explained_variance | 1.19e-07 | +| learning_rate | 0.0003 | +| loss | 1.66e+05 | +| n_updates | 300 | +| policy_gradient_loss | -0.00376 | +| std | 0.913 | +| value_loss | 3.15e+05 | +------------------------------------------ +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.77e+04 | +| time/ | | +| fps | 147 | +| iterations | 32 | +| time_elapsed | 445 | +| total_timesteps | 65536 | +| train/ | | +| approx_kl | 0.006433362 | +| clip_fraction | 0.0423 | +| clip_range | 0.2 | +| entropy_loss | -5.29 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 7.14e+04 | +| n_updates | 310 | +| policy_gradient_loss | -0.00386 | +| std | 0.906 | +| value_loss | 1.45e+05 | +----------------------------------------- +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.74e+04 | +| time/ | | +| fps | 147 | +| iterations | 33 | +| time_elapsed | 457 | +| total_timesteps | 67584 | +| train/ | | +| approx_kl | 0.0060111308 | +| clip_fraction | 0.0567 | +| clip_range | 0.2 | +| entropy_loss | -5.27 | +| explained_variance | 5.96e-08 | +| learning_rate | 0.0003 | +| loss | 8.6e+04 | +| n_updates | 320 | +| policy_gradient_loss | -0.004 | +| std | 0.904 | +| value_loss | 1.9e+05 | +------------------------------------------ +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.71e+04 | +| time/ | | +| fps | 148 | +| iterations | 34 | +| time_elapsed | 469 | +| total_timesteps | 69632 | +| train/ | | +| approx_kl | 0.002752479 | +| clip_fraction | 0.0267 | +| clip_range | 0.2 | +| entropy_loss | -5.28 | +| explained_variance | -1.19e-07 | +| learning_rate | 0.0003 | +| loss | 3.72e+04 | +| n_updates | 330 | +| policy_gradient_loss | -0.000776 | +| std | 0.909 | +| value_loss | 5.9e+04 | +----------------------------------------- +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.7e+04 | +| time/ | | +| fps | 149 | +| iterations | 35 | +| time_elapsed | 480 | +| total_timesteps | 71680 | +| train/ | | +| approx_kl | 0.004144692 | +| clip_fraction | 0.0243 | +| clip_range | 0.2 | +| entropy_loss | -5.29 | +| explained_variance | 1.19e-07 | +| learning_rate | 0.0003 | +| loss | 4.48e+04 | +| n_updates | 340 | +| policy_gradient_loss | -0.00131 | +| std | 0.907 | +| value_loss | 1.06e+05 | +----------------------------------------- +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.69e+04 | +| time/ | | +| fps | 149 | +| iterations | 36 | +| time_elapsed | 492 | +| total_timesteps | 73728 | +| train/ | | +| approx_kl | 0.0060227686 | +| clip_fraction | 0.043 | +| clip_range | 0.2 | +| entropy_loss | -5.28 | +| explained_variance | 1.19e-07 | +| learning_rate | 0.0003 | +| loss | 9.28e+04 | +| n_updates | 350 | +| policy_gradient_loss | -0.00293 | +| std | 0.903 | +| value_loss | 1.91e+05 | +------------------------------------------ +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.68e+04 | +| time/ | | +| fps | 150 | +| iterations | 37 | +| time_elapsed | 504 | +| total_timesteps | 75776 | +| train/ | | +| approx_kl | 0.003745494 | +| clip_fraction | 0.0147 | +| clip_range | 0.2 | +| entropy_loss | -5.29 | +| explained_variance | -1.19e-07 | +| learning_rate | 0.0003 | +| loss | 6.81e+04 | +| n_updates | 360 | +| policy_gradient_loss | -0.00168 | +| std | 0.91 | +| value_loss | 1.31e+05 | +----------------------------------------- +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.71e+04 | +| time/ | | +| fps | 150 | +| iterations | 38 | +| time_elapsed | 516 | +| total_timesteps | 77824 | +| train/ | | +| approx_kl | 0.0039524576 | +| clip_fraction | 0.0286 | +| clip_range | 0.2 | +| entropy_loss | -5.3 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 1.13e+05 | +| n_updates | 370 | +| policy_gradient_loss | -0.00305 | +| std | 0.909 | +| value_loss | 2.44e+05 | +------------------------------------------ +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.67e+04 | +| time/ | | +| fps | 150 | +| iterations | 39 | +| time_elapsed | 529 | +| total_timesteps | 79872 | +| train/ | | +| approx_kl | 0.005160669 | +| clip_fraction | 0.0254 | +| clip_range | 0.2 | +| entropy_loss | -5.29 | +| explained_variance | 1.19e-07 | +| learning_rate | 0.0003 | +| loss | 1.6e+05 | +| n_updates | 380 | +| policy_gradient_loss | -0.00292 | +| std | 0.907 | +| value_loss | 2.55e+05 | +----------------------------------------- +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.66e+04 | +| time/ | | +| fps | 151 | +| iterations | 40 | +| time_elapsed | 540 | +| total_timesteps | 81920 | +| train/ | | +| approx_kl | 0.0046265204 | +| clip_fraction | 0.0285 | +| clip_range | 0.2 | +| entropy_loss | -5.27 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 2.09e+04 | +| n_updates | 390 | +| policy_gradient_loss | -0.00145 | +| std | 0.902 | +| value_loss | 3.81e+04 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.67e+04 | +| time/ | | +| fps | 151 | +| iterations | 41 | +| time_elapsed | 553 | +| total_timesteps | 83968 | +| train/ | | +| approx_kl | 0.0042863134 | +| clip_fraction | 0.0239 | +| clip_range | 0.2 | +| entropy_loss | -5.26 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 9.31e+04 | +| n_updates | 400 | +| policy_gradient_loss | -0.00143 | +| std | 0.9 | +| value_loss | 1.85e+05 | +------------------------------------------ +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.68e+04 | +| time/ | | +| fps | 151 | +| iterations | 42 | +| time_elapsed | 566 | +| total_timesteps | 86016 | +| train/ | | +| approx_kl | 0.005065168 | +| clip_fraction | 0.0253 | +| clip_range | 0.2 | +| entropy_loss | -5.24 | +| explained_variance | 1.19e-07 | +| learning_rate | 0.0003 | +| loss | 1.1e+05 | +| n_updates | 410 | +| policy_gradient_loss | -0.0026 | +| std | 0.894 | +| value_loss | 2.2e+05 | +----------------------------------------- +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.67e+04 | +| time/ | | +| fps | 152 | +| iterations | 43 | +| time_elapsed | 577 | +| total_timesteps | 88064 | +| train/ | | +| approx_kl | 0.0030657728 | +| clip_fraction | 0.0121 | +| clip_range | 0.2 | +| entropy_loss | -5.22 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 1.52e+05 | +| n_updates | 420 | +| policy_gradient_loss | -0.00173 | +| std | 0.892 | +| value_loss | 3.03e+05 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.73e+04 | +| time/ | | +| fps | 153 | +| iterations | 44 | +| time_elapsed | 588 | +| total_timesteps | 90112 | +| train/ | | +| approx_kl | 0.0051104454 | +| clip_fraction | 0.0357 | +| clip_range | 0.2 | +| entropy_loss | -5.22 | +| explained_variance | -1.19e-07 | +| learning_rate | 0.0003 | +| loss | 8.25e+04 | +| n_updates | 430 | +| policy_gradient_loss | -0.00201 | +| std | 0.893 | +| value_loss | 1.81e+05 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.8e+04 | +| time/ | | +| fps | 153 | +| iterations | 45 | +| time_elapsed | 600 | +| total_timesteps | 92160 | +| train/ | | +| approx_kl | 0.0051720007 | +| clip_fraction | 0.033 | +| clip_range | 0.2 | +| entropy_loss | -5.23 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 3.47e+05 | +| n_updates | 440 | +| policy_gradient_loss | -0.00428 | +| std | 0.896 | +| value_loss | 7.59e+05 | +------------------------------------------ +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.9e+04 | +| time/ | | +| fps | 153 | +| iterations | 46 | +| time_elapsed | 612 | +| total_timesteps | 94208 | +| train/ | | +| approx_kl | 0.004487371 | +| clip_fraction | 0.0192 | +| clip_range | 0.2 | +| entropy_loss | -5.23 | +| explained_variance | 5.96e-08 | +| learning_rate | 0.0003 | +| loss | 6.84e+05 | +| n_updates | 450 | +| policy_gradient_loss | -0.00245 | +| std | 0.895 | +| value_loss | 1.3e+06 | +----------------------------------------- +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.98e+04 | +| time/ | | +| fps | 153 | +| iterations | 47 | +| time_elapsed | 625 | +| total_timesteps | 96256 | +| train/ | | +| approx_kl | 0.005325151 | +| clip_fraction | 0.0271 | +| clip_range | 0.2 | +| entropy_loss | -5.22 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 9.17e+05 | +| n_updates | 460 | +| policy_gradient_loss | -0.00341 | +| std | 0.892 | +| value_loss | 1.81e+06 | +----------------------------------------- +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -3.08e+04 | +| time/ | | +| fps | 154 | +| iterations | 48 | +| time_elapsed | 637 | +| total_timesteps | 98304 | +| train/ | | +| approx_kl | 0.004731435 | +| clip_fraction | 0.0245 | +| clip_range | 0.2 | +| entropy_loss | -5.21 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 8.34e+05 | +| n_updates | 470 | +| policy_gradient_loss | -0.00319 | +| std | 0.888 | +| value_loss | 1.53e+06 | +----------------------------------------- +---------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -3.21e+04 | +| time/ | | +| fps | 154 | +| iterations | 49 | +| time_elapsed | 648 | +| total_timesteps | 100352 | +| train/ | | +| approx_kl | 0.00386829 | +| clip_fraction | 0.00859 | +| clip_range | 0.2 | +| entropy_loss | -5.2 | +| explained_variance | -1.19e-07 | +| learning_rate | 0.0003 | +| loss | 1.05e+06 | +| n_updates | 480 | +| policy_gradient_loss | -0.00151 | +| std | 0.887 | +| value_loss | 2.04e+06 | +---------------------------------------- +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -3.34e+04 | +| time/ | | +| fps | 154 | +| iterations | 50 | +| time_elapsed | 660 | +| total_timesteps | 102400 | +| train/ | | +| approx_kl | 0.005242249 | +| clip_fraction | 0.0372 | +| clip_range | 0.2 | +| entropy_loss | -5.2 | +| explained_variance | -1.19e-07 | +| learning_rate | 0.0003 | +| loss | 1.95e+06 | +| n_updates | 490 | +| policy_gradient_loss | -0.00506 | +| std | 0.889 | +| value_loss | 3.17e+06 | +----------------------------------------- +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -3.5e+04 | +| time/ | | +| fps | 155 | +| iterations | 51 | +| time_elapsed | 673 | +| total_timesteps | 104448 | +| train/ | | +| approx_kl | 0.003204999 | +| clip_fraction | 0.00566 | +| clip_range | 0.2 | +| entropy_loss | -5.21 | +| explained_variance | 5.96e-08 | +| learning_rate | 0.0003 | +| loss | 1.29e+06 | +| n_updates | 500 | +| policy_gradient_loss | -0.000996 | +| std | 0.89 | +| value_loss | 3.12e+06 | +----------------------------------------- +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -3.71e+04 | +| time/ | | +| fps | 155 | +| iterations | 52 | +| time_elapsed | 685 | +| total_timesteps | 106496 | +| train/ | | +| approx_kl | 0.0037713286 | +| clip_fraction | 0.0106 | +| clip_range | 0.2 | +| entropy_loss | -5.2 | +| explained_variance | 5.96e-08 | +| learning_rate | 0.0003 | +| loss | 1.73e+06 | +| n_updates | 510 | +| policy_gradient_loss | -0.00205 | +| std | 0.889 | +| value_loss | 3.39e+06 | +------------------------------------------ +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -3.89e+04 | +| time/ | | +| fps | 155 | +| iterations | 53 | +| time_elapsed | 699 | +| total_timesteps | 108544 | +| train/ | | +| approx_kl | 0.003621605 | +| clip_fraction | 0.00576 | +| clip_range | 0.2 | +| entropy_loss | -5.2 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 2.11e+06 | +| n_updates | 520 | +| policy_gradient_loss | -0.00108 | +| std | 0.889 | +| value_loss | 5.23e+06 | +----------------------------------------- +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -4.07e+04 | +| time/ | | +| fps | 155 | +| iterations | 54 | +| time_elapsed | 710 | +| total_timesteps | 110592 | +| train/ | | +| approx_kl | 0.0037987605 | +| clip_fraction | 0.0108 | +| clip_range | 0.2 | +| entropy_loss | -5.21 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 2.02e+06 | +| n_updates | 530 | +| policy_gradient_loss | -0.00193 | +| std | 0.891 | +| value_loss | 4.78e+06 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -4.31e+04 | +| time/ | | +| fps | 155 | +| iterations | 55 | +| time_elapsed | 722 | +| total_timesteps | 112640 | +| train/ | | +| approx_kl | 0.0041659893 | +| clip_fraction | 0.00801 | +| clip_range | 0.2 | +| entropy_loss | -5.21 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 2.27e+06 | +| n_updates | 540 | +| policy_gradient_loss | -0.00111 | +| std | 0.89 | +| value_loss | 5e+06 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -4.52e+04 | +| time/ | | +| fps | 156 | +| iterations | 56 | +| time_elapsed | 734 | +| total_timesteps | 114688 | +| train/ | | +| approx_kl | 0.0052787326 | +| clip_fraction | 0.0296 | +| clip_range | 0.2 | +| entropy_loss | -5.21 | +| explained_variance | 5.96e-08 | +| learning_rate | 0.0003 | +| loss | 3.7e+06 | +| n_updates | 550 | +| policy_gradient_loss | -0.00406 | +| std | 0.889 | +| value_loss | 6.79e+06 | +------------------------------------------ +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -4.67e+04 | +| time/ | | +| fps | 156 | +| iterations | 57 | +| time_elapsed | 746 | +| total_timesteps | 116736 | +| train/ | | +| approx_kl | 0.004433933 | +| clip_fraction | 0.0184 | +| clip_range | 0.2 | +| entropy_loss | -5.2 | +| explained_variance | 5.96e-08 | +| learning_rate | 0.0003 | +| loss | 2.93e+06 | +| n_updates | 560 | +| policy_gradient_loss | -0.00222 | +| std | 0.888 | +| value_loss | 6.15e+06 | +----------------------------------------- +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -4.83e+04 | +| time/ | | +| fps | 156 | +| iterations | 58 | +| time_elapsed | 758 | +| total_timesteps | 118784 | +| train/ | | +| approx_kl | 0.004643922 | +| clip_fraction | 0.025 | +| clip_range | 0.2 | +| entropy_loss | -5.2 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 2.54e+06 | +| n_updates | 570 | +| policy_gradient_loss | -0.00334 | +| std | 0.888 | +| value_loss | 4.8e+06 | +----------------------------------------- +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -4.99e+04 | +| time/ | | +| fps | 156 | +| iterations | 59 | +| time_elapsed | 769 | +| total_timesteps | 120832 | +| train/ | | +| approx_kl | 0.004279623 | +| clip_fraction | 0.00815 | +| clip_range | 0.2 | +| entropy_loss | -5.2 | +| explained_variance | 1.19e-07 | +| learning_rate | 0.0003 | +| loss | 2.58e+06 | +| n_updates | 580 | +| policy_gradient_loss | -0.00133 | +| std | 0.89 | +| value_loss | 4.7e+06 | +----------------------------------------- +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -5.18e+04 | +| time/ | | +| fps | 157 | +| iterations | 60 | +| time_elapsed | 782 | +| total_timesteps | 122880 | +| train/ | | +| approx_kl | 0.004928913 | +| clip_fraction | 0.0252 | +| clip_range | 0.2 | +| entropy_loss | -5.2 | +| explained_variance | 1.19e-07 | +| learning_rate | 0.0003 | +| loss | 2.06e+06 | +| n_updates | 590 | +| policy_gradient_loss | -0.00314 | +| std | 0.886 | +| value_loss | 4.64e+06 | +----------------------------------------- +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -5.37e+04 | +| time/ | | +| fps | 157 | +| iterations | 61 | +| time_elapsed | 793 | +| total_timesteps | 124928 | +| train/ | | +| approx_kl | 0.0044577485 | +| clip_fraction | 0.0167 | +| clip_range | 0.2 | +| entropy_loss | -5.19 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 2.75e+06 | +| n_updates | 600 | +| policy_gradient_loss | -0.00216 | +| std | 0.884 | +| value_loss | 5.37e+06 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -5.54e+04 | +| time/ | | +| fps | 157 | +| iterations | 62 | +| time_elapsed | 805 | +| total_timesteps | 126976 | +| train/ | | +| approx_kl | 0.0033779903 | +| clip_fraction | 0.00854 | +| clip_range | 0.2 | +| entropy_loss | -5.19 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 2.75e+06 | +| n_updates | 610 | +| policy_gradient_loss | -0.000881 | +| std | 0.887 | +| value_loss | 5.11e+06 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -5.84e+04 | +| time/ | | +| fps | 157 | +| iterations | 63 | +| time_elapsed | 817 | +| total_timesteps | 129024 | +| train/ | | +| approx_kl | 0.0036522774 | +| clip_fraction | 0.00669 | +| clip_range | 0.2 | +| entropy_loss | -5.2 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 2.36e+06 | +| n_updates | 620 | +| policy_gradient_loss | -0.00121 | +| std | 0.889 | +| value_loss | 5.49e+06 | +------------------------------------------ +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -6.02e+04 | +| time/ | | +| fps | 158 | +| iterations | 64 | +| time_elapsed | 829 | +| total_timesteps | 131072 | +| train/ | | +| approx_kl | 0.005089692 | +| clip_fraction | 0.0314 | +| clip_range | 0.2 | +| entropy_loss | -5.2 | +| explained_variance | -1.19e-07 | +| learning_rate | 0.0003 | +| loss | 2.64e+06 | +| n_updates | 630 | +| policy_gradient_loss | -0.00405 | +| std | 0.887 | +| value_loss | 5.26e+06 | +----------------------------------------- +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -6.17e+04 | +| time/ | | +| fps | 158 | +| iterations | 65 | +| time_elapsed | 841 | +| total_timesteps | 133120 | +| train/ | | +| approx_kl | 0.004889611 | +| clip_fraction | 0.0176 | +| clip_range | 0.2 | +| entropy_loss | -5.2 | +| explained_variance | 1.19e-07 | +| learning_rate | 0.0003 | +| loss | 1.92e+06 | +| n_updates | 640 | +| policy_gradient_loss | -0.00247 | +| std | 0.888 | +| value_loss | 4.65e+06 | +----------------------------------------- +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -6.28e+04 | +| time/ | | +| fps | 158 | +| iterations | 66 | +| time_elapsed | 853 | +| total_timesteps | 135168 | +| train/ | | +| approx_kl | 0.004658374 | +| clip_fraction | 0.021 | +| clip_range | 0.2 | +| entropy_loss | -5.19 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 1.67e+06 | +| n_updates | 650 | +| policy_gradient_loss | -0.00222 | +| std | 0.886 | +| value_loss | 3.85e+06 | +----------------------------------------- +---------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -6.38e+04 | +| time/ | | +| fps | 158 | +| iterations | 67 | +| time_elapsed | 866 | +| total_timesteps | 137216 | +| train/ | | +| approx_kl | 0.00569404 | +| clip_fraction | 0.0394 | +| clip_range | 0.2 | +| entropy_loss | -5.19 | +| explained_variance | 5.96e-08 | +| learning_rate | 0.0003 | +| loss | 1.44e+06 | +| n_updates | 660 | +| policy_gradient_loss | -0.00414 | +| std | 0.887 | +| value_loss | 2.78e+06 | +---------------------------------------- +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -6.47e+04 | +| time/ | | +| fps | 157 | +| iterations | 68 | +| time_elapsed | 887 | +| total_timesteps | 139264 | +| train/ | | +| approx_kl | 0.004979359 | +| clip_fraction | 0.0314 | +| clip_range | 0.2 | +| entropy_loss | -5.19 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 7.57e+05 | +| n_updates | 670 | +| policy_gradient_loss | -0.00347 | +| std | 0.883 | +| value_loss | 1.69e+06 | +----------------------------------------- +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -6.6e+04 | +| time/ | | +| fps | 155 | +| iterations | 69 | +| time_elapsed | 911 | +| total_timesteps | 141312 | +| train/ | | +| approx_kl | 0.003934146 | +| clip_fraction | 0.0181 | +| clip_range | 0.2 | +| entropy_loss | -5.17 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 8.59e+05 | +| n_updates | 680 | +| policy_gradient_loss | -0.002 | +| std | 0.882 | +| value_loss | 1.66e+06 | +----------------------------------------- +---------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -6.73e+04 | +| time/ | | +| fps | 154 | +| iterations | 70 | +| time_elapsed | 929 | +| total_timesteps | 143360 | +| train/ | | +| approx_kl | 0.00488944 | +| clip_fraction | 0.0386 | +| clip_range | 0.2 | +| entropy_loss | -5.17 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 1.07e+06 | +| n_updates | 690 | +| policy_gradient_loss | -0.00419 | +| std | 0.879 | +| value_loss | 2.26e+06 | +---------------------------------------- +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -6.88e+04 | +| time/ | | +| fps | 151 | +| iterations | 71 | +| time_elapsed | 956 | +| total_timesteps | 145408 | +| train/ | | +| approx_kl | 0.0039507896 | +| clip_fraction | 0.026 | +| clip_range | 0.2 | +| entropy_loss | -5.16 | +| explained_variance | -2.38e-07 | +| learning_rate | 0.0003 | +| loss | 1.23e+06 | +| n_updates | 700 | +| policy_gradient_loss | -0.00263 | +| std | 0.879 | +| value_loss | 2.33e+06 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -7e+04 | +| time/ | | +| fps | 151 | +| iterations | 72 | +| time_elapsed | 974 | +| total_timesteps | 147456 | +| train/ | | +| approx_kl | 0.0048819017 | +| clip_fraction | 0.0321 | +| clip_range | 0.2 | +| entropy_loss | -5.16 | +| explained_variance | -1.19e-07 | +| learning_rate | 0.0003 | +| loss | 1.66e+06 | +| n_updates | 710 | +| policy_gradient_loss | -0.00324 | +| std | 0.877 | +| value_loss | 3.4e+06 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -7.08e+04 | +| time/ | | +| fps | 150 | +| iterations | 73 | +| time_elapsed | 994 | +| total_timesteps | 149504 | +| train/ | | +| approx_kl | 0.0051534167 | +| clip_fraction | 0.0276 | +| clip_range | 0.2 | +| entropy_loss | -5.15 | +| explained_variance | 5.96e-08 | +| learning_rate | 0.0003 | +| loss | 1.15e+06 | +| n_updates | 720 | +| policy_gradient_loss | -0.0034 | +| std | 0.877 | +| value_loss | 2.73e+06 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -7.17e+04 | +| time/ | | +| fps | 150 | +| iterations | 74 | +| time_elapsed | 1009 | +| total_timesteps | 151552 | +| train/ | | +| approx_kl | 0.0039522136 | +| clip_fraction | 0.0215 | +| clip_range | 0.2 | +| entropy_loss | -5.17 | +| explained_variance | 5.96e-08 | +| learning_rate | 0.0003 | +| loss | 8.39e+05 | +| n_updates | 730 | +| policy_gradient_loss | -0.00278 | +| std | 0.885 | +| value_loss | 1.82e+06 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -7.25e+04 | +| time/ | | +| fps | 150 | +| iterations | 75 | +| time_elapsed | 1023 | +| total_timesteps | 153600 | +| train/ | | +| approx_kl | 0.0037896927 | +| clip_fraction | 0.0131 | +| clip_range | 0.2 | +| entropy_loss | -5.18 | +| explained_variance | 1.19e-07 | +| learning_rate | 0.0003 | +| loss | 1.18e+06 | +| n_updates | 740 | +| policy_gradient_loss | -0.00183 | +| std | 0.883 | +| value_loss | 2.15e+06 | +------------------------------------------ +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -7.33e+04 | +| time/ | | +| fps | 149 | +| iterations | 76 | +| time_elapsed | 1038 | +| total_timesteps | 155648 | +| train/ | | +| approx_kl | 0.005035511 | +| clip_fraction | 0.0261 | +| clip_range | 0.2 | +| entropy_loss | -5.16 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 6.91e+05 | +| n_updates | 750 | +| policy_gradient_loss | -0.00347 | +| std | 0.877 | +| value_loss | 1.49e+06 | +----------------------------------------- +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -7.45e+04 | +| time/ | | +| fps | 149 | +| iterations | 77 | +| time_elapsed | 1052 | +| total_timesteps | 157696 | +| train/ | | +| approx_kl | 0.005323178 | +| clip_fraction | 0.0373 | +| clip_range | 0.2 | +| entropy_loss | -5.15 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 8.95e+05 | +| n_updates | 760 | +| policy_gradient_loss | -0.00419 | +| std | 0.876 | +| value_loss | 1.9e+06 | +----------------------------------------- +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -7.61e+04 | +| time/ | | +| fps | 149 | +| iterations | 78 | +| time_elapsed | 1071 | +| total_timesteps | 159744 | +| train/ | | +| approx_kl | 0.005339088 | +| clip_fraction | 0.0279 | +| clip_range | 0.2 | +| entropy_loss | -5.13 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 1.56e+06 | +| n_updates | 770 | +| policy_gradient_loss | -0.00348 | +| std | 0.871 | +| value_loss | 3.12e+06 | +----------------------------------------- +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -7.72e+04 | +| time/ | | +| fps | 148 | +| iterations | 79 | +| time_elapsed | 1088 | +| total_timesteps | 161792 | +| train/ | | +| approx_kl | 0.0021434259 | +| clip_fraction | 0.00132 | +| clip_range | 0.2 | +| entropy_loss | -5.13 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 1.39e+06 | +| n_updates | 780 | +| policy_gradient_loss | -0.000295 | +| std | 0.874 | +| value_loss | 3.14e+06 | +------------------------------------------ +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -7.88e+04 | +| time/ | | +| fps | 148 | +| iterations | 80 | +| time_elapsed | 1106 | +| total_timesteps | 163840 | +| train/ | | +| approx_kl | 0.004515986 | +| clip_fraction | 0.0185 | +| clip_range | 0.2 | +| entropy_loss | -5.13 | +| explained_variance | -2.38e-07 | +| learning_rate | 0.0003 | +| loss | 1.26e+06 | +| n_updates | 790 | +| policy_gradient_loss | -0.00181 | +| std | 0.872 | +| value_loss | 2.6e+06 | +----------------------------------------- +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -8.02e+04 | +| time/ | | +| fps | 147 | +| iterations | 81 | +| time_elapsed | 1125 | +| total_timesteps | 165888 | +| train/ | | +| approx_kl | 0.004079287 | +| clip_fraction | 0.0139 | +| clip_range | 0.2 | +| entropy_loss | -5.13 | +| explained_variance | 5.96e-08 | +| learning_rate | 0.0003 | +| loss | 1.86e+06 | +| n_updates | 800 | +| policy_gradient_loss | -0.00189 | +| std | 0.873 | +| value_loss | 3.26e+06 | +----------------------------------------- +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -8.2e+04 | +| time/ | | +| fps | 146 | +| iterations | 82 | +| time_elapsed | 1147 | +| total_timesteps | 167936 | +| train/ | | +| approx_kl | 0.004386483 | +| clip_fraction | 0.0127 | +| clip_range | 0.2 | +| entropy_loss | -5.13 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 1.87e+06 | +| n_updates | 810 | +| policy_gradient_loss | -0.00205 | +| std | 0.873 | +| value_loss | 3.56e+06 | +----------------------------------------- +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -8.37e+04 | +| time/ | | +| fps | 145 | +| iterations | 83 | +| time_elapsed | 1167 | +| total_timesteps | 169984 | +| train/ | | +| approx_kl | 0.0041227336 | +| clip_fraction | 0.0245 | +| clip_range | 0.2 | +| entropy_loss | -5.14 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 1.95e+06 | +| n_updates | 820 | +| policy_gradient_loss | -0.00324 | +| std | 0.873 | +| value_loss | 3.58e+06 | +------------------------------------------ +---------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -8.62e+04 | +| time/ | | +| fps | 145 | +| iterations | 84 | +| time_elapsed | 1180 | +| total_timesteps | 172032 | +| train/ | | +| approx_kl | 0.00430945 | +| clip_fraction | 0.0171 | +| clip_range | 0.2 | +| entropy_loss | -5.13 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 2.18e+06 | +| n_updates | 830 | +| policy_gradient_loss | -0.0021 | +| std | 0.872 | +| value_loss | 3.97e+06 | +---------------------------------------- +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -8.81e+04 | +| time/ | | +| fps | 145 | +| iterations | 85 | +| time_elapsed | 1198 | +| total_timesteps | 174080 | +| train/ | | +| approx_kl | 0.0027071913 | +| clip_fraction | 0.0043 | +| clip_range | 0.2 | +| entropy_loss | -5.14 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 1.6e+06 | +| n_updates | 840 | +| policy_gradient_loss | -0.000301 | +| std | 0.876 | +| value_loss | 3.94e+06 | +------------------------------------------ +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -8.97e+04 | +| time/ | | +| fps | 144 | +| iterations | 86 | +| time_elapsed | 1218 | +| total_timesteps | 176128 | +| train/ | | +| approx_kl | 0.003243664 | +| clip_fraction | 0.0133 | +| clip_range | 0.2 | +| entropy_loss | -5.15 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 2.15e+06 | +| n_updates | 850 | +| policy_gradient_loss | -0.00204 | +| std | 0.878 | +| value_loss | 4.5e+06 | +----------------------------------------- +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -9.15e+04 | +| time/ | | +| fps | 143 | +| iterations | 87 | +| time_elapsed | 1239 | +| total_timesteps | 178176 | +| train/ | | +| approx_kl | 0.0029459428 | +| clip_fraction | 0.00308 | +| clip_range | 0.2 | +| entropy_loss | -5.16 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 2.44e+06 | +| n_updates | 860 | +| policy_gradient_loss | -0.000751 | +| std | 0.88 | +| value_loss | 4.24e+06 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -9.36e+04 | +| time/ | | +| fps | 143 | +| iterations | 88 | +| time_elapsed | 1258 | +| total_timesteps | 180224 | +| train/ | | +| approx_kl | 0.0043680565 | +| clip_fraction | 0.0208 | +| clip_range | 0.2 | +| entropy_loss | -5.17 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 2.09e+06 | +| n_updates | 870 | +| policy_gradient_loss | -0.00237 | +| std | 0.881 | +| value_loss | 4.39e+06 | +------------------------------------------ +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -9.52e+04 | +| time/ | | +| fps | 142 | +| iterations | 89 | +| time_elapsed | 1283 | +| total_timesteps | 182272 | +| train/ | | +| approx_kl | 0.004063189 | +| clip_fraction | 0.012 | +| clip_range | 0.2 | +| entropy_loss | -5.16 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 2.77e+06 | +| n_updates | 880 | +| policy_gradient_loss | -0.00207 | +| std | 0.877 | +| value_loss | 4.73e+06 | +----------------------------------------- +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -9.69e+04 | +| time/ | | +| fps | 141 | +| iterations | 90 | +| time_elapsed | 1306 | +| total_timesteps | 184320 | +| train/ | | +| approx_kl | 0.0049707354 | +| clip_fraction | 0.0279 | +| clip_range | 0.2 | +| entropy_loss | -5.13 | +| explained_variance | 0 | +| learning_rate | 0.0003 | +| loss | 1.65e+06 | +| n_updates | 890 | +| policy_gradient_loss | -0.00372 | +| std | 0.871 | +| value_loss | 3.68e+06 | +------------------------------------------ diff --git a/train_log_full.txt b/train_log_full.txt new file mode 100644 index 0000000000000000000000000000000000000000..ae4c34c2224b980606c4eb8da3e7e6f50eae961c --- /dev/null +++ b/train_log_full.txt @@ -0,0 +1,64 @@ +Setting up Training Environment... +Creating Liquid PPO Agent... +Using cpu device +Wrapping the env with a `Monitor` wrapper +Wrapping the env in a DummyVecEnv. +Starting Training (This may take a while)... +---------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.12e+04 | +| time/ | | +| fps | 464 | +| iterations | 1 | +| time_elapsed | 4 | +| total_timesteps | 2048 | +---------------------------------- +Traceback (most recent call last): + File "/home/ylop/Documents/drone go brr/Drone-go-brrrrr/Drone-go-brrrrr/train.py", line 35, in + train() + ~~~~~^^ + File "/home/ylop/Documents/drone go brr/Drone-go-brrrrr/Drone-go-brrrrr/train.py", line 28, in train + model.learn(total_timesteps=total_timesteps, callback=checkpoint_callback) + ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/ppo/ppo.py", line 311, in learn + return super().learn( + ~~~~~~~~~~~~~^ + total_timesteps=total_timesteps, + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ...<4 lines>... + progress_bar=progress_bar, + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + ) + ^ + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/common/on_policy_algorithm.py", line 337, in learn + self.train() + ~~~~~~~~~~^^ + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/ppo/ppo.py", line 275, in train + loss.backward() + ~~~~~~~~~~~~~^^ + File "/home/ylop/.local/lib/python3.14/site-packages/torch/_tensor.py", line 625, in backward + torch.autograd.backward( + ~~~~~~~~~~~~~~~~~~~~~~~^ + self, gradient, retain_graph, create_graph, inputs=inputs + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ) + ^ + File "/home/ylop/.local/lib/python3.14/site-packages/torch/autograd/__init__.py", line 354, in backward + _engine_run_backward( + ~~~~~~~~~~~~~~~~~~~~^ + tensors, + ^^^^^^^^ + ...<5 lines>... + accumulate_grad=True, + ^^^^^^^^^^^^^^^^^^^^^ + ) + ^ + File "/home/ylop/.local/lib/python3.14/site-packages/torch/autograd/graph.py", line 841, in _engine_run_backward + return Variable._execution_engine.run_backward( # Calls into the C++ engine to run the backward pass + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + t_outputs, *args, **kwargs + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + ) # Calls into the C++ engine to run the backward pass + ^ +RuntimeError: Trying to backward through the graph a second time (or directly access saved tensors after they have already been freed). Saved intermediate values of the graph are freed when you call .backward() or autograd.grad(). Specify retain_graph=True if you need to backward through the graph a second time or if you need to access saved tensors after calling backward. diff --git a/train_log_retry.txt b/train_log_retry.txt new file mode 100644 index 0000000000000000000000000000000000000000..c8543ad324c031a23257a7ea819da84fd377bde9 --- /dev/null +++ b/train_log_retry.txt @@ -0,0 +1,314 @@ +Setting up Training Environment... +Creating Liquid PPO Agent... +Using cpu device +Wrapping the env with a `Monitor` wrapper +Wrapping the env in a DummyVecEnv. +Starting Training (This may take a while)... +---------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -1.79e+04 | +| time/ | | +| fps | 465 | +| iterations | 1 | +| time_elapsed | 4 | +| total_timesteps | 2048 | +---------------------------------- +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -1.91e+04 | +| time/ | | +| fps | 24 | +| iterations | 2 | +| time_elapsed | 169 | +| total_timesteps | 4096 | +| train/ | | +| approx_kl | 0.004881427 | +| clip_fraction | 0.0184 | +| clip_range | 0.2 | +| entropy_loss | -5.67 | +| explained_variance | 0.000221 | +| learning_rate | 0.0003 | +| loss | 4.46e+04 | +| n_updates | 10 | +| policy_gradient_loss | -0.00155 | +| std | 0.998 | +| value_loss | 9.86e+04 | +----------------------------------------- +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.01e+04 | +| time/ | | +| fps | 31 | +| iterations | 3 | +| time_elapsed | 196 | +| total_timesteps | 6144 | +| train/ | | +| approx_kl | 0.0020806824 | +| clip_fraction | 0.00215 | +| clip_range | 0.2 | +| entropy_loss | -5.66 | +| explained_variance | -6.6e-05 | +| learning_rate | 0.0003 | +| loss | 6.96e+04 | +| n_updates | 20 | +| policy_gradient_loss | -0.000315 | +| std | 0.996 | +| value_loss | 1.37e+05 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.08e+04 | +| time/ | | +| fps | 36 | +| iterations | 4 | +| time_elapsed | 226 | +| total_timesteps | 8192 | +| train/ | | +| approx_kl | 0.0041169263 | +| clip_fraction | 0.0206 | +| clip_range | 0.2 | +| entropy_loss | -5.66 | +| explained_variance | -5.96e-06 | +| learning_rate | 0.0003 | +| loss | 7.12e+04 | +| n_updates | 30 | +| policy_gradient_loss | -0.00234 | +| std | 0.994 | +| value_loss | 1.63e+05 | +------------------------------------------ +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.1e+04 | +| time/ | | +| fps | 42 | +| iterations | 5 | +| time_elapsed | 242 | +| total_timesteps | 10240 | +| train/ | | +| approx_kl | 0.003560378 | +| clip_fraction | 0.0138 | +| clip_range | 0.2 | +| entropy_loss | -5.66 | +| explained_variance | 6.62e-06 | +| learning_rate | 0.0003 | +| loss | 8.45e+04 | +| n_updates | 40 | +| policy_gradient_loss | -0.00122 | +| std | 0.998 | +| value_loss | 1.94e+05 | +----------------------------------------- +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.13e+04 | +| time/ | | +| fps | 47 | +| iterations | 6 | +| time_elapsed | 258 | +| total_timesteps | 12288 | +| train/ | | +| approx_kl | 0.0027945049 | +| clip_fraction | 0.0139 | +| clip_range | 0.2 | +| entropy_loss | -5.67 | +| explained_variance | 2.8e-06 | +| learning_rate | 0.0003 | +| loss | 6.45e+04 | +| n_updates | 50 | +| policy_gradient_loss | -0.00151 | +| std | 1 | +| value_loss | 1.47e+05 | +------------------------------------------ +----------------------------------------- +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.19e+04 | +| time/ | | +| fps | 52 | +| iterations | 7 | +| time_elapsed | 274 | +| total_timesteps | 14336 | +| train/ | | +| approx_kl | 0.004093081 | +| clip_fraction | 0.018 | +| clip_range | 0.2 | +| entropy_loss | -5.68 | +| explained_variance | 1.79e-07 | +| learning_rate | 0.0003 | +| loss | 9.83e+04 | +| n_updates | 60 | +| policy_gradient_loss | -0.00117 | +| std | 1 | +| value_loss | 1.69e+05 | +----------------------------------------- +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.21e+04 | +| time/ | | +| fps | 56 | +| iterations | 8 | +| time_elapsed | 290 | +| total_timesteps | 16384 | +| train/ | | +| approx_kl | 0.0041737873 | +| clip_fraction | 0.0396 | +| clip_range | 0.2 | +| entropy_loss | -5.67 | +| explained_variance | -2.38e-07 | +| learning_rate | 0.0003 | +| loss | 9.31e+04 | +| n_updates | 70 | +| policy_gradient_loss | -0.00342 | +| std | 0.996 | +| value_loss | 1.76e+05 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.21e+04 | +| time/ | | +| fps | 59 | +| iterations | 9 | +| time_elapsed | 309 | +| total_timesteps | 18432 | +| train/ | | +| approx_kl | 0.0060277004 | +| clip_fraction | 0.037 | +| clip_range | 0.2 | +| entropy_loss | -5.65 | +| explained_variance | 2.21e-06 | +| learning_rate | 0.0003 | +| loss | 6.73e+04 | +| n_updates | 80 | +| policy_gradient_loss | -0.00309 | +| std | 0.991 | +| value_loss | 1.55e+05 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.32e+04 | +| time/ | | +| fps | 62 | +| iterations | 10 | +| time_elapsed | 326 | +| total_timesteps | 20480 | +| train/ | | +| approx_kl | 0.0032014307 | +| clip_fraction | 0.0083 | +| clip_range | 0.2 | +| entropy_loss | -5.63 | +| explained_variance | 2.98e-07 | +| learning_rate | 0.0003 | +| loss | 8.79e+04 | +| n_updates | 90 | +| policy_gradient_loss | -0.000593 | +| std | 0.989 | +| value_loss | 1.53e+05 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.57e+04 | +| time/ | | +| fps | 64 | +| iterations | 11 | +| time_elapsed | 348 | +| total_timesteps | 22528 | +| train/ | | +| approx_kl | 0.0035356751 | +| clip_fraction | 0.012 | +| clip_range | 0.2 | +| entropy_loss | -5.61 | +| explained_variance | 5.96e-08 | +| learning_rate | 0.0003 | +| loss | 1.91e+05 | +| n_updates | 100 | +| policy_gradient_loss | -0.00137 | +| std | 0.981 | +| value_loss | 3.78e+05 | +------------------------------------------ +------------------------------------------ +| rollout/ | | +| ep_len_mean | 1e+03 | +| ep_rew_mean | -2.78e+04 | +| time/ | | +| fps | 67 | +| iterations | 12 | +| time_elapsed | 365 | +| total_timesteps | 24576 | +| train/ | | +| approx_kl | 0.0027306664 | +| clip_fraction | 0.00293 | +| clip_range | 0.2 | +| entropy_loss | -5.6 | +| explained_variance | 1.79e-07 | +| learning_rate | 0.0003 | +| loss | 4.31e+05 | +| n_updates | 110 | +| policy_gradient_loss | -0.000544 | +| std | 0.983 | +| value_loss | 9.15e+05 | +------------------------------------------ +Traceback (most recent call last): + File "/home/ylop/Documents/drone go brr/Drone-go-brrrrr/Drone-go-brrrrr/train.py", line 35, in + train() + ~~~~~^^ + File "/home/ylop/Documents/drone go brr/Drone-go-brrrrr/Drone-go-brrrrr/train.py", line 28, in train + model.learn(total_timesteps=total_timesteps, callback=checkpoint_callback) + ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/ppo/ppo.py", line 311, in learn + return super().learn( + ~~~~~~~~~~~~~^ + total_timesteps=total_timesteps, + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ...<4 lines>... + progress_bar=progress_bar, + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + ) + ^ + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/common/on_policy_algorithm.py", line 324, in learn + continue_training = self.collect_rollouts(self.env, callback, self.rollout_buffer, n_rollout_steps=self.n_steps) + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/common/on_policy_algorithm.py", line 202, in collect_rollouts + actions, values, log_probs = self.policy(obs_tensor) + ~~~~~~~~~~~^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/torch/nn/modules/module.py", line 1775, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/torch/nn/modules/module.py", line 1786, in _call_impl + return forward_call(*args, **kwargs) + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/common/policies.py", line 645, in forward + features = self.extract_features(obs) + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/common/policies.py", line 672, in extract_features + return super().extract_features(obs, self.features_extractor if features_extractor is None else features_extractor) + ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/stable_baselines3/common/policies.py", line 131, in extract_features + return features_extractor(preprocessed_obs) + File "/home/ylop/.local/lib/python3.14/site-packages/torch/nn/modules/module.py", line 1775, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/torch/nn/modules/module.py", line 1786, in _call_impl + return forward_call(*args, **kwargs) + File "/home/ylop/Documents/drone go brr/Drone-go-brrrrr/Drone-go-brrrrr/models/liquid_ppo.py", line 58, in forward + output, self.hx = self.ltc(observations, self.hx) + ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/torch/nn/modules/module.py", line 1775, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/torch/nn/modules/module.py", line 1786, in _call_impl + return forward_call(*args, **kwargs) + File "/home/ylop/.local/lib/python3.14/site-packages/ncps/torch/ltc.py", line 185, in forward + h_out, h_state = self.rnn_cell.forward(inputs, h_state, ts) + ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ + File "/home/ylop/.local/lib/python3.14/site-packages/ncps/torch/ltc_cell.py", line 282, in forward + next_state = self._ode_solver(inputs, states, elapsed_time) + File "/home/ylop/.local/lib/python3.14/site-packages/ncps/torch/ltc_cell.py", line 247, in _ode_solver + v_pre = numerator / (denominator + self._epsilon) + ^^^^^ +KeyboardInterrupt diff --git a/utils/__init__.py b/utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..aa3e6d4812597de4df8d6d1daa18fc9eae94a907 --- /dev/null +++ b/utils/__init__.py @@ -0,0 +1,2 @@ +"""Utility functions and helpers.""" +