ugo ProでVLAモデルを開発する① [データセット構築編]

0. はじめに

FastLabelで技術開発グループに所属しているMLエンジニアの海野です。当社では現在ロボティクスAI関連の技術開発、データ収集またモデル構築など様々な活動をしていますが、本記事では当社が保持しているugo株式会社製のロボットugo Proを使用したモデル開発についてご紹介します。本記事の内容は以下となりますので、どうぞ最後までご覧ください。

  • 対象読者:ロボティクスAIに関心のある方、VLAモデルに興味のある方、初学者向け
  • 記事の内容:ロボティクスAI開発全体の概略説明
    • [本記事] ugo Pro R&Dキットの説明→データ収集→データセット構築
    • [後日] モデル学習→実機評価
  • 記事の目的:ugo Proを使用してVLAモデルを開発できるようになる。

本記事のお品書き


1. ugo Pro とは

ugo Proは昇降機タイプのヒューマノイド型双腕ロボットで、商業施設や空港での警備・案内業務など既に社会実装が進んでいます。ugo Proにはカメラで不審者や不審行動を検知する警備機能や、AIを活用した音声対話で来訪者の質問に回答する案内機能を備えられています。

当社では本機のR&Dキットを保持しており、本キットには通常のugo Proと異なり、追加でカメラが3つ(頭部1つ、両手各1つ)備え付けられ、バイラテラルコントローラーでロボットを操作することでロボットの関節情報と3つのカメラ視点の映像データを収集することができます。ugo Proは人間の自由度と同様に片腕7DoFで構成され、滑らかに腕を動かせます。ugo Proの詳細情報については、以下をご覧ください。

またモデル開発に使用する主なソフトウエアは以下の2つです。

  • lerobot-robot-ugo-pro:ugo株式会社が開発しているugo ProとLeRobotをインテグレーションするためのオープンソース
  • LeRobot:Hugging Faceが主導して開発しているロボティクスAIのためのオープンソースで、PyTorchを用いてロボティクス関連のモデル、データセット、ツールを提供

なお、当社で保持しているugo Proは以下のような外観で、頭部と両腕にカメラがついています。

ugo Pro(R&D)
ugo Pro(R&D)

また、以下が本記事(後日掲載も含む)の全体像となり、モデル開発の各種工程で利用するH/WおよびS/Wとなります。

モデル開発全体像
モデル開発全体像


2. データ収集

まずは本ブログで開発するVLAモデルのイメージを掴んでいただくために、以下にデータ収集対象となるタスクの動画を示します。

データ収集するタスク
データ収集するタスク

2.1 タスクの定義

ここではタスクの定義について説明します。セクション2.1全体の概要を整理すると、2.1.1でタスクの全体像を説明し、2.1.2でタスクの詳細をどのような観点で定義すべきかまとめています。

タスク定義の概要
タスク定義の概要

2.1.1 タスクの全体像

データ収集を開始する前に、ロボットで実現したいタスクを定義します。今回はugo Proを使用したモデル開発の全体像は把握することを目的としているため、タスクはデータ収集が容易で時間の掛からないシンプルなタスク「Pick and place」とし、机上のcubeを掴んでトレイに配置するデータを収集します。タスクの全体の流れは以下の通りです。なお、本タスクではより設定をシンプルにするために右腕だけでcubeを移動できる環境を前提とし、左腕は使用しないこととします。

  1. ロボットで初期姿勢をとる
  2. 実タスクを実行する
  3. ロボットで完了姿勢をとる

上記でロボットの初期姿勢と完了姿勢をとる理由ですが、タスクの実行前後の状態を定めておくことで、一貫性のある動作/状態のデータを収集することができます。一貫性のないデータはモデルの品質(精度/タスク成功率など)に影響を与えるめ、細かいことではありますが、当社ではデータ収集を定義するうえで初期姿勢と完了姿勢は重要な観点だと思っています。

2.1.2 タスクの詳細化

