🏭 EMBODIED AI & ROBOTICS β€” Ketika AI Mendapatkan Tubuh

VLA Models (RT-2 Β· PaLM-E) Β· Sim-to-Real Β· Robotic Foundation Models Β· Open Challenges

Filosofi Fundamental

Sebuah LLM bisa menulis esai tentang cara membuat kopi, tapi tidak bisa mengangkat cangkir. Embodied AI adalah jembatan antara kognisi digital dan aksi fisik. Dokumen ini membedah revolusi VLA (Vision-Language-Action) β€” model yang menggabungkan penglihatan, bahasa, dan gerakan dalam satu arsitektur β€” dari RT-2 Google DeepMind hingga Ο€0 (Physical Intelligence). Dibahas juga Sim-to-Real transfer, robotic foundation models, dan mengapa robotik adalah β€œfinal frontier” AI.


Daftar Isi


First Principles β€” Mengapa Embodiment Penting

Apa itu Embodied AI?

Embodied AI β‰  β€œrobot with ChatGPT.” Embodied AI adalah agen yang:

  1. Menerima input sensorik dari dunia fisik (kamera, tactile, proprioception)
  2. Mengambil keputusan berdasarkan input + tujuan
  3. Bertindak di dunia fisik melalui aktuator (lengan, kaki, gripper)
  4. Menerima feedback dari lingkungan (berhasil/gagal, collision, force)

Mengapa Ini Sulit?

Masalah fundamental: Simbol Grounding Problem
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ LLM: "Cangkir ada di atas meja"                        β”‚
β”‚   β†’ Ini hanya simbol β€” model tidak pernah mengalami    β”‚
β”‚     berat, tekstur, atau keseimbangan cangkir.         β”‚
β”‚                                                        β”‚
β”‚ Embodied AI: "Ambil cangkir itu"                       β”‚
β”‚   β†’ Harus: deteksi β†’ pose estimation β†’ trajectory      β”‚
β”‚     planning β†’ force control β†’ grasp β†’ verify          β”‚
β”‚   β†’ Satu kegagalan di salah satu langkah = gagal total β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Embodiment Spectrum

Level 0: Text Only (LLM) β€” Tidak ada embodiment
Level 1: Vision Only β€” Melihat tapi tidak bisa bertindak
Level 2: Vision + Language (VLM) β€” Melihat + memahami
Level 3: Vision + Language + Action (VLA) β€” Melihat + memahami + bertindak ⭐
Level 4: VLA + Memory β€” Belajar dari pengalaman fisik
Level 5: VLA + Curiosity β€” Eksplorasi aktif, belajar skill baru

VLA β€” Vision-Language-Action Models

Arsitektur VLA

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      VISUAL ENCODER                         β”‚
β”‚  (ViT / SigLIP / DINOv2) β€” extract visual features         β”‚
β”‚  Input: image(s) β†’ Output: visual tokens           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β”‚
                         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      LANGUAGE MODEL                         β”‚
β”‚  (PaLM / Llama / GPT) β€” reasoning + planning               β”‚
β”‚  Input: visual tokens + text instruction                   β”‚
β”‚  Output: reasoning tokens + action tokens                  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β”‚
                         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      ACTION HEAD                            β”‚
β”‚  Decode action tokens β†’ continuous/low-level control       β”‚
β”‚  Output: end-effector pose, joint angles, gripper          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Diskritisasi Aksi β€” RT-2 Approach

Masalah: Robot action space kontinu (pose 6-DoF + gripper). Language model output diskrit (tokens).

Solusi RT-2: Diskritisasi continuous action ke bins.

Action space:
  x: [-0.5, 0.5] β†’ 256 bins β†’ token
  y: [-0.5, 0.5] β†’ 256 bins β†’ token
  z: [-0.2, 0.5] β†’ 128 bins β†’ token
  roll: [-Ο€, Ο€] β†’ 64 bins β†’ token
  pitch: [-Ο€, Ο€] β†’ 64 bins β†’ token
  yaw: [-Ο€, Ο€] β†’ 64 bins β†’ token
  gripper: [0, 1] β†’ 2 bins β†’ token

