masato-ka's diary

日々思ったこととか、やったことの備忘録。

推論だけで終わらせない!フィジカルAIアプリ実装で挑んだAMD Open Robotics Hackathon参加録

1. はじめに-AMD Open Roboticsハッカソンで優勝

2025年12月、東京で開催されたAMD Open Robotics Hackathonで、秋葉原のロボティクスコミュニティから集結した4名のチーム「GreateAkihabara」が、36チーム・100人以上の参加者の中から優勝を勝ち取りました。

本記事では、AMD Open Robotics Hackathonの様子とともに、ドーナッツショップの自動化という実世界のタスクに挑戦した、我々チームGreateAkihabraの取り組みを紹介します。VLA(Vision Language Action)モデルの学習だけでなく、実際のアプリケーションとして実装するためのTipsについて、今回のハッカソンの経験をもとに紹介します。

また、国内のLeRobotコミュニティの成長、AMDのAI推論環境の実力など、ハッカソンを通じて見えたLeRobot周辺の動向についても紹介します。ロボティクスやAI、ハッカソンに興味のある方はもちろん、実装の詳細を知りたい方にも是非読んでいただきたいです。

AMD Open Robotics Hackathonとは?

AMDが主催となりHuggingFace, WowRobotそしてData Monstersが協賛して開催したLeRobotとAMDGPUそしてAI PCを使ったハッカソンです。東京、パリ、サンジョセの3都市でそれぞれ開催されました。

東京会場のハッカソンは12/5金曜日の19:00から開始され、12/7日曜日の20:00までぶっ続けで開催されました。

▼急遽開催決定した待望の国内イベント

イベント開催の告知は11月10日ごろだったようですが、このイベントに気づいたのは開催2週間前くらいでした。その後SNS上でも少しずつ話題となっていました。実際、イベントの最初で主催者側から1ヶ月前に開催を決定したという話を聞き、かなりの突貫でイベント開催が決定した様子が伺えます。

▼豪華すぎるイベント仕様

国内でも多くのハッカソンが開催されていますが、このハッカソンは豪華かつユーニークな構成であったと思います。優勝賞金は1万ドル、賞金総額は3万ドルという非常に豪華なプライズが用意されています。また、参加チームは期間中AMDの最新環境である、MI300X GPU(NVIDIAのH100相当)を学習用として2環境、そしてRyzen AI 9 HX 370搭載のノートパソコンが貸し出されます。SO-ARM 101も、WowRoboさんの完成品が1セットずつ貸与されました。そのため、手ぶらでもハッカソンに参加できるようになっています。

さらに会場は秋葉原のど真ん中ベルサール秋葉原を3日間貸切、そして開催期間中は3食+おやつが提供されています。過去私が参加したハッカソンの中でもずば抜けて豪華仕様のハッカソンでした。

しかし、何よりも主催者のハッカソンを本気でやるぞ!という熱意が伝わってくるイベントでした。

▼ 本気で「ハッカソン」をやるぞという主催者側の熱意

まず開始2日前に参加者へスケジュールが送付されました。これを見た時点で、このハッカソンの「本気」を感じました。同じように驚かれた参加者も多かったのではないでしょうか。まず記載されたスケジュールには金曜日の18時集合と書かれていました。3日のハッカソンで平日金曜日から始まることは事前に明言されていましたが、午前中から開始すると勝手に思っていたため、これは予想外でした。さらに『ミッドナイトスナック』や『寝袋の持参』といった文言が並んでおり、

「完成するまで絶対に家に返す気がないハッカソンだな」

と認識しました。会場は24時間出入り自由なので、もちろん途中で帰ることも可能です。

また集合直後の会場も少し異質な雰囲気がありました。会場のベルサール秋葉原に到着すると開始までの間、待機部屋に案内されます。少し薄暗い通常のカンファレンスホールの一部に机と椅子、そしてお水が用意された空間で参加者が机に座り待機しています。

週末の夕方に何もないホールに集められた状態がさながら「エスポーワール号」乗船前のような雰囲気を醸し出していました。

もちろんですが、イベント自体はとても健全な内容です。このイベントの準備に尽力したすべての方に感謝します。

  1. GreateAkihabaraチームの取り組み

ここからは我々、GreateAkihabaraチームの取り組みを紹介します。GreateAkihabaraチームは2025年6月に開催されたLeRobot World Wide Hackathonでの出場時のチーム名をそのまま利用しました。

チーム名は流用ですが、新たに組成した新規チームです。

▼秋葉の最強メンバー集結!チームGreateAkihabara

まず今回優勝できたのは、何よりも素晴らしいチームメンバーの連携プレーがあったからこそです。秋葉原フィジカルAI界隈の原宿と言っても過言ではないロボスタディオンの村田店長、ロボスタディオンの常連であるよしかいさん、ロボティクス系の情報発信をされているYUJIさん、そして筆者の4名チームで参加しました。チーム集結当初は想定していませんでしたが、各人の得意領域のバランスが取れたチーム構成でした。例えば、アーキテクチャとVLAのファインチューニングは私が担当しました。村田店長は後述するベルシステムを作成してくれました。よしかいさんはモデルをアプリケーションに仕立てるアーキテクチャの実装を、YUJIさんはUIの実装を担当してくれました。それぞれが『これできない?』という相談に対して、爆速でアイデアから実装まで実現してくれる素晴らしいチームでした。

▼ドーナッツショップ自動化ロボット

GreateAkihabaraチームがハッカソンの中で取り組んだのは「注文に応じたドーナッツのパッキングの自動化」です。WEBオーダーのシステム経由で顧客からの注文を受け取った後、VLA(Vision Language Action)で制御される、バイマニュアル構成のSO-ARM 101が、注文されたドーナッツを箱に詰め、箱を閉じるという実世界のタスク自動化に挑戦しました。

実際に行ったデモ動画はこちらです。

ソースコードやデータセット、学習済みモデルのリポジトリはこちらです。

▼実装上の工夫

このような実世界のアプリケーションへVLAモデルを活用することはまだ一般的ではありません。ただの学習モデルの推論デモではなく、アプリケーションと成立するように以下の工夫を行っています。

1. ロングホライズンタスク(Long-Horizon Task)

VLAは数分など長期間のタスクを学習することはチャレンジングです。今回のタスクは1分以上かつ、2本のアームが連動する複雑なタスクです。そのため、そのままVLAへ学習させる自信はありませんでした。そこでサブタスクに分解して、サブタスク単位で学習させました。具体的にはドーナッツを箱に入れるタスク、さらに箱を閉じるタスクという2つのサブタスクから構成されています。

さらに、サブタスクを全て1データセットとしてまとめ1モデルに学習させると、箱を閉めるタスクの学習がうまく行きませんでした。そこで箱を閉めるタスクだけデータセットを分けて、2つのモデルとして学習させています。

1モデルで学習がうまくいかなかった原因についてはデータセット収集時の問題でした。後日データセットを確認したところ1データセットとしてまとめて記録したデータセットにおいて箱を閉めるタスクのデータが破損していることが原因でした。

このモデルの分割は提出締切4時間前に決定しました。分割によりモデルの学習がうまくいく自信はありましたが、アプリケーション側での2つのモデルを利用するという仕様変更には厳しさを感じていました。最終的に、よしかいさんの迅速な対応力により無事完成させることができました。素晴らしかったです。

2.Bimanual SO-ARM 101

ドーナッツを箱に入れる動作や箱を閉じる動作は6自由度(グリッパ込)のアーム1本では実現できません。そこで、SO-ARM 101アームを2本使ったBi-manual構成にしています。本番のデータ収集の前に2本のアームを使って各タスクを実行するための動作の検討とリハーサルをしています。またどうしても操作中に箱の位置が変わってしまうため固定用のストッパをアルミフレームで作り固定ます。(店長作)

3. タスク完了の認識

VLAで実行したタスクが完了したことをシステムが検知する方法も一つの課題でした。今回のデモを実現するためにはシステムがVLAへのインストラクションの変更またはモデルの切り替えをする必要があります。そのためには何らかの方法でサブタスクが完了したことを知る必要があります。しかし、VLAモデルはその仕組みとして、指定されたタスクが完了したことを知る術がありません。そこで、何らかの方法でVLAが所定のタスクを完了したことをシステムへ通知する必要があります。

今回は各タスクの最後に必ずベルをならす動作を学習させています。このベルはUSBキーボードとして推論PCに接続されており、ベルを叩くことでシステムにタスクの完了を通知することができます。つまりロボットは物理世界を通じて自らタスクの完了を通知し、タスク管理を行う仕組みを構築しています。

また、仮にロボットがタスクを失敗した場合など人間がベルを叩くことで強制的にロボットを次のタスクに進めることができるといった副次的な効能も考えられます。

別の方法として、VLMに判断させるアイディアもありましたが、プロンプトの工夫など課題がありそうなので今回は採用しませんでした。

このベルをどうやってPCに繋ぐか土曜日の朝時点で全くアイディアがありませんでしたが店長が即座に考え、秋葉でパーツを集めトータル2時間ほどで完成させてくれました。秋葉原周辺で何かすぐに作りたいと思ったらロボスタディオンに相談に行きましょう。

次にこれら、技術的な工夫点を実際に実装するためのデータの収集、モデルの学習、そしてアーキテクチャについて解説します。

▼学習データの収集

今回のモデルを学習させるためのデータセットの収集はデータ取得に失敗したエピソードも含めて200エピソード以上を取得しています。練習を含めるとさらに多くの回数を試行しました。 実際に学習に寄与したのは120エピソードです。