ここでは、先ほど定義した全体像(タスク、初期姿勢、完了姿勢)を詳細化します。

まずは初期姿勢を詳細化します。データ収集/データセット構築した後のモデル学習ではVLAモデルを使用するため、カメラ画像から視覚情報(机の上の状態や手元の状態)を捉えられるように初期姿勢を設定しました。頭部のカメラは机を真上から捉えた情報を取得できるため、右腕の姿勢は肘を引き、机を横から捉えた映像を取得できるようにしました。ボディの姿勢については、机正面を向き、頭部カメラで机全体を捉えられ、かつタスクがスムーズに実行できる高さとしました。

続いて、先ほど設定した「机上のcubeを掴んでトレイに配置する」一連の動作を詳細化し、ロボットの動かし方を定義します。今回の一連の動作を詳細化した一例は以下のようになります。

  1. 初期姿勢から右腕をcubeに近づける
  2. cubeを掴む
  3. 右腕をトレイに移動させる
  4. cubeをトレイに置く

上記の動作の詳細化に関しては、より具体的することでオペレータ間で一貫したデータを収集できるようになります。例えば、「1の初期姿勢から右腕をcubeに近づける」動作に関しては、cubeに対して右腕を直線的にアプローチする方法や、UFOキャッチャーのようなに「横方向調整」「奥行き調節」「高さ調整」の3段階でアプローチするといった考え方ができます。また動作を詳細化する際はロボットに求める動作も大切ですが、オペレータが安定してデータ収集できる動作、またモデルの学習安定性といった観点も必要となります。

最後に完了姿勢ですが、こちらは初期姿勢と同様の姿勢とし、机の状態を頭部と右腕のカメラで捉えれるようにしています。そして、各種内容を定義したら、最終的に標準作業手順書にまとめることで、オペレーターが定められた方法でデータ収集できるようになります。

また以下はタスク実行前(初期姿勢)の机上の環境を可視化したものとなりますが、データ収集の流れにしたがって状態を可視化することで、オペレーターのタスクの理解度が高まります。

初期状態
初期状態

※実プロジェクトでは使用する道具やデータ収集計画(データの種類、量、スケジュール)なども詳細化します。

2.2 リーダー機によるテレオペレーション

前述でタスクが決まったので、ここからデータ収集を開始します。データ収集にはLeRobotを使用します。 まず初めにカメラとデータセットの観測情報を紐づけるためのIDを確認するために、lerobot-find-camerasコマンドでカメラ情報を確認します。

lerobot-find-cameras

上記コマンドを実行後、output/captured_imagesディレクトリ以下に.pngというファイル名でキャプチャされた画像が保存されるので、画像の内容からカメラ(頭部/右腕/左腕)とindexの紐づけを確認します。

続いてlerobot-teleoperateコマンドで実際にどのようにデータ収集できているかを確認します。

lerobot-teleoperate \
  --robot.type=ugo_pro \
  --robot.id=my_ugo_pro \
  --robot.cameras="{ front: {type: opencv, index_or_path: 6, width: 640, height: 480, fps: 30}, left: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}, right: {type: opencv, index_or_path: 10, width: 640, height: 480, fps: 30}}" \
  --teleop.type=ugo_bilcon \
  --teleop.id=my_ugo_bilcon \
  --display_data=true
  • --display-data=trueを指定することで、実際のカメラ映像や間接情報を確認することができます。
  • --robot.camerasのindex_or_pathに先ほど確認した各カメラのindexを設定します。

2.3 データ収集

ここから実際にリーダー機(バイラテラルコントローラ)でロボットを操作してデータを集めます。ugo Proで使用されるリーダー機は非常にコンパクトで持ち運びが比較的楽です。

リーダー機
リーダー機

データを集める場合はlerobot-recordコマンドを使用してデータ収集を開始します。