Total action tokens per timestep: 7 tokens
Action vocabulary: ~1,000 tokens dari total 256K model vocabulary

Keuntungan: Action tokens bisa diproses seperti language tokens β€” autoregressive generation. Kerugian: Resolusi terbatas oleh jumlah bins. Halusηš„θΏεŠ¨ diperlukan post-processing.


RT-2 β€” Robotic Transformer 2 (Google DeepMind)

Filosofi

RT-2 membawa internet-scale knowledge ke robotik. Model VLM yang di-fine-tune dengan data robotic.

Web-scale pre-training (PaLI-X / PaLM-E)
  β”œβ”€β”€ Milyaran gambar + teks dari internet
  β”œβ”€β”€ Tahu konsep: "cangkir", "meja", "ambilkan"
  └── Tahu relasi: "cangkir di atas meja"
          β”‚
          β–Ό
Robotic fine-tuning
  β”œβ”€β”€ Ribuan episode robotic demonstration
  β”œβ”€β”€ Mapping: "ambilkan cangkir" β†’ action tokens
  └── Generalisasi ke object/scene baru

Detail Arsitektur

KomponenDetail
Base ModelPaLI-X (55B) atau PaLM-E (562B)
Visual EncoderViT-22B + SigLIP
TrainingCo-Fine-Tuning: web data + robotic data simultan
Action Rep8 bins per dimensi β†’ token
Sequence6 timestep history β†’ predict next action
InferenceAutoregressive: 7 action tokens per step

CoT + RT-2

Chain-of-Thought sebelum action:

Input: "Ambil apel merah di sebelah cangkir"
Model generates:
  Thought: "Ada apel merah dan cangkir putih di atas meja.
            Apel merah di sebelah kiri cangkir.
            Saya perlu menjangkau apel merah."
  Action: [0.32, -0.15, 0.45, 0.1, -0.3, 0.5, 0.8]

Hasil: CoT meningkatkan success rate dari 62% β†’ 78% pada task unseen.

Evaluasi RT-2

TaskRT-2 (No CoT)RT-2 (CoT)Baseline (Gato)
Pick & Place (seen)87%91%72%
Pick & Place (unseen)62%78%35%
Multi-step (3 steps)42%58%18%
Distractor rejection68%81%41%

PaLM-E β€” Embodied Reasoning at Scale

Inovasi PaLM-E

PaLM-E mengintegrasikan continuous sensor data langsung ke dalam language model sebagai embodied tokens.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                       INPUT STREAM                           β”‚
β”‚                                                              β”‚
β”‚  Text: "Ambil kotak merah dari laci atas"                  β”‚
β”‚  Image(s): 3 camera views                                    β”‚
β”‚  State: joint_positions [0.1, -0.3, 0.5, ...]              β”‚
β”‚  Neural 3D: scene representation vector                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β”‚
                         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      ENCODERS                                β”‚
β”‚                                                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  Text    β”‚  β”‚  Visual  β”‚  β”‚  State   β”‚  β”‚   Neural   β”‚    β”‚
β”‚  β”‚  Encoder β”‚  β”‚  Encoder β”‚  β”‚  Encoder β”‚  β”‚   3D       β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚       β”‚             β”‚             β”‚              β”‚           β”‚
β”‚       β–Ό             β–Ό             β–Ό              β–Ό           β”‚
β”‚  tokens         visual tokens   state tokens   3d tokens     β”‚
β”‚                                                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚                PaLM (562B) Decoder-Only                β”‚  β”‚
β”‚  β”‚  [Text tokens] [Visual tokens] [State tokens] [3D]     β”‚  β”‚
β”‚  β”‚  β†’ Reasoning β†’ Planning β†’ Action tokens                β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Kemampuan Unik PaLM-E

