LeRobot documentation

Politika Dağıtımı (lerobot-rollout)

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Politika Dağıtımı (lerobot-rollout)

lerobot-rollout, eğitim almış politikaları gerçek robotlarda dağıtmak için kullanılan tek CLI'dir. Hızlı değerlendirme, sürekli kayıt ve insan-döngüde veri toplama dahil olmak üzere birden fazla yürütme stratejisini ve çıkarım arka ucunu destekler.

Hızlı Başlangıç

Robotunuz ve politika eklerinizin dışında ek bağımlılıklara gerek yoktur.

lerobot-rollout \
    --strategy.type=base \
    --policy.path=lerobot/act_koch_real \
    --robot.type=koch_follower \
    --robot.port=/dev/ttyACM0 \
    --task="pick up cube" \
    --duration=30

Bu, 30 saniye boyunca kayıt yapılmadan politikayı çalıştırır.

Cihaz seçimi

O hostta ilgili cihazın kullanılabilir olduğu durumlarda, checkpoint cihazını geçersiz kılmak için --device=cpu veya --device=cuda parametresini iletin. Çözümlenen cihaz, politika yüklenmeden ve işlemcileri oluşturulmadan önce politika yapılandırmasına uygulanır. Örneğin, politika CPU çalıştırmayı destekliyorsa, yukarıdaki komuta --device=cpu ekleyerek CUDA ile eğitilmiş bir checkpoint'i yalnızca CPU'ya sahip bir hostta çalıştırabilirsiniz. Bir robota dağıtmadan önce CPU çıkarımının gerekli kontrol hızınızı karşılayabildiğinden emin olun.

--device atlandığında, rollout, ayarlanmışsa politika yapılandırma cihazını kullanır, aksi halde uygun bir cihazı otomatik olarak seçer. Aynı davranış, build_rollout_context ile RolloutConfig(device=...) için de geçerlidir.


Stratejiler

--strategy.type=<name> ile bir strateji seçin. Her strateji, kendi kaydetme ve etkileşim anlamlarına sahip farklı bir kontrol döngüsü tanımlar.

Taban ( --strategy.type=base )

Veri kaydı olmadan otonom politika çalıştırma. Hızlı değerlendirme, demolar veya yalnızca robotu gözlemlemeniz gerektiğinde bunu kullanın.

lerobot-rollout \
    --strategy.type=base \
    --policy.path=${HF_USER}/my_policy \
    --robot.type=so100_follower \
    --robot.port=/dev/ttyACM0 \
    --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \
    --task="Put lego brick into the box" \
    --duration=60
BayrakAçıklamaVarsayılan
--durationSaniye cinsinden çalışma süresi (0 = sonsuz)0
--taskPolitikaya iletilen görev tanımı—
--display_dataGözlemleri/aksiyonları görselleştirme için Rerun'a akıtınfalse

Sentry ( --strategy.type=sentry )

Hugging Face Hub'a periyodik yükleme ile sürekli otonom kayıt. Bölüm sınırları, kamera çözünürlüğü ve FPS'den otomatik olarak hesaplanır; böylece her kaydedilen bölüm tam bir video dosyası üretir ve yüklemeler verimli kalır.

Policy durumu (gizli durum, RTC kuyruğu) bölüm sınırları boyunca kalıcıdır: robot bölümler arasında sıfırlanmaz.

lerobot-rollout \
    --strategy.type=sentry \
    --strategy.upload_every_n_episodes=5 \
    --policy.path=${HF_USER}/my_policy \
    --robot.type=so100_follower \
    --robot.port=/dev/ttyACM0 \
    --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \
    --dataset.repo_id=${HF_USER}/rollout_eval_data \
    --dataset.single_task="Put lego brick into the box" \
    --duration=3600
BayrakAçıklamaVarsayılan
--strategy.upload_every_n_episodesHer N bölümde Hub'a it5
--strategy.target_video_file_size_mbBölüm rotasyonu için hedef video dosya boyutuauto
--dataset.repo_idZorunlu. Kaydedilen veri seti için Hub deposu—
--dataset.push_to_hubKapatma sırasında Hub'a gönderilip gönderilmeyeceğitrue

Öne çıkarma ( --strategy.type=highlight )

Bellek sınırı olan bir halka tamponu (ring buffer) üzerinden talep üzerine kayıt ile otonom dağıtım (rollout). Tampon, telemetrinin son N saniyesini yakalar. Kaydet tuşuna basarak tamponu boşaltın ve canlı kaydı başlatın; bölümü (episode) kaydetmek için tekrar basın. Asenkron bir arka uç (backend) ile, her geçiş (toggle) çıkarımı (inference) duraklatır, kuyruktaki/interpole edilmiş hareketi geçersiz kılar ve engellenen boşaltma (drain) veya kaydetme işleminden önce desteklenen yerel bir tutma (hold) ister. Sağlıklı bir çalıştırma, sonrasında taze bir yakalamadan (capture) devam eder.

lerobot-rollout \
    --strategy.type=highlight \
    --strategy.ring_buffer_seconds=30 \
    --strategy.save_key=s \
    --strategy.push_key=h \
    --policy.path=${HF_USER}/my_policy \
    --robot.type=koch_follower \
    --robot.port=/dev/ttyACM0 \
    --dataset.repo_id=${HF_USER}/rollout_highlight_data \
    --dataset.single_task="Pick up the red cube"

Klavye kontrolleri:

AnahtarEylem
s (yapılandırılabilir)Kaydı başlat (tamponu boşaltır) / durdur ve bölümü kaydet
h (yapılandırılabilir)Veri setini Hub'a gönder
ESCOturumu durdur
BayrakAçıklama
--strategy.ring_buffer_secondsTamponlanan telemetrinin süresi (varsayılan: 10)
--strategy.ring_buffer_max_memory_mbHalka tamponu için bellek sınırı (varsayılan: 1024)
--strategy.save_keyKaydı aç/kapatmak için tuş (varsayılan: s)
--strategy.push_keyHub'a göndermek için tuş (varsayılan: h)

DAgger ( --strategy.type=dagger )

İnsan döngüde veri toplama. Otonom politika yürütmesi ile teleoperatör aracılığıyla insan müdahalesi arasında dönüşümlü olarak çalışır. Müdahale kareleri intervention=True etiketiyle işaretlenir. Bir teleoperatör (--teleop.type) gerektirir.