内訳はチョコレートドーナッツの箱詰めが30エピソード、同じくストロベリードーナッツが30エピソード、箱を閉める動作が30エピソードです。ロボットアームの動作は複雑ですが、オブジェクトの位置がほぼ固定であるため、難易度は比較的低めです。経験上、今回のタスクあれば各タスク30エピソードが最初にテストするべき目安になります。

ドーナッツピックアップの学習データ例

指定されたドーナッツに近いアームでドーナッツを掴み上げ、もう片方のアームにドーナッツを受け渡します。箱のふたをアームで広げ、ドーナッツを入れます。ドーナッツを入れるときは一度ドーナッツを押し込む動作を差し込みます。最後にベルを鳴らして完了です。

箱を閉める動作の学習データ例

箱のふたを左右のアームで押し込みます。左側の蓋を左アームで摘んで箱のふたを抑え込みます。さらに右側のアームでロックを掛けます。反対側のロックも同じ手順で閉じます。最後にベルを鳴らして完了です。

▼モデルの選定と学習

学習モデルの選定

モデルの選定と学習について説明します。モデルの選択肢は限られています。今回はタスクインストラクションが必要なため、VLAモデルが必須となります。また、推論環境はRyzen AI 9 HX 370のノートパソコンを使用するため、大きなモデルは選択できません。そこで今回はSmolVLAを利用することにしました。今回貸与されたASUSのS14は32GBのメモリを搭載しており、そのメモリをユニファイドメモリ(GPUから直接アクセスできる)として利用できます。そのため、Pi 0.5も動作させることができます。しかし学習データ例で紹介したような細かいタスク実行のためには推論速度を可能な限り確保する必要があります。そのためSmolVLAが適切な選択だと判断しました。

学習の実行

学習は4万ステップを目安にLoss値が0.010以下を目指して学習させています。学習環境であるAMDGPU MI300Xではバッチサイズ32で約100分程度の学習時間になります。

学習時のLossのグラフを掲載します。灰色のグラフはドーナッツのピッキングです。緑色が箱を閉じる動作を表しています。ドーナッツのピッキングは80K stepsまで学習させていますが、40K stepsで十分に動作します。

▼推論時の工夫

推論ではLeRobot 0.4.2から実装されたReal-Time Action Chunkingを利用しました。Real-Time Action ChunkingはPhysical IntelligenceのPi0.5から採用されたVLAの推論方法です。アクションチャンクと呼ばれる、ロボットのアクション系列の推論と実行を非同期で行うことでロボッt動作の滑らかさと、環境変化に対するVLAの応答性を向上させる手法です。SO-ARM 101はハードウェア的にガタがある動作が目立つため、通常の推論との差は限定的ですが、少しでも動作を滑らかにしてタスク成功率を向上させることを期待して採用しました。

LeRobotのReal-Time Action Chunkingではデフォルトでは制御周期が10 FPSになっているので、30 FPSを指定して動かしています。またパラメーターとしてexecution_horizon=12, max_guidance_weight=10.0を指定しました。

▼システムアーキテクチャ

全体的なシステム構成です。Web注文システムと連動し、3つのタスクを切り替えてタスクを実行する工夫を入れています。このシステムでは注文システムとロボット制御システムの2つのシステムから構成されています。両者はREST APIで連携します。

システム構成:

  1. Order System:顧客がドーナッツを注文するWebインタフェースです。アーキテクチャ図上はチャットボット風に記載されていますが、実際にはWebシステムとして実装しました。ユーザーに対して、注文受け付けと準備完了の2つの状態を通知します。State ControllerからSSEイベントを待ちユーザへの通知を実行します。
  2. Physical SystemREST APIを通じてOrderSystemから受け取った注文に基づいてドーナッツの梱包を実行します。以下の3つのコンポーネントから構成されています。
  3. State Controller:ロボットのタスク実行と状態を管理します。REST-APIで受け取った注文とベルから通知されるタスク完了に基づいてロボットのタスク実行状態を管理し、適切なインストラクションと実行モデルの切り替えをVLA/ILに指示します。またタスクの実行状態をOrder SystemへSSEイベントとして通知します。
  4. VLA/IL:学習済みモデルとReal-Time Action Chunkingの実行プログラムで構成。テキスト指示と環境状態に基づいてロボットを制御します。
  5. Bell:State Controllerに接続され、ロボットが鳴らすことでタスク完了をシステムに通知します。今回の実装としては簡易なUSBキーボードとして実装され、押すことで”R”を標準入力として受け取ります。

3. 今回のハッカソンを通して

今回のハッカソンを通じて気付いた点について紹介します。この気づきを得られただけでも今回のハッカソンに参加して良かったと感じています。

▼国内のLeRobotユーザーの増加

今回のハッカソンに参加していた大半の方がLeRobotでの模倣学習経験者であったように思います。6月のハッカソンでは初めてLeRobotとSO-ARM 101での模倣学習にチャレンジする方が多かった印象でした。それと比較して、今回は参加者の大半は模倣学習をすぐに使いこなし、LeKiwiやXLeRobotの持ち込みもあり、経験者が多かった印象です。この半年でLeRobotのユーザー数が増加していると感じました。言い換えれば、模倣学習やVLAを用いたPick and Placeは、もはや「できて当たり前」になってきたと感じます。ハッカソンの中でもピックアンドプレース以上に思考を凝らした取り組みが多かったです。ますます今後の動向が楽しみになりました。

今後はLeRobotを「使う」以上の状態にまでコミュニティが進んでいくことが重要だと思います。

▼WowRoboさんのSO-ARM 101

今回WowRoboさん製のSO-ARM 101を初めて利用しました。実は、このハッカソンに先駆けて試供品を1台提供いただいています。これまで使っていた他社製のSO-ARM101と何ら変わりなく利用できています。別途3Dモデルについては調整が入っており1%程度大きく疲れている気がしますが問題なく利用できます。

組み立て済み品は購入後すぐに使用できるため、とにかく早く模倣学習を試したい方にはおすすめです。組み立ての労力をかけるのであれば十分に買いだと思います。組み立て完成済み品がカメラやACアダプタ、クランプもついて$299はお買い得だと思います。

SO-ARM101 DIY Kit & Assembled Version

AMDのコンピューティング環境の成熟

今回のハッカソンAMDの環境を使った感想は、「Physical AI用途で十分に実用的だ」というのが率直な感想です。ゲーミング環境においてはAMD GPUは人気のあるプラットフォームです。しかし、AI推論や学習用途では、まだ採用が進んでいないという印象を持っていました。実際に使ってみるとLeRobotの環境構築も問題なく行え、普段利用している環境と比較しても全く違いなく利用できました。さらに、MI300Xは十分な学習速度を実現できます。RunPodなどでは他社同等品よりも割安に利用できます。また、推論に使用したASUS S14に搭載されているRyzen AI 9 HX 370(CPU+iGPU)はいわゆるAI PC用モデルかつモバイル用途ですが、SmolVLAの推論は問題なく実行できます。我々は利用しませんでしたが、Pi 0.5を使用したチームもあったようです。AMDプラットフォームはLeRobot使用時の選択肢として十分であり、筆者が普段使用しているM2 MacBook Airと比較しても性能面で優位性が期待できます。(世代が違うのでそうなのですが)。

▼英語スキルの重要性

主催者の公用語は英語なので、基本的には英語前提で進行が進められます。また参加チームの中には多国籍のチームもあり、そういったチームとの交流も当然ながら英語です。この分野の取り組みは英語でのコミュニケーションが重要だなと改めて思いました。そして日本のチームもほとんどのチームが英語でのプレゼンテーションをしていて素直にすごいなと思いまいた。

なお、デモプレゼンの動画を見直した際、文法以前に単語選びの課題があったため、基礎から学び直す必要があると感じています。

▼フィジカルAIは己のフィジカルが最も大事

前述したように今回の学習では200エピソード以上のデータを収集しています。つまりリーダーアームを使い、細かい作業を200回以上実施したと言うことです。60回を超えたあたりから肩こりと肩甲骨周辺の痛みが生じる物理的な不具合が発生したため、緊急パッチを適用することになりました。

模倣学習でデータを集める方は常日頃からご自身のフィジカルを鍛えておくことをお勧めします。また、ハッカソンなどで短期間に大量のデータを集める必要がある場合は、オペレーターを複数名体制にすること、および緊急パッチの事前準備をお勧めします。

4. おわりに

今回は優秀なチームメンバーと創意工夫で優勝を勝ち取ることができました。またAMDのコンピューティング環境についても現状を把握できる大変良い機会となりました。ハッカソン中は他の参加者との交流もあり、国内のLeRobotのユーザー拡大とコミュニティ形成に強く影響したイベントだったと思います。

ぜひまたどこかのハッカソンやイベントで参加者の皆さんとお会いできる日を楽しみにしています。

5. 宣伝

フィジカルAIの同人誌を出しました!電子版は絶賛配布中です。物理本は秋葉原のロボスタディオンさんで取り扱いしています。今回のデータ取得やモデル学習ではこの本に記載した内容を踏まえながら実施しています。是非ご興味あれば手に取っていただければと思います。

techbookfest.org

世はまさに大フィジカルAI時代 〜フィジカルAIアドベントカレンダーイントロダクション〜

この記事はフィジカルAIアドベントカレンダー1日目の記事です。

大フィジカルAI時代

2025年はフィジカルAIというキーワードが興隆した。AIにより制御されたロボットの動画が毎日のようにSNSに登場し、新しい技術の登場に誰もが目を見張っている。これらの技術は一部の専門家だけが試せるのではなく、誰もが再現することができるようになった。専門家や一部の天才身を削ってやっと実現できていたことが、誰もが真似をできる再現性の高い技術になった。これは産業を大きく広げるターニングポイントの入り口に立っているように感じる。時はまさに大フィジカルAI時代なのだ。