KemampuanDeskripsiContoh
Active PerceptionGerak untuk melihat lebih baik”Saya tidak bisa melihat kotak, putar kamera 45Β°β€œ
Failure RecoveryDeteksi + koreksi kegagalan”Gagal grasp β€” coba lagi dengan posisi 2cm ke kiri”
Multi-modal ReasoningGabung visual + state + language”Objek terlalu berat untuk suction gripper”
Task PlanningBreakdown task kompleks”Ambil kotak β†’ buka laci β†’ letakkan β†’ tutup laci”
Language GroundingHubungkan simbol ke fisik”Kiri” = koordinat relatif -0.3m dari current pose

Sim-to-Real Transfer

Reality Gap

Simulator tidak pernah sempurna. Perbedaan antara simulasi dan realitas = reality gap.

AspekSimulatorDunia Nyata
FisikaApproximate (PBD, spring-damper)Real physics
SensorPerfect, no noiseNoise, latency, dropout
AktuatorInstant, preciseDelay, backlash, friction
ObjectPerfect mesh, uniformDeformasi, variasi, texture
LightingControlledUnpredictable
LatencyDeterministicStochastic

Domain Randomization (DR)

Strategi paling efektif untuk menjembatani reality gap.

Prinsip: Variasi parameter simulasi secara acak β†’ policy belajar menjadi robust terhadap variasi.

# Contoh domain randomization untuk robot arm
def randomize_scene():
    # 1. Visual randomization
    lighting = {
        "direction": uniform(0, 360),
        "intensity": uniform(500, 2000),  # lux
        "color_temp": uniform(3000, 7000),  # Kelvin
    }
    table_texture = random.choice(TEXTURES)  # wood, metal, plastic
    object_color = random_color()  # RGB random
 
    # 2. Physics randomization
    physics = {
        "friction": uniform(0.2, 1.5),       # Coefficient
        "mass_scale": uniform(0.5, 2.0),       # Object mass multiplier
        "gravity": uniform(8.0, 10.0),         # m/sΒ²
        "joint_damping": uniform(0.01, 0.1),   # Motor damping
        "control_latency": uniform(0, 0.05),   # Detik
    }
 
    # 3. Camera randomization
    camera = {
        "position_noise": uniform(-0.02, 0.02),  # meter
        "fov_noise": uniform(-2, 2),              # degrees
        "motion_blur": uniform(0, 0.5),           # intensity
    }
 
    return {"lighting": lighting, "physics": physics, "camera": camera}

Domain Adaptation

Pendekatan alternatif: Align feature distribution antara domain simulasi dan real.

                   Sim Data β†’ Feature Extractor β†’ Sim Features
                                                    β”‚
                                              Domain Adversarial
                                              Loss (GAN-based)
                                                    β”‚
                   Real Data β†’ Feature Extractor β†’ Real Features
                                                    β”‚
                                              Task Policy
                                              (shared untuk kedua domain)

System Identification

Tune simulator agar match real world dynamics:

def sys_id(real_trajectory, initial_params):
    """Cari parameter simulator yang paling match dengan real data"""
 
    def sim_loss(params):
        # Run simulator with params
        sim_traj = run_sim(params, real_trajectory.actions)
        # MSE between sim and real states
        return np.mean((sim_traj.states - real_trajectory.states) ** 2)
 
    # Bayesian optimization untuk mencari parameter optimal
    best_params = bayesian_optimize(
        sim_loss,
        param_space={
            "friction": (0.1, 2.0),
            "mass": (0.1, 5.0),
            "damping": (0.001, 0.5),
        },
        n_iterations=100,
    )
    return best_params

Sim-to-Real Success Stories

ProjectTaskSimReal SuccessTeknik
OpenAI DactylRubik’s cubeMuJoCo100%DR + LSTM + asymm. actor-critic
Drone RacingGate traversalFlightGoggles95%DR + GAN domain adaptation
ANYmalRough terrain locomotionRaiSim90%DR + teacher-student
RLBenchMulti-task manipulationCoppeliaSim45-75%Per-task (masih rendah)