Detaylı bir anlatım için Human-In-the-Loop Data Collection kılavuzuna bakın.

Sadece düzeltme modu (varsayılan): Yalnızca insan düzeltme pencereleri kaydedilir. Her düzeltme bir epizot oluşturur.

lerobot-rollout \
    --strategy.type=dagger \
    --strategy.num_episodes=20 \
    --policy.path=outputs/pretrain/checkpoints/last/pretrained_model \
    --robot.type=bi_openarm_follower \
    --teleop.type=bi_openarm_mini \
    --dataset.repo_id=${HF_USER}/rollout_hil_data \
    --dataset.single_task="Fold the T-shirt"

Sürekli kayıt modu (--strategy.record_autonomous=true): Hem otonom hem de düzeltme kareleri, zaman tabanlı bölüm döndürmesiyle (Sentry ile aynı) kaydedilir.

lerobot-rollout \
    --strategy.type=dagger \
    --strategy.record_autonomous=true \
    --strategy.num_episodes=50 \
    --policy.path=${HF_USER}/my_policy \
    --robot.type=so100_follower \
    --robot.port=/dev/ttyACM0 \
    --teleop.type=so101_leader \
    --teleop.port=/dev/ttyACM1 \
    --dataset.repo_id=${HF_USER}/rollout_dagger_data \
    --dataset.single_task="Grasp the block"

Klavye kontrolleri (varsayılan giriş cihazı):

AnahtarEylem
SpacePolitika yürütmesini duraklat/devam ettir
Tabİnsan düzeltmesini başlat / durdur
EnterVeri setini Hub'a gönder (yalnızca düzeltme modu)
ESCOturumu durdur

Pedal girişi de --strategy.input_device=pedal ile desteklenir. Pedal kodlarını --strategy.pedal.* bayraklarıyla yapılandırın.

Robot, rollout konum tutma işlevini desteklediğinde, duraklatma, sürücünün fiilen uyguladığı son konum hedefini yeniler; bu, kırpma (clipping) ve kavrama (gripper) hedefini de içerir. İlk komuttan önce, doğrulanmış bir ölçüm durumu (pose) hedefi sağlar. Bu, hedefi ölçülen duruma değiştirmek yerine komut edilen konum hatasını korur; politika yörünge ilerlemesi dururken robot, o hedefe doğru yerleşimini tamamlayabilir. Yüklenmiş kol ve kavrama davranışını gerçek robot üzerinde doğrulayın; bu yazılımsal tutma, kavranan nesnenin elde tutulmasını veya fiziksel hareketsizliği garanti etmez.

BayrakAçıklama
--strategy.num_episodesKaydedilecek düzeltme bölümü sayısı (varsayılan: --dataset.num_episodes)
--strategy.record_autonomousOtonom kareleri de kaydet (varsayılan: false)
--strategy.upload_every_n_episodesHer N bölümde Hub'a gönder (varsayılan: 5)
--strategy.input_deviceGiriş cihazı: keyboard veya pedal (varsayılan: keyboard)
--strategy.smooth_handoverDuraklatma / düzeltme başlangıcında kontrolü sorunsuz bir şekilde devral (varsayılan: true). Mevcut robot duruşunda yeniden referans alan kavrama tarzı teleops'ler için devre dışı bırakın
--teleop.typeZorunlu. Teleoperatör türü

Epizodik ( --strategy.type=episodic )

lerobot-record davranışını yansıtan, bölüm odaklı kayıt. Her bölümde politika robotu yönlendirir; bölümler arası sıfırlama aşamasında isteğe bağlı bir teleoperatör robotu yönlendirebilir.

lerobot-rollout \
    --strategy.type=episodic \
    --policy.path=${HF_USER}/my_policy \
    --robot.type=so100_follower \
    --robot.port=/dev/ttyACM0 \
    --teleop.type=so100_leader \
    --teleop.port=/dev/ttyACM1 \
    --dataset.repo_id=${HF_USER}/rollout_eval_data \
    --dataset.num_episodes=20 \
    --dataset.episode_time_s=30 \
    --dataset.reset_time_s=10 \
    --dataset.single_task="Pick up the red cube"

Teleop isteğe bağlıdır — atlanırsa robot, sıfırlama aşamasında konumunu korur.

Klavye kontrolleri:

AnahtarEylem
→ (sağ)Mevcut bölümü erken sonlandır
← (sol)Bölümü sil ve yeniden kaydet
ESCKayıt oturumunu durdur
BayrakAçıklama
--dataset.num_episodesKaydedilecek bölüm sayısı
--dataset.episode_time_sHer kayıt bölümünün saniye cinsinden süresi. --duration ayarlanmış ve bu ayarlanmamışsa varsayılan olarak --duration kullanılır
--dataset.reset_time_sEpizodlar arası sıfırlama aşamasının saniye cinsinden süresi
--teleop.typeİsteğe bağlı. Sıfırlamalar sırasında robotu sürmek için teleoperatör
--strategy.reset_to_initial_positionEpizodlar arasında robotun başlangıç konumuna sıfırlanıp sıfırlanmayacağı
--strategy.smooth_leader_to_follower_handoverLider -> takipçi akıcı devralma davranışının açılıp kapatılacağı.
--strategy.smooth_handoverSıfırlama başlangıcında kontrolü teleop'a sorunsuz bir şekilde devret (varsayılan: true). Mevcut robot duruşunda yeniden referans alan kavrama tarzı teleop'lar için devre dışı bırakın

Kendi stratejinizi getirin

--strategy.type, yukarıdaki yerleşiklerin yanı sıra ortamda kayıtlı herhangi bir stratejiyi kabul eder. Bir strateji, pip ile kurulabilir bir paketteki iki sınıftır: RolloutStrategyConfig üzerinde kayıtlı bir yapılandırma ve Config son ekini içermeyen, ona göre adlandırılmış bir RolloutStrategy alt sınıfı — özel donanım ile aynı SomethingConfig/Something sözleşmesi, yapılandırmanın modülünden veya paketinden çözümlenir.

from dataclasses import dataclass
from typing import ClassVar

from lerobot.rollout import RolloutContext, RolloutStrategy, RolloutStrategyConfig