物理世界を行動する知能の本質に迫る

フィジカルAIという単語は多くの場合、AIを用いてロボットの動作を制御する技術の総称として扱われている。特に人間による操作のお手本をAIで学習しロボットアームの関節を直接制御する模倣学習による制御、さらに言語情報を加味して言葉の指示お通りに動くロボット、強化学習による2足、4足のロボットの不整地の歩行やアクロバティックな動作の制御などが代表例だ。

これらの技術は既存のAIやロボットの研究成果や技術の上に成り立っているものだが、単純な組み合わせではなく、物理世界で動作する知能ならではの難しさをハードウェア、AI、データの3極から追求している。知能の本質を追求するテーマとなっている。

量産されるヒューマノイド

フィジカルAIという言葉が浸透し、期待を向けられ始めた要因の一つとしてヒューマノイドがある。中国や米国のスタートアップから安価なヒューマノイドロボットが登場した。一部は工場などでの軽作業などを行う動画が毎週のようにSNS上で拡散され続けた。また数十万円から数百万程度のこれまででは考えられなくらい安価なヒューマノイドロボットが登場した。

www.unitree.com

未だこのヒューマノイドを何に使うのか出口は見えておらず産業として成熟するか不透明だ。しかし間違いなくこの分野の期待感を増長させる象徴となっている。

AI技術の進化

これらヒューマノイドはこれまで開発されていたヒューマノイドと一線を画している。その制御は緻密に計算された制御ではなく、「AI」を利用して大量のデータを元に制御されるものだ。歩行動作ではシミュレーション上での大量の試行錯誤をもとに強化学習を施し、現実のロボットへ適用させている。これまでロボットの歩行研究で難関とされていた様々な課題を最も簡単にクリアしているように見える。マニピュレーションでは長時間のタスク実行や未知環境のタスク実行が大量データへの学習でできるようになった。

www.physicalintelligence.company

beyondmimic.github.io

とても楽観的に見てしまうと、大量のデータさえ集めてしまえばなんでもできるヒューマノイドがいとも容易く実現できるように感じてしまう。もちろんそんなことはないのだが、そう感じさせてしまうくらいにこの技術進化は急速に進んでいる。

誰もがフィジカルAIを試せる。

そして最もこれまでと違うのは、これら最新の研究成果を個人でも試せるところまできた。ロボットやAIの専門家でなくても試すことができる。この点がこれまでのロボットブームと大きく違うところだ。特にHuggingFaceが開発を進めているフィジカルAIのライブラリLeRobotはAIによるロボット制御の民主化に大きく貢献している。筆者もLeRobotを自ら使うことはもちろん、半年の間に数多くのハンズオンを行い、ロボティクスの専門家から全くの未経験者まで、多くの人が模倣学習やVLA(Vision Language Action)を試すのをみてきた。

これまでのロボティクスの研究は最新技術を試すためにロボティクスの専門知識を必要とする領域だった。ロボットに対する素養のある人が試すことが限度であった。しかしフィジカルAIはこの人の集まり方が変わってきている。ここはフィジカルAIへの期待の一つである。

これまで限定され閉じられていたある種の村社会から大きく開かれ、これまでよりも多くの知見がこの分野に落とされていくことに期待している。

LeRobotを使ってフィジカルAIを始めてみたいという人はまずは以下のGitHubリポジトリや書籍をおすすめしたい。

huggingface.co

techbookfest.org

来年に向けて

このアドベントカレンダーではさまざまなバックグラウンドの方達が参加してくれることを期待している。これまでロボットを生業にしていた方、研究者、ホビースト、専門外の方など、多くの方達の意見や知見が共有されることを願う。そしてこの読者にとってはフィジカルAIの情報に触れて是非このムーブメントに考えを巡らせて欲しい。このアドベントカレンダーが皆さんの来年の何かしらのアクションに繋がることを期待している。

Action Chunking Transformerのピッキング位置に対する汎化能力の検証

1. この記事について

ACTを使用した模倣学習では学習データと違った状況にどれだけ対応させられるかは、実用的なタスクや使用を行う場合に重要になります。例えばピッキングでは学習時のデータには現れない対象部の位置でもうまくピッキングが可能になるかが重要になります。

以下のポストはACTを位置や対象物の形状に対して上述のような汎化をさせたと主張しています。

この記事ではACTのピッキング位置に対する汎化性能について検証します。具体的にはブロックのピック&プレースタスクのピッキング位置が、学習データに現れない位置だった場合でもピッキングできることを確認します。

2. 検証概要

この検証では、モデルの汎化性能を未知の位置でのピッキングに対するロバスト性として測定します。具体的には、学習データでは指定した位置で物体をピッキングさせ、評価時にはその位置に含まれない場所でのピッキング性能を確認します。検証方法については後述します。

過去の経験から、従来のデータ収集では学習時以外の位置での性能向上が見込めないと感じていました。そのため、汎化能力を高めるための戦略を検討しています。前記のポストではいくつかの対策を施していますが、今回はデータの取得方法とACTモデルのデコーダー層に焦点を当てます。

まず、1つの位置について10エピソードを厳格に収集します。また、ACTのデコーダ層数が1層のモデルと7層のモデルを比較します。データの品質向上が課題と考えられまた、ACTモデルはパラメーターサイズが小さく、過学習の可能性もあるためです。

参考として前述のXポストに記載されていたACTの汎化に対して実施した内容をまとめます。

▼ 元ポストで実施された内容

1.100episode 10episod/position->採用

テーブル上にマーカーをつけ、各ポジションで10エピソードずつピッキングのデータを記録し、合計で100エピソードのデータセットを作成しています。LeRobotの公式においてもピッキングの際は1箇所に付き10episode程度データをとることが推奨されています。

2.Decoderを7層に変更->採用

ACTの論文ではDecoder層は7層であると指定されていますが、オリジナル実装にはバグがあり最初の1層のみ利用するようになっています。それに倣いLeRobotのDecoder実装はデフォルトを1層としています。ACTの論文に合わせるため、LeRobotのACTConfigクラスの設定を書き換え、Decoder層を7層へ変更しました。

3.リーダーアームからデータを取得

ACTの論文ではエキスパートデータを収集する際はリーダーアームの値をとることになっています。その理由はフォロワーアーム側のエンコーダ値には外乱や重力などの影響を受けた値になりデモンストレーション時の入力値と乖離しするためです。しかし、LeRobotではフォトワーアーム側のエンコーダ値をデータとして記録します。こちらもリーダーアームのあたいを使うように変更されました。 SO-ARM10xの場合、誤差がそこまで大きならないと考え今回は省略

4.Temporaly assenbleを有効化

ACTにはTemporaly assembleというアクションチャンクの加重平均をアクションに採用する手法が取られています。LeRobotでは無効化されているため、有効化して実験しています。 ピッキング位置の汎化に対して大きく影響するか不明なため、今回は省略

5.照明はコンスタントになるよう人工光を設定

データに対する外乱を低減させるために、室内照明などの人工光で作業を実施しています。 今回の実験環境でも外光が入らない環境で実施しました。

6.データ拡張を実施(詳細不明、カラージッター?)

具体的にどういったデータ拡張を施しているのかわかりませんが、おそらく、LeRobotの標準で用意されているデータ拡張を有効化して利用していると読み取れます。

7.画像のリサイズ処理を前処理で全部やってしまう。(学習速度の向上に寄与)

画像サイズを前処理で小さくすることで学習速度の向上を実施したと記載があります。

3. 検証方法

収集したデータセットを用いて、デコーダー1層と7層の2モデルを作成し、ピッキング精度を実機で評価しました。9ヶ所の学習データ取得位置に加え、学習データに含まれない16箇所でも評価し、成功率をヒートマップで可視化して空間パターンを分析しています。

▼検証条件

検証条件は以下のとおりです。

  1. 学習データ数: 90エピソード(10episode/position x 9箇所)
  2. 学習モデル: ACT(LeRobot実装) Decoder 1層と7層を比較
  3. 学習ステップ数: 10万step
  4. その他ハイパーパラメータ: LeRobot標準値を採用
  5. カメラ
    1. フロントカメラ 640x480@2MP
    2. リストカメラ 640x480@2MP

▼検証環境

検証環境は、前方から俯瞰で撮影するフロントカメラと、グリッパ先端を撮影するリストカメラの2台を使用しました。ピッキング対象は3cm3の青いEVAブロックで、ロボットはこれをピッキングして左手の青いカップに入れます。

学習データ用のピッキングポジションにはテープで目印をつけました。この目印はロボット設置位置を中央として左右に10cm、縦に7.5cmの間隔の設定です。

▼学習データと取得方法

今回取得した学習データはHuggingFaceへ公開されています(masato-ka/SO100_evaluate_generalize_pick_pos )。90エピソード取得しました。

テーブル上の白テープで示された学習データ取得位置に、ロボットの正面左上から順にL1からL9と名付けました。それぞれの位置で10回のエピソードにわたり、ブロックの姿勢を変えながらロボットの動作データを収集しました。ブロックの姿勢には、正面を向く「並行姿勢」、傾きを持つ「傾き姿勢」、ロボットに対して角を向ける「対角姿勢」の3種類があり、傾き姿勢は左右の2パターンがあるため、合計4つの姿勢となります。

training_data_position.jpeg

▼モデルの学習

