G1 (29自由度) + Dex3-1 |
H1_2(腕 7自由度) |
このリポジトリは、Apple Vision Pro を使用して Unitree ヒューマノイドロボット を遠隔操作するためのものです。
以下は本リポジトリで現在サポートされているロボットの種類です,
🤖 ロボット | ⚪ ステータス |
---|---|
G1(29自由度) | ✅ 完了 |
G1(23自由度) | ✅ 完了 |
H1(腕 4自由度) | ✅ 完了 |
H1_2(腕 7自由度) | ✅ 完了 |
Dex3-1 ハンド | ✅ 完了 |
Inspire ハンド | ✅ 完了 |
... | ... |
以下は、必要なデバイスと配線図です:
これはネットワークトポロジー図で、G1ロボットを例にしています:
私たちは Ubuntu 20.04 と Ubuntu 22.04 でコードをテストしました。他のオペレーティングシステムでは異なる設定が必要かもしれません。
詳細については、公式ドキュメント および OpenTeleVision を参照してください。
unitree@Host:~$ conda create -n tv python=3.8
unitree@Host:~$ conda activate tv
# `pip install` を使用する場合、pinocchio のバージョンが 3.1.0 であることを確認してください
(tv) unitree@Host:~$ conda install pinocchio -c conda-forge
(tv) unitree@Host:~$ pip install meshcat
(tv) unitree@Host:~$ pip install casadi
注意:コマンドの前にあるすべての識別子は、どのデバイスとディレクトリでコマンドを実行するべきかを示すためのものです。
Ubuntu システムの ~/.bashrc
ファイルでは、デフォルトの設定は次の通りです: PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
例として、
(tv) unitree@Host:~$ pip install meshcat
コマンドを取り上げます。
(tv)
はシェルが conda 環境tv
にあることを示します。unitree@Host:~
はユーザー\u
unitree
がデバイス\h
Host
にログインしており、現在の作業ディレクトリ\w
が$HOME
であることを示します。$
は現在のシェルが Bash であることを示します(非ルートユーザーの場合)。pip install meshcat
はunitree
がHost
で実行したいコマンドです。詳細については、Harley Hahn's Guide to Unix and Linux および Conda User Guide を参照してください。
# unitree_sdk2_python をインストールします。
(tv) unitree@Host:~$ git clone https://github.com/unitreerobotics/unitree_sdk2_python.git
(tv) unitree@Host:~$ cd unitree_sdk2_python
(tv) unitree@Host:~$ pip install -e .
注意:元の h1_2 ブランチの unitree_dds_wrapper は一時的なバージョンであり、現在は公式の Python 版制御通信ライブラリ unitree_sdk2_python に完全に移行されています。
(tv) unitree@Host:~$ cd ~
(tv) unitree@Host:~$ git clone https://github.com/unitreerobotics/avp_teleoperate.git
(tv) unitree@Host:~$ cd ~/avp_teleoperate
(tv) unitree@Host:~$ pip install -r requirements.txt
Apple Vision Pro
Apple は非 HTTPS 接続での WebXR を許可していません。アプリケーションをローカルでテストするには、自己署名証明書を作成し、クライアントにインストールする必要があります。Ubuntu マシンとルーターが必要です。Apple Vision Pro と Ubuntu ホストマシン を同じルーターに接続します。
- mkcert をインストールします: https://github.com/FiloSottile/mkcert
- ホストマシン のローカル IP アドレスを確認します:
(tv) unitree@Host:~/avp_teleoperate$ ifconfig | grep inet
ホストマシン のローカル IP アドレスが 192.168.123.2
であると仮定します。
p.s.
ifconfig
コマンドを使用して ホストマシン の IP アドレスを確認できます。
- 証明書を作成します:
(tv) unitree@Host:~/avp_teleoperate$ mkcert -install && mkcert -cert-file cert.pem -key-file key.pem 192.168.123.2 localhost 127.0.0.1
生成された cert.pem
と key.pem
ファイルを teleop
に配置します。
(tv) unitree@Host:~/avp_teleoperate$ cp cert.pem key.pem ~/avp_teleoperate/teleop/
- サーバーでファイアウォールを開きます:
(tv) unitree@Host:~/avp_teleoperate$ sudo ufw allow 8012
- Apple Vision Pro に ca-certificates をインストールします:
(tv) unitree@Host:~/avp_teleoperate$ mkcert -CAROOT
rootCA.pem
を AirDrop 経由で Apple Vision Pro にコピーし、インストールします。
設定 > 一般 > 情報 > 証明書信頼設定。「ルート証明書の完全な信頼を有効にする」の下で、証明書の信頼をオンにします。
設定 > アプリ > Safari > 高度な設定 > 機能フラグ > WebXR 関連機能を有効にします。
注意:新しい Vision OS 2 システムでは、この手順が異なります。証明書を AirDrop 経由で Apple Vision Pro デバイスにコピーした後、設定アプリの左上のアカウント欄の下に証明書関連情報欄が表示されます。それをクリックして、証明書の信頼を有効にします。
2.2.2 PICO 4 Ultra Enterprise or Meta Quest 3
PICO 4 Ultra Enterprise と Meta-Quest 3 において、ハンドトラッキングを用いたテレオペレーションを試みました。
PICO 4 Ultra Enterprise のシステム仕様:
システムバージョン:5.12.6.U;Android バージョン:14;ソフトウェアバージョン:c000_cf01_bv1.0.1_sv5.12.6_202412121344_sparrow_b4244_user; ブラウザーバージョン: 4.0.28 beta version
Meta-Quest 3 のシステム仕様:
システムバージョン:49829370066100510;バージョン:62.0.0.273.343.570372087;ランタイムバージョン:62.0.0.269.341.570372063;OS バージョン:SQ3A.220605.009.A1
さらなる設定手順については、その issue をご覧ください。
このステップは、環境が正しくインストールされているかを確認するためのものです。
近日公開。
このプログラムを開始する前に、公式ドキュメント を少なくとも一度は読んでください。
avp_teleoperate/teleop/image_server
ディレクトリにある image_server.py
を Unitree ロボット (G1/H1/H1_2 など) の 開発用コンピューティングユニット PC2 にコピーし、PC2 で次のコマンドを実行します:
# 注意1:scp コマンドを使用して image_server.py を PC2 に転送し、ssh を使用して PC2 にリモートログインして実行できます。
# 開発用コンピューティングユニット PC2 の IP アドレスが 192.168.123.164 であると仮定すると、転送プロセスは以下のようになります:
# まず ssh で PC2 にログインし、画像サーバーのフォルダを作成します
(tv) unitree@Host:~$ ssh [email protected] "mkdir -p ~/image_server"
# ローカルの image_server.py を PC2 の ~/image_server ディレクトリにコピーします
(tv) unitree@Host:~$ scp ~/avp_teleoperate/teleop/image_server/image_server.py [email protected]:~/image_server/
# 注意2:現在、この画像転送プログラムは OpenCV と Realsense SDK の 2 つの画像読み取り方法をサポートしています。image_server.py の ImageServer クラスのコメントを読んで、カメラハードウェアに応じて画像転送サービスを設定してください。
# 現在、Unitree ロボット PC2 端末にいます
unitree@PC2:~/image_server$ python image_server.py
# 端末に次のように出力されます:
# {'fps': 30, 'head_camera_type': 'opencv', 'head_camera_image_shape': [480, 1280], 'head_camera_id_numbers': [0]}
# [Image Server] Head camera 0 resolution: 480.0 x 1280.0
# [Image Server] Image server has started, waiting for client connections...
画像サービスが開始された後、ホスト 端末で image_client.py
を使用して通信が成功したかどうかをテストできます:
(tv) unitree@Host:~/avp_teleoperate/teleop/image_server$ python image_client.py
注意: 選択したロボット構成に Inspire デクスタラスハンドが使用されていない場合、このセクションは無視してください。
関連する環境を設定し、制御プログラムをコンパイルするには、デクスタラスハンド開発 を参照できます。まず、このリンク を使用してデクスタラスハンド制御インターフェースプログラムをダウンロードし、Unitree ロボットの PC2 にコピーします。
Unitree ロボットの PC2 で次のコマンドを実行します:
unitree@PC2:~$ sudo apt install libboost-all-dev libspdlog-dev
# プロジェクトをビルドします
unitree@PC2:~$ cd h1_inspire_service & mkdir build & cd build
unitree@PC2:~/h1_inspire_service/build$ cmake .. -DCMAKE_BUILD_TYPE=Release
unitree@PC2:~/h1_inspire_service/build$ make
# ターミナル 1. h1 inspire ハンドサービスを実行します
unitree@PC2:~/h1_inspire_service/build$ sudo ./inspire_hand -s /dev/ttyUSB0
# ターミナル 2. サンプルを実行します
unitree@PC2:~/h1_inspire_service/build$ ./h1_hand_example
2 つの手が連続して開閉する場合、成功を示します。成功したら、ターミナル 2 で ./h1_hand_example
プログラムを閉じます。
すべての人は、潜在的な危険を防ぐためにロボットから安全な距離を保つ必要があります!
このプログラムを実行する前に、公式ドキュメント を少なくとも一度は読んでください。
常にロボットが デバッグモード (L2+R2) に入っていることを確認し、モーションコントロールプログラムを停止して、潜在的なコマンドの競合問題を回避します。
このプログラムを実行するには、オペレーター A と オペレーター B と呼ばれる 2 人のオペレーターがいるのが最適です。
まず、オペレーター B は次の手順を実行する必要があります:
~/avp_teleoperate/teleop/teleop_hand_and_arm.py
のif __name__ == '__main__':
コードの下にあるimg_config
画像クライアント設定を変更します。これは、3.1 節で PC2 に設定した画像サーバーパラメータと同じである必要があります。- ロボット構成に応じて異なる起動パラメータを選択します。 以下は、いくつかのコマンド例です:
# 1. G1(29自由度)ロボット + Dex3-1 多指ハンド(※ G1_29 は --arm のデフォルト値なので省略可能)
(tv) unitree@Host:~/avp_teleoperate/teleop$ python teleop_hand_and_arm.py --arm=G1_29 --hand=dex3
# 2. G1(29自由度)ロボットのみ
(tv) unitree@Host:~/avp_teleoperate/teleop$ python teleop_hand_and_arm.py
# 3. G1(23自由度)ロボット
(tv) unitree@Host:~/avp_teleoperate/teleop$ python teleop_hand_and_arm.py --arm=G1_23
# 4. H1_2 ロボット + Inspire Hand
(tv) unitree@Host:~/avp_teleoperate/teleop$ python teleop_hand_and_arm.py --arm=H1_2 --hand=inspire1
# 5. H1 ロボット
(tv) unitree@Host:~/avp_teleoperate/teleop$ python teleop_hand_and_arm.py --arm=H1
# 6. データの可視化および記録を有効にしたい場合は、--record オプションを追加してください
(tv) unitree@Host:~/avp_teleoperate/teleop$ python teleop_hand_and_arm.py --arm=G1_23 --record
- プログラムが正常に起動すると、端末の最後の行に "Please enter the start signal (enter 'r' to start the subsequent program):" というメッセージが表示されます。
次に、オペレーター A は次の手順を実行します:
-
Apple Vision Pro デバイスを装着します。
-
Apple Vision Pro で Safari を開き、次の URL にアクセスします: https://192.168.123.2:8012?ws=wss://192.168.123.2:8012
p.s. この IP アドレスは ホストマシン の IP アドレスと一致する必要があります。
-
Enter VR
をクリックし、Allow
を選択して VR セッションを開始します。 -
Apple Vision Pro でロボットの一人称視点が表示されます。
次に、オペレーター B は端末で r キーを押して遠隔操作プログラムを開始します。
この時点で、オペレーター A はロボットのアーム(およびデクスタラスハンド)を遠隔操作できます。
--record
パラメータを使用した場合、オペレーター B は開いている "record image" ウィンドウで s キーを押してデータの記録を開始し、再度 s キーを押して停止できます。必要に応じてこれを繰り返すことができます。
注意1:記録されたデータはデフォルトで
avp_teleoperate/teleop/utils/data
に保存されます。使用方法については、このリポジトリを参照してください: unitree_IL_lerobot。注意2:データ記録時にはディスク容量に注意してください。
プログラムを終了するには、オペレーター B は 'record image' ウィンドウで q キーを押すことができます。
ロボットを損傷しないようにするために、オペレーター A がロボットのアームを自然に下げた位置または適切な位置に配置した後、オペレーター B が q を押して終了するのが最適です。
avp_teleoperate/
│
├── assets [ロボット URDF 関連ファイルの保存]
│
├── teleop
│ ├── image_server
│ │ ├── image_client.py [ロボット画像サーバーから画像データを受信するために使用]
│ │ ├── image_server.py [カメラから画像をキャプチャし、ネットワーク経由で送信(ロボットのオンボードコンピュータで実行)]
│ │
│ ├── open_television
│ │ ├── television.py [Apple Vision Pro から Vuer を使用して手首と手のデータをキャプチャ]
│ │ ├── tv_wrapper.py [キャプチャされたデータの後処理]
│ │
│ ├── robot_control
│ │ ├── robot_arm_ik.py [アームの逆運動学]
│ │ ├── robot_arm.py [デュアルアームジョイントを制御し、他の部分をロック]
│ │ ├── robot_hand_inspire.py [Inspire ハンドジョイントを制御]
│ │ ├── robot_hand_unitree.py [Unitree ハンドジョイントを制御]
│ │
│ ├── utils
│ │ ├── episode_writer.py [模倣学習のデータを記録するために使用]
│ │ ├── mat_tool.py [いくつかの小さな数学ツール]
│ │ ├── weighted_moving_filter.py [ジョイントデータをフィルタリングするため]
│ │ ├── rerun_visualizer.py [記録中のデータを可視化するため]
│ │
│ │──teleop_hand_and_arm.py [遠隔操作の起動実行コード]
注意: 太字のアイテムは遠隔操作タスクに必要な機器であり、他のアイテムは データセット を記録するためのオプション機器です。
アイテム | シミュレーション | 実物 | ||
---|---|---|---|---|
ヘッド | ヘッドマウント | 組み立ての側面図 | 組み立ての正面図 | |
リスト | リストリングとカメラマウント | 左手の組み立て | 右手の組み立て |
注意: リストリングマウントは、画像の赤い円で示されているように、ロボットのリストのシームと一致する必要があります。
このコードは、以下のオープンソースコードベースに基づいて構築されています。各ライセンスを確認するには、以下の URL を訪れてください。
- https://github.com/OpenTeleVision/TeleVision
- https://github.com/dexsuite/dex-retargeting
- https://github.com/vuer-ai/vuer
- https://github.com/stack-of-tasks/pinocchio
- https://github.com/casadi/casadi
- https://github.com/meshcat-dev/meshcat-python
- https://github.com/zeromq/pyzmq
- https://github.com/unitreerobotics/unitree_dds_wrapper
- https://github.com/tonyzhaozh/act
- https://github.com/facebookresearch/detr
- https://github.com/Dingry/BunnyVisionPro
- https://github.com/unitreerobotics/unitree_sdk2_python