コンテンツにスキップ

LeRobot各種コマンド

各種認識

Jetsonの場合はSO-101は、/dev/ttyUSB0や/dev/ttyACM0で認識、MacBookは、/dev/tty.usbmodem58FA1026181などで認識

1
ls /dev/tty*
1
ls /dev/tty.*

SO-101の接続先を確認できたら、次に、OpenCVに対応したカメラデバイスを探します。

1
lerobot-find-cameras opencv
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
--- Detected Cameras ---
Camera #0:
  Name: OpenCV Camera @ 0
  Type: OpenCV
  Id: 0
  Backend api: AVFOUNDATION
  Default stream profile:
    Format: 16.0
    Fourcc: 
    Width: 1920
    Height: 1080
    Fps: 24.000038
--------------------
Camera #1:
  Name: OpenCV Camera @ 1
  Type: OpenCV
  Id: 1
  Backend api: AVFOUNDATION
  Default stream profile:
    Format: 16.0
    Fourcc: 
    Width: 1920
    Height: 1080
    Fps: 15.0
--------------------

ここでは使用するカメラのIdをメモしておきます。

コマンドの作成

全項目で判明したSO-101のデバイス名と、使用するカメラ IDを下記フォームに入力します。

  • 「Hugging Faceにアップ」チェック: --dataset.push_to_hub=true(未チェックなら false
  • 「wandbにアップ」チェック: --wandb.enable=true(未チェックなら false

作業フォルダの作成・移動

作業フォルダの作成

1
mkdir -p {{ WORKSPACE_DIR }}/

作業フォルダへの移動

1
cd {{ WORKSPACE_DIR }}/

キャリブレーション(Leader)

Info

すでにキャリブレーション実施済みの場合は、質問時にcを入力することで再度キャリビュレーション実施できます。

SO101

1
2
3
4
lerobot-calibrate \
  --teleop.type=so101_leader \
  --teleop.port={{ TELEOP_PORT }} \
  --teleop.id=my_leader_arm

キャリブレーション結果は、~/.cache/huggingface/lerobot/calibration/teleoperators/so_leader/my_leader_arm.jsonに保存されます。

キャリブレーション(Follower)

Info

すでにキャリブレーション実施済みの場合は、質問時にcを入力することで再度キャリビュレーション実施できます。

SO101

1
2
3
4
lerobot-calibrate \
  --robot.type=so101_follower \
  --robot.port={{ ROBOT_PORT }} \
  --robot.id=my_follower_arm

キャリブレーション結果は、~/.cache/huggingface/lerobot/calibration/robots/so_follower/my_follower_arm.jsonに保存されます。

Teleportation

1
2
3
4
5
6
7
lerobot-teleoperate   \
  --robot.type=so101_follower   \
  --robot.port={{ ROBOT_PORT }}   \
  --robot.id=my_follower_arm   \
  --teleop.type=so101_leader   \
  --teleop.port={{ TELEOP_PORT }}   \
  --teleop.id=my_leader_arm

データセット収集(新規)

Info

データセットを新規で収集する場合に、すでに同じ名前のデータセットが存在しているとエラーが出ますので、先にフォルダ毎削除します。

1
rm -rf {{ DATASET_DIR }}

Info

dataset.episode_time_sが収集秒数、dataset.reset_time_sが次のepisodeまでのじかん、dataset.num_episodesが収集する回数となります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
lerobot-record \
    --robot.type=so101_follower \
    --robot.port={{ ROBOT_PORT }} \
    --robot.id=my_follower_arm \
    --teleop.type=so101_leader \
    --teleop.port={{ TELEOP_PORT }} \
    --teleop.id=my_leader_arm \
    --dataset.repo_id={{ DATASET_REPO_ID }} \
    --dataset.root={{ DATASET_DIR }} \
    --dataset.push_to_hub=false \
    --dataset.single_task="Pick up the red cube" \
    --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: 'MJPG'}}" \
    --display_data=true \
    --dataset.episode_time_s=10 \
    --dataset.reset_time_s=5 \
    --dataset.num_episodes=30
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
lerobot-record \
    --robot.type=so101_follower \
    --robot.port={{ ROBOT_PORT }} \
    --robot.id=my_follower_arm \
    --teleop.type=so101_leader \
    --teleop.port={{ TELEOP_PORT }} \
    --teleop.id=my_leader_arm \
    --dataset.repo_id={{ DATASET_REPO_ID }} \
    --dataset.root={{ DATASET_DIR }} \
    --dataset.push_to_hub=false \
    --dataset.single_task="Pick up the red cube" \
    --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: 'MJPG'}}" \
    --dataset.vcodec=h264 \
    --display_data=true \
    --dataset.episode_time_s=10 \
    --dataset.reset_time_s=5 \
    --dataset.num_episodes=30