模倣学習モデルにはAction Chunking Transformerを使用し、LeRobotの実装を利用しました。Decoderレイヤー以外はデフォルト設定を適用し、Decoderレイヤーを1層と7層の2種類のモデルで学習しました。学習はGoogle ColaboratoryのA100 GPUを用いて、いずれも10万ステップ行いました。

◽️Decoder Layer 1 100k steps

Image.png

Image.png

◽️Decoder Layer 7 100k steps

Image.png

Image.png

モデルの評価

モデルの汎化性を確認するため、学習データに含まれていないピッキング位置で評価を行います。使用する評価位置は1から16までナンバリングされ、学習時の位置の間に設定しています。合計25箇所で評価し、各位置でブロックの姿勢を「並行」「傾き(左向き)」「対角」の3種類に変え、各姿勢で1回ずつ試行します。したがって、1モデルにつき25箇所×3姿勢=75試行を実施します。

ピッキング動作は、ロボットがテーブル上でグリッパを開閉する一連の流れと定義し、3回以内の試行で成功すれば成功、3回以上かかるかピックできなければ失敗とします。試行中に対象物が移動しても手動での修正は行わず、成功時には何回目の動作で成功したかも記録します。

ACT汎化精度実験手順.heic

4. 評価結果

今回の実験設定では1層モデルと7層モデルではピッキング精度に優位な差は見らませんでした。成功数の絶対値は1層モデルの方が大きです。

advanced_statistical_analysis.png

次にタスクが成功しやすい位置の偏りがあるか調べるため、タスク成功率をヒートマップとして可視化しました。Decoder 1層のモデルの結果は全体的に満遍なくピッキングできていますが、画像中央上の学習データに含まれていない位置では成功率が落ちています。

redframe_comparison_10k_act_standard.jpeg

Decoder 7層モデルは1層モデルが苦手とした画像中央上の位置での成功率が改善していますが、画像下方、画像右下での成功率が低くなります。

redframe_comparison_10k_7L_act_standard.jpeg

また、両モデルともフロントカメラの真下での成功率が落ちていますが、カメラマウントなどが影響して成功率が落ちている可能性が考えられます。

5. 考察

ピッキングタスクの設定ではDecoder 1層と7層モデルではピッキング成功率に優位な差はみされませんでした。一方、同一の学習データを使用しているにもかかわらずDecoderの層数の違いにより、ピッキングが失敗しやすい位置が変わっていることがわかります。結果は省略しますがDecoder 7層モデルで8万ステップ学習させたモデルを検証しましたが、位置に対する成功率の傾向は変化しませんでした。

1層モデルに着目すると、ある程度学習データ外の位置に対しても成功率が確保されていることが伺えますが、やはり学習データに含まれている位置よりは成功率が全体に低くなります。

単純なピッキングタスクにおいてはACTのDecoder層は1層でも問題なく性能を発揮します。また十分な量のデータを取得することで学習データ近傍の位置に対してある程度の汎化性能を確保しますが、学習データと同一の位置よりも成功率は低下します。

ピッキングタスクの設定では、Decoderの1層と7層モデル間に成功率の優位な差は見られませんでした。ただし、層数の違いによりピッキングが失敗しやすい位置が変化しました。7層モデルを8万ステップ学習させた結果、成功率の傾向は変わりませんでした。1層モデルでは、学習データ外の位置に対しても一定の成功率がありましたが、学習データ内の位置よりは低下しました。単純なピッキングタスクでは、1層のDecoderでも高い性能を発揮します。十分なデータを取得すれば、学習データ近傍でのピッキング性能は確保できますが、学習データと同一の位置での成功率と比較すると下がるようです。

▼性能改善に向けて

ピッキングの成功率は、十分なデータ量を確保することで向上しますが、学習データ外の位置での成功率は低下します。全体的に、タスクの成功率を向上させる方法を検討します。

方法1. 追加データの学習

最も有望だと思われるのでは、ピッキング成功率が低い箇所で追加データを取得し、元のデータと合わせて再学習する法です。学習位置の「密度」をあげることでピッキング能な領域のカバー率を上げていくという考え方です。

この場合、元の学習データにデータを合わせて再学習する必要があります。ために差分のデータを用いて、学習済みのモデルにFine-Tuningしただけでは破滅的な忘却が発生しました。

方法2. ACTのパラメーターチューニング

今回の検証でもデータセットの動きにかなりフィットした、過学習のような挙動を観測する場合がありました。学習データにフィットしすぎることで学習外の状況にうまく対応できていない可能性があります。Decoder層の値だけでなく、バッチサイズを増やす、ステップ数を見直すなど、ACTのハイパーパラメータ自体も調整が必要かもしれません。

方法3. SmolVLAなどの他のモデルの使用

ACT以外のモデ流を使うことで性能が向上することが期待できます。SmolVLAやDiffusionPolicyなどのモデルの利用も今後検討してみます。

人はヒューマノイドの夢を見ることだけはやめられない。

駄文怪文書の供養の回です。いろんな記事に触発されて考えたことを3月くらいから書き溜めてましたが色々ぶん投げて公開してい供養します。

10年後には家庭に普及? ヒューマノイドロボットの可能性とは - Impress Watch

日本ロボット工業会:講演「中国のヒューマノイド・ロボットの開発と利用の最新動向」 20250625 - Speaker Deck

このヒューマノイドブームは実を結ぶのか

ヒューマノイドの意義という話は古より散々語り尽くされている。人と同じ形であれば、人が生活する空間に入り込み、人と同じ道具をそのまま使って作業できる。日本でロボットを扱った人ならば一度は聞く言説だろう。しかし、それを体現するヒューマノイドは未だ登場していない。またそこにヒューマノイドを必要とするアプリケーションは存在せず単なる機能的特徴を述べているに過ぎない。 現在、主に米国、中国を中心としたスタートアップがヒューマノイドの開発を進めている。その内情はこういった動機なき技術の開発を生成AIへの投資から溢れた投機マネーによって支えているというのが実情ではないだろうか。 本稿では短期的な資金回収を意図した意味ではなく、出口が見えないまま関連する分野の余剰投資が割り当てられ、一種のバブルになっていることを表現する上であえて「投機」という言葉を利用する。 この投機による技術開発が新たな市場を作ることもあるだろう。だが、果たしてヒューマノイドにおいてそれは通用するのだろうか。本稿では今のヒューマノイドブームがなぜ成り立っているのか、これからどういう経路を辿るのかを考察してみる。

技術と投資のベストマッチが格安ヒューマノイドを実現した。

現在のヒューマノイドブームに登場したロボットに共通しているのはQDDモータによるAI利用を前提とした安価なロボットを実現していると言う点だろう。ビジネス的に投資を呼び込みやすい生成AIとQDDと言う奇跡的なタイミングでのランデブーがこのヒューマノイドブームを作り出している。しかし、本当に実用的なタスクに利用できるロボットが実現できるのはまだもっと先の話になるのではないだろうか。

▼AIとロボットの融合を促進させるQDD

例えばUnitreeに代表されるような中国性のヒューマノイドはQDD(準ダイレクトドライブ)と呼ばれるモーターを採用している。ロボットと人や物の接触など、外力に対して柔軟に対応できる高いバックドライバビリティを備えている。また減速機が無いことで、摩擦やバックラッシュといった制御における邪魔な因子である機械的な損失を小さくすることができる。QDD自体は新しいものではないが、2019年ごとにMITが出したミニチーター以降、中国性の安価な製品が市場に出回ることになりロボットの価格を抑える結果となっている。 このQDDを使ったロボットはAIによる学習と非常に相性が良い。先にも言ったようにQDDモーターはバックドライバビリティが高い。これは模倣学習のデータを集めるにあたり、ロボット自体を直接教示しデータを集めることが容易になる。さらに重要なのは機械的な損失が少ないことで、理論通りに動くという利点がある。模倣学習では複数の機体のデータを集約して学習したAIモデルを利用して別機体(ここでは同一機種、別個体を指す)で再現性を持たせることができる。さらに、シミュレーション上での強化学習からのSim2Realが容易になる。理論としてAIに学習された動作を精度高く実機にて動作させることが可能になるため、シミュレーション上での理論上の学習結果をそのまま実機にて動作させやすくなる。強化学習を用いたヒューマノイドの歩行動作を学習させたデモンストレーションやUnitree Go2の歩行動作をシミュレーションで強化学習させて、実機で動作させることが比較的簡単に実現できているのはこのQDDモータの特性が一つの要因だと考えられる。

よりQDDモータについて知りたい方は以下参照

https://dspace.mit.edu/bitstream/handle/1721.1/118671/1057343368-MIT.pdf

▼物理世界のハードルを完全に越えられないAI

一方でAIによるロボット制御は未だ発展途上の段階にある。生成AIで成果を上げたTransformerや拡散モデル/Flow Matchingといったモデル構造が模倣学習やVLAにおいても成果を上げているのは事実だが、いまだ実験的な領域に過ぎない。 タスクの成功率や一連の動作の時間は短く、家事などのようなタスクの種類が多岐にわたり実行時間が長いロングホライゾンのタスクを学習させることは以前として難しい。 また未学習の環境や複数のロボットに対する対応も十分ではない。 いわゆるロボット基盤モデルという問題については大量データの収集とともに、基盤モデルそのものや理論の改善がこれからも必要になっていく。 先述の強化学習により歩き方を学習できたとしてもアプリケーションにあたる賢さを必要とするタスクを実行するにはまだAIは十分とは言い切れない。 いずれはこのようなAIの課題が克服され、ヒューマノイドに搭載され、様々な場所で使われる世界観が来るかもしれないが、現状を見る限りその世界とは大きな技術的な隔たりがまだ多く存在している。これが解決するのはおそらく明日でも1年後でもない、10年先はわからないかもしれないが、それも生成AI投資からこぼれ出た投機マネーが尽きればその進化のスピードは緩やかになるだろう。

