LeRobot documentation
Unitree G1
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)| Yetenek | G1-29 | G1-23 |
|---|---|---|
| Ortak yapılandırma ve eylem/gözlem özellikleri | 29 gövde eklemi, 14 kol eklemi | 23 gövde eklemi, 10 kol eklemi |
| DDS komut/geri bildirim düzeni | 29 aktif slot | 29 eklemi olmayan slot pasif bırakıldı |
| MuJoCo simülasyonu | Destekleniyor | Henüz desteklenmiyor; yerel model planlanıyor |
| Hareket denetleyicileri | GR00T ve Holosoma | GR00T ve Holosoma |
| SONIC tüm vücut denetleyicisi | Destekleniyor | Desteklenmiyor; politika 29 DoF gerektirir |
| Ağırlık telafisi | Desteklenir, 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=GrootLocomotionControllerBu, 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
9tuşuna basın - Bel yüksekliğini artırmak / azaltmak için
7/8tuş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=GrootLocomotionControllerSim, 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 upRobot'a SSH ile bağlanın
ssh unitree@192.168.123.164
# Password: 123Ethernet 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 ACCEPTG1 ü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.8G1 ü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 NetworkManagerBir 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 wlan0Ardından Ethernet yerine WiFi üzerinden SSH bağlantısı kurabilirsiniz:
ssh unitree@<ROBOT_WIFI_IP>
# Password: 123Bö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 --cameraLocomotion 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=HolosomaLocomotionControllerGrootLocomotionController 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=2Not: Yalnızca joystick kullanıyorsanız
--teleop.left_arm_config.portve--teleop.right_arm_config.portparametrelerini 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=32RTC 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=rtcG1 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=trueG1 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