Skip to content

Quick Start

Submit your first policy in 5 minutes.

1. Create a Policy

Create policy.py:

import numpy as np

def policy(observation: dict) -> np.ndarray:
    """Simple policy that moves toward objects."""
    robot_pos = observation['robot_state'][:3]
    objects = observation['object_positions']

    if len(objects) == 0:
        return np.zeros(7)

    # Move toward nearest object
    target = objects[0]
    direction = target - robot_pos
    direction = direction / (np.linalg.norm(direction) + 1e-6)

    action = np.zeros(7)
    action[:3] = direction * 0.5
    return action

2. Package It

zip policy.zip policy.py

3. Submit

from botmanifold import BotManifoldClient

client = BotManifoldClient()

submission = client.submit(
    policy_path="policy.zip",
    scenario="messy_room_v1"
)

print(f"Submitted! ID: {submission.id}")

4. Wait for Results

import time

while True:
    status = client.get_submission(submission.id)
    print(f"Status: {status.status}")

    if status.status in ['COMPLETED', 'FAILED']:
        break

    time.sleep(5)

print(f"Verdict: {status.verdict}")
print(f"Score: {status.score}")

5. Watch the Video

# Get video URL
video_url = status.video_url
print(f"Watch at: {video_url}")

# Or download
client.download_video(submission.id, "result.mp4")

Complete Example

from botmanifold import BotManifoldClient
import time

# Initialize
client = BotManifoldClient()

# Submit
print("Submitting policy...")
submission = client.submit(
    policy_path="policy.zip",
    scenario="messy_room_v1"
)
print(f"Submission ID: {submission.id}")

# Poll for completion
print("Waiting for results...")
while True:
    status = client.get_submission(submission.id)

    if status.status == 'COMPLETED':
        print(f"\nSuccess!")
        print(f"Verdict: {status.verdict}")
        print(f"Score: {status.score}")
        print(f"Video: {status.video_url}")
        break
    elif status.status == 'FAILED':
        print(f"\nFailed: {status.error}")
        break
    else:
        print(f"  Status: {status.status}")
        time.sleep(5)

Next Steps