@RolloutStrategyConfig.register_subclass("patrol")
@dataclass
class PatrolStrategyConfig(RolloutStrategyConfig):
    dataset_mode: ClassVar[str] = "required"  # the engine creates the dataset for you
    legs: int = 2  # becomes --strategy.legs


class PatrolStrategy(RolloutStrategy):
    def run(self, ctx: RolloutContext) -> None:
        ...  # the paced control loop: see the contract on RolloutStrategy.run

    def teardown(self, ctx: RolloutContext) -> None:
        ctx.data.dataset.finalize()
        self._teardown_hardware(ctx.hardware, ctx.runtime.cfg.return_to_initial_position)

Config, motorun strateji adına neyi nasıl düzenlediğini bildirir; bu nedenle LeRobot içindeki hiçbir bileşen türünü bilmek zorunda değildir:

BeyanEtki
dataset_mode"none" (varsayılan) --dataset.* bayraklarını reddeder, "optional" verildiğinde kaydeder, "required" --dataset.repo_id parametresini zorunlu hale getirir
requires_teleop--teleop.type zorunlu hale getirir
supports_interactive--interactive=true değerine izin verir; bu durumda run(), RolloutStrategy üzerinde belgelenen yeniden başlatılabilir sözleşmeye uymak zorundadır
supports_sim_robot--robot.type=sim değerine izin verir; run() bu durumda bir bölüm sonlandığında her zaman yeni bir bölüm başlatmalıdır (bkz. lerobot.robots.sim_robot)
requires_streaming_encoding()Kontrol döngüsünün içinden kareler yazıldığında True döndür: --dataset.streaming_encoding zorunlu olarak etkinleştirilir
extra_dataset_features()Stratejiye ait veri seti sütunları (örneğin DAgger’ın intervention sütunu); kaydedilen her kare bunları içermelidir

Dağıtımın adını lerobot_strategy_<name> olarak belirleyin ve lerobot-rollout, CLI'yi ayrıştırmadan önce paketi içe aktarır — yalnızca __init__.py çalıştığı için yapılandırmayı orada içe aktarın. Başka herhangi bir ada sahip bir paket, alt modüller dahil olmak üzere, --strategy.discover_packages_path=<package> ile yüklenir. Stratejinin dataclass alanları --strategy.* bayraklarına dönüşür:

lerobot-rollout \
    --strategy.type=patrol \
    --strategy.legs=3 \
    --policy.path=${HF_USER}/my_policy \
    --robot.type=so100_follower \
    --robot.port=/dev/ttyACM0 \
    --dataset.repo_id=${HF_USER}/rollout_patrol \
    --dataset.single_task="patrol the aisle"

SentryStrategy (kayıt, etkileşim-güvenli) ve BaseStrategy (kayıt yok) kopyalanacak referans uygulamalardır; lerobot.rollout.strategies içindeki send_next_action, safe_push_to_hub ve estimate_max_episode_seconds bu uygulamaların dayandığı yardımcı işlevlerdir.

Asenkron arka uçlar için dağıtım sözleşmesi zorunludur. Her yakalanan gözlemi engine.notify_observation(obs_processed) ile yayımlayın, her otonom motor tikinde (interpolasyon ve tutma tikleri dahil) send_next_action(...) çağrısını yapın, ardından engine.pump_query(obs_processed) çağrısını yapın. Yalnızca engine.get_action() çağrısı, izin ve tutma el sıkışmasını atlar: planlanmış bir metin sorgusu süresiz bekleyebilir ve bir son hata asla kapanışı bildiremeyebilir.

Üçüncü taraf stratejiler, _init_engine(ctx) sonrasında periyodik sağlık raporlamasını içerebilmek için timer.tick(...) yerine self._tick(timer, new_cycle=interpolator.needs_new_action()) çağrısını kullanabilir.

send_next_action, lerobot.inference.dispatch_tick ve onun parçaları (next_interpolated_action, commit_action, dispatch_permitted) üzerine inşa edilmiştir; bu parçalar sıralamayı bir kez kodlar: bir aksiyon çekmeden önce ve sonra, ayrıca göndermeden önce dispatch_allowed(); reddedildiğinde interpolasyon geçersiz kılma, desteklenen yerel bekleme ve acknowledge_hold(); gönderimden sonra record_dispatch(). Başarısız olan bir bekleme asla onaylanmaz. Sıralamayı yeniden uygulamak yerine bu yardımcıları kullanın; send_next_action yalnızca veri seti çerçevesini, robot tarafındaki aksiyon işleyicisini ve tempo sayımını ekler. Uzak bağlamlarda ctx.policy.policy, preprocessor ve postprocessor None olarak ayarlanır; ctx.policy.inference ve ctx.processors içindeki robot tarafı iş akışlarını kullanın.

Bilinen engellenen çalışma ortası kayıt işlemlerini, ring-bufer boşaltma ve bölüm sonlandırma dahil olmak üzere, self._pause_for_recording(ctx) içinde sarmalayın. Bu, kayıt duraksamasından önce asenkron hareketi geçersiz kılar ve yalnızca çalışma hâlâ sağlıklı ve aktifse devam eder. Operatör kontrollü fazlara sahip stratejiler, geçerli hareket iznini resume_allowed olarak iletmelidir. Bir sonraki eylem taze bir gözlemden gelmelidir; kaydedilmiş iş, duraklatılmış, durdurulmuş veya arızalı bir çalışmayı yeniden canlandırmamalıdır.


Politika tahminlerini görselleştirme

--display_data ile görüntüleyici, eylemlerin dışında politikanın ne öngördüğünü de gösterir: bir dünya modelinin hayal ettiği kamera kareleri, öngörülen bir alt görev, bir kameranın üzerine çizilen sınırlayıcı kutular. Her politika, öngördüğü şeyi kendi yapılandırması üzerinden etkinleştirerek belirler; örneğin LingBot-VA için --policy.return_predicted_video=true. Bir öngörü, öngördüğü şeye göre adlandırılır: Rerun, öngörülen observation.images.top değerini prediction.images.top olarak, öngörülen alt görevi prediction.subtask olarak ve kutuları ilgili kamerasının altında (<camera>/prediction) gösterir; Foxglove bunları /prediction/... konularında ve <camera topic>/prediction görüntü eklemelerinde yayınlar. RTC ile öngörü, parça başına bir kez yenilenir. Bir politikadan öngörü döndürmek için Kendi politikanızı getirin bölümüne bakın.