lerobot-record \
  --robot.type=ugo_pro \
  --robot.id=my_ugo_pro \
  --robot.cameras="{ front: {type: opencv, index_or_path: 6, width: 640, height: 480, fps: 30}, right: {type: opencv, index_or_path: 10, width: 640, height: 480, fps: 30}}" \
  --teleop.type=ugo_bilcon \
  --teleop.id=my_ugo_bilcon \
  --dataset.fps=15 \
  --dataset.push_to_hub=false \
  --dataset.repo_id=path/to/repo_id \
  --dataset.single_task="Pick up the cube and place it on the tray."
  --dataset.num_episodes=1 \
  --dataset.reset_time_s=10 \
  --dataset.episode_time_s=45 \
  --display_data=false \
  --resume=true

なお、タスク実行時にオペレーターは実空間を確認しながら作業するのではなく、カメラ映像(ロボットの視野)を見てロボットを制御します。オペレーターが直接タスク実行環境を見る視野とカメラから見える情報は異なります。このため、オペレーターがロボットからは確認できない情報を元にロボットをコントロールしたデータでモデルを学習した場合、ロボットの動作とカメラ映像が関連付けられなくなる恐れがあります。

以下、実際にオペレーターがカメラ映像を元にロボットをコントロールした様子ですが、奥行きの感覚を掴むことが難しいため、実際にデータ収集する前にカメラ映像をみながらロボットを制御する練習をした方が良いです。

データ収集画面(サンプル)
データ収集画面(サンプル)


3. データセット作成

ここからはモデル学習時に必要なデータセットをまとめるために、Lerobotを利用してデータセットを構築する方法を説明します。データ収集では大量のカメラ映像や関節角度のデータを保存していますが、全てのデータをモデル学習に利用するわけではありません。モデル学習の要件やノイズデータ(不用意な操作や欠損データ)の混入など、必要に応じてデータを加工する必要があります。

今回のケースではデータ収集時に両腕のカメラ映像と関節角度をあえて収集していますが、今回は右腕だけで完結するタスクにしているため、左手カメラおよび左腕の関節角度を使用しない方法でモデルを学習することにします。このため、それらの情報を削除する必要があります。

そこで、lerobot-edit-datasetコマンドで不要な観測情報を削除することができます。以下のコマンドではカメラ情報が削除されます。

lerobot-edit-dataset --repo_id <repo_id> --new_repo_id <new_repo_id> --operation.type remove_feature --operation.feature_names "['observation.images.camera_left']"

また、左腕の関節情報も削除する必要がありますが、ugo Proでは右腕と左腕の関節情報をobservation.stateにリスト形式でまとめて保存しているため、lerobot-edit-datasetでは特徴量の修正はできません。このため、この部分については自前のスクリプトで右腕の関節角度だけを保持するように修正しています。

続いて、モデル学習時にノイズとなるデータを削除します。収集されたデータの中には、操作を誤り腕を机に衝突させた動作や最後までタスクを完了できなかったデータが含まれます。このためモデル学習時にノイズになるデータを削除して、よりクリーンなデータセットにします。以下のコマンドで特定のエピソードを削除することができます。

lerobot-edit-dataset --repo_id <repo_id> --new_repo_id <new_repo_id>. --operation.type delete_episodes --operation.episode_indices <deleted_episode_indices>

以上までが、ugo Proでモデル開発する工程のデータセット構築までの内容となります。

まとめ

本ブロブでは、ugo Proを使用したモデル開発のデータ収集からデータセット構築までを説明しました。データ収集においては、実現したいタスクを定義して、一貫したデータを収集できるようにすることが大切です。またデータセットの構築に関しては、ノイズとなるデータを整理してよりクリーンなデータセットを構築することで、モデルを安定して学習できることが期待できます。次回の記事ではモデルの学習および評価について掲載する予定です。

FastLabelではエンジニアを積極募集しています!

herp.careers

fastlabel.ai

FastLabel Robotics 公式X

AIロボティクスのトレンドや弊社取り組みの最新情報をお届けしております。@FL_Robotics