LeRobot documentation

Unitree G1

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Unitree G1

Unitree G1 insan benzeri robotu LeRobot tarafından desteklenmektedir. Teleoperasyon yapabilir, lokomaniplasyon politikaları eğitebilir, simülasyonda test edebilir ve daha fazlasını yapabilirsiniz. Hem 29 hem de 23 DoF varyantları desteklenmektedir.

Vücut Seçimi

UnitreeG1 sınıfı, eklem tanımlarını UnitreeG1Config.embodiment üzerinden seçer. Varsayılan değer g1_29'dur; bu nedenle mevcut yapılandırmalar G1-29 davranışını korur. 23-DoF yerleşimini --robot.embodiment=g1_23 ile veya Python'da şu şekilde seçin:

from lerobot.robots.unitree_g1 import UnitreeG1Config

config = UnitreeG1Config(embodiment="g1_23", is_simulation=False)
YetenekG1-29G1-23
Ortak yapılandırma ve eylem/gözlem özellikleri29 gövde eklemi, 14 kol eklemi23 gövde eklemi, 10 kol eklemi
DDS komut/geri bildirim düzeni29 aktif slot29 eklemi olmayan slot pasif bırakıldı
MuJoCo simülasyonuDestekleniyorHenüz desteklenmiyor; yerel model planlanıyor
Hareket denetleyicileriGR00T ve HolosomaGR00T ve Holosoma
SONIC tüm vücut denetleyicisiDestekleniyorDesteklenmiyor; politika 29 DoF gerektirir
Ağırlık telafisiDesteklenir, varsayılan olarak kapalıHenüz desteklenmiyor; yerel kinematik planlanıyor

Her iki varyant da aynı 29 slotlu DDS mesaj düzenini kullanır. G1-29 tüm 29 slotu kullanırken G1-23 23 slotu kullanır ve altı mevcut olmayan eklem slotunu pasif bırakır. Bu nedenle kp, kd ve default_positions vektörleri 29 eleman uzunluğunda kalır ve DDS slotuna göre indekslenir. G1-23’ün aktif kol slotları 15..19 ve 22..26’dır. 13, 14, 20, 21, 27, 28 slotlarında aktif eklem yoktur; yapılandırma değerleri sıfır olmalıdır. Bu slotlar eylem/gözlem özelliklerinden çıkarılır, yeniden numaralandırılmaz. Pasif ve ayrılmış komut girdileri, bir G1-23 mesajı yayımlanmadan önce temizlenir. Açık kazanç geçersizleştirmeleri sonlu, negatif olmayan ve aynı seyrek düzeni kullanmalıdır. Varsayılan kazançlar, her iki varyant arasında eklem adıyla paylaşıldığından, aynı fiziksel eklem aynı kazançları kullanırken G1-23’te olmayan slotlar sıfırda kalır.

Native G1-23 MuJoCo simülasyonu henüz desteklenmiyor. Simülasyon etkinleştirilmiş olarak G1-23 embodiment seçildiğinde, transport başlatılmasından önce hata oluşur. Native G1-23 MuJoCo modeli, gelecekteki bir sürümde planlanmaktadır.


Bölüm 1: Başlangıç

Unitree SDK'yi yükleyin

unitree_sdk2_python kurulum kılavuzunu izleyin. unitree_sdk2py==1.0.1 ve cyclonedds==0.10.2 ile test edildi:

conda create -y -n lerobot python=3.12
conda activate lerobot
git clone https://github.com/unitreerobotics/unitree_sdk2_python.git
cd unitree_sdk2_python
pip install -e .
cd ..

LeRobot'u Yükle

conda install ffmpeg -c conda-forge
conda install -c conda-forge "pinocchio>=3.0.0,<4.0.0"
git clone https://github.com/huggingface/lerobot.git
cd lerobot
pip install -e '.[unitree_g1]'
For now, pinocchio must be installed from conda-forge (not pip) to include the CasADi bindings needed for arm IK.

Kurulumu Test Et (Simülasyon)

Simülasyon ortamının kendi bağımlılıkları vardır. Simülasyon ortamı bağımlılıklarını kontrol edin: Unitree G1 Mujoco EnvHub.

