はじめに
lerobot v.0.4.x で学習データ採取する方法です。tatsuya1970 さんの以下の記事を参考にさせていただきました。感謝申し上げます。
準備関係
前の記事の内容(環境設定、テレオペレーションまで完了)が出来ていることが前提です。
huggingface にログイン
以下は古いと言われました。
huggingface-cli login --token ${HUGGINGFACE_TOKEN} --add-to-git-credential
今は、こちらだそうです。環境変数$HF_TOKENにトークンをあらかじめ登録しておきます。
hf auth login --token $HF_TOKEN --add-to-git-credential
これで、トークンを聞かれてから入力する方法もあります。
hf auth login
カメラの設定
学習データ採取に先立ち、カメラ位置を確認します。~/lerobot/outputs/captured_images に画像が保存されるので、カメラ位置を調整して何回か撮影してください。
lerobot-find-cameras opencv
注意点は、フォロワーからリーダーを離し、フォロワーだけが映るように(リーダーが映らないように)することです。ケーブルの関係もありますが、なるべく離して撮影しましょう。
学習データ採取のスクリプト
まずは、全体のスクリプトです。
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_follower_arm \
--robot.cameras="{ front: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}}" \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_leader_arm \
--display_data=true \
--dataset.repo_id=#####/record-test \
--dataset.root=./record-project \
--dataset.single_task="Move the box" \
--dataset.num_episodes=10 \
--dataset.episode_time_s=10 \
--dataset.reset_time_s=10 \
--resume=true
以下、個別のオプションを説明します。
--robot.cameras で、カメラを指定します。"lerobot-find-cameras opencv"の出力表示に合わせて、数値を調整してください。
--dataset.repo_id で、huggingface に保存される場所を指定します。#####にはユーザー名を入れます。
--dataset.root で、ローカルの保存先を指定します。この指定だと、~/lerobot/record-project に保存されます。すでにローカルに同じ名前のものが存在していると、実行時エラーになります。その場合は、消去するか、名前を変えるか、すれば大丈夫です。
--dataset.repo_id=#####/record-test
--dataset.root=./record-project
num_episodes=10 は10回で一区切りです(resumeで再開するので、少なめにしています。)
episode_time_s=10 はアームを動かし、撮影する時間が10秒です。
reset_time_s=10 は配置をもとに戻す時間が10秒です。
--dataset.num_episodes=10 \
--dataset.episode_time_s=10 \
--dataset.reset_time_s=10 \
最後の --resume=true は再開用です。初回は --resume=false にするか、削除します。
では、データ採取開始です。私は初回(10エピソード採取)の後、3回再開(つまり30エピソード分採取)して、合計40のエピソードを採取しました。
通常通り実行できたら、まず接続状況が以下のように表示されます。
...
INFO 2026-01-23 18:03:21 a_opencv.py:180 OpenCVCamera(2) connected.
INFO 2026-01-23 18:03:21 follower.py:107 my_follower_arm SOFollower connected.
INFO 2026-01-23 18:03:21 so_leader.py:81 my_leader_arm SOLeader connected.
以下は、初回でなく --resume=true で再開した時の実行時の表示ですので、エピソード30になっています。
レコーディングとリセットの表示のタイミングに合わせて、レコーディング中にアームを動かし、リセット中に配置を戻します(英語のスペルを発声しますが、表示優先で)。
INFO 2026-01-23 18:03:21 ls/utils.py:227 Recording episode 30
INFO 2026-01-23 18:03:31 ls/utils.py:227 Reset the environment
その後、以下の処理があります。
Map: 100%|████████████████████████████████████████████████████████████| 300/300 [00:00<00:00, 3366.49 examples/s]
Svt[info]: -------------------------------------------
Svt[info]: SVT [version]: SVT-AV1 Encoder Lib v3.0.0
Svt[info]: SVT [build] : GCC 14.2.1 20250110 (Red Hat 14.2.1-7) 64 bit
Svt[info]: LIB Build date: Jul 3 2025 03:14:07
Svt[info]: -------------------------------------------
Svt[warn]: Preset M12 is mapped to M10.
Svt[info]: Level of Parallelism: 5
Svt[info]: Number of PPCS 76
Svt[info]: [asm level on system : up to avx2]
Svt[info]: [asm level selected : up to avx2]
Svt[info]: -------------------------------------------
Svt[info]: SVT [config]: main profile tier (auto) level (auto)
Svt[info]: SVT [config]: width / height / fps numerator / fps denominator : 640 / 480 / 30 / 1
Svt[info]: SVT [config]: bit-depth / color format : 8 / YUV420
Svt[info]: SVT [config]: preset / tune / pred struct : 10 / PSNR / random access
Svt[info]: SVT [config]: gop size / mini-gop size / key-frame type : 2 / 16 / key frame
Svt[info]: SVT [config]: BRC mode / rate factor : CRF / 30
Svt[info]: SVT [config]: AQ mode / variance boost : 2 / 0
Svt[info]: SVT [config]: sharpness / luminance-based QP bias : 0 / 0
Svt[info]: Svt[info]: -------------------------------------------
ここまで来たら、次のエピソードに続きます。エピソード数10なので、エピソード39で終了です。
データ採取の最後に以下が表示されます。
以下は、FFmpeg が MP4 を正しく書き出すために ヘッダー情報(moov atom)を先頭に移動 しているところです。
...
[mp4 @ 0x28a9d900] Starting second pass: moving the moov atom to the beginning of the file
以下は、
録画は正常に停止しており、カメラ、フォロワー、リーダーも正常に切断されていること、を示しています。
INFO 2026-01-23 18:07:15 ls/utils.py:227 Stop recording
INFO 2026-01-23 18:07:18 a_opencv.py:541 OpenCVCamera(2) disconnected.
INFO 2026-01-23 18:07:18 follower.py:236 my_follower_arm SOFollower disconnected.
INFO 2026-01-23 18:07:18 o_leader.py:162 my_leader_arm SOLeader disconnected.
以下は、データセットの各ファイル(.mp4 や .parquet)が正しく処理・アップロードされていることを示しています。
サイズや進捗が 100% になっているので、破損や未書き込みの問題は起こっていません。
Processing Files (13 / 13) : 100%|███████████████████████████████████████████████| 122MB / 122MB, 38.8kB/s
New Data Upload : 100%|███████████████████████████████████████████████| 29.8MB / 29.8MB, 38.8kB/s
...hunk-000/file-002.parquet: 100%|███████████████████████████████████████████████| 177kB / 177kB
...hunk-000/file-001.parquet: 100%|███████████████████████████████████████████████| 53.1kB / 53.1kB
...hunk-000/file-002.parquet: 100%|███████████████████████████████████████████████| 53.2kB / 53.2kB
...hunk-000/file-000.parquet: 100%|███████████████████████████████████████████████| 53.2kB / 53.2kB
...nt/chunk-000/file-000.mp4: 100%|███████████████████████████████████████████████| 30.4MB / 30.4MB
...nt/chunk-000/file-001.mp4: 100%|███████████████████████████████████████████████| 30.2MB / 30.2MB
...nt/chunk-000/file-002.mp4: 100%|███████████████████████████████████████████████| 30.9MB / 30.9MB
...hunk-000/file-003.parquet: 100%|███████████████████████████████████████████████| 179kB / 179kB
...hunk-000/file-003.parquet: 100%|███████████████████████████████████████████████| 53.1kB / 53.1kB
...nt/chunk-000/file-003.mp4: 100%|███████████████████████████████████████████████| 29.6MB / 29.6MB
INFO 2026-01-23 18:10:47 ls/utils.py:227 Exiting
終わりに
無事終わってホッとしました。ローカルフォルダーに保存された動画で学習時の動作を振り返ることができます。