ヒューマノイドロボットは本当に使えるのか?

現在中国、そして米国のスタートアップは開発したヒューマノイドを自動車工場や物流現場に導入する試験が始まっている。これらは本当に現実的なのだろうか? 例えば公開されたFigureのロボットは物流工場の中で一列に並び流れてくるパッケージの仕分け作業を行っている。同様に工場や物流工場でヒューマノイドが作業する姿は他のスタートアップからも公開されており、もはや珍しくもない。だがこれらの映像はあくまで投資家向けのデモンストレーションとして捉えておいた方が良い。

実用を考えた場合にまずそもそもヒューマノイドである必要はなく双腕のアームを持った機会があれば良い。(なんならアームでなく別の解決策でも十分である可能性はある。) むしろヒューマノイドであるがゆえ、その稼働時間やメンテナンスなど「ロボットを運用するための人」や「予備のロボット」がどのくらい必要になるか想像を掻き立てる。 実際Unitree G1の場合連続歩行時間は2時間、H1は3時間とされている。上記のFigureと機種は違うが、いずれにしても実稼働時間は数時間というところではないだろうか。工場の中で安全に回収するためにはもう少し余裕を持たせるかもしれない。

ヒューマノイドに期待されるべきは人間と同じ環境で人間の代替として活躍する労働力ということになるのだろうが現状でもなおそれを期待できる能力にまだ達していないのではないだろうか。1箇所の配備に対して複数台の準備、または交換バッテリ、それを自動で賄う設備などを考えると少なくともコストは嵩むように感じる。

それでも成功するかもしれないという不安と期待

人間の代わりに休みなく何時間も働き、どんな作業でも指示するだけで軽々こなすという、我々が理想とする能力を持つ汎用的なヒューマノイドを実現するにはまだ技術的なギャップがあることを説明した。しかしそれでもなお、人はヒューマノイドに対して夢を見ずにはいられない。この流れのままヒューマノイドがマジョリティになる世界はどんなシナリオが考えられるだろうか。それはiPhoneのようにいち早く市場に製品を投入しアプリやプラットフォームとして地位を確立し、エコシステムを作り上げたシナリオに似ているかもしれない。

1. 安く使い勝手の良いロボットとしての地位確立

例えば4足歩行ロボットとしては後発でありながら確固たる地位を気づいたUnitree Go1/Go2は入手性の良さと、拡張性の高い移動ロボットの開発プラットフォームとして一定の支持をえているのではないだろうか。建設現場での利用など4足歩行というメリットは享受できるも必ずしも必須ではない環境に導入されるケースがいくつかある。 これと同じように、大量生産されて使い勝手の良いロボットがヒューマノイドになると言うのが一つの勝ち筋ではないかと考えている。ヒューマノイドである必要性はないけれどど、単純に双腕アームの使いやすいロボットとして買いやすく扱いやすいロボットがそれだったという話である。現状でも低価格を売りにしたヒューマノイドがでてきている。 また数が出ればその製品に対する投資が集まりより高性能な製品を安く大量に供給できるという好循環が発生する。

2. データ収集のためのプラットフォーム化

賢いロボットを作るためには大量のデータが必要となる。そのためにはロボットを大量にばら撒かなければならない。LeRobotはオープンハードウェアのロボットアームを担ぐことでこれを実現しようとしている。 1のように安く使い勝手の良いロボットとして地位が確立していれば同じロボットを使った学習データが集まり、さらにそのデータがユーザーを惹きつける好循環を生み出すことができるかもしれなし。つまり、みんなこのロボットを使ってデータを作っているから自分たちもそれを活用するために同じロボットを使うという理屈で採用するものだ。

3. 人間によるデータを扱いやすくする。

ロボットを学習させるためのデータを集めるのは難しい。最近ではロボットではなく、人間が作業をしている動画から直接ロボットに模倣させる研究もある。(昔からあるが今もある) 例えば現在ではYoutubeなどの動画プラットフォーム上で容易に人間による作業の動画を得ることができる。これを活用する際に、ヒューマノイドであればそのデータを転用しやすいと言うことになれば、これは「賢いロボットを作るためにヒューマノイドを活用する大きな動機になる」

まとめ

今のヒューマノイドロボットのブーム、そこに明確な需要や必然性はない。ハードウェアとAIの確認によってヒューマノイドは確実に安く性能が良いものができている。それでも実用には物足りない。生成AIからこぼれ落ちた投資が投機となり現在のブームに拍車をかけており、いずれ爆発的なヒットに繋がるかもしれない。一方で期待に足りずしぼんていく可能性も残されている。

国内でも昨今のヒューマノイドブームにあやかり再度本邦のヒューマノイド栄光の日々を取り戻そうとする動きがある。ヒューマノイドはAIに対する投資から生まれた投機である点を理解しつつ、しかしそれが当たるかもしれない技術のブレークスルーに注視し、決断は慎重にしかし素早く行っていく難しい舵取りが必要になっているのだろう。

世界が巨大な最先端のロボティクスラボになる日-LeRobot World Wide Hackathon 2025 参加記録-

1. はじめに

2024年の初頭からスタートしたHuggingFaceのAIロボットプロジェクトLeRobotはSO-ARMと呼ばれる低価格のロボットアームの提供とともにその知名度とコントリビューターを増やし、今やロボット界で一つのムーブメントを起こさんとする状況になってきている。そんな中、この2025年の6月に世界規模のハッカソンを開催するという話が舞い込んできた。

そして、ここ日本の東京は秋葉原では、ギーク文化最先端の地を再興せんとするものたちが日本のローカル会場として名乗りをあげ始めた。

これは2025年の梅雨に秋葉原を中心に繰り広げられたロボ愛好者たちによる世界を巻き込んだ巻き込まれた熱きハッカソンの記録である! (LeRobot World Wide Hackathonの参加レポートです。)

2. LeRobot World Wide Hackathon

▼参加者と会場

今回のハッカソンでは、44カ国から100を超えるローカル会場と3000名以上の参加登録(オンライン参加を含む)があったとされています。日本では、東京の秋葉原に2会場、本郷と代官山にそれぞれ1会場ずつ、合計4つのローカル会場が開設されました。同一都市に複数の会場が設けられたのは東京だけです。これは、日本国内でのコミュニティがまだ発展していないことや、大規模な会場を準備することが難しい事情が影響しています。

▼開催期間

ハッカソンは各参加者のローカルタイムで、6月14日09:00から6月15日18:00まで開催されました。タイムゾーンを考慮すると、ニュージーランドからアメリカ西海岸までの期間は55+時間となります。各会場はZoomで接続していましたが、パリのHugging Faceチームは開催中ずっと接続を維持していました。

▼最終的な成果

参加者は1~5人のチームに分かれて参加しました。最終的に190チームから成果物が提出され、デモ動画はHugging Faceで公開されています。

デモ動画だけでなく、AIに学習させたデータの提出も求められ、現段階で186以上のデータが投稿されています。それぞれのデータセットで実際のデータ量は異なりますが、たった2日間で集まった量としては驚異的です。 今後、Hugging Faceはこのデータを活用してSmolVLAというVLAモデルの開発を進める予定です。コミュニティの努力が集まり、汎用AI基盤モデルが発展していく未来を感じさせるハッカソンとなり、参加するだけで満足感が得られます。

3. 日本会場について

ハッカソンは、地域のローカル会場とオンライン参加の2パターンで開催されます。募集当初は日本会場がなかったため、日本からはオンライン参加のみでしたが、秋葉原のロボット専門のFAB&コワーキングスペース「ロボ⭐️スタディオン」が会場として名乗りを上げました。さらに、ハッカソンに向けてSO-ARMの3Dプリントサービスを格安で開始し、現在ではLeRobotとSO-ARMの日本の中心地として広く認知されています。

IMG_6272.jpeg

IMG_6384.jpeg

ロボ☆スタディオン

その後、OpenARMを開発しているレアゾン研究所も会場に加わり、5月中旬には秋葉原で2つの拠点体制になりました。最終的には開催1週間前に東京大学の本郷テックガレージとTAI Design Thinking Japanのオフィスもローカル会場として参加しました。

各ローカル会場のホストが連絡を取り合い、調整を行いました。また、素敵なTシャツも作成していただきました。次回は福岡や大阪、名古屋などの他の都市でも開催されるといいなと思っています。この記事を見て興味を持ってくれる方が増えることを願っています。

4. 開催当日の様子

ここからは開催当日の様子を紹介します。私が参加したのは通称Tokyo-1のロボスタさん会場です。そちらでの様子になります。

▼SO-ARMの組み立てからVLAの学習までなんでもあり

ハッカソンのテーマについてはある程度HuggingFaceから示されていましたが、実質はなんでもありです。SO-ARMの組み立てをしているチームもあれば、模倣学習でアプリケーションを実装するチームもありました。おそらく他の会場も似たようなものだったと想像します。

Tokyo-1では私は他チームのサポートをしつつ、自分の作業を行なっていました。日本人だけでなく海外の方も参加しており、日本語と英語(雰囲気英語)で会話を行いながら多国籍なコミュニケーションをローカル会場でも行なっていました。

IMG_6422.jpeg

IMG_6423.jpeg

▼技術とダンスで世界とコミュニケーション

このハッカソンでは、LeRobotのDiscordサーバーを中心にコミュニケーションを取り、Zoomも活用しています。このZoomを通じたコミュニケーションは、ハッカソンの特徴の一つでした。