Robotic Foundation Models β€” Ekosistem

Perbandingan Model

ModelOrgTahunArsitekturDataAction SpaceOpen Source?
RT-2Google DeepMind2023PaLI-X β†’ actionWeb data + ~10K demo❌
RT-XOpen X-Embodiment2023RT-2 arch + multi-embodiment1M+ episode, 22 robotsβœ…
PaLM-EGoogle2023PaLM + embodied tokensInternet + robotic❌
OctoUC Berkeley2023Transformer-basedOpen X-Embodimentβœ…
Ο€0 (Pi-Zero)Physical Intelligence2024Flow matching + VLMMulti-robot, multi-task❌
MOOMIT2024Object-centric VLAProprietary❌
GraspGPTMicrosoft2024LLM-based grasp planningInternet❌

Open X-Embodiment Dataset

Dataset terbesar dan paling beragam untuk robotic learning:

MetrikNilai
Total episodes1,000,000+
Robot platforms22 (Franka, Kuka, UR5, Sawyer, Spot, etc.)
Tasks527 (pick, place, push, open, close, pour, etc.)
Environments60+ labs worldwide
AnnotationsLanguage instructions, task IDs, success/failure

Format RT-X (unified):

{
    "episode_id": "franka_00142",
    "robot": "franka_panda",
    "steps": [
        {
            "observation": {
                "image_0": np.array (480, 640, 3),
                "image_1": np.array (480, 640, 3),
                "joint_positions": [0.1, -0.3, 0.5, ...],
                "gripper_position": 0.04,
            },
            "action": {
                "world_vector": [0.23, -0.12, 0.05],
                "rotation_delta": [0.01, -0.03, 0.02],
                "gripper_open": 0.0,
            },
            "language_instruction": "pick up the red apple",
            "reward": 0.0 if step < len-1 else 1.0,
        },
    ]
}

Toolchain Robotik β€” dari Simulasi ke Deploy

Simulators

SimulatorFisikaVisualRobot SupportRL SupportGPU
MuJoCoβœ… Excellent❌ Basicβœ… Broadβœ… Native❌
Isaac Sim (NVIDIA)βœ… Excellentβœ… Photorealβœ… Broadβœ… Nativeβœ…
PyBullet⚠️ OK⚠️ Basicβœ… Broad⚠️ DIY❌
Habitat (Meta)❌ N/Aβœ… Excellent❌ Navigationβœ…βœ…
CoppeliaSimβœ… Good⚠️ OKβœ… Broad⚠️ API⚠️
SAPIEN⚠️ OKβœ… Goodβœ… Maniulationβœ…βœ…

Robot Middleware

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    ROS 2 (Humble)                         β”‚
β”‚                                                           β”‚
β”‚  rclpy/rclcpp β€” Node-based distributed architecture      β”‚
β”‚  Topics β€” pub/sub communication (camera, joint state)    β”‚
β”‚  Actions β€” goal-based (move_arm, grasp)                  β”‚
β”‚  Services β€” request/reply (get_pose, detect_object)      β”‚
β”‚  TF2 β€” coordinate transform tree                         β”‚
β”‚  Gazebo β€” simulation bridge              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Reinforcement Learning Stack

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  SB3     β”‚   β”‚  Gymnasiumβ”‚  β”‚  Sim     β”‚   β”‚  Policy  β”‚
β”‚  (SAC)   │──►│  Env      │──►│  (MuJoCo)│──►│  Deploy  β”‚
β”‚  PPO     β”‚   β”‚  Wrapper  β”‚   β”‚  Isaac   β”‚   β”‚  β†’ Real  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Implementasi β€” Step by Step

Langkah 1: Setup Simulasi dengan MuJoCo + Gym