Çıkarım Arka Uçları

--inference.type=<name> ile bir backend seçin. Yerel senkron ve RTC çıkarımı, aşağıda yapılandırılan politikayı kullanır. Uzak backend, politika sözleşmesini bir sunucudan alır ve robot bilgisayarında ağırlıkları yüklemez.

Eşitle (varsayılan)

Her kontrol tikinde bir politika çağrısı. Ana döngü, eylem hesaplanana kadar bloklanır.

Tüm politikalarla çalışır. Ek bayrak gerekmez.

Gerçek Zamanlı Parçalama ( --inference.type=rtc )

Arka plan iş parçacığı, eylem parçalarını asenkron olarak üretir. Ana kontrol döngüsü, politika bir sonraki parçayı paralel olarak hesaplarken, sıradaki hazır eylemi sorgular.

Uygun VLA modelleri (Pi0, Pi0.5, SmolVLA) ile RTC kullanarak çıkarım ve hareketi üst üste bindirin. Sürekli çalıştırma, çıkarım gecikmesini ve değişkenliğini karşılayacak kadar kullanılabilir eylem oynatma gerektirmeye devam eder.

lerobot-rollout \
    --strategy.type=base \
    --inference.type=rtc \
    --inference.rtc.execution_horizon=10 \
    --inference.rtc.max_guidance_weight=10.0 \
    --policy.path=${HF_USER}/pi0_policy \
    --robot.type=so100_follower \
    --robot.port=/dev/ttyACM0 \
    --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \
    --task="Pick up the cube" \
    --duration=60 \
    --device=cuda
BayrakAçıklama
--inference.rtc.execution_horizonÖnceki parçayla birleştirme adımları (varsayılan: politika bazında değişir)
--inference.rtc.modeguided (varsayılan) veya uyumlu Pi05 denetim noktaları için eğitimli önek trained
--inference.rtc.max_guidance_weightTutarlılık uygulama gücü (varsayılan: politika bazında değişir)
--inference.rtc.prefix_attention_scheduleKarışım zamanlaması: LINEAR, EXP, ONES, ZEROS
--inference.queue_thresholdBackpressure eşiği; eğitilmiş RTC en az maksimum gecikmesini gerektirir
--inference.action_starvation_grace_sDesteklenen bir robotda açlık sonrası taze hareketi bekleyin (varsayılan 1.0; 0 anında hata verir)

RTC parametrelerini ayarlama ayrıntıları için Gerçek Zamanlı Parçalama kılavuzuna bakın.

Yerel RTC, rollout sürecinde, taşıma katmanı olmadan arka plan iş parçacığında çalışır. Aynı bilgisayardaki bir sunucu ve istemci bunun yerine --inference.type=remote kullanır. Parça hizalama/karıştırma ve asenkron arka uçlar tarafından paylaşılan bekleme davranışı için uzak kılavuza bakın.

Bekleme, desteklenen bir robot gerektirir. O özellik olmadan sıradan yerel RTC kullanılabilir kalmaya devam eder, ancak planlanan metin/yönerge değişikliği duraklamaları ve kurtarılabilir açlık durumu bunu gerektirir. Konum kontrollü SO, OMX, Koch, HopeJr ve Rebot takipçileri bunu destekler; OpenArm, Reachy2 ve çift kollu sarmalayıcılar için robot destek tablosunda listelenen yapılandırma kısıtlamaları vardır. Destek mevcut olduğunda, boş bir tampon, eski çıkarımı boşaltmak ve taze bir yakalamadan tahmin yapmak için gereken süre dahil olmak üzere, son uygulanan hedefi action_starvation_grace_s (varsayılan 1 saniye) boyunca koruyabilir. Hareket başladıktan sonra, sıfır tolerans veya desteklenmeyen bir robot, tükenme durumunda derhal arızaya geçer; başlatma işlemi kendi son tarihine sahiptir. Eski yerel RTC yolunun aksine, tükenme artık sınırsız olarak atlanan bir tik değildir. Tolerans, süresi dolmuş istek veya tazelik sınırlarını asla uzatmaz.

Local RTC bu ek bütçeleri --inference. üzerinden açığa çıkarır:

ParametreVarsayılanAnlam
max_observation_age_s5 sEylem yürütmesi yoluyla maksimum kaynak yaşı
action_timeout_s10 sAçık aksiyon talebi
startup_timeout_s120 sBaşlangıç hazırlığı ve taze eylem başlatma
language_timeout_s120 sPlanlanan dil işlemi

Bunlar başlangıç değerleridir, ölçülmüş donanım garantileri değildir. RTC, bir sonraki çıkarım ve zamanlama payı için yeterli kesim sonrası oynatma süresini korumalıdır. Çıkarım, kullanılabilir tahmin ufuklarını düzenli olarak tüketiyorsa queue_threshold değerini artırmak işe yaramaz; gecikmeyi azaltın veya daha uzun bir ufuk/farklı bir eylem sıklığını doğrulayın.

Bir terminal arızası, politika hareketini asla otomatik olarak yeniden başlatmaz. Kullanılabilir gözlem edinimi ve aktüatör kontrolü ile kapatma işlemi --return_to_initial_position (varsayılan: true) parametresine uyar ve bağlantıyı keser. Geri dönüş işlemi tam bir gözlem okuduğu için, kalıcı bir kamera arızası bu işlemi engelleyebilir. Başarısız komut uygulaması, senkron dahil olmak üzere tüm arka uçlar için sonraki kapatma hareketlerini bastırır. Bu durum, senkron tahmini değiştirmez veya kamera-özel bir kurtarma mekanizması getirmez.

Compilation and instruction changes

RTC derlemesi, hareketten önce hem başlangıç hem de önekli çağrıları, temsilci bir sıfırdan farklı gecikme dahil olmak üzere ısıtır. --compile_warmup_inferences varsayılan olarak 2 olsa da, etkinleştirilmiş RTC en az 3 gerektirir; başlangıç günlükleri etkin sayıyı raporlar. Isınma, startup_timeout_s içinde tamamlanmalıdır. Gerginlik biçimlerini değiştiren sonraki talimatlar yeniden derlemeyi tetikleyebilir ve oynatma veya bir işlem süresini aşabilir.

