Data Collection#
RoboEval provides tools for collecting high-quality demonstrations using keyboard or VR teleoperation.
Keyboard Teleoperation#
Collect demonstrations using keyboard controls:
python examples/6_collect_data.py
Left Arm Controls:
A/D: Left/Right (X-axis)
Z/C: Forward/Backward (Y-axis)
W/S: Up/Down (Z-axis)
V: Gripper open/close
Right Arm Controls:
J/L: Left/Right (X-axis)
U/O: Forward/Backward (Y-axis)
I/K: Up/Down (Z-axis)
B: Gripper open/close
Recording Controls:
R: Start recording demonstration (resets environment)
X: Save and stop current demonstration
T: Toggle position/orientation control modes
G: Toggle gripper mode (autoclose vs hold-to-close)
ESC: Exit
VR Teleoperation#
High-quality data collection with Oculus Quest:
Prerequisites:
Oculus Quest headset (Quest 2, Quest Pro, or Quest 3)
USB-C cable for connection
Developer mode enabled on Oculus Quest
ADB installed and configured
Setup:
Enable Developer Mode on Oculus Quest (via Oculus app on phone)
Connect Oculus Quest to computer via USB-C
Allow USB debugging when prompted in headset
Install VR dependencies:
pip install -e ".[vr]"
Verify connection:
adb devices # Should show your Quest device
Run data collection:
python examples/7_collect_data_oculus.py
Controller Mapping:
- Left Controller:
Position/Rotation: Physical hand position/rotation controls left end-effector
Trigger: Squeeze to close gripper, release to open
- Right Controller:
Position/Rotation: Physical hand position/rotation controls right end-effector
Trigger: Squeeze to close gripper, release to open
- Button Controls:
A Button: Start recording demonstration
B Button: Save current demonstration
Y Button: Toggle gripper autoclose mode
Custom Data Collection#
Create your own data collection script:
from pathlib import Path
from roboeval.action_modes import JointPositionActionMode
from roboeval.robots.configs.panda import BimanualPanda
from roboeval.data_collection.keyboard_input import KeyboardTeleop
from roboeval.envs.manipulation import LiftPot
# Set up keyboard teleoperation
demo_dir = Path("./my_demos")
demo_dir.mkdir(exist_ok=True)
teleop = KeyboardTeleop(
env_cls=LiftPot,
action_mode=JointPositionActionMode(
floating_base=True,
absolute=True,
floating_dofs=[]
),
resolution=(900, 1000),
demo_directory=demo_dir,
robot_cls=BimanualPanda,
config={"env": "Lift Pot", "robot": "Bimanual Panda"}
)
# Start teleoperation (blocks until exit)
teleop.run()
Demonstration Storage#
Demonstrations are saved in a standardized format:
from roboeval.demonstrations.demo_store import DemoStore
from roboeval.demonstrations import Demo
# Save demonstration
demo_store = DemoStore()
demo_store.save_demo(demo, metadata)
# Load demonstrations
demos = demo_store.get_demos(metadata, amount=10)
Best Practices#
Use control_frequency=20 for consistency with dataset
Record multiple attempts for diversity
Save failed attempts for negative examples
Add metadata (task, robot, timestamp)
Next Steps#
Work with Demonstrations
Learn about Metrics for tracking custom metrics