LeRobot documentation

Simulasi: lokal atau disajikan

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Simulasi: lokal atau disajikan

Lingkungan simulasi dapat dijalankan dengan dua cara:

  • sebagai env batched (--env.*): banyak lingkungan untuk satu tugas, yang dijalankan bersama oleh setiap panggilan step(). lerobot-eval dan evaluasi selama pelatihan menggunakannya.
  • sebagai sim robot (--robot.type=sim): satu lingkungan di balik antarmuka Robot, dapat diganti dengan perangkat keras asli. lerobot-rollout, lerobot-record, lerobot-teleoperate dan lerobot-replay menggunakannya.

Jalankan lokal, melalui API lingkungan, atau dijalankan oleh lerobot-env-server, biasanya dalam image Docker-nya sendiri, sehingga dependensi simulator tidak pernah bertemu dengan dependensi kebijakan. Menetapkan endpoint memilih eksekusi yang dijalankan; kedua jalur tersebut mengekspos observasi kanonik yang sama (gambar HWC uint8, state float32 datar), akhir episode, dan konvensi kontrol.

Kode memisahkan tiga lapisan:

  • sebuah env (lerobot.envs, --env.type) adalah apa yang dijalankan oleh perintah LeRobot, dikonfigurasi oleh EnvConfig. Tidak semua env adalah simulator: gym_manipulator menggerakkan robot fisik.
  • a sim (lerobot.sim) adalah simulator di balik env simulasi: sebuah SimConfig yang menamai integrasinya, di-step oleh LocalVectorEnv, tanpa torch.
  • env server (lerobot.env_server) menyajikan simulasi; RemoteVectorEnv mengendalikannya dengan API yang sama seperti LocalVectorEnv.

Evaluasi checkpoint

Secara lokal, dengan simulator yang diinstal di samping LeRobot (lihat LIBERO):

lerobot-eval \
  --policy.path=lerobot/smolvla_libero \
  --policy.pretrained_revision=a24f1f380461b665158d52acd140152c79e8b36d \
  --policy.device=cuda \
  --env.type=libero --env.task=libero_spatial --env.task_ids='[0]' \
  --rename_map='{"observation.images.image": "observation.images.camera1", "observation.images.image2": "observation.images.camera2"}' \
  --eval.n_episodes=1 --eval.batch_size=1 \
  --output_dir=outputs/eval_libero

Disediakan: mulaikan server dengan lingkungan yang sama (lihat Sediakan lingkungan), dan tambahkan endpoint-nya:

lerobot-env-server --config_path=docker/sim/configs/libero.yaml --docker=true
lerobot-eval ... --env.server.endpoint=tcp/127.0.0.1:7448

Setiap opsi untuk server berada di bawah --env.server.*, dan tidak ada yang berlaku untuk eksekusi lokal. Klien meminta deployment yang dinamai sesuai dengan --env.type, sebagaimana dinamai oleh konfigurasi server; gunakan --env.server.deployment untuk deployment lain. Endpoint atau deployment yang salah akan gagal dalam waktu --env.server.handshake_timeout_s (10 detik) dan menyebutkan apa yang disajikan oleh endpoint tersebut. Terhadap server yang diamankan dengan TLS, berikan file Zenoh JSON5-nya dengan --env.server.zenoh_config_path, sebagaimana untuk inferensi jarak jauh. Server harus menjalankan lingkungan yang dijelaskan oleh perintah: tipe, tugas, konvensi kontrol, dan tubuh simulasi (robot_type) yang sama, atau evaluasi akan menolak untuk dimulai dan mencantumkan perbedaannya. Opsi lain yang berbeda (resolusi, panjang episode) akan dicatat sebagai peringatan.

Nama observasi berasal dari lingkungan (observation.images.<camera>, observation.state). Jika checkpoint dilatih dengan nama kamera lain, petakan nama tersebut dengan --rename_map, seperti pada robot apa pun, dan pertahankan identitas masing-masing kamera meskipun beberapa memiliki bentuk yang sama. Kamera placeholder (empty_cameras) adalah pengaturan kebijakan yang disimpan bersama checkpoint; timpa pengaturan tersebut dengan --policy.empty_cameras hanya jika diperlukan.