import mujoco
import gymnasium as gym
import numpy as np
 
# Load robot model (Franka Panda example)
model = mujoco.MjModel.from_xml_path("franka_panda.xml")
data = mujoco.MjData(model)
 
class RobotEnv(gym.Env):
    def __init__(self, model_path, render_mode=None):
        self.model = mujoco.MjModel.from_xml_path(model_path)
        self.data = mujoco.MjData(self.model)
 
        # Action space: 7 joint velocities + gripper
        self.action_space = gym.spaces.Box(
            low=np.array([-1.0]*7 + [0.0]),
            high=np.array([1.0]*7 + [1.0]),
            dtype=np.float32,
        )
 
        # Observation: joint positions, end-effector pose, gripper
        self.observation_space = gym.spaces.Dict({
            "joint_pos": gym.spaces.Box(-3.14, 3.14, (7,)),
            "ee_pose": gym.spaces.Box(-2.0, 2.0, (7,)),  # xyz + quat
            "gripper": gym.spaces.Box(0.0, 0.08, (1,)),
            "image": gym.spaces.Box(0, 255, (224, 224, 3), dtype=np.uint8),
        })
 
        # Rendering
        self.renderer = mujoco.Renderer(self.model)
 
    def step(self, action):
        # Apply action
        self.data.ctrl[:7] = action[:7]  # Joint velocities
        self.data.ctrl[7] = action[7]    # Gripper
 
        # Physics step
        mujoco.mj_step(self.model, self.data)
 
        # Get observation
        obs = self._get_obs()
 
        # Reward: distance to goal
        reward = -np.linalg.norm(obs["ee_pose"][:3] - self.goal_pos)
 
        # Done: close enough or timeout
        done = reward > -0.02  # < 2cm from goal
 
        return obs, reward, done, False, {}
 
    def _get_obs(self):
        # Extract joint positions
        joint_pos = self.data.qpos[:7].copy()
 
        # End-effector pose from FK
        ee_id = self.model.body("end_effector").id
        ee_pose = np.concatenate([
            self.data.xpos[ee_id],
            self.data.xquat[ee_id],
        ])
 
        # Render image
        self.renderer.update_scene(self.data, camera="front")
        image = self.renderer.render().copy()
 
        return {
            "joint_pos": joint_pos,
            "ee_pose": ee_pose,
            "gripper": np.array([self.data.qpos[7]]),
            "image": image,
        }

Langkah 2: Train Policy dengan SAC

from stable_baselines3 import SAC
from stable_baselines3.common.vec_env import DummyVecEnv
 
# Domain randomization wrapper
class DomainRandomizationWrapper(gym.Wrapper):
    def reset(self, **kwargs):
        # Randomize physics
        self.model.opt.gravity[2] = np.random.uniform(-10.0, -8.0)
 
        # Randomize object pose
        obj_id = self.model.body("object").id
        self.model.body_pos[obj_id][:2] = np.random.uniform(-0.2, 0.2, 2)
 
        # Randomize goal
        self.goal_pos = np.random.uniform([0.2, -0.3, 0.0], [0.5, 0.3, 0.3])
 
        return self.env.reset(**kwargs)
 
# Create env
env = DummyVecEnv([lambda: DomainRandomizationWrapper(RobotEnv("robot.xml"))])
 
# Train SAC
model = SAC(
    "MultiInputPolicy",
    env,
    learning_rate=3e-4,
    buffer_size=1_000_000,
    batch_size=256,
    tau=0.005,
    gamma=0.99,
    ent_coef="auto",
    verbose=1,
)
 
model.learn(total_timesteps=5_000_000)
model.save("robot_policy_sac")

Langkah 3: Sim-to-Real β€” Deploy Policy

# Deployment script β€” muat policy dan jalankan di robot real
import rospy
from sensor_msgs.msg import JointState
from geometry_msgs.msg import PoseStamped
 
