LeRobot documentation
Unitree G1
Unitree G1
Unitree G1ヒューマノイドはLeRobotでサポートされています。テレオペレーション、locomanipulationポリシーの学習、シミュレーションでのテストなどが可能です。29 DoFおよび23 DoFの両方のバリアントに対応しています。
エンボディメントの選択
UnitreeG1 クラスは、UnitreeG1Config.embodiment によって関節定義を選択します。
デフォルトは g1_29 であり、既存の設定は G1-29 の動作を維持します。23 自由度のレイアウトを選択するには、--robot.embodiment=g1_23 を使用するか、Python で以下のように指定します。
from lerobot.robots.unitree_g1 import UnitreeG1Config
config = UnitreeG1Config(embodiment="g1_23", is_simulation=False)| 機能 | G1-29 | G1-23 |
|---|---|---|
| ジョイント設定とアクション/観測特徴 | 29の体の関節、14の腕の関節 | 23の体幹関節、10の腕関節 |
| DDSコマンド/フィードバックレイアウト | 29個のアクティブなスロット | 29のスロットで欠損した関節を非アクティブのままにします |
| MuJoCoシミュレーション | サポート | 未対応。ネイティブモデルの計画あり |
| Locomotionコントローラー | GR00TとHolosoma | GR00TとHolosoma |
| SONIC 全身コントローラー | サポート | サポートされていません。ポリシーは29 DoFを必要とします |
| 重力補正 | サポートされていますが、デフォルトでは無効です | 未対応。ネイティブの運動学は計画されています |
両方のバリアントは、同じ29スロットのDDSメッセージレイアウトを使用します。G1-29は29スロットすべてを使用し、G1-23は23スロットを使用し、存在しない6つのジョイントのスロットを非アクティブにします。そのため、kp、kd、およびdefault_positionsベクトルは29要素の長さのままとなり、DDSスロットによってインデックス付けされます。
G1-23のアクティブなアームスロットは15..19および22..26です。スロット13, 14, 20, 21, 27, 28にはアクティブなジョイントがなく、それらの設定値はゼロでなければなりません。これらはアクション/観測特徴から省略され、再番号付けは行われません。
非アクティブおよび予約済みのコマンドエントリは、G1-23メッセージを公開する前にクリアされます。
明示的なゲインの上書きは、有限で非負であり、同じスパースレイアウトを使用する必要があります。
デフォルトゲインはジョイント名で両方のバリアント間で共有されるため、同一の物理ジョイントは同一のゲインを使用し、G1-23に存在しないスロットはゼロのままになります。
ネイティブのG1-23 MuJoCoシミュレーションはまだサポートされていません。シミュレーションを有効にしてG1-23エンボディメントを選択すると、トランスポートの初期化の前に失敗します。ネイティブのG1-23 MuJoCoモデルは将来のバージョンで提供される予定です。
Part 1: はじめに
Unitree SDKをインストールします
unitree_sdk2_python インストールガイドに従ってください。unitree_sdk2py==1.0.1およびcyclonedds==0.10.2で動作確認済みです:
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のインストール
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.
インストールのテスト(シミュレーション)
シミュレーション環境には独自の依存関係があります。Simulation environment dependencies: 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これにより、G1用のMuJoCoシミュレーションインスタンスが起動します。シミュレーション内でロボットの歩行を操作するために、起動前にゲームパッドをマシンに接続できます。--robot.controllerを介して、HolosomaLocomotionControllerとGrootLocomotionControllerの両方をサポートしています。
9を押してロボットを解放します7/8を押して、ウエストの高さを上げる / 下げる
エンドエフェクタの選択
--robot.end_effector は、アームが保持するエンドエフェクタの種類を指定します。dex1 は並列グリップ(デフォルト)、dex3 は3本指ハンド、dummy は裸のリストです。シミュレーションでは、この設定によって MuJoCo モデルが選択され、指のアクチュエータやシーンに搭載されるカメラが決まります。リストカメラはエンドエフェクタにマウントされるため、dummy の場合は head_camera のみになります。
lerobot-teleoperate \
--robot.type=unitree_g1 \
--robot.is_simulation=true \
--robot.end_effector=dex3 \
--teleop.id=wbc_unitree \
--robot.controller=GrootLocomotionControllerシミュレータは、モデルのカメラを--robot.sim_camera_port(デフォルトは5555)のZMQ経由で公開します。--robot.cameras内のzmqカメラは、そこからそれらを読み取ります。--robot.sim_publish_images=falseを渡すと、代わりにMuJoCoのインタラクティブウィンドウが開きます。シミュレータはカメラまたはウィンドウのいずれかをレンダリングしますが、両方をレンダリングすることはありません。これは、オフスクリーンコンテキストがビューアではなく、それらを作成したスレッドに属するためです。--robot.sim_onscreenは、カメラに委ねるのではなく、この選択を明示的に指定します。両方を要求することは拒否されます。レンダリングを行わない場合は、--robot.sim_onscreenと--robot.sim_publish_imagesの両方をfalseに設定します。ディスプレイのないマシンでは、これが実行可能な方法です。
物理ロボットに接続する
G1のイーサネットIPは192.168.123.164に固定されています。お使いの機器には、同じサブネットの静的IPアドレス192.168.123.x(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ロボットにSSH接続する
ssh unitree@192.168.123.164
# Password: 123Ethernet経由でインターネットを共有する
G1 はリポジトリのクローンとパッケージのインストールにインターネット接続が必要です。ラップトップの接続を Ethernet 経由で共有してください:
ラップトップ上で:
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 について:
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にUnitree SDKをインストールする
unitree_sdk2_python インストールガイドに従ってください:
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にLeRobotをインストールする
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.
(任意) ロボットで WiFi を有効にする
ワイヤレスでのSSHアクセスには、G1でWiFiを有効にできます(デフォルトでは無効になっています):
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 NetworkManagerWiFiネットワークに接続する:
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その後、Ethernet ではなく WiFi 経由で SSH 接続できます:
ssh unitree@<ROBOT_WIFI_IP>
# Password: 123Part 2: 遠隔操作と移動
ロボットサーバーの実行
ロボット上(~/lerobotから):
cd ~/lerobot
python src/lerobot/robots/unitree_g1/run_g1_server.py --cameraLocomotion Policyの実行
テレオペレーションクライアントは、ラップトップからEthernet経由、WiFi経由(実験的)、またはロボット本体上で直接実行できます。ネットワークによって生じる可能性のあるレイテンシにご注意ください。
ラップトップから:
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--robot.controller を使用して、GrootLocomotionController と HolosomaLocomotionController の両方をサポートしています。
Part 3: Homunculus ExoskeletonによるLoco-Manipulation
Homunculus Exoskeleton を通じて、loco-manipulation のソリューションを提供しています。これは全身制御のためのオープンソースの 7 DoF 外骨格です。こちらをご覧ください。
キャリブレーション
lerobot-calibrate \ --teleop.type=unitree_g1 \ --teleop.left_arm_config.port=/dev/ttyACM1 \ --teleop.right_arm_config.port=/dev/ttyACM0 \ --teleop.id=exo
キャリブレーション中は、各関節をその全可動範囲にわたって動かしてください。フィッティング後、関節を中立位置に移動し、nを押して次へ進んでください。
Datasetを記録する
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注: ジョイスティックのみを使用する場合は、
--teleop.left_arm_config.portと--teleop.right_arm_config.portを省略してください。
データセットの例: nepyope/unitree_box_move_blue_full
Part 4: 学習と推論
学習
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による推論
互換性のある学習済みポリシーは、ローカル推論時RTCを使用できます。
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の歩行コントローラーは、rolloutの回復可能な待機で使用される保留ターゲットの契約を宣言していません。そのため、モーション開始後にアクションバッファを使い切ると、グレース期間の待機ではなく、ターミナルフォールトが発生します。リクエストの期限と観測の経過時間制限も適用されます。このレシピを使用する前に、ポリシーの利用可能なチャンクが推論のレイテンシーをカバーしていることを検証してください。ローカルRTCの待機と予算を参照してください。SONICには、以下に説明する別の保留トークンの契約があります。
Part 5: SONIC 全身制御(潜在トークンポリシー)
LeRobotは現在、NVIDIAのSONIC全身デプロイスタックのデコーダー部分をSonicWholeBodyControllerとして移植しました。このポリシーは関節を直接コマンドするのではなく、各ティックで64次元の潜在モーショントークン(motion_token.{i}.pos)を出力します。SONICデコーダーは、このトークンと最近の固有受容性履歴を、残差アクションにマッピングします。この残差アクションはスケーリングされ、立位姿勢に加算されることで、全29自由度に対する50 Hzの関節位置ターゲットが生成されます。
コントローラーは、ONNXデコーダーとすべてのデプロイ定数(PDゲイン、default_angles、action_scale、ニュートラルトークン)を、lerobot/sonic_decoderから読み込みます。リポジトリには、低遅波の蒸留済みデコーダーも同梱されており、コントローラーのpolicy_type="low_latency"引数で選択できます(デフォルトは"default"です)。
シミュレーションでのテスト
SONICモーショントークンで学習されたトークン出力ポリシー(例: nepyope/sonic_walk)は、すべてこれを駆動できます:
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}}'物理ロボット上で実行する
GPUマシン上でリモート推論ポリシーサーバーを実行し、ロボットブリッジ、SONICデコーダー、ロールアウトクライアントはG1 Jetson上に保持します。ネットワークを通過するのは64次元のトークンチャンクのみであり、デコーダーと50 Hzのrt/lowcmdループは機内(オンボード)で動作します。
両方のマシンにリモートエクストラをインストールします。G1にはUnitreeエクストラを維持してください:
# GPU machine
python -m pip install -e '.[remote]'
# G1 Jetson
python -m pip install -e '.[unitree_g1,remote]'GPUマシン上で、リポジトリのルートディレクトリからポリシーサーバーを起動します。メンテナンスされているプロファイルはnepyope/sonic_walkと一致しています。別のポリシーを使用する場合は、そのチェックポイントとフィーチャーコントラクトをコピーして、まとめて更新してください。
lerobot-policy-server \ --config_path=examples/remote_inference/unitree_g1_sonic.yaml
G1では、ブリッジとカメラを動作させ続けます:
python src/lerobot/robots/unitree_g1/run_g1_server.py --camera
次に、<GPU_MACHINE_IP> を置き換えて、2番目の G1 ターミナルでロールアウトクライアントを起動します:
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 が移動可能と判定された後でなければ、/start を入力しないでください。SONIC は待機サポートを宣言します。これは、最後の完全なトークンを再送信することで、オンボードのデコーダーのバランスを維持できるためです。最初のポリシー結果の前に、ロールアウトはデコーダーのニュートラルトークンを送信します。アクションバッファが枯渇した場合、最後に適用されたトークンを最大 action_starvation_grace_s(上記では 1 秒)の間繰り返します。新しい予測が届かない場合、ロールアウトはフォールトとなり、設定されたシャットダウン/切断パスに従います。G1 の歩行コントローラーは、この方法ではジョイスティックの速度を保持できないため、サポートされていません。
このレシピでは、初期位置への復帰が無効化されています。SONICの潜在トークン空間を補間することは、検証済みの物理的なホーミング軌道ではないためです。同じ理由により、/resetの使用を避けてください。これにより、トークンが接続時の値にリセットされてしまうためです。/stopは、リモートセッションを閉じ、通常のコントローラーのシャットダウン経路を通じてロボットを切断します。
SonicWholeBodyControllerでは、観測状態は29の関節位置ではなく64次元のトークンエコーとなるため、その状態に対して学習された互換性のあるチェックポイントが必要です。接続時、ロボットはコントローラーが制御を引き継ぐ前に、関節をデコーダーのdefault_anglesへ緩やかに移動させます。
追加のリソース
最終更新日: 2026年7月
Update on GitHub