データセット収集(追加)

Info

--resume=trueを指定する事で、既存データセットに追加でデータセットを追加可能です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
lerobot-record \
    --robot.type=so101_follower \
    --robot.port={{ ROBOT_PORT }} \
    --robot.id=my_follower_arm \
    --teleop.type=so101_leader \
    --teleop.port={{ TELEOP_PORT }} \
    --teleop.id=my_leader_arm \
    --dataset.repo_id={{ DATASET_REPO_ID }} \
    --dataset.root={{ DATASET_DIR }} \
    --dataset.push_to_hub=false \
    --dataset.single_task="Pick up the red cube" \
    --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: 'MJPG'}}" \
    --display_data=true \
    --dataset.episode_time_s=10 \
    --dataset.reset_time_s=5 \
    --dataset.num_episodes=5 \
    --resume=true

学習(新規)

Info

環境にffmpegが入っていない場合は、
conda install -c conda-forge ffmpeg=7.1.1 でインストールしてください。

学習回数は、lerobot/lerobot/configs/train.pyのsteps数で調整。Jetsonの場合、4000 stepsぐらいで試していくといいでしょう。1万〜2万Stepsぐらいを目安に調整していきます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True,max_split_size_mb:128

lerobot-train \
  --dataset.root={{ DATASET_DIR }} \
  --dataset.repo_id={{ DATASET_REPO_ID }} \
  --policy.type=act \
  --output_dir={{ TRAIN_OUTPUT_DIR }} \
  --job_name={{ TRAIN_RUN_NAME }} \
  --policy.device=cuda \
  --wandb.enable=false \
  --policy.push_to_hub=false \
  --steps=5000 \
  --batch_size=2 \
  --num_workers=0 \
  --policy.use_amp=true \
  --policy.use_vae=false \
  --policy.chunk_size=50 \
  --policy.n_action_steps=50
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
lerobot-train \
  --dataset.root={{ DATASET_DIR }} \
  --dataset.repo_id={{ DATASET_REPO_ID }} \
  --policy.type=act \
  --output_dir={{ TRAIN_OUTPUT_DIR }} \
  --job_name={{ TRAIN_RUN_NAME }} \
  --policy.device=mps \
  --wandb.enable=false \
  --policy.push_to_hub=false \
  --steps=5000 \
  --dataset.video_backend=pyav

目安の学習時間

デバイス GPU 学習時間
M4 Mac mps 3時間

学習(継続)

{{ TRAIN_CONFIG_PATH }}

のstepsの項目に、学習(新規)で指定したstepsが記載されているので、その部分を修正し再学習します。

1
2
    #"steps": 10000,
    "steps": 15000,
1
2
3
lerobot-train \
    --config_path={{ TRAIN_CONFIG_PATH }} \
    --resume=true

推論実行

1
rm -rf {{ EVAL_DATASET_DIR }}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
lerobot-record \
  --robot.type=so101_follower \
  --robot.port={{ ROBOT_PORT }} \
  --robot.id=my_follower_arm \
  --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: 'MJPG'}}" \
  --display_data=true \
  --dataset.root={{ EVAL_DATASET_DIR }} \
  --dataset.repo_id={{ EVAL_DATASET_REPO_ID }} \
  --dataset.single_task="Grasp a lego block and put it in the bin." \
  --dataset.fps=30 \
  --dataset.episode_time_s=120 \
  --dataset.reset_time_s=30 \
  --dataset.num_episodes=10 \
  --dataset.tags='["tutorial"]' \
  --dataset.push_to_hub=false \
  --policy.path={{ POLICY_PATH }}

リファレンス

  • https://huggingface.co/docs/lerobot/so101