class SimToRealDeploy:
    def __init__(self, policy_path):
        self.policy = SAC.load(policy_path)
 
        # ROS subscribers
        rospy.Subscriber("/joint_states", JointState, self.joint_callback)
        rospy.Subscriber("/cartesian_pose", PoseStamped, self.pose_callback)
 
        # Publishers
        self.arm_pub = rospy.Publisher("/arm_controller/command", JointState, queue_size=10)
        self.gripper_pub = rospy.Publisher("/gripper_controller/command", JointState, queue_size=10)
 
        self.current_obs = None
        self.rate = rospy.Rate(50)  # 50 Hz
 
    def joint_callback(self, msg):
        # Update joint state
        pass
 
    def pose_callback(self, msg):
        # Update end-effector pose
        pass
 
    def run(self):
        while not rospy.is_shutdown():
            if self.current_obs is None:
                continue
 
            # Policy inference β€” no exploration
            action, _ = self.policy.predict(self.current_obs, deterministic=True)
 
            # Clip action untuk safety
            action = np.clip(action, -0.5, 0.5)
 
            # Publish
            self.publish_action(action)
            self.rate.sleep()

Open Challenges & Frontier

1. Data Scarcity

DomainData ScaleBiaya
TextTrillions of tokens~$0.1M
ImageBillions of images~$1M
RobotMillions of episodes$100M+

Mengapa robot data sangat mahal?

  • Setiap episode = setup ulang robot secara fisik (manusia ~30 detik)
  • 1M episode = ~8,300 jam manusia
  • Robot rusak, battery habis, object jatuh
  • Tidak bisa β€œscale up” dengan compute saja

Solusi potensial:

  • Sim-to-Real (tapi masih gap)
  • Human video as training data (IL from YouTube)
  • Self-supervised exploration (curiosity-driven)
  • Data augmentation via 3D reconstruction

2. Generalization

DimensiCurrent SOTATarget
Object10-50 objects10,000+
Scene1-3 scenesAny tabletop
LightingLab conditionsAny
Distractors0-2 objectsClutter
TasksPick & Place, OpenAny manipulation

3. Safety

Physical Safety:
β”œβ”€β”€ Force limiting β€” jangan sampai robot melukai manusia
β”œβ”€β”€ Emergency stop β€” hardware + software
β”œβ”€β”€ Collision detection β€” filtered contact detection
└── Safe RL β€” constraint dalam policy optimization (Lagrangian, shielding)

System Safety:
β”œβ”€β”€ Distribution shift detection β€” policy di luar training distribution β†’ stop
β”œβ”€β”€ Fallback policy β€” jika primary policy tidak yakin
β”œβ”€β”€ Human-in-the-loop β€” untuk high-risk decisions
└── Formal verification β€” bukti bahwa policy tidak akan masuk unsafe state

4. Computation

Inferensi VLA model (562B params) di embedded hardware? Belum feasible.

HardwarePaLM-E (562B)RT-2 (55B)Octo (1.2B)
A100 (80GB)~5 detik/step~0.5 detik/step~10ms/step
Jetson Orin❌❌~100ms/step
Raspberry Pi❌❌❌

Arah riset: Model kecil (sub-5B), quantization, distillation, temporal action aggregation.


Catatan Terkait


Prinsip Praktis

Embodied AI adalah bidang di mana simulasi tidak pernah cukup. Setiap model VLA hari ini bekerja di lab dengan lighting terkontrol, object terbatas, dan tanpa disturbance. Reality gap bukanlah bug β€” ini adalah tantangan fundamental dari fisika. Aturan praktis: (1) Domain randomization adalah pertahanan terbaik Anda, (2) Jangan pernah deploy policy yang hanya di-train di simulasi β€” validasi di real minimal 10% dari total data, (3) Model kecil + temporal smoothing sering outperform model besar + single-step prediction di dunia nyata karena latency dan noise. Dan yang terpenting: safety dulu. Robot yang salah grasp bisa merusak β€” atau melukai.