Çıkarım sırasında görev değişikliği, eski sonucu atar. Desteklenen robotlar durur ve yeni eylemler ister; bu bekleme yeteneği olmadan, kalan eylemler tükenebilir. Bu robotlarda görevleri çalıştırmalar arasında değiştirmeyi tercih edin.


Etkileşimli Oturumlar

Terminalden yönlendirme yapmak ve hemen başlatmamak için --interactive=true ekleyin. Donanım bağlanır ve politika normal şekilde yüklenir, ancak robot, /start yazana kadar hareketsiz kalır — sahneyi önce konumlandırmak, denemeler arasında politika talimatını yeniden vermek veya yükleme süresini tekrar ödemeden birkaç çekim yapmak istediğinizde faydalıdır.

lerobot-rollout \
    --strategy.type=base \
    --policy.path=${HF_USER}/my_smolvla_policy \
    --robot.type=so100_follower \
    --robot.port=/dev/ttyACM0 \
    --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \
    --task="pick up the cube" \
    --interactive=true
KomutEylem
/startPolitika kontrol döngüsünü başlatın (veya yeniden başlatın)
/subtask <text>Mevcut çalıştırma içindeki talimatı değiştirir; asenkron çıkarım planlanan bir bekleme durumuna girebilir. Argüman verilmeden mevcut görevi görüntüler. Yalnızca dil koşullu politikaları etkiler (SmolVLA, π0/π0.5 ve benzerleri). dış planlayıcı ile /subtask, kontrolü autosteer'dan geri alır
/vqa <text>Robotun şu anda ne gördüğüne dair bir soru sorun. Yalnızca bir çalıştırma devam ederken ve yalnızca bir politika metin başlığı veya dış planlayıcı ile.
/autosteer <goal>Yüksek düzeyde bir hedef verin ve politikanın metin başının veya dış planlayıcının alt görevleri seçmesine izin verin. /autosteer off kontrolü geri verir; argüman verilmezse mevcut hedef raporlanır
/resetHareketi durdurun, robotu başlangıç konumuna geri getirin ve --task talimatını geri yükleyin
/stopOturumu sonlandırın ve normal kapatma rutinlerini çalıştırın
/helpKomutları listele
> /start
Rollout running — task 'pick up the cube'. /subtask <text> to change it, ...
> /subtask put the cube in the box
Task: 'pick up the cube' → 'put the cube in the box' (applies from the next policy inference)
> /vqa is the cube inside the box?
Asked: 'is the cube inside the box?' — answering from the next observation...
Q: is the cube inside the box?
A: No — the cube is on the table to the left of the box.
> /reset
Task restored to 'pick up the cube'
Resetting — returning the robot to its initial position...
Robot reset — holding at initial position. /start to run.
> /stop

> ile başlayan satırlar sizin yazdıklarınızdır; oturum kendi komut istemcisini görüntülemez.

Ctrl-C hâlâ olduğu gibi kapatır ve stdin’i kapatmak (Ctrl-D veya borulanan bir betiğin sonu) oturumu sonlandırır — bu nedenle borulanan bir betiğin, planlanan süre boyunca stdin’i açık tutması gerekir:

(printf '/start\n'; sleep 60; printf '/stop\n') | lerobot-rollout ... --interactive=true

/subtask sonraki çıkarım için görevi günceller. --inference.type=sync kullanıldığında, önceden hesaplanmış parça eylemleri atılır. Yerel RTC veya uzak çıkarım kullanıldığında, bir eylem isteği sırasında yapılan değişiklik, eski sonucu iptal eder. Yerel tutma (hold) destekleyen bir robotta, motor kuyruktaki/interpole edilmiş hareketi geçersiz kılar, kontrol döngüsünün tutmayı onaylamasını bekler ve ardından yeni görev altında taze hareket ister. Bu geçiş sırasında bir durma bekleyin; bu, garanti edilen sürekli bir geçiş (blend) değildir. İstekler arasında yapılan bir değişiklik, süreklilik için zaten kabul edilmiş eylemleri koruyabilir. Tutma desteği olmayan bir robotta yerel RTC hâlâ eski sonucu atar, ancak kalan eylemlerini tüketebilir ve sonlanabilir. Bu robot uygun şekilde tutamıyorsa, çalıştırmalar arasında talimatları değiştirin.

Yerel --use_torch_compile=true ile, işlenmiş tensör şekillerini değiştiren bir talimat yeniden derlemeyi tetikleyebilir. Dolgu (padding), bazı görev değişikliklerini aynı şekilde tutabilir, ancak sonraki derlemenin kalan oynatmaya veya talimat-değişiklik süresine sığacağı garanti edilmez: bu, bir sonlandırma hatasına neden olabilir. Geçişler doğrulanmadıkça talimatları keşfederken derlemeyi kapalı bırakın. İlk derleme ısınması sırasında yapılan değişiklikler, politika hareketi henüz başlamadığı için bir hareket durdurma isteği oluşturmaz.

/vqa ve /autosteer, metin üretimi desteğini beyan eden ve PreTrainedPolicy.generate_text() işlevini uygulayan bir politika gerektirir; bu, uygun şekilde eğitilmiş bir EO1 checkpoint'i veya bir dış planlayıcı olabilir. Yetkinlik, bir sorguyu kabul etmeden önce kontrol edilir; checkpoint'e özgü davranışın doğrulanması hâlâ gereklidir.