Sebelum langkah pertama, setiap input checkpoint harus ada di lingkungan setelah penamaan ulang, dengan dimensi state dan action serta jumlah channel RGB yang sesuai. Tinggi dan lebar gambar boleh berbeda: prapemrosesan kebijakan bertanggung jawab atas pengubahan ukuran. Konvensi pengontrol (aksi delta vs absolut, format rotasi) tidak diperiksa; gunakan checkpoint yang dilatih pada konvensi lingkungan.

Setiap step() memajukan setiap lingkungan yang belum selesai dalam batch sekali. Lingkungan yang berakhir mempertahankan observasi terminalnya hingga reset berikutnya; langkah pada lingkungan lain tidak pernah memulai ulang lingkungannya. Dengan --eval.use_async_envs=true (default), setiap lingkungan berjalan di proses worker-nya sendiri, baik secara lokal maupun di server, dan batch melangkah secara paralel. Server menerima hingga max_envs lingkungan per batch (32 secara default). --env.server.encoding=jpeg (atau --robot.env.server.encoding=jpeg, dengan --env.server.jpeg_quality, 90 secara default) mengirim bingkai kamera yang disajikan sebagai JPEG: balasan lebih kecil untuk server jarak jauh dan batch lebih besar, dengan biaya waktu enkoding dan bingkai lossy. Di localhost, bingkai mentah lebih cepat. Balasan membawa bingkai dari setiap lingkungan dalam batch dan harus muat max_payload_bytes (32 MiB secara default) di kedua ujung, atau server menolak batch saat dibuka. Untuk batch besar atau kamera resolusi tinggi, naikkan di server (max_payload_bytes di bagian zenoh YAML, di sebelah listen_endpoints) dan di klien (--env.server.max_payload_bytes, atau --robot.env.server.max_payload_bytes).

Jalankan robot simulasi

Lingkungan yang sama sebagai lingkungan batched dan sebagai robot simulasi:

lerobot-eval    --env.type=libero --env.task=libero_spatial --env.task_ids='[0]' ...
lerobot-rollout --robot.type=sim --robot.env.type=libero --robot.env.task=libero_spatial --robot.task_id=0 ...

Sebagai contoh:

lerobot-rollout \
  --robot.type=sim --robot.env.type=libero --robot.env.task=libero_spatial --robot.task_id=0 \
  --task="pick up the black bowl between the plate and the ramekin and place it on the plate" \
  --policy.path=lerobot/smolvla_libero \
  --policy.pretrained_revision=a24f1f380461b665158d52acd140152c79e8b36d \
  --rename_map='{"observation.images.image": "observation.images.camera1", "observation.images.image2": "observation.images.camera2"}' \
  --device=cuda --fps=20 --inference.type=sync \
  --display_data=true --display_mode=rerun \
  --return_to_initial_position=false --play_sounds=false
  • --robot.env.* menerima opsi yang sama dengan --env.* dalam evaluasi. --robot.task_id memilih satu tugas yang dijalankan robot, sedangkan evaluasi menjalankan setiap tugas dalam suite atau yang ada di --env.task_ids. Lingkungan EnvHub adalah --robot.env.type=envhub --robot.env.hub_path=<user/repo> --robot.env.trust_remote_code=true.
  • Beberapa kebijakan memerlukan prosesor lingkungan (XVLA dan Cosmos3 pada LIBERO, Isaac Lab Arena). lerobot-eval menerapkannya, dan demikian pula robot simulasi dengan --inference.type=sync. Inferensi jarak jauh tidak melakukannya, sehingga menolak checkpoint semacam itu saat startup.
  • --robot.env.server.endpoint=tcp/... menjalankan lingkungan pada server env, sama seperti yang dilakukan --env.server.endpoint untuk env yang di-batch. Robot akan memeriksa bahwa server menjalankan lingkungan tersebut.
  • Setiap send_action() memajukan lingkungan tepat satu kali. Pembacaan observasi, inferensi kebijakan, dan penantian tidak memajukan simulasi; loop kontrol yang ada memiliki kendali atas penjadwalan waktu nyata.
  • --fps harus sama dengan laju kontrol lingkungan, dibagi dengan --interpolation_multiplier saat melakukan interpolasi, karena setiap perintah memajukan lingkungan sekali. Saat merekam, --dataset.fps harus sama dengan --fps. Rollout akan menolak untuk dimulai jika tidak.