ローカル会場同士は、パリのHuggingFaceをホストとしてZoomで繋がっており、その様子はYouTubeでストリーミングされています。基本的に音声はオフですが、画面には各会場の様子が映し出され、時刻が進むにつれて各タイムゾーンハッカソンが開始されたり、食事の時間になったりする様子がわかり、非常に面白いです。

また、画面を通じて会場同士のコミュニケーションも行われています。特にブラジル会場では、紙に日本語や韓国語、中国語で挨拶のメッセージを書いて反応を楽しんでいる様子が見られ、離れていても一体感を感じました。

朝の時間帯は、タイムゾーン的にHuggingFace本部と日本会場だけが接続されていたため、お互いカメラの前でダンス対決をしていました。私がTokyo-1に到着した時、ロボスタの店長さんがカメラに向かって踊っていたので、会場を間違えたかと思いました。物理的に離れ、タイムゾーンが異なっていても、ロボットが好きな人たちが集まり、世界中で一体感を持って楽しんでいました。

今でも少しだけYouTubeやXのライブでその様子を観ることができるようです。

▼見学したら最後、見るだけではつまらない!

Tokyo-1がコワーキングスペースという特色から、ハッカソン期間中に多くの方がSNSや看板を見て見学に訪れました。変わったところではインドから旅行中のおじさんもいました。また、会場間での移動や交流もあり、特にTokyo-1のロボスタとTokyo-2のレアゾン研究所は近いため、頻繁に相互に移動していました。本郷テックガレージの東大チームの方も訪問いただきました。

見学者の中には、その場で即席ハッカソンチームに参加したり、説明を受けてすぐに手を動かし始める人もいて、見学者も気軽に参加できる雰囲気です。このような良い意味でゆるい雰囲気でした。

▼参加者の心とお腹アイデアを満たしたありがたい差し入れ

大変ありがたいことに、レアゾンさん、ロボスタさん、見学者の皆様から差し入れがありました。これらの差し入れは参加者が食べると共に、一部ロボットのハンドリング対象として活躍しています。(もちろん無駄にせずその後しっかりと食べてます)。本当にありがとうございました。

5. 自分が取り組んだ内容

▼2人チームでVLAの学習に挑戦

私はおれっちさんとチームを組み参加しましたテーマは、ハッカソン開催の前週に公開されたSmolVLAのファインチューニングです。具体的なタスクとして、テキストの指示に従って指定された枚数のお皿を取り、人に渡すことと、人から渡されたお皿を戻す動作を学習することに決めました。

提出ギリギリの15日の16時ごろから全てのインストラクションを通しで行うデモを撮影しようとしましたが、その頃からタスクの成功率が極端に下がり、最後まで通しデモを撮影できませんでした。帰宅後にロボットの様子をチェックしたところ、各所のネジが緩んでおり、特に手首関節のロール軸のネジがほぼ外れている状態でした。やはりロボットなので、メカ部分の影響は大きいと感じました。メンテナンスと基本動作はしっかり行うべきです。

▼他会場からのSNS投稿に翻弄される。

最終的に上記のネタにたどり着くまでには紆余曲折がありました。1日目の夕方から、SNSやDiscordでHugging Faceのメンバーから「Sooooo Cooool」と言われているチームの話があり、それがTokyo-2のteam-npakaさんたちによるエアホッケーネタでした。

Tokyo-1も「So Cool」と言われたいという気持ちから、夕方にネタの再検討を行い、アキヨドにドミノを買いに行くなど、他チームのテーマに翻弄されていました(最終的に私の子供のおもちゃ箱に収まりました)。

過去のハッカソン参加経験から、準備が8割だという持論がありますが、今回はどんなネタをやるかを事前に検討する時間がありませんでした。もう少し真面目にネタ検討すればよかったなと思ってます。

6. デモと結果

最終的に投稿された250+のデモは以下のサイトに動画が掲載されています。とにかくチュートリアルをやってみました、これをやりたいです、というレベルのものから、モデルを拡張して学習させたデモ、ガウシアンスプラっティングで合成データ作成にチャレンジしたものなど様々なあハイレベルな取り組みまで揃っています。正直これだけのAI ロボティクスに関するデモが一度にたった55時間ちょっとで出来上がったのは驚きではないでしょうか?ぜひいろんなチームの動画を見てください。

最終的に投稿された250以上のデモは、以下のサイトに動画が掲載されています。チュートリアルを試したものや、モデルを拡張して学習させたデモ、ガウシアンスプラッティングを用いて合成データを作成したものなど、さまざまなレベルの取り組みが揃っています。これだけのAIロボティクスに関するデモが、わずか55時間ほどで完成したのには驚きます。ぜひいろんなチームの動画をご覧ください。

ハッカソンの優勝チームと入賞チーム

ハッカソンなので1位という概念があり、最終的に参加者の投票で上位10位が決定されました。優勝したのはLeChefというプロジェクトです。

LeChefは、会話をしながら複数のサンドイッチメニューを作れるロボットです。LLMにはMistralを使用し、会話内容からメニューを決定し、ACTモデルに必要なメニューを伝えます。メニューはone-hotベクトルでエンコードされ、あらかじめACTの入力として条件を学習させています。また、台座をリニア機構で動かせるようにし、こちらもACTの制御対象となっています。テーマ、AI技術、メカのすべてにおいて、参加者全員が納得する完成度でした。

▼そのほか30位までの入賞

そのほか30位までの入賞は以下の通りとなっています。日本国内チームも入っており、4位にTAIのチームが、我々のチームのPJも15位に入賞しました。さらに18位にえいいっく(箸ロボット)、29位にteam-npakaが続いています。世界から投稿された300近いPJからの上位30に入りました。本当におめでとうございます。

さらにここに入賞していないものも面白いものがたくさんあるので機会があればどこかで紹介したいです。

Let’s turn the world into one giant robotics lab!

HuggingFaceのオーガナイザーやローカル会場のオーガナイザーの方々の苦労は計り知れません。非常に楽しめたイベントでした。本当に運営の皆様には感謝の言葉しかありません。

個人的に少し残念だなと思ったのが、参加者が東京に偏っていた(たように見える)。さらに国内のアカデミックや企業からの興味関心が得られなかった(私の知る限り東大チームのみ参加)ように見えました。所詮は素人のホビーと思われているんだと思いますが、The next big thing will start out looking like a toy と捉えてこういったコミュニティベースの取り組みにも是非興味を持ってもらえると嬉しいです。

Let’s turn the world into one giant robotics lab!

この言葉はHuggingFaceから送られてきたこのハッカソンの合言葉です。

LeRobotはやる気があれば誰でも簡単にAIロボティスクを始められる仕組みです。専門的な知識がなくても始められます。もちろん専門的な知識があればこれをベースにして、よりすごいPJを立ち上げることもできます。さらにみんなでデータを集めていくことで、オーガナイザであるHuggingFaceが基盤モデルを作ることができ、その成果をまたコミュニティで使っていくことができる。AI ロボティクスの実現に素人から玄人までコミュニティーベースで貢献することができるのです。まさに「世界を一つの大きなロボティクスの研究室」にすることができます。

こんなことが実現できるのか正直謎でした。しかし今回のハッカソンでその鱗片を垣間見た来ましす。皆さんもこの世界で最も巨大なロボティクスラボのラボメンになりたい方はいますぐLeRobotをインストールして動かすことから始めていきましょう!

第二回が開催されるかはわかりませんが、とにかくSNSを見てあーだこーだ言ったり、見て見ぬ振りするくらいだったらとっとと参加してしまった方が楽しいですよ。やりましょう!

【SO-ARM100/101のアプリ実装】5万円で作る!AIロボットアーム SO-ARM100 完全ガイド#5-アプリケーション実装編-

1. はじめに

ここまでロボットの組み立てから学習データの収集と学習、学習結果の実行について解説しました。 学習結果の実行ではLeRobotのcontrol_robotスクリプトを使いましたが。この方法では学習したモデルを使いロボットを動かすことができますが、独自のアプリケーションに組み込んで利用することができません。

そこで今回はLeRobotをライブラリとして利用することでオリジナルのアプリケーションを実装する方法について紹介します。

2. LeRobotのアプリケーション実装の全体像

学習させたPolicyを用いてロボットを動かすためには大きく次の処理が必要です。

  1. ロボットへの接続

ロボットのコンフィグファイルを元にロボットのインスタンスを取得し接続します。

  1. ロボットの内部状態、外部センサの状態取得

カメラの画像やロボットの現在の関節値を取得します。

  1. Policyによる推論

2で取得した観測情報を元に学習済みPolicyを使ってロボットの指令値を決定します。

  1. ロボットへの指令値の送信

3で決定した指令値をロボットへ送り、実際にロボットを動かします。

それぞれの処理の実装方法について説明し、最後に全体をまとめたコードを紹介します。

3. ロボットとの接続

LeRobotからロボットへ接続する場合はRobotConfigとManipulatorRobotオブジェクトを使用します。SO-ARM100を接続する場合はSo100RobotConfigを使い、設定を読み込みManipulatoroRobotオブジェクトを作成します。以下のコードはロボットオブジェクトを作成してロボットに接続するコードです。この状態でロボットに対して指示を送ることがあります。

from lerobot.common.robot_devices.robots.configs import So100RobotConfig
from lerobot.common.robot_devices.robots.manipulator import ManipulatorRobot

config = So100RobotConfig()
config.calibration_dir= <スクリプト実行パスからみたキャリブレーションファイルのパス>

robot = ManipulatorRobot(config)
robot.connect()
## ロボットが急な動きや無理な姿勢、障害物への衝突が発生する可能性があるので
## まだロボットに対して指令値を送らない。