pip install mujoco loguru msgpack msgpack-numpy
lerobot-teleoperate \
  --robot.type=unitree_g1 \
  --robot.is_simulation=true \
  --teleop.type=unitree_g1 \
  --teleop.id=wbc_unitree \
  --robot.cameras='{"global_view": {"type": "zmq", "server_address": "localhost", "port": 5555, "camera_name": "head_camera", "width": 640, "height": 480, "fps": 30, "warmup_s": 5}}' \
  --display_data=true \
  --robot.controller=GrootLocomotionController

Bu, G1 için bir MuJoCo sim örneği başlatacaktır. Sim içinde robotun yürüyüşünü kontrol edebilmek için başlatmadan önce makinenize bir oyun kolu bağlayabilirsiniz. --robot.controller aracılığıyla hem HolosomaLocomotionController hem de GrootLocomotionController desteklenmektedir.

  • Robotu serbest bırakmak için 9 tuşuna basın
  • Bel yüksekliğini artırmak / azaltmak için 7 / 8 tuşlarına basın

Son Etkileyiciyi Seçme

--robot.end_effector, kolların ne taşıdığını belirtir: paralel kavrayıcılar için (varsayılan) dex1, üç parmaklı eller için dex3 veya çıplak bilekler için dummy. Simülasyonda MuJoCo modelini seçer; bu model parmak aktüatörlerini ve sahnenin hangi kameraları içerdiğini belirler — bilek kameraları uç efektere monte edildiğinden, dummy yalnızca head_camera içerir.

lerobot-teleoperate \
  --robot.type=unitree_g1 \
  --robot.is_simulation=true \
  --robot.end_effector=dex3 \
  --teleop.id=wbc_unitree \
  --robot.controller=GrootLocomotionController

Sim, modelin kameralarını --robot.sim_camera_port (varsayılan olarak 5555) üzerinden ZMQ ile yayınlar; --robot.cameras içindeki zmq kameraları da görüntüleri buradan okur. Bunun yerine MuJoCo’nun etkileşimli penceresini açmak için --robot.sim_publish_images=false parametresini iletin: sim, ekran dışı bağlamlar pencereyi kullanan iş parçacığına değil, onları oluşturan iş parçacığına ait olduğu için yalnızca kameralarını ya da penceresini, asla ikisini birden render etmez. --robot.sim_onscreen bu seçimi kameralara bırakmak yerine açıkça belirtir ve ikisinin de istenmesi reddedilir; ikisini de render etmemek için bunu ve --robot.sim_publish_images parametresini de false olarak ayarlayın, bu da ekranı olmayan bir makinenin yapabileceği şeydir.

Fiziksel Robotla Bağlantı Kurun

G1'in Ethernet IP'si 192.168.123.164 olarak sabittir. Makinenizin aynı alt ağda statik bir IP'si olmalıdır: 192.168.123.x burada x ≠ 164.

# Replace 'enp131s0' with your ethernet interface name (check with `ip a`)
sudo ip addr flush dev enp131s0
sudo ip addr add 192.168.123.200/24 dev enp131s0
sudo ip link set enp131s0 up

Robot'a SSH ile bağlanın

ssh unitree@192.168.123.164
# Password: 123

Ethernet ile İnternet Paylaşımı

G1'in depoları klonlamak ve paketleri yüklemek için internet erişimine ihtiyacı vardır. Laptopunuzun bağlantısını Ethernet üzerinden paylaşın:

Laptop'unuzda:

sudo sysctl -w net.ipv4.ip_forward=1

# Replace wlp132s0f0 with your WiFi interface name
sudo iptables -t nat -A POSTROUTING -o wlp132s0f0 -s 192.168.123.0/24 -j MASQUERADE
sudo iptables -A FORWARD -i wlp132s0f0 -o enp131s0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i enp131s0 -o wlp132s0f0 -j ACCEPT

G1 üzerinde:

sudo ip route del default 2>/dev/null || true
sudo ip route add default via 192.168.123.200 dev eth0
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf

# Verify
ping -c 3 8.8.8.8

G1 üzerinde Unitree SDK'sını yükleyin

unitree_sdk2_python kurulum kılavuzunu izleyin:

conda create -y -n lerobot python=3.12
conda activate lerobot
git clone https://github.com/unitreerobotics/unitree_sdk2_python.git
cd unitree_sdk2_python
python -m pip install -e .
cd ..

G1 üzerinde LeRobot'ı yükleyin

git clone https://github.com/huggingface/lerobot.git
cd lerobot
conda install -c conda-forge "pinocchio>=3.0.0,<4.0.0"
python -m pip install -e '.[unitree_g1]'
For now, pinocchio must be installed from conda-forge (not pip) to include the CasADi bindings needed for arm IK.

(İsteğe bağlı) Robotta WiFi'ı Etkinleştir

Kablosuz SSH erişimi için G1 üzerinde WiFi'yi etkinleştirebilirsiniz (varsayılan olarak engellenmiştir):

sudo rfkill unblock all
sudo ip link set wlan0 up
sudo nmcli radio wifi on
sudo nmcli device set wlan0 managed yes
sudo systemctl restart NetworkManager

Bir WiFi ağına bağlanın:

nmcli device wifi list

sudo nmcli connection add type wifi ifname wlan0 con-name "YourNetwork" ssid "YourNetwork"
sudo nmcli connection modify "YourNetwork" wifi-sec.key-mgmt wpa-psk
sudo nmcli connection modify "YourNetwork" wifi-sec.psk "YourPassword"
sudo nmcli connection modify "YourNetwork" connection.autoconnect yes
sudo nmcli connection up "YourNetwork"

ip a show wlan0

Ardından Ethernet yerine WiFi üzerinden SSH bağlantısı kurabilirsiniz:

ssh unitree@<ROBOT_WIFI_IP>
# Password: 123

Bölüm 2: Teleoperasyon & Locomotion

Robot Sunucusunu Çalıştırın

Robot üzerinde (~/lerobot içinden):

cd ~/lerobot
python src/lerobot/robots/unitree_g1/run_g1_server.py --camera

Locomotion Politikasını Çalıştırın

Teleoperasyon istemcisini, Ethernet üzerinden, WiFi üzerinden (deneysel) veya doğrudan robotun kendisinde, dizüstü bilgisayarınızdan çalıştırabilirsiniz. Ağınızın getirebileceği olası gecikmelere dikkat edin.

Laptop'unuzdan:

lerobot-teleoperate \
  --robot.type=unitree_g1 \
  --robot.is_simulation=false \
  --robot.robot_ip=<ROBOT_IP> \
  --teleop.type=unitree_g1 \
  --teleop.id=wbc_unitree \
  --robot.cameras='{"global_view": {"type": "zmq", "server_address": "<ROBOT_IP>", "port": 5555, "camera_name": "head_camera", "width": 640, "height": 480, "fps": 30}}' \
  --display_data=true \
  --robot.controller=HolosomaLocomotionController

GrootLocomotionController ve HolosomaLocomotionController her ikisini de --robot.controller aracılığıyla destekliyoruz.


Bölüm 3: Homunculus Ekzoskeleti ile Loco-Manipülasyon

Homunculus Ekzoskeleti aracılığıyla bir loco-manipulation çözümü sunuyoruz — tüm vücut kontrolü için açık kaynaklı 7 DoF bir ekzoskelet. buradan inceleyebilirsiniz.

Kalibre

lerobot-calibrate \
  --teleop.type=unitree_g1 \
  --teleop.left_arm_config.port=/dev/ttyACM1 \
  --teleop.right_arm_config.port=/dev/ttyACM0 \
  --teleop.id=exo

Kalibrasyon sırasında her eklemi tüm hareket aralığında gezdirin. Ayarlama tamamlandıktan sonra eklemi nötr konuma getirin ve ilerlemek için n tuşuna basın.

Bir Veri Seti Kaydet

lerobot-record \
  --robot.type=unitree_g1 \
  --robot.is_simulation=true \
  --robot.cameras='{"global_view": {"type": "zmq", "server_address": "localhost", "port": 5555, "camera_name": "head_camera", "width": 640, "height": 480, "fps": 30}}' \
  --teleop.type=unitree_g1 \
  --teleop.left_arm_config.port=/dev/ttyACM1 \
  --teleop.right_arm_config.port=/dev/ttyACM0 \
  --teleop.id=exo \
  --dataset.repo_id=your-username/dataset-name \
  --dataset.single_task="Test" \
  --dataset.num_episodes=2 \
  --dataset.episode_time_s=5 \
  --dataset.reset_time_s=5 \
  --dataset.push_to_hub=true \
  --dataset.streaming_encoding=true \
  --dataset.encoder_threads=2