/vqa sonraki gözlemden yanıt alır ve hazır olduğunda yazdırır, böylece bu sırada yazmaya devam edebilirsiniz; aynı anda yalnızca bir soru işlenir (autosteer’ın kendi sorguları da bu yeri paylaşır). Harici bir planlayıcı kullanıldığında soru, robot işlemeye devam ederken bir işçi iş parçacığında yanıtlanır ve aşağıdaki hiçbir madde uygulanmaz. Asenkron arka uçlar önce onaylanmış yerel bir beklemeye girer ve kuyruktaki/interpole edilmiş hareketi geçersiz kılar, ardından taze bir gözlemi metin yoluna iletir. Sağlıklı bir aktif çalışma, yanıtın ardından taze bir eylem parçasından devam eder; duraklatılmış veya durdurulmuş çalışmalarsa pasif kalır. Senkron metin üretimi, kontrol iş parçacığında satır içi çalışır ve politikanın önceden hesaplanmış eylemlerini düşürür, bu nedenle sonraki tik taze çıkarımdan devam eder. Sorgu süresi --duration süresinden düşülür. Sorular yalnızca bir çalışma devam ederken kabul edilir — boşta bir motorun güncel bir görünümü yoktur. Talimat veya yürütme bağlamı asenkron bir yanıtı geçersiz kılıyorsa, soru eski yanıt yerine tek bir iptal bildirimi alır. Segment sonu, hâlâ üretim aşamasında olanlar da dahil olmak üzere yanıtlanmamış soruları da raporlar; iptalin raporlanması, çalışan bir model çağrısını yarıda kesmez veya sorgu yerini erken serbest bırakmaz.

/autosteer politikaya bir hedef verir ve her --autosteer_interval_s saniyede (varsayılan 10) bir sonraki alt görevi ister; her birini /subtask ile aynı yoldan uygular ve sohbet üzerinden duyurur. Her sorgu tam bir metin üretimi olduğundan, aralık bir maliyet ayarıdır: daha düşük değerler daha erken yeniden planlama yapar ancak döngünün daha büyük bir kısmını eylem yerine metin üretmeye harcar. Plan ilerlemesi rollout'ta değil politikada tutulduğundan, plan segmentle birlikte sona erer; dizgeleyici ayrıca /reset, /subtask, /autosteer off ve ilk planlama hatasında da durur.

ERROR seviyesinin altındaki günlükler oturum çalışırken sessize alınır böylece rutin çıktılar yazdıklarınızla iç içe geçmez; hatalar ve ölümcül çıkarım arızaları yine de görünür ve oturum sonlandığında normal günlük tutma yeniden başlar. cadence özetleri bunun yerine sohbette yazdırılır ve --interactive olmadan çalıştırma canlı günlüğü geri getirir.

Oturumlar SSH üzerinden ve ekranı olmayan makinelerde çalışır — bir görüntü sunucusu gerekmez.

Etkileşimli kayıt. --strategy.type=sentry ayrıca --interactive=true parametresini de kabul eder ve siz yönlendirirken sürekli kayıt yapar: her /start…/reset segmenti tam bölümleri ve son olarak bir kısmi bölümü kaydeder ve veri seti kapanışa kadar açık kalır. Kareler, aslında gönderilen eylemin görev kökenini taşır; bu nedenle eski görev altında zaten kuyruğa alınmış veya içsel olarak doldurulmuş eylemler eski etiketi korur.

Çalışma sırasında gerçekleşen episode kayıtları, asenkron çıkarımı duraklatır, kuyruğa alınmış/interpole edilmiş eylemleri geçersiz kılar ve desteklenen yerel bir bekleme talep eder. Çalışma aktif ve sağlıklı kaldığı sürece, yeniden başlatma yalnızca taze bir yakalama ile yapılır. Aynı koruma, DAgger kayıtları ve Highlight halka tamponu boşaltma/kayıt işlemleri için de geçerlidir. Kayıt duraklamaları ve olağan açlık durumları, fiziksel bekleme davranışını paylaşır; ancak süre sınırları ve yeniden başlatma nedenleri ayrı kalır.

lerobot-rollout \
    --strategy.type=sentry \
    --policy.path=${HF_USER}/my_smolvla_policy \
    --robot.type=so100_follower \
    --robot.port=/dev/ttyACM0 \
    --dataset.repo_id=${HF_USER}/rollout_cube_sessions \
    --task="pick up the cube" \
    --interactive=true

Diğer kayıt stratejileri (episodic, DAgger, highlight) desteklenmez: kendi klavye kontrollerini bağlarlar ve run() çıktığında veri setini sonlandırır, bu nedenle segment segment yeniden başlatılamazlar.

Dış planlayıcı

--planner.model_id=<name>, /vqa ve /autosteer çağrılarını politikanın metin başı yerine anotasyon hattının VLM istemcisi (annotations ek paketi) üzerinden yönlendirir. Çağrılar, robotun eylemlerine devam etmesi sırasında bir işçi iş parçacığında çalışır ve bunlar için dil kilidi istenmez; ancak kasıtlı bir istisna vardır: /autosteer başladığında, hedef politika için bir talimat değil planlayıcı için bir bağlam olduğu için, planlayıcının ilk yanıtına kadar çıkarım arka planı duraklatılır. Asenkron arka planlar (rtc, remote), önceki talimat için kuyruğa alınmış veya hesaplanmakta olan eylemleri düşürür; senkron arka plan ise robotu bekletir. İlk alt görev uygulandığında arka plan, taze bir gözlemle devam eder. /subtask hâlâ talimatınızı doğrudan uygular ve otomatik planlamayı iptal eder; geç gelen planlayıcı yanıtları bunu geçersiz kılamaz.

Planlayıcı, tüm çıkarım arka uçlarıyla çalışır. Yerel çıkarım sırasında, yüklü işleyicinin alt görev tarifi varsa onu yeniden kullanır, yoksa kısa bir talimat ister; bu, bir kontrol noktasının bu talimatı takip edebileceğini garanti etmez. --planner.instructions='["pick up the cup","open the drawer"]' planlayıcı çıktısını kısıtlar: VLM, bu dizelerden birini seçmeye davet edilir ve listede olmayan bir sonraki alt görev yanıtı bir hatadır. Büyük/küçük harf, ek boşluklar ve sondaki nokta göz ardı edilir; listenin kendi ifadesi politika (policy) ile iletilir. Bu bayrak olmadan, liste, kontrol noktasının eğitim veri setinin görev etiketlerinden (bunun train_config.json dosyası üzerinden) okunur. Her etikat prompt’a dahil edilir, bu nedenle birçok görev içeren veri setleri için bayrağı daha kısa bir listeyle geçirin. Veri seti okunamazsa, bir uyarı günlüğe kaydedilir ve planlayıcı çıktısı serbest biçimde kalır. Uzaktan çıkarım politikanın sahibidir, bu nedenle ne tarif ne de eğitim sözlüğü yerel olarak kullanılabilir: --planner.instructions bayrağını açıkça geçirin, aksi halde yanıtlar serbest biçimde kalır. Planlayıcı yalnızca yerel çıkarım içeren donanımlarda test edilmiştir.