SO100RobotConfigでロボットのコンフィグを読み出します。このconfigは変更可能です。例えば、通常、leaderとfollower両方のアームが読み込まれ接続が行われます。しかし以下のようにSO100RobotConfignのコンストラクタ引数に値を設定することで、leaderアームの設定を無効にし、followerのみ接続するよう変更できます。またcalibration_dirのパスも設定できます。

config = SO100RobotConfig(leader_arms={}, calibration_dir='lerobot/.cache/calibration/so100')
robot = ManipulatorRobot(config)

4. 観測情報の取得

ロボットの関節情報やカメラの画像はManipulatorRobot.capture_observationメソッドからdict型の戻り値として取得できます。カメラはconfigsの設定で指定した値がキー値として設定されます。複数カメラを接続している場合はfor文を使い取り出すことができます。下の例ではリスト内包表記を使用しています。

observation = robot.capture_observation()

state = observation['observation.state']
images = []

image_keys = [key for key in observation if "image" in key] # カメラのキー値はConfigファイルに設定した値

#画像はnumpy.arrayで格納されている。
for key in image_keys:
    cv2.imshow(key, cv2.cvtColor(observation[key].numpy(), cv2.COLOR_RGB2BGR))
cv2.waitKey(1)

5. ロボットへの指令値の送信

ロボットに対するアクションはrobot.send_actionメソッドを使います。このメソッドは要素0が1軸目の台座の回転に対応している要素数6のリスト(numpy.nbarray or tensor)を引数にとり、そのまま各関節の指令値として与えます。そのため不用意に指令値を与えるとロボットの思わぬ動作を引き起こすことになります。順運動や逆運動学を解き、指令値を決める。もしくは現在の関節角をベースに動作を指定するなど対策をしましょう。

今回はダミーデータとして現在の観測値を取得し、それをそのまま指令値として与えてみます。

if robot.is_connected:
  observation = robot.capture_observation()
  action = observation['observation.state']
  print(action)
  ## 指令値を変更する場合は無理な姿勢にならないか、急な動作を引き起こさないかを確認する。
  ## 警告:適当な値を指令値として与えないこと。
  robot.send_action(action)

5. モデルの読み込みと推論

学習ずみモデルを用いて推論を行う場合はモデルクラスのfrom_pretrained()メソッドに学習したモデルファイルを指定して読み込ませます。ACTを使う場合は次のようにします。

推論結果の戻り値はバッチに従って2次元配列になっています。1次元目の要素は1なので、次元を一つ落として利用します。

from lerobot.common.policies.act.modeling_act import ACTPolicy

policy = ACTPolicy.from_pretrained('モデルファイルまでのパス')
action = policy.select_action(observation) # robot.capture_observationの戻り値
action = action.squeeze(0)#2次元配列から1次元配列へ変換
action = action.to("cpu")
if robot.is_connected:
  robot.send_action(action)

6. 全体のコード

実際にFollowerアームと学習済モデルを使ってロボットを動かす場合は次のようにコードを記述します。以下参考に、ロボットが動き出すトリガーの実装やWEBアプリケーションとの連携などにより、デモの見栄えを良くすることができます。

"""
This is sample code for running the robot controller.
"""


import time

import cv2
import torch

from lerobot.common.policies.act.modeling_act import ACTPolicy
from lerobot.common.robot_devices.robots.configs import So100RobotConfig
from lerobot.common.robot_devices.robots.manipulator import ManipulatorRobot
from lerobot.common.robot_devices.utils import busy_wait

inference_time_s = 60
fps = 30
device = "mps"  # TODO: On Mac, use "mps" or "cpu"

ckpt_path = "masato-ka/act_so100_cls_block_color"
policy = ACTPolicy.from_pretrained(ckpt_path)
policy.to(device)

config = So100RobotConfig(leader_arms={})
config.calibration_dir='lerobot/.cache/calibration/so100'

robot = ManipulatorRobot(config)

if __name__ == '__main__':

    robot.connect()

    try:
        for _ in range(inference_time_s * fps):
            start_time = time.perf_counter()

            # Read the follower state and access the frames from the cameras
            observation = robot.capture_observation()

            image_keys = [key for key in observation if "image" in key]
            for key in image_keys:
                cv2.imshow(key, cv2.cvtColor(observation[key].numpy(), cv2.COLOR_RGB2BGR))
            cv2.waitKey(1)
            # Convert to pytorch format: channel first and float32 in [0,1]
            # with batch dimension
            for name in observation:
                if "image" in name:
                    observation[name] = observation[name].type(torch.float32) / 255
                    observation[name] = observation[name].permute(2, 0, 1).contiguous()
                observation[name] = observation[name].unsqueeze(0)
                observation[name] = observation[name].to(device)

            # Compute the next action with the policy
            # based on the current observation
            action = policy.select_action(observation)
            # Remove batch dimension
            action = action.squeeze(0)
            # Move to cpu, if not already the case
            action = action.to("cpu")
            # Order the robot to move
            robot.send_action(action)

            dt_s = time.perf_counter() - start_time
            busy_wait(1 / fps - dt_s)
    finally:
        robot.disconnect()

7. まとめ

上記コードをベースに、外部イベントによる動作の開始やGUIでの制御といったアプリケーションの構築ができます。LeRobotの付属スクリプの実行だけでなく、WEBブラウザからの入力や他のシステムと連携した動作などインタラクティブなデモアプリケーションを組み上げてください。

次回はより、LeRobotを使いこなすため、Action Chunking Transformerにコンディション(条件)を加えた学習にチャレンジします。例えば、画像上で指定したオブジェクトを取らせたり、言語による作業指示に従って動作させることができるようになります。

▫️画像座標によるコンディショニングの例

x.com

▫️言語によるコンディショニング(VLA)の例

x.com

【模倣学習&LeRobot】5万円で作る!AIロボットアーム SO-ARM100 完全ガイド#4-模倣学習編-

1. はじめに

前回はキャリブレーションとテレオペレーション、カメラの動作確認まで進みました。今回からはいよいよ模倣学習にチャレンジします。最初は模倣学習で一番重要なステップである学習データの収集について説明します。

学習データの良し悪しによってタスクを正確に実行できるか、ロボットの振る舞いが決まってしまいます。Lerobotを使った学習データの作り方と合わせてそのコツも紹介します。

2. 学習させる問題設定

学習データを集める前に、ロボットに実行させたい作業を決めておきます。最初は複雑なことを求めず、単純なタスクを設定しましょう。今回はロボットアームに挑戦させる「Hello World」として、Pick and Placeの問題を設定します。これは、ブロックをロボットに持たせて指定されたエリアに置く作業です。

非常に簡単に見える作業ですが、ロボットで実現するのは手間がかかります。まず、ティーチングプレイバック方式でロボットに動作を覚えさせ、その通りに動かす方法があります。しかし、この方法ではブロックやゴールの位置を厳密に決められた場所に置く必要があります。また、正確にロボットを制御するために高い位置精度が求められます。より柔軟にするためには、ロボットの逆運動学とプランニング、画像認識によるブロックの認識と位置推定を統合したプログラムが必要です。今回は、これらすべてを模倣学習によるEnd-to-Endで実現します。

3. 模倣学習

模倣学習とは、エキスパートのデモンストレーションを基に、そのタスクにおける最適な行動を獲得する手法です。ロボットの例では、人間がデモンストレーションを行い、機械学習を用いて最適な行動方針(Policy)をロボットに学習させます。

具体的には、SO-ARM100のリーダーアームを人間が操作し、ロボットに学習させたい作業を複数回実行したデモンストレーションデータを集めます。このデータをAIモデルに学習させることで、ロボットはタスクを模倣して動作します。ただし、行動方針を獲得するため、人間と全く同じ動きにはなりません。

模倣学習の一手法であるBehavior Cloningには、タスクに対して複数の解法が存在する問題(多峰性分布)や、長時間動作させるとエキスパートの行動方針からずれてしまう共変量シフトといった課題があります。そのためそのままではロボットによる複雑・長時間にわたるタスクへの適用は困難でした。

LeRobotが提供するAction Chunking TransformerやDiffusion Policyといった最新の模倣学習AIモデルは、これらの課題に対処しています。今回は、模倣学習のAIモデルとしてAction Chunking Transformer(以降ACT)を採用します。(もちろん完全ではありません。Conditional Flow Matchingなど新しい技術が登場してきています。)

ACTについては過去記事で解説しています。

note.com

4. 事前準備と確認

まずは環境の準備から行います。

Lerobotを使いGoogle Colab上で学習するノートブックを用意しました。

▼ロボットの設置と動作環境の準備

SO-ARM100のLeader/Follower、カメラ、ブロック、ゴール地点(紙などにマジックで丸を書く)を準備して設置します。作業場所を確保し、ブロックとゴール、Followerアームを配置してください。その後、カメラを設置し、ブロックとゴール、Followerアームが画角に収まるように調整します。前方斜め上から撮影すると良いです。Leaderアームはカメラに映らない位置に配置してください。

▼Hugging Faceアカウントの準備

Hugging Faceの無料アカウントを作成してください。収集した学習データや学習済みモデルをアップロードできます。学習データをHugging Faceにアップロードすると、学習時のファイル転送がスムーズになります。ただし、公開リポジトリになるため、データの写り込みには注意が必要です。

▼Wandbアカウントの準備

学習中の進行状況を確認するために、Weights & Biases社のWandbサービスを利用します。最近の生成AIモデルの学習においてデファクトスタンダードとなりつつあります。こちらも無料でアカウントが作成できるので、アカウントを作成してください。

