| name | genie-envisioner-robotic-foundation |
| title | Genie Envisioner - World Foundation Platform for Robotic Manipulation |
| version | 0.0.2 |
| engine | skillxiv-v0.0.2-claude-opus-4.6 |
| license | MIT |
| url | https://arxiv.org/abs/2508.05635 |
| keywords | ["robotic-manipulation","video-diffusion","embodied-ai","foundation-models"] |
| description | Unified platform combining instruction-conditioned video diffusion, flow-matching action decoder, and action-conditioned simulator. Enables scalable robot learning without extensive labeled demonstrations. |
Genie Envisioner: World Foundation Platform for Robotic Manipulation
Core Concept
Genie Envisioner consolidates fragmented robotic manipulation research into a unified foundation platform. By combining video diffusion modeling for world understanding, a lightweight action decoder, and a neural simulator, the system enables instruction-driven robot learning that generalizes across embodiments and requires minimal demonstrations.
Architecture Overview
- GE-Base: Instruction-conditioned video diffusion model capturing spatial, temporal, and semantic dynamics of robot interactions
- GE-Act: Lightweight flow-matching decoder translating latent representations to executable action sequences
- GE-Sim: Action-conditioned neural simulator for generating high-fidelity rollouts
- Embodiment Generalization: Policies transfer across diverse robot morphologies
- Scalable Training: Efficient learning from limited demonstration data
Implementation Steps
Step 1: Build Instruction-Conditioned Video Diffusion (GE-Base)
Create video diffusion model that conditions on instructions.
import torch
import torch.nn as nn
from einops import rearrange
class InstructionConditionedVideoDiffusion(nn.Module):
"""
GE-Base: Instruction-conditioned video diffusion model.
"""
def __init__(self, video_channels=3, latent_dim=256, num_frames=16):
super().__init__()
self.video_channels = video_channels
self.latent_dim = latent_dim
self.num_frames = num_frames
self.text_encoder = self._build_text_encoder()
self.video_vae = self._build_3d_vae()
self.diffusion_model = self._build_diffusion_model()
def _build_text_encoder(self):
"""Encode instruction text to embedding."""
from transformers import CLIPTextModel
return CLIPTextModel.from_pretrained("openai/clip-vit-base-patch32")
def _build_3d_vae(self):
"""Build 3D VAE for video compression."""
class VideoVAE(nn.Module):
def ():
().__init__()
.encoder = nn.Sequential(
nn.Conv3d(in_channels, , , stride=, padding=),
nn.ReLU(),
nn.Conv3d(, , , stride=, padding=),
nn.ReLU(),
nn.Conv3d(, , , stride=, padding=),
)
.fc_mu = nn.Linear( * * * , latent_dim)
.fc_logvar = nn.Linear( * * * , latent_dim)
():
h = .encoder(x)
h = h.view(h.size(), -)
mu = .fc_mu(h)
logvar = .fc_logvar(h)
mu, logvar
VideoVAE()
():
(nn.Module):
():
().__init__()
.latent_dim = latent_dim
.text_proj = nn.Linear(text_dim, latent_dim)
.denoise_net = nn.Sequential(
nn.Linear(latent_dim, ),
nn.ReLU(),
nn.Linear(, ),
nn.ReLU(),
nn.Linear(, latent_dim)
)
():
text_cond = .text_proj(text_embedding)
noise_pred = .denoise_net(x_t + text_cond)
noise_pred
LatentDiffusionModel()
():
text_embeddings = .text_encoder(instruction)
video_reshaped = rearrange(video_frames, )
video_latent_mu, _ = .video_vae.encode(video_reshaped)
noise = torch.randn_like(video_latent_mu)
noisy_latent = video_latent_mu + noise
denoising_pred = .diffusion_model(noisy_latent, timestep, text_embeddings)
denoising_pred
():
z_t = torch.randn(, .latent_dim)
text_embeddings = .text_encoder([instruction])
t (num_steps, , -):
denoising_pred = .diffusion_model(z_t, t, text_embeddings)
z_t = z_t - denoising_pred
z_t
Step 2: Implement Flow-Matching Action Decoder (GE-Act)
Create lightweight decoder that converts latent representations to action sequences.
class FlowMatchingActionDecoder(nn.Module):
"""
GE-Act: Flow-matching decoder for action generation.
Maps latent representations to robot action sequences.
"""
def __init__(self, latent_dim=256, action_dim=7, seq_len=16):
super().__init__()
self.latent_dim = latent_dim
self.action_dim = action_dim
self.seq_len = seq_len
self.decoder = nn.TransformerDecoder(
nn.TransformerDecoderLayer(d_model=latent_dim, nhead=8),
num_layers=3
)
self.action_head = nn.Sequential(
nn.Linear(latent_dim, 256),
nn.ReLU(),
nn.Linear(256, action_dim)
)
def forward(self, latent_codes, seq_len=None):
"""
Decode latent codes to action sequence.
Args:
latent_codes: Latent representation [batch, seq_len, latent_dim]
seq_len: Target sequence length
Returns:
Action sequence [batch, seq_len, action_dim]
"""
if seq_len is None:
seq_len = self.seq_len
decoded = self.decoder(latent_codes)
actions = self.action_head(decoded[:, :seq_len])
actions = torch.tanh(actions)
actions
():
pred_actions = .forward(latent_codes, seq_len=target_actions.shape[])
flow_loss = torch.mean((pred_actions - target_actions) ** )
flow_loss
Step 3: Implement Action-Conditioned Simulator (GE-Sim)
Create neural simulator for rollout generation.
class ActionConditionedSimulator(nn.Module):
"""
GE-Sim: Neural simulator predicting next frames given actions.
"""
def __init__(self, latent_dim=256, action_dim=7, num_frames=16):
super().__init__()
self.latent_dim = latent_dim
self.action_dim = action_dim
self.num_frames = num_frames
self.action_encoder = nn.Sequential(
nn.Linear(action_dim, 128),
nn.ReLU(),
nn.Linear(128, latent_dim)
)
self.frame_predictor = nn.LSTM(
input_size=latent_dim * 2,
hidden_size=256,
num_layers=2,
batch_first=True
)
self.frame_decoder = nn.Sequential(
nn.Linear(256, 512),
nn.ReLU(),
nn.Linear(512, latent_dim)
)
def forward(self, initial_frame_latent, actions):
"""
Generate video rollout given initial frame and actions.
Args:
initial_frame_latent: Initial frame latent [batch, latent_dim]
actions: Action sequence [batch, seq_len, action_dim]
Returns:
Predicted frame latents [batch, seq_len, latent_dim]
"""
seq_len = actions.shape[1]
batch_size = actions.shape[0]
encoded_actions = self.action_encoder(actions)
frame_latents = [initial_frame_latent]
hidden_state =
t (seq_len):
lstm_input = torch.cat(
[frame_latents[-], encoded_actions[:, t]],
dim=-
).unsqueeze()
lstm_out, hidden_state = .frame_predictor(lstm_input, hidden_state)
next_frame = .frame_decoder(lstm_out.squeeze())
frame_latents.append(next_frame)
predicted_latents = torch.stack(frame_latents[:], dim=)
predicted_latents
():
predicted = .forward(initial_frame, actions)
loss = torch.mean((predicted - target_frames) ** )
loss
Step 4: Integrate Components into Unified Platform
Combine all components into end-to-end system.
class GenieEnvisioner(nn.Module):
"""
Unified platform combining GE-Base, GE-Act, and GE-Sim.
"""
def __init__(self, latent_dim=256, action_dim=7):
super().__init__()
self.video_diffusion = InstructionConditionedVideoDiffusion()
self.action_decoder = FlowMatchingActionDecoder()
self.simulator = ActionConditionedSimulator()
def forward(self, instruction, initial_frame, num_frames=16):
"""
Generate manipulation trajectory from instruction.
Args:
instruction: Text instruction
initial_frame: Starting frame
num_frames: Length of trajectory
Returns:
Predicted frame sequence and actions
"""
initial_latent, _ = self.video_diffusion.video_vae.encode(initial_frame)
actions = self.action_decoder(
initial_latent.unsqueeze(1).repeat(1, num_frames, 1)
)
predicted_frames = self.simulator(initial_latent, actions)
return predicted_frames, actions
def train_on_demonstrations(self, demonstrations, num_epochs=10):
"""
Train platform on robot demonstrations.
Args:
demonstrations: List of (instruction, video, actions) tuples
num_epochs: Training epochs
"""
optimizer = torch.optim.Adam(self.parameters(), lr=1e-4)
epoch (num_epochs):
total_loss =
instruction, video, actions demonstrations:
video_latent_mu, _ = .video_diffusion.video_vae.encode(video)
action_loss = .action_decoder.flow_matching_loss(
video_latent_mu.unsqueeze(),
actions.unsqueeze()
)
rollout_loss = .simulator.rollout_loss(
video_latent_mu[],
actions,
video_latent_mu[:]
)
loss = action_loss + rollout_loss
optimizer.zero_grad()
loss.backward()
optimizer.step()
total_loss += loss.item()
()
Practical Guidance
When to Use Genie Envisioner
- Robot learning from limited demos: <100 trajectories per task
- Embodiment transfer: Single model for multiple robot types
- Instruction-conditioned manipulation: Text-guided robot tasks
- Sim-to-real transfer: Neural simulator for domain randomization
When NOT to Use Genie Envisioner
- Real-time control: Diffusion generation adds latency
- Precise manipulation: Neural approximation may lack precision
- Fully unseen objects: Limited generalization without diverse training
- Contact-rich tasks: Simulator may miss subtle dynamics
Hyperparameter Recommendations
- Latent dimension: 256-512 for rich representation
- Action dimension: 6-7 (position + gripper)
- Frame sequence length: 16-32 frames per trajectory
- Diffusion steps: 50 steps balances quality and speed
- Learning rate: 1e-4 for stable training
Key Insights
The critical innovation is unifying world modeling (GE-Base), action generation (GE-Act), and simulation (GE-Sim) into one framework. Rather than separate systems for learning, evaluation, and simulation, this approach leverages the same latent representation across all components, enabling efficient transfer learning and embodiment generalization.
Reference
Genie Envisioner: Unified World Foundation Platform for Robotic Manipulation (arXiv:2508.05635)
Introduces integrated platform combining instruction-conditioned video diffusion, flow-matching action decoder, and neural simulator. Enables scalable robot learning across embodiments with minimal demonstration data.