Harici planlayıcı, son --planner.history gözlem/komut çiftlerini (varsayılan 4) ve ardından geçerli görüntüleri alır. Her çift, bir talimat istemek için kullanılan gözlemi ve motor tarafından daha sonra kabul edilen talimatı içerir; kabul, başarılı bir çalıştırma anlamına gelmez. Tekrarlanan talimatlar, VLM’nin ilerleme eksikliğini değerlendirebilmesi için geçmişte kalır. Geçmiş, manuel devralma, sıfırlama, durdurma, segment sonu veya yeni bir autosteer hedefi durumunda temizlenir. Devre dışı bırakmak için --planner.history=0 ayarlayın. /vqa bu geçmişi inceleyebilir ancak girdi eklemez. Bir sonraki alt görev isteği için VLM, önce sahneyi açıklamalı ve önceki komutun tamamlandığını, devam ettiğini veya başarısız olduğunu belirtmeli, yalnızca ardından bir sonraki talimatı adlandırmalıdır. done yanıtı, hedefin tamamlandığı anlamına gelir: autosteer durur, çalışma sona erer ve robot /reset veya /start uygulanana kadar duruşunu korur. /subtask, /reset veya yeni bir hedeften önce gelen geç bir done yanıtı atılır. Her uygulanan alt görev, modelin sahne değerlendirmesi ve istek gecikmesiyle birlikte yazdırılır.

Ayrı olarak OpenAI uyumlu bir VLM sunucusu başlatın, ardından bağlanın:

transformers serve Qwen/Qwen3-VL-8B-Instruct --port 8000
# Alternatively: vllm serve Qwen/Qwen3-VL-8B-Instruct --port 8000
lerobot-rollout ... --task="pick up the cup" --interactive=true \
    --planner.model_id=Qwen/Qwen3-VL-8B-Instruct \
    --planner.api_base=http://localhost:8000/v1
> /start
> /vqa What is the next short instruction to clear the table?
> /subtask put the cup in the sink
> /autosteer clear the table

Barındırılan bir model de aynı şekilde çalışır. Bu örnek, “Inference Providers'a çağrılar yapma” iznine sahip bir jetonla Hugging Face Inference Providers'ı kullanır:

export HF_TOKEN=hf_...
lerobot-rollout ... --task="put all colored cubes in the green bin" --interactive=true \
    --planner.model_id=Qwen/Qwen3.8-27B:novita \
    --planner.api_base=https://huggingface.co/proxy/router.huggingface.co/v1 \
    --planner.api_key_env=HF_TOKEN

/vqa yalnızca bir yanıt bildirir; /autosteer talimatları uygular. Uç nokta --planner.api_base ile, anahtar ise --planner.api_key_env=<variable> (tercih edilen yöntem, anahtar komutların ve günlüklerin dışında kalır) veya --planner.api_key ile yapılandırılır. --planner.request_timeout_s (varsayılan 600) ve --planner.request_max_retries (varsayılan 2) her isteği sınırlar; --planner.camera_key tek bir kamera seçer; --planner.log_path her etkileşimi tek bir JSON satırı olarak ekler. Model sunumu bağımlılıkları sunucu ortamına aittir. --autosteer_interval_s, istek gecikmesinin yanı sıra, bir yanıt uygulandıktan sonraki robot hareket süresini ölçer. Çok seviyeli yönlendirme ve otomatik sahne envanteri bu adaptörün kapsamı dışındadır.

Programatik kontrol

RolloutController, bir kütüphane API'si olarak aynı işlemleri sunar — stdin, yazdırma veya log susturma olmadan, iş parçacığı güvenli start() / reset() / stop() / set_task() işlemleri ve bir RolloutEvent geri çağırması:

from threading import Event, Thread

from lerobot.rollout import (
    LinkedEvent,
    RolloutController,
    RolloutEvent,
    build_rollout_context,
    create_strategy,
)

parent = Event()  # your application's shutdown signal
ctx = build_rollout_context(cfg, LinkedEvent(parent))  # loads policy, connects robot
strategy = create_strategy(cfg.strategy)
strategy.setup(ctx)

controller = RolloutController(strategy, ctx, on_event=print)  # or your own observer
serve_thread = Thread(target=controller.serve)  # serve() blocks; run it where you like
serve_thread.start()

controller.start()                        # robot starts executing the policy
controller.set_task("grab the red cube")  # re-instruct mid-run
controller.reset()                        # stop movement, return home, stay warm
controller.stop()                         # end serve()

serve_thread.join()
strategy.teardown(ctx)  # teardown stays with the caller

RolloutController, bağlamın kapatma olayının yukarıdaki gibi oluşturulmuş bir LinkedEvent olmasını gerektirir: denetleyici, çalıştırma bölümlerini yerel bayrağı üzerinden sonlandırırken, parent olayınız hâlâ tam bir kapatmayı zorlar. Sesli duyuruları istemedikçe play_sounds=False olarak ayarlayın.


Orbay Bayraklar