Not: Yalnızca joystick kullanıyorsanız --teleop.left_arm_config.port ve --teleop.right_arm_config.port parametrelerini atlayın.

Örnek veri seti: nepyope/unitree_box_move_blue_full


Bölüm 4: Eğitim & Çıkarım

Eğit

python src/lerobot/scripts/lerobot_train.py \
  --dataset.repo_id=your-username/dataset-name  \
  --policy.type=pi05 \
  --output_dir=./outputs/pi05_training \
  --job_name=pi05_training \
  --policy.repo_id=your-username/your-repo-id \
  --policy.pretrained_path=lerobot/pi05_base \
  --policy.compile_model=true \
  --policy.gradient_checkpointing=true \
  --trackio.enable=true \
  --policy.dtype=bfloat16 \
  --policy.freeze_vision_encoder=false \
  --policy.train_expert_only=false \
  --steps=3000 \
  --policy.device=cuda \
  --batch_size=32

RTC ile çıkarım

Uygun bir şekilde eğitilmiş bir politika, yerel çıkarım zamanı RTC'sini kullanabilir:

lerobot-rollout \
  --strategy.type=base \
  --policy.path=your-username/your-repo-id \
  --policy.device=cuda \
  --robot.type=unitree_g1 \
  --robot.is_simulation=false \
  --robot.controller=HolosomaLocomotionController \
  --robot.cameras='{"global_view": {"type": "zmq", "server_address": "<ROBOT_IP>", "port": 5555, "camera_name": "head_camera", "width": 640, "height": 480, "fps": 30}}' \
  --task="task_description" \
  --duration=1000 \
  --fps=30 \
  --inference.type=rtc

G1 yürüyüş denetleyicileri, rollout’un kurtarılabilir bekleme mekanizmasının kullandığı saklanan hedef sözleşmesini beyan etmez. Hareket başladıktan sonra, eylem tamponlarının tükenmesi bir kibarlık süresi bekleme yerine sonlu bir arızaya neden olur. İstek süre sınırları ve gözlem yaş sınırları da geçerlidir. Bu tarifi kullanmadan önce, politikanın kullanılabilir parçasının çıkarım gecikmesini kapsadığını doğrulayın; bkz. yerel RTC bekleme ve bütçeleri. SONIC, aşağıda açıklanan ayrı bir saklanan jeton sözleşmesine sahiptir.


Bölüm 5: SONIC Tüm Vücut Kontrolü (Latent-Token Politikaları)

LeRobot artık NVIDIA’nın SONIC tüm vücut dağıtım yığınının decoder yarısını SonicWholeBodyController olarak taşır. Artık eklemlere komut vermek yerine, politika her tik’te 64 boyutlu bir latent hareket token’ı (motion_token.{i}.pos) üretir; SONIC decoder’ı bu token’ı ve son zamanlardaki propriosepsiyon geçmişini, duruş pozuna ölçeklenerek eklenen bir kalan eyleme dönüştürür ve tüm 29 DoF için 50 Hz eklemler konum hedefleri oluşturur.

Kontrolcü, ONNX çözücüsünü ve tüm dağıtım sabitlerini (PD kazançları, default_angles, action_scale ve nötr token) lerobot/sonic_decoder konumundan yükler. Depo, ayrıca kontrolcünün policy_type="low_latency" argümanı ile seçilebilen damıtılmış düşük gecikmeli bir çözücü de içerir (varsayılan değer "default"’tir).

Simülasyonda Test

SONIC hareket token'ları üzerinde eğitilmiş herhangi bir token-çıktı politikası (ör. nepyope/sonic_walk) onu sürdürebilir:

lerobot-rollout \
  --strategy.type=base \
  --policy.path=nepyope/sonic_walk \
  --policy.device=cuda \
  --robot.type=unitree_g1 \
  --robot.is_simulation=true \
  --robot.controller=SonicWholeBodyController \
  --robot.cameras='{"ego_view": {"type": "zmq", "server_address": "localhost", "port": 5555, "camera_name": "head_camera", "width": 640, "height": 480, "fps": 30, "warmup_s": 15}}'

Fiziksel Robotta Çalıştır

remote inference politikası sunucusunu GPU makinesinde çalıştırın ve robot köprüsünü, SONIC kodlayıcısını ve rollout istemcisini G1 Jetson üzerinde tutun. Ağ üzerinden yalnızca 64 boyutlu token parçaları geçer; kodlayıcı ve 50 Hz rt/lowcmd döngüsü cihaz üzerinde kalır.

Her iki makinede de uzak ekini kurun. G1'de Unitree ekini koruyun:

# GPU machine
python -m pip install -e '.[remote]'

# G1 Jetson
python -m pip install -e '.[unitree_g1,remote]'

GPU makinesinde, politika sunucusunu depo kök dizininden başlatın. Bakımı yapılan profil nepyope/sonic_walk ile eşleşir; başka bir politika için kontrol noktasını ve özellik sözleşmesini birlikte kopyalayın ve güncelleyin.

lerobot-policy-server \
  --config_path=examples/remote_inference/unitree_g1_sonic.yaml

G1'de köprü ve kamerayı çalışır durumda tutun:

python src/lerobot/robots/unitree_g1/run_g1_server.py --camera

Ardından <GPU_MACHINE_IP> değerini değiştirerek ikinci bir G1 terminalinde rollout istemcisini başlatın:

lerobot-rollout \
  --strategy.type=base \
  --inference.type=remote \
  --inference.endpoint=tcp/<GPU_MACHINE_IP>:7447 \
  --inference.deployment=g1-sonic \
  --inference.semantics=unitree-g1-sonic-motion-token-v1 \
  --inference.encoding=jpeg \
  --inference.action_starvation_grace_s=1.0 \
  --robot.type=unitree_g1 \
  --robot.is_simulation=false \
  --robot.robot_ip=127.0.0.1 \
  --robot.controller=SonicWholeBodyController \
  --robot.cameras='{"ego_view": {"type": "zmq", "server_address": "127.0.0.1", "port": 5555, "camera_name": "head_camera", "width": 640, "height": 480, "fps": 30, "warmup_s": 5}}' \
  --task='walk forward' \
  --fps=30 \
  --return_to_initial_position=false \
  --interactive=true

G1 hareket için hazır olduğundan emin olduktan sonra yalnızca /start yazın. SONIC, son tam token’ın yeniden gönderilmesinin gömülü çözücü dengelemesini koruduğu için bekleme desteğini bildirir. İlk politika sonucu gelmeden önce, rollout çözücünün nötr token’ını gönderir. Eylem tamponu boşalırsa, son uygulanan token en fazla action_starvation_grace_s (yukarıda bir saniye) boyunca tekrarlanır; taze bir tahmin gelmezse rollout hataya düşer ve yapılandırılmış kapatma/ayrılma yolunu izler. G1 yürüme denetleyicileri, joystick hızlarının bu şekilde korunamaması nedeniyle desteklenmez.

Tarif, başlangıç konumuna dönüşü devre dışı bırakır: SONIC'in gizli token uzayında interpolasyon, doğrulanmış fiziksel bir ev konumu yörüngesi değildir. Aynı nedenle /reset komutundan kaçının, çünkü bu komut token'ı bağlantı anındaki değerine geri sardıracaktır. /stop komutu, uzak oturumu kapatmaya ve robotu normal denetleyici kapatma yolu üzerinden bağlantısını kesmeye devam eder.

SonicWholeBodyController ile gözlem durumu, 29 eklem konumu yerine 64 boyutlu token yankısıdır; bu nedenle uyumlu bir checkpoint, bu duruma karşı eğitilmiş olmalıdır. Bağlantı sırasında robot, denetleyici devralmadan önce eklemleri kodlayıcının default_angles değerlerine yumuşak bir şekilde getirir.


Ek Kaynaklar


Son güncelleme: Temmuz 2026

Update on GitHub