Google Colaboratoryの準備(オプション)

ACTの学習にはGPUが必要です。Apple SiliconのGPUやゲーミングノートパソコンのGPU、Jetsonは非力なため、GPUサーバーの利用をお勧めします。Google ColabのPro契約(月額約1200円)でA100やL4を利用するのが手っ取り早いです。Lerobotを使い、Google Colab上で学習するノートブックも用意しました。

gist.github.com

5. 学習データの収集

SO-ARM100, Lerobotを使って学習データを収集します。

▼HuggingFaceのログイン

コマンドプロンプトからHuggingFaceにログインします。Hugging Faceのサイトで、Write権限のある認証トークンを取得してください。

▫️参考: HuggingFaceでのユーザーアクセストークンの取得方法

huggingface.co

続いて以下のコマンドを実行してコマンドプロンプトからHugginFaceへログインします。

export HUGGINGFACE_TOKEN=<取得した認証トークン>
huggingface-cli login --token ${HUGGINGFACE_TOKEN} --add-to-git-credential
HF_USER=$(huggingface-cli whoami | head -n 1)
echo $HF_USER

▼データ収集の実行

以下のコマンドを実行し、SO-ARM100でデータ収集を開始します。10エピソードのデータが収集されます。可視化ツールのrerunが実行されますが、不要な場合はfalseに設定してください。

エラーが発生した場合は、config.pyでシリアルポートのパスやカメラの設定を確認してください。

スクリプトを一時停止し、続きから学習する場合は、--control.resumetrueにしてください。

python lerobot/scripts/control_robot.py
--robot.type=so100 #利用するロボットの名前(今回)
--control.type=record
--control.fps=30
--control.single_task="Grasp a lego block and put it in the bin."
--control.repo_id=${HF_USER}/so100_test
--control.tags='["so100","tutorial"]'
--control.warmup_time_s=5
--control.episode_time_s=30
--control.reset_time_s=30
--control.num_episodes=10
--control.push_to_hub=true
--control.display_data=true
--control.resume=false 

実行の流れは以下の通りです。1エピソードの間にロボットを操作してタスクを1回実行し、データを収集します。リセットエンバイロメントでは、ロボットをレストポジションに戻し、環境を初期状態にして次のエピソードに備えます。

学習のフローはキーボードで操作できます。キー操作は以下の通りです。作業に失敗した場合は左矢印キーでエピソードの取り直しをしてください。

  1. 右矢印キー: エピソードのスキップ
  2. 左矢印キー: エピソードのやり直し
  3. ESCキー: スクリプトの終了

指定したエピソードが完了すると、Hugging Faceに公開データセットとしてアップロードが始まります。アップロードを避けたい場合は、コマンド実行時に --control.push_to_hubfalse に指定してください。

▼学習データ収集のコツ

まずは50エピソードを目標にデータを収集してください。どんな状況でも堅牢にタスクを実行するためには、物の形や色、向き、位置などのバリエーションが重要です。しかし、初めからあまり多くのバリエーションを増やすとうまくいかないことがあります。最初は10エピソードずつ、物の向きや位置、ゴールポジションを変えながら収集すると良いでしょう。

▫️参考 masato-kaが収集したデータセット

huggingface.co

huggingface.co

▼データの保存場所と削除

学習したデータは、Hugging Face形式のデータセットとしてキャッシュディレクトリに保存されます。デフォルトのパスは「~/.cache/huggingface/lerobot/$HF_USER/<データセット名>」です。先述のコマンドを実行した場合は「~/.cache/huggingface/lerobot/$HF_USER/so100_test」になります。Windowsの場合、ホームディレクトリは「C:/Users/<ユーザー名>」です。

6. 学習データの確認

▼ビジュアライザでの学習データの可視化

Hugging Faceにデータセットを公開している場合、以下のサイトにデータセット名を入力すると閲覧できます。

huggingface.co

ローカルで閲覧したい場合は、以下のコマンドを入力してWEBブラウザで確認できます。—repo-idは作成したデータセット名に合わせて変更してください。

python lerobot/scripts/visualize_dataset_html.py \
  --repo-id ${HF_USER}/so100_test

Image.png

▼学習データのプレイバック

学習したデータをFollowerアームで再生できます。以下のコマンドでデータセット名とエピソード名を指定してください。

python lerobot/scripts/control_robot.py \
  --robot.type=so100 \
  --control.type=replay \
  --control.fps=30 \
  --control.repo_id=${HF_USER}/so100_test \
  --control.episode=0

学習データの動きを再現するため、同じデータセットの同じエピソードを指定すると、常に同じ動きを繰り返します。

7. ACTの学習

収集したデータをACTに学習させます。Google Colaboratoryを利用する場合は、以下のノートブックを実行してください。インスタンスはL4以上で、できればA100が望ましいです。

▼wandbへのログイン

シェル上でwandbへログインします。

wandb login

▼学習の実行

以下のコマンドを実行して学習を開始します。デフォルトでは10万ステップの学習を行い、2万ステップごとにチェックポイントを保存します。1エピソードは20~30秒で、50エピソードの学習にGoogle ColabのA100 GPUを使用すると約90分かかります。最低でも6万から10万ステップの学習を推奨しますが、学習ステップ数は--stepsオプションで変更可能です。

!python lerobot/scripts/train.py \
  --dataset.repo_id='masato-ka/so100_cutlery_handling_simple' \
  --policy.type=act  \
  --output_dir=outputs/train/act_so100_cutlery_handling_simple \
  --job_name=act_so100_cutlery_handling_simple \
  --policy.device=cuda \
  --wandb.enable=true

保存されたチェックポイントや学習結果は、lerobotフォルダ内のoutput/trainディレクトリに格納されています。また、WandBのダッシュボードからlerobotプロジェクトの--job-nameで指定したジョブ名のメトリクスをリアルタイムで確認できます。プロジェクト名を変更する場合は、--wandb.projectで指定してください。

基本的にはtrain/lossの値を確認します。画像のようにtrain/lossが下がっている場合、正常に学習が進んでいます。

Image.png

学習完了後、モデルはWandBにもアップロードされますが、WandBのフリープランでは5GBのストレージしかありません。複数回学習する場合は、容量上限に達するため、定期的にモデルやログを削除してください。 アーティファクトを削除する方法を参照してください。

アーティファクトを削除する

学習をチェックポイントから再開する際は、以下のコマンドを実行し、--config_pathに再開したいチェックポイントのtrain_config.jsonを指定してください。

python lerobot/scripts/train.py \
  --config_path=outputs/train/act_so100_test/checkpoints/last/pretrained_model/train_config.json \
  --resume=true

8. 実機での動作確認

実機で学習したACTモデルの動作確認を行います。チェックポイントファイルをローカルフォルダに移動し、以下のコマンドを実行します。—control.policy.pathには学習済みモデルファイルのパスを指定します。

python lerobot/scripts/control_robot.py \
  --robot.type=so100 \
  --control.type=record \
  --control.fps=30 \
  --control.single_task="Grasp a lego block and put it in the bin." \
  --control.repo_id=${HF_USER}/eval_act_so100_test \
  --control.tags='["tutorial"]' \
  --control.warmup_time_s=5 \
  --control.episode_time_s=30 \
  --control.reset_time_s=30 \
  --control.num_episodes=10 \
  --control.push_to_hub=true \
  --control.policy.path=outputs/train/act_so100_test/checkpoints/last/pretrained_model

動作の流れは、学習データの収集と同じです。—control.episode_time_sで実行時間を、—control.num_episodeで実行するエピソード数を指定します。実際の動作の様子は、HuggingFaceのキャッシュディレクトリ内のeval_act_so100_testにビデオとして保存されています。

AnimatedImage.gif

huggingface.co

学習データを工夫することで、色に応じて仕分けすることができます。

AnimatedImage.gif

huggingface.co

それぞれモデルを共有しました。

9. 学習データ収集のポイント

学習データ収集の章で述べたポイントに加え、いくつかのコツを紹介します。

▼Leaderアームはフォアアームを支えながらゆっくり動かす。

リーダーロボットを動かす際、アッパーアームとフォアアームが予期しない動きをすることがあります。そのため、ロボットを動かすときは、グリップを握った手と反対側でフォアアームを支えながら動かすことをお勧めします。

▼データのバリエーションを徐々に増やす

模倣学習は、学習データ以上のことを学ぶことができません。したがって、現実世界の環境変化に強い動作を実現するためには、学習データのバリエーションが重要です。物の形や向き、大きさ、場所を変えてバリエーションを増やしましょう。ただし、極端にバリエーションを増やしすぎると、うまく学習できず、性能の悪いモデルができてしまうことがあります。バランスを考えながら、徐々にデータを集め改善していくことをお勧めします。

▼人間でも解ける問題か確認する

学習データを集める際に、人間でもその作業が可能か確認してください。例えば、物体がカメラの画角から切れたり、障害物に隠れて見えなかったりすると、その作業は実際には人間でも実行できません。このようなデータは学習しても期待通りの結果が得られないでしょう。

10. まとめ

今回は完成したSO-ARM100を使って模倣学習に挑戦しました。模倣学習で最も重要なのはデータセットの収集です。良いデータを集めることが学習成功の鍵となります。一度でうまくいくとは限らないので、何度も練習してより良いデータを収集する工夫をしてください。

もし良いデータ収集のコツを見つけたら、是非コミュニティで共有していただけると嬉しいです。

次回は、学習したモデルを使ってアプリケーションを構築する方法について説明します。具体的には、今回学習したモデルを用いてPythonプログラムから実行や停止を行う方法を解説します。