BayrakAçıklamaVarsayılan
--policy.pathZorunlu. HF Hub model kimliği veya yerel kontrol noktası yolu—
--robot.typeZorunlu. Robot türü (ör. so100_follower, koch_follower)—
--robot.portRobotun seri portu—
--robot.camerasKamera yapılandırması (JSON sözlüğü)—
--fpsPolitika çıkarımı ve veri seti kaydetme sıklığı30
--status_interval_sSağlık günlükleri arasındaki saniye (0 devre dışı bırakır; yalnızca etkileşimli olmayan)5
--durationSaniye cinsinden çalışma süresi (0 = sonsuz; etkileşimli modda segment başına)0
--deviceTorch cihazı (cpu, cuda, mps)auto
--taskGörev açıklaması (veri seti sağlanmadığında kullanılır)—
--display_dataTelemetriyi Rerun görselleştirmesine akıtınfalse
--display_ip / --display_portUzak Rerun sunucu adresi—
--interpolation_multiplierPolitika başına robot komutları (kontrol fps × N Hz'de)1
--interactivestdin üzerinde sohbet oturumu; robot /start (base, sentry) gelene kadar beklemede kalırfalse
--use_torch_compileÇıkarım için torch.compile etkinleştirinfalse
--resumeÖnceki bir kayıt oturumunu sürdürünfalse
--play_soundsEtkinlikler için vokal sentezitrue

Cadence Raporlama

Etkileşimsiz rollout, durumunu her beş saniyede bir kaydeder. Aralığı --status_interval_s=10 ile değiştirin veya --status_interval_s=0 ile devre dışı bırakın.

Rollout: loop 29.7/30 Hz · over budget 2/149 · starved 0 · infer 18.7 ms (worst 40.1) · process 2.41 GiB · GPU 5.12/79.6 GiB

Gecikme, aralığın medyanı/en kötüsüdür (RTC/uzak için turnaround). Kullanılamayan alanlar atlanır; GPU belleği cihaz genelinde, uzak bellek ise yereldir. Döngü bloklandığında raporlama duraklatılır.

Her strateji, kontrol döngüsünün fiilen ne başardığını raporlar; lerobot-record, lerobot-teleoperate ve lerobot-replay de aynı şekilde — hepsi aynı zamanlayıcı üzerinden ilerler. Kaydedilen her bölüm için tek satırlık bir özet üretilir ve döngü sona erdiğinde — Ctrl-C ile kesilme dahil — tüm çalışmayı kapsayan bir blok görüntülenir:

Cadence (episode 1): 29.84 Hz policy vs 30 Hz target · 1200 ticks, 20.1 s measured · 6/598 cycles over the 33.3 ms budget (work mean 18.7 ms, worst 48.1 ms)
Cadence (episode 2): 29.84 Hz policy vs 30 Hz target · 1200 ticks, 20.1 s measured · 6/599 cycles over the 33.3 ms budget (work mean 18.7 ms, worst 48.1 ms)
Cadence summary — whole run, 2 episodes · target 30 Hz × 2 (16.7 ms tick slot, 33.3 ms cycle budget): 2400 ticks, 1197 cycles judged
  effective cadence: 29.84 Hz policy / 59.67 Hz commands over 40.2 s measured
  cycles over the 33.3 ms work budget: 12/1197 (1.0%) — work mean 18.7 ms, worst 48.1 ms
  ticks over their 16.7 ms slot: 40/2400 (costs interpolation smoothness only)
  loop-body steps (share of measured work):
    observe      mean   3.13 ms · worst   9.00 ms ·  31.7% of work · 2400 calls
    process_obs  mean   0.50 ms · worst   1.00 ms ·   5.1% of work · 2400 calls
    infer        mean   5.18 ms · worst  40.00 ms ·  52.4% of work · 2400 calls
    send         mean   0.40 ms · worst   0.40 ms ·   4.1% of work · 2400 calls
    record       mean   0.67 ms · worst 620.00 ms ·   6.8% of work · 2402 calls
  pacing headroom: 7.4 ms slept per tick on average (max 13.0 ms) — near zero means the loop is saturated

Yukarıdan aşağı okuyun: etkin tempo, --fps hedefine karşı elde edilen değerdir; bütçeyi aşan döngüler, döngünün bu değeri kaç kez tutamadığını gösterir; adım kırılımı zamanın nereye harcandığını belirtir; tempo payı sıfıra yakınsa, yavaş bir tik emecek hiçbir pay kalmamış demektir. Yüksek bir infer payı, politika veya cihaza işaret eder; yüksek bir observe payı ise kameralara işaret eder. Bir adımın worst değeri, mean değerinin çok üzerindeyse bu tek seferlik bir olaydır — yukarıdaki örnekte record kare başına 0,67 ms iken 620 ms’lik sapma, bir bölümü kapatan engellenen save_episode çağrısıdır.

Buradaki bir döngü, bir politika eyleminin karşılığı olan tik sayısını (--interpolation_multiplier kadarı) ifade eder. Yalnızca 1/fps bütçesi üzerinde tamamlanan tam döngüler kare kaybına yol açabilir; tek bir tikin kendi zaman dilimini aşması, yalnızca içsel hareketin daha az akıcı olmasına neden olur, bu yüzden ikisi ayrı ayrı sayılır. İçsel işlem olmadan bir döngü tek bir tiktir, bu nedenle rapor bu ayrımı kaldırır ve her yerde tikleri sayar.

etkileşimli oturumlarda her /start segmenti kendi zamanlayıcısına sahiptir, bu nedenle rapor her segmentte bir kez (/reset, /stop veya --duration) sohbet kanalına iletilir, her işlemde bir kez değil.


Programatik Kullanım

Eklentiler için, lerobot.inference arka uç yapılandırmaları, yerel motorlar ve ortak zamanlama sözleşmeleri için herkese açık pakettir. lerobot.remote_inference uzak motor, protokol, dağıtım ve oturum uygulamasından sorumludur; lerobot.rollout robot döngüsü, stratejiler, interpolasyon ve kayıttan sorumludur. Herkese açık sembolleri uygulama dosyalarından değil, kendi paketlerinden içe aktarın. İsteğe bağlı uzak bağımlılıklar yalnızca uzak arka uç veya sunucu kullanıldığında gereklidir.

Özel dağıtımlar için (ör. kinematik işlemcilerle) rollout modül API'sini doğrudan kullanın:

from lerobot.rollout import BaseStrategyConfig, RolloutConfig, build_rollout_context
from lerobot.inference import SyncInferenceConfig
from lerobot.rollout.strategies import BaseStrategy
from lerobot.utils.process import ProcessSignalHandler

cfg = RolloutConfig(
    robot=my_robot_config,
    policy=my_policy_config,
    strategy=BaseStrategyConfig(),
    inference=SyncInferenceConfig(),
    fps=30,
    duration=60,
    task="my task",
)

signal_handler = ProcessSignalHandler(use_threads=True)
ctx = build_rollout_context(
    cfg,
    signal_handler.shutdown_event,
    robot_action_processor=my_custom_action_processor,       # optional
    robot_observation_processor=my_custom_obs_processor,     # optional
)

strategy = BaseStrategy(cfg.strategy)
try:
    strategy.setup(ctx)
    strategy.run(ctx)
finally:
    strategy.teardown(ctx)

Kinematik işlemcilerle tam örnekler için examples/so100_to_so100_EE/rollout.py ve examples/phone_to_so100/rollout.py dosyalarına bakın.

Update on GitHub