sanju-1007's picture
Update app.py
fa114a9 verified
Raw
History Blame Contribute Delete
2.75 kB
import gradio as gr
import gymnasium as gym
import panda_gym
import imageio
import os
from stable_baselines3 import A2C
from huggingface_hub import hf_hub_download
# 1. Download and load your trained model
repo_id = "sanju-1007/PandaReachDense-PandaReachDense-v3"
filename = "a2c-PandaReachDense-v3.zip" # Updated to match your exact repo file
custom_objects = {
"learning_rate": 0.0,
"lr_schedule": lambda _: 0.0,
"clip_range": lambda _: 0.0,
}
checkpoint = hf_hub_download(repo_id=repo_id, filename=filename)
model = A2C.load(checkpoint, custom_objects=custom_objects, device="cpu")
def simulate_agent(seed, num_episodes=3):
"""Runs multiple live simulations and strings them into one smooth MP4 video."""
video_path = "live_rollout.mp4"
# Initialize environment for RGB rendering
env = gym.make("PandaReachDense-v3", render_mode="rgb_array")
frames = []
# Run 3 back-to-back episodes so the video is a good length (5-8 seconds)
for ep in range(num_episodes):
# We add 'ep' to the seed so the target moves to a new spot each time!
obs, info = env.reset(seed=int(seed) + ep)
for _ in range(100):
# The agent predicts the next movement
action, _states = model.predict(obs, deterministic=True)
obs, reward, terminated, truncated, info = env.step(action)
# Capture the visual frame
frames.append(env.render())
# If the robot successfully hits the target...
if terminated or truncated:
# Add 20 'padding' frames (about 0.6 seconds) so the viewer
# can actually see the robot holding its final position.
for _ in range(20):
frames.append(env.render())
break # Move on to the next episode
env.close()
# Compile frames to a smooth 30 FPS video
imageio.mimsave(video_path, frames, fps=30)
return video_path
# 2. Build the Gradio UI
with gr.Blocks(theme=gr.themes.Soft()) as demo:
gr.Markdown("# 🤖 Live A2C Agent: PandaReachDense-v3")
gr.Markdown("Change the seed to randomize the target position and watch the trained agent calculate the trajectory in real-time.")
with gr.Row():
with gr.Column():
seed_input = gr.Slider(minimum=0, maximum=1000, step=1, label="Environment Random Seed", value=42)
run_button = gr.Button("▶️ Run Simulation Live", variant="primary")
with gr.Column():
video_output = gr.Video(label="Agent Rollout")
run_button.click(fn=simulate_agent, inputs=seed_input, outputs=video_output)
# Launch the app
demo.launch()