features = {
"observation.state": {"dtype": "float32", "shape": [14]},
"observation.images.top": {"dtype": "video", "shape": [3, 480, 640]},
"observation.images.wrist": {"dtype": "video", "shape": [3, 480, 640]},
"observation.images.side": {"dtype": "video", "shape": [3, 480, 640]},
"action": {"dtype": "float32", "shape": [14]},
}
dataset = LeRobotDataset.create(
repo_id="username/multi-camera",
fps=30,
features=features,
use_videos=True,
)
dataset = LeRobotDataset(
"username/multi-camera",
streaming_encoding=True,
vcodec="auto", # Uses hardware encoder
encoder_queue_maxsize=60, # 2s buffer per camera
encoder_threads=2, # Threads per camera
)
# 3 cameras encode in parallel
with VideoEncodingManager(dataset):
for ep_idx in range(num_episodes):
episode_buffer = dataset.create_episode_buffer()
for t in range(max_steps):
frame = {
"observation.state": robot.get_state(),
"observation.images.top": robot.get_camera("top"),
"observation.images.wrist": robot.get_camera("wrist"),
"observation.images.side": robot.get_camera("side"),
"action": robot.get_action(),
"task": "Manipulation task",
}
dataset.add_frame(frame)
dataset.save_episode(task="Manipulation task", encode_videos=True)
dataset.finalize()