Robot simulasi adalah robot: ganti --robot.type=sim --robot.env.* dengan --robot.* dari pengikut nyata, dan semuanya lainnya tetap sama. Teleoperator mengendalikannya seperti mengendalikannya untuk menggerakkan pengikut nyata (--teleop.type=so101_leader untuk kembar SO-101), ketika lingkungan menyatakan nama dan unit aksi pengikut; ketidakcocokan dilaporkan pada aksi pertama. lerobot-record menyimpan tubuh yang dinyatakan oleh lingkungan sebagai robot_type dataset (panda untuk LIBERO), atau sim_robot jika tidak ada yang dinyatakan.

Episode yang direkam mengikuti episode lingkungan. lerobot-record dan strategi rollout episodik memulai ulang lingkungan simulasi di awal setiap episode, dan mengakhirinya ketika episode lingkungan berakhir (sukses, terminasi, atau batas langkahnya) atau ketika durasinya habis, mana pun yang terjadi lebih dulu. Oleh karena itu, setiap episode yang direkam adalah satu episode simulasi, dari keadaan awalnya. Tidak ada yang perlu direset secara manual, jadi lewati fase reset antar-episode dengan --dataset.reset_time_s=0, dan dengan strategi rollout episodik juga berikan --strategy.reset_to_initial_position=false. Ketika sebuah episode berakhir, robot berhenti: ia mengabaikan aksi dan mempertahankan keadaan akhirnya, dan latest mempertahankan reward, terminasi, dan sukses terakhir. Teleoperation dan strategi rollout dasar kemudian memulai episode baru (strategi juga mereset kebijakan), dan replay berhenti. Strategi sentry, highlight, dan DAgger belum mendukung robot simulasi, karena mereka merekam berdasarkan waktu atau sesuai permintaan, bukan per episode; gunakan strategi episodik untuk merekam. Robot sungguhan tidak terpengaruh: episode mereka berbasis waktu, dan adegannya direset secara manual. Untuk tingkat sukses, evaluasi dengan lerobot-eval dan lingkungan yang di-batch.

Fitur kamera robot menggunakan nama observation.images.<camera> yang sama dengan perekaman perangkat keras asli. Satu kamera tanpa nama adalah observation.images.image. Evaluasi batched mempertahankan kunci lingkungan itu sendiri, seperti observation.image untuk satu kamera; saat deploying checkpoint dengan nama tersebut melalui SimRobot, gunakan --rename_map='{"observation.images.image": "observation.image"}'.

Untuk inferensi jarak jauh, pertahankan opsi --robot.* yang sama dan ganti opsi kebijakan dan inferensi lokal dengan:

--inference.type=remote \
--inference.endpoint=tcp/127.0.0.1:7447 \
--inference.deployment=libero \
--inference.semantics=libero-delta-v1

Mulakan server kebijakan secara terpisah menggunakan pengaturan inferensi jarak jauh. Skema-nya harus sesuai dengan observasi robot setelah --rename_map. Hilangkan --policy.path dari perintah rollout karena server kebijakan memuat checkpoint. Untuk RTC lokal, gunakan --inference.type=rtc dengan pengaturan RTC kebijakan.

Ketika kebijakan terlambat, mempertahankan robot simulasi tidak memajukan fisika. Kegagalan simulator menyebar ke penghentian rollout.

Layani lingkungan

Dari checkout sumber LeRobot (citra dibangun darinya), jalankan dari akar repositori:

