Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| import time | |
| import os | |
| import uuid | |
| from PIL import Image | |
| import numpy as np | |
| import cv2 | |
| is_recording = False | |
| command_log = [] | |
| # Placeholder image path or URL | |
| placeholder_image_path = 'images.png' | |
| try: | |
| from jetbot import Robot, Camera, bgr8_to_jpeg | |
| robot = Robot() | |
| camera = Camera.instance() | |
| except ImportError as e: | |
| print(f"Import error: {e}\nRunning in simulation mode.") | |
| robot = None | |
| camera = None | |
| def move_forward(): | |
| if robot: | |
| robot.forward(0.3) | |
| time.sleep(1) | |
| robot.stop() | |
| def move_backward(): | |
| if robot: | |
| robot.backward(0.3) | |
| time.sleep(1) | |
| robot.stop() | |
| def turn_left(): | |
| if robot: | |
| robot.left(0.3) | |
| time.sleep(1) | |
| robot.stop() | |
| def turn_right(): | |
| if robot: | |
| robot.right(0.3) | |
| time.sleep(1) | |
| robot.stop() | |
| def toggle_recording(): | |
| global is_recording | |
| is_recording = not is_recording | |
| if not is_recording: | |
| return "Recording stopped. Ready to replay." | |
| else: | |
| command_log.clear() | |
| return "Recording started. Please execute commands." | |
| def record_command(command, *params): | |
| if is_recording: | |
| command_log.append((command, params)) | |
| def replay_commands(): | |
| if not command_log: | |
| return "No commands recorded." | |
| for func, params in command_log: | |
| print(func,params) | |
| func(*params) | |
| time.sleep(1) # delay between commands for clarity | |
| return "Replay finished." | |
| def stop(): | |
| if robot: | |
| robot.stop() | |
| def set_speed_left(speed): | |
| if robot: | |
| robot.left_motor.value = speed | |
| def set_speed_right(speed): | |
| if robot: | |
| robot.right_motor.value = speed | |
| def update_camera(): | |
| if camera: | |
| # Assuming the camera.value is a numpy array in BGR format | |
| # Convert from BGR to RGB | |
| rgb_image = cv2.cvtColor(camera.value, cv2.COLOR_BGR2RGB) | |
| # Convert numpy array to PIL Image | |
| pil_image = Image.fromarray(rgb_image) | |
| return pil_image | |
| else: | |
| # Load the placeholder image as a PIL Image | |
| with open(placeholder_image_path, 'rb') as f: | |
| pil_image = Image.open(f) | |
| pil_image.load() # This might be necessary depending on how PIL handles lazy loading | |
| return pil_image | |
| def move_robot(direction, duration=1.0): | |
| if robot: | |
| getattr(robot, direction)(0.3) | |
| robot.sleep(duration) | |
| robot.stop() | |
| record_command(move_robot, direction, duration) | |
| def save_snapshot(): | |
| if camera: | |
| image_path = f"snapshots/{uuid.uuid4()}.jpeg" | |
| with open(image_path, 'wb') as f: | |
| f.write(update_camera()) | |
| return image_path | |
| else: | |
| return placeholder_image_path | |
| # Ensure snapshot directory exists | |
| os.makedirs('snapshots', exist_ok=True) | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# JetBot Control Panel") | |
| gr.Markdown("Use the controls below to operate the JetBot. Ensure the area is clear before sending commands to avoid collisions.") | |
| with gr.Row(): | |
| record_button = gr.Button("🔴 Start/⏹️ Stop Recording") | |
| replay_button = gr.Button("🔁Replay Commands") | |
| record_status = gr.Textbox(label="Recording Status", value="Recording not started.") | |
| record_button.click(toggle_recording, outputs=record_status) | |
| replay_button.click(replay_commands, outputs=record_status) | |
| with gr.Row(): | |
| left_speed = gr.Slider(-1.0, 1.0, step=0.1, label="Left Motor Speed", value=0.0) | |
| right_speed = gr.Slider(-1.0, 1.0, step=0.1, label="Right Motor Speed", value=0.0) | |
| with gr.Row(): | |
| directions = ['⬆️ Forward', '⬅️ Left', '🛑 Stop', '➡️ Right', '⬇️ Backward'] | |
| for direction in directions: | |
| gr.Button(direction.title(), elem_id=f"{direction}_button").click( | |
| fn=lambda x=direction: move_robot(x), inputs=[], outputs=[]) | |
| left_speed.change(set_speed_left, inputs=[left_speed], outputs=[]) | |
| right_speed.change(set_speed_right, inputs=[right_speed], outputs=[]) | |
| with gr.Row(): | |
| live_feed = gr.Image(streaming=True,value=update_camera) | |
| snapshot_result = gr.Image(width=300, height=300, label="Last Snapshot") | |
| snapshot_button = gr.Button("📸 Take Snapshot", elem_id="snapshot_button").click(save_snapshot, outputs=snapshot_result) | |
| gr.Markdown("### Instructions") | |
| gr.Markdown("1. **Move the Sliders**: Adjust the sliders to change the speed of the left and right motors.") | |
| gr.Markdown("2. **Press the Buttons**: Use the directional buttons to move the JetBot. Press 'Stop' to halt any movement.") | |
| gr.Markdown("3. **Camera and Snapshot**: View the live feed and take snapshots using the button.") | |
| demo.launch() | |