LeRobot SO-101での模倣学習
SO-101で以前、学習用の教師データ取得まで実施しました。
いよいよ模倣学習をしてみたいと思います。
上記記事で、キャリブレーションとテレオペレーション(遠隔操作)とカメラの確認までは実施できている前提です。
タスクはワニワニパニック
トライする題材はワニワニパニックです。
なんの変哲もないワニワニパニック…
と思いきや、バッチリ魔改造されています。
matsujirushiさんが一晩でやってくれました。マイコンはSeeedのXIAOです。これによりワニさんの速度を、ソフトウェアを書き換えることで自在に変更が可能です。
ロボットをフォロワー、リーダー、カメラ、Jetson Orinを準備しています。
今回は、カメラの画角は、ワニワニパニックにフォーカスしています(他のものは何も見えないです)。
Webで調べたら、ロボットアームもカメラの画角に入れたり、複数のカメラを使っている例が見えましたが、今回は採用しませんでした。
自分の角度情報は全て取得して姿勢自体は情報として取得理解できているはずなので、正しく位置を合わせるためには、ワニさんだけがしっかり見えたほうが良いだろう(それ以外はノイズになるだろう)という判断です。
教師データ取得
前の記事と重なるところはありますが、リポジトリのクローンからです。
$ git clone https://github.com/huggingface/lerobot.git
$ cd lerobot
uvのセットアップをします。
$ uv sync
$ uv pip install "lerobot[feetech]"
Hugging Faceのログインとユーザー名の確認です。
$ uv run hf auth login --token ${HUGGINGFACE_TOKEN} --add-to-git-credential
ユーザー名取得
$ HF_USER=$(uv run hf auth whoami | head -n 1)
以下でユーザー名がでてこればOKです。
以下コマンドでデータを取得します。1エピソード30秒(episode_time_s
)、リセット時間(準備期間)を10秒(reset_time_s
)、エピソード数は30個num_episodes
、Hugging Faceのデータセットはprivateにするためにprivate=true
にしています。
$ uv run python -m lerobot.record \
--robot.type=so101_follower \
--robot.port=/dev/usbserial_lerobot_follower \
--robot.id=lerobot_follower \
--teleop.type=so101_leader \
--teleop.port=/dev/usbserial_lerobot_leader \
--teleop.id=lerobot_leader \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \
--display_data=true \
--dataset.repo_id=${HF_USER}/record-wani-003 \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=10 \
--dataset.num_episodes=30 \
--dataset.private=true \
--dataset.single_task="waniwani_panic"
30エピソード x 40秒 = 20分 で、20分くらいひたすらロボットの遠隔操作でワニワニパニックをします。
本当は50〜100エピソードくらいあったほうがよいらしいのですが、1時間とかロボットでワニワニパニックするのは辛過ぎるので…
やっぱりAIの教師データを集めるのは大変ですね。
学習
LeRobot公式のノートブックをベースに修正したものを使いました。
学習は、テストで2000ステップ、本命で40000ステップを学習しました。
Google ColabのGPU(A100)で3時間ちょいかかりました。以下学習曲線です。結構きれいにloss下がってますね。
推論
40000ステップの学習が終わったら推論してみます。推論のコマンドは以下です。
policy.path
で、Hugging Faceのリポジトリを指定しています。
uv run python -m lerobot.record \
--robot.type=so101_follower \
--robot.port=/dev/usbserial_lerobot_follower \
--robot.id=lerobot_follower \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30} }" \
--display_data=true \
--policy.path=karaage0703/wani003-act-baseline-v2 \
--policy.device=cuda \
--dataset.push_to_hub=false \
--dataset.repo_id=karaage0703/eval_wani003_run1 \
--dataset.single_task="inference-only" \
--dataset.num_episodes=1 \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=5
以下のように、なんとかワニさんをたたいてくれます。
動きが人間が悩んでいるような温かみがあってよいですね。
ちなみにテスト用に2000ステップで学習したモデルも試してみたのですが、ワニさんを全く叩こうとしなかったです。学習曲線を見た感じだと、数万ステップくらいは必要なようですね。
2回目以降の推論は、推論時のデータを保存するディレクトリ(上の例だとkaraage0703/eval_wani003_run1
)を変えないとエラーになります。デモ的に何度も実行する場合は、以下のように毎回データを削除するようなスクリプトを作成しましょう。
# まず推論実行
uv run python -m lerobot.record \
--robot.type=so101_follower \
--robot.port=/dev/usbserial_lerobot_follower \
--robot.id=lerobot_follower \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30} }" \
--display_data=true \
--policy.path=karaage0703/wani003-act-baseline-v2 \
--policy.device=cuda \
--dataset.root=/tmp/lerobot_eval \
--dataset.repo_id=karaage0703/eval_wani003_tmp \
--dataset.single_task="inference-only" \
--dataset.num_episodes=1 \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=5 \
--dataset.push_to_hub=false
# 実行が終わったらキャッシュを削除
rm -rf /tmp/lerobot_eval
AI画像認識と決め打ち動作
模倣動作とは別のアプローチとして、AI画像認識とロボットの決め打ち動作を使ったワニワニパニックも試しています。詳細は以下記事参照ください。
魔改造したワニワニパニックをやらせてみた様子です。
キビキビとワニさんを叩いていることがみてとれます。正確性や速度だけなら、こちらの方が実用的ですね。そもそもロボットがワニワニパニックをすることのどこに実用性があるのかは置いておくとして…
まとめ
ロボットの模倣学習をやってみました。初めてのチャレンジでしたが、ちゃんと学習させた動き(今回だとワニさんを叩く動作)ができると「おおっ」ってなりますね。
教師データ集めは、カメラの位置だったり、学習の量だったりと色々コツが要りそうですね。そして、何よりたくさんのデータを集める根気が重要です。やっぱりAIで大事なのはデータですね。
性能だけなら、今ならAI画像認識と決め打ち動作をする方が良いケースがほとんどになりそうですが、模倣学習は、カメラで厳しくキャリブレーションしなくても、それっぽく動くのはよいというか凄いですね。未来を感じました。
参考
Views: 0