lerobot-env-server --config_path=docker/sim/configs/libero.yaml --docker=true

--docker=true menggunakan docker/sim/compose.server.yaml, memilih image dari sim.type, memount YAML yang efektif, dan menjalankan container pada jaringan host, sehingga server mendengarkan di localhost:7448 kecuali --zenoh.listen_endpoints menyatakan sebaliknya. Ganti YAML untuk memilih simulator lain. Laju kontrol, konvensi aksi, nama komponen, dan tipe robot untuk setiap simulator berasal dari conventions() integrasinya, sehingga YAML hanya perlu menamai tugas dan opsi simulator.

Adapun lerobot-policy-server, setiap field YAML menerima override baris perintah yang bersarang, dan file tetap tidak berubah. Nilai kamus seperti sim.kwargs digabungkan ke dalam YAML:

lerobot-env-server --config_path=docker/sim/configs/libero.yaml --docker=true \
  --sim.task=libero_goal \
  --sim.kwargs='{gym_kwargs: {observation_height: 256, observation_width: 256}}'

Konfigurasi efektif disimpan di bawah $HF_LEROBOT_HOME/sim, sehingga kontainer yang dimulai ulang dapat menemukannya. Mengganti konfigurasi akan membuat ulang server dan mengakhiri sesi aktif. Image dibangun saat tidak ada; tambahkan --build=true untuk membangun ulang setelah mengubah simulator atau sumber LeRobot, atau --stop=true untuk mematikan server. Kontainer memerlukan akses GPU Docker untuk rendering EGL. Repositori EnvHub disajikan dengan --envhub=<user/repo>; lihat EnvHub dan server simulator.

Jika simulator yang merender dengan Vulkan (Isaac Sim, atau ManiSkill/SAPIEN seperti pada RoboMME, yang image-nya menyertakan file Vulkan miliknya sendiri) gagal di dalam container dengan vkCreateInstance failed atau ERROR_INCOMPATIBLE_DRIVER padahal berjalan di luar Docker, maka container tersebut memiliki pustaka driver NVIDIA tetapi tidak memiliki file loader yang menunjuk ke pustaka tersebut (/usr/share/vulkan/icd.d/nvidia_icd.json, /usr/share/glvnd/egl_vendor.d/10_nvidia.json). Mode default dari NVIDIA Container Toolkit, yang digunakan oleh gpus: all, mungkin tidak memount file-file tersebut; mode CDI-nya melakukannya. Minta GPU melalui CDI (--device nvidia.com/gpu=all untuk docker run, devices: [nvidia.com/gpu=all] menggantikan gpus: all di docker/sim/compose.server.yaml), atau tambahkan kedua file tersebut ke dalam image.

Tanpa --docker=true, perintah yang sama menjalankan server di lingkungan saat ini: menginstal dependensi native simulator dalam lingkungan terisolasi, menginstal LeRobot dengan --no-deps, dan menginstal docker/sim/requirements.txt. Dalam kedua kasus, server mendengarkan di localhost; untuk menerima mesin lain, berikan alamat antarmuka jaringan yang dapat mereka jangkau, seperti pada --zenoh.listen_endpoints='[tcp/192.168.1.20:7448]', dan tambahkan TLS serta kontrol akses dengan zenoh.config_file dalam YAML.

Gambar runtime LIBERO menggunakan file keadaan awal NumPy yang telah dikonversi. Proses build gambar mengonversi aset upstream yang tepercaya dengan scripts/ci/convert_libero_init_states.py; server menolak file yang dikonversi jika tidak ada. RoboTwin dan RoboMME masing-masing memerlukan torch mereka sendiri untuk perencanaan native dan ManiSkill; instalasi torch mereka terisolasi dari lingkungan policy.

Permintaan server tidak pernah diulang. Setelah timeout yang ambigu, klien gagal; tutup dan buka sesi baru.

Tambahkan benchmark

Lihat Menambahkan benchmark untuk modul simulator, konvensi, gambar, dan integrasi CI.

Update on GitHub