ドキュメント: ドキュメント
単純なロボット エージェントの例:
SimplerEnv を使用したシミュレーション例:
? OpenVLA を使用したモーター エージェント:
⏺️ロボットにデータセットを記録する
?サポート、ディスカッション、ハウツー:
更新情報:
2024 年 8 月 28 日、embodied-agents v1.2
mbodied
。2024 年 6 月 30 日、embodied-agents v1.0 :
mbodied
に変更されました。身体化エージェントは、わずか数行のコードで大規模なマルチモーダル モデルを既存のロボット スタックに統合するためのツールキットです。一貫性、信頼性、拡張性を提供し、あらゆる観察およびアクション空間に合わせて構成できます。
Sample クラスは、任意のデータをシリアル化、記録、操作するための基本モデルです。拡張可能で柔軟性があり、強力に型指定されるように設計されています。観察オブジェクトまたはアクション オブジェクトを Sample クラスでラップすると、次のものとの間で簡単に変換できるようになります。
身体化されたエージェントのあらゆる可能性について詳しく知りたい場合は、ドキュメントを参照してください。
Sample
または Dict のリストを 1 つのSample
またはDict
にpack
、それに応じてunpack
できますか?Sample
クラスに非unflatten
できます。 サンプルを作成するには、Python 辞書をSample
クラスでラップするだけです。さらに、いくつか例を挙げると、クワーグ、ジム スペース、テンソルから作成できます。
from mbodied . types . sample import Sample
# Creating a Sample instance
sample = Sample ( observation = [ 1 , 2 , 3 ], action = [ 4 , 5 , 6 ])
# Flattening the Sample instance
flat_list = sample . flatten ()
print ( flat_list ) # Output: [1, 2, 3, 4, 5, 6]
# Generating a simplified JSON schema
>> > schema = sample . schema ()
{ 'type' : 'object' , 'properties' : { 'observation' : { 'type' : 'array' , 'items' : { 'type' : 'integer' }}, 'action' : { 'type' : 'array' , 'items' : { 'type' : 'integer' }}}}
# Unflattening a list into a Sample instance
Sample . unflatten ( flat_list , schema )
>> > Sample ( observation = [ 1 , 2 , 3 ], action = [ 4 , 5 , 6 ])
Sample クラスは、シリアル化と逆シリアル化のための Pydantic の強力な機能を活用し、Sample インスタンスと JSON の間で簡単に変換できるようにします。
# Serialize the Sample instance to JSON
sample = Sample ( observation = [ 1 , 2 , 3 ], action = [ 4 , 5 , 6 ])
json_data = sample . model_dump_json ()
print ( json_data ) # Output: '{"observation": [1, 2, 3], "action": [4, 5, 6]}'
# Deserialize the JSON data back into a Sample instance
json_data = '{"observation": [1, 2, 3], "action": [4, 5, 6]}'
sample = Sample . model_validate ( from_json ( json_data ))
print ( sample ) # Output: Sample(observation=[1, 2, 3], action=[4, 5, 6])
# Converting to a dictionary
sample_dict = sample . to ( "dict" )
print ( sample_dict ) # Output: {'observation': [1, 2, 3], 'action': [4, 5, 6]}
# Converting to a NumPy array
sample_np = sample . to ( "np" )
print ( sample_np ) # Output: array([1, 2, 3, 4, 5, 6])
# Converting to a PyTorch tensor
sample_pt = sample . to ( "pt" )
print ( sample_pt ) # Output: tensor([1, 2, 3, 4, 5, 6])
gym_space = sample . space ()
print ( gym_space )
# Output: Dict('action': Box(-inf, inf, (3,), float64), 'observation': Box(-inf, inf, (3,), float64))
詳細については、sample.py を参照してください。
Message クラスは、単一の補完サンプル空間を表します。テキスト、画像、テキスト/画像のリスト、サンプル、またはその他のモダリティを使用できます。 Message クラスは、さまざまなタイプのコンテンツを処理するように設計されており、ユーザー、アシスタント、システムなどのさまざまな役割をサポートします。
Message
さまざまな方法で作成できます。それらはすべて mbodi のバックエンドで理解できます。
from mbodied . types . message import Message
Message ( role = "user" , content = "example text" )
Message ( role = "user" , content = [ "example text" , Image ( "example.jpg" ), Image ( "example2.jpg" )])
Message ( role = "user" , content = [ Sample ( "Hello" )])
バックエンド クラスは、バックエンド実装の抽象基本クラスです。これは、特定のメッセージに基づいて完了を生成するための API 呼び出しなど、さまざまなバックエンド サービスと対話するために必要な基本的な構造とメソッドを提供します。さまざまなバックエンドがどのように実装されるかについては、バックエンド ディレクトリを参照してください。
Agent は、以下にリストされているさまざまなエージェントの基本クラスです。これは、リモート バックエンド/サーバーと通信し、オプションでアクションや観察を記録できるエージェントを作成するためのテンプレートを提供します。
言語エージェントは、選択したさまざまなバックエンドまたはトランスフォーマーに接続できます。これには、会話の記録、コンテキストの管理、メッセージの検索、メッセージの忘れ、コンテキストの保存、指示と画像に基づいた行動のメソッドが含まれます。
API サービス: OpenAI、Anthropic、vLLM、Ollama、HTTPX、または任意の gradio エンドポイントをネイティブにサポートします。さらに今後も!
ロボット バックエンドに OpenAI を使用するには:
from mbodied . agents . language import LanguageAgent
agent = LanguageAgent ( context = "You are a robot agent." , model_src = "openai" )
命令を実行するには:
instruction = "pick up the fork"
response = robot_agent . act ( instruction , image )
言語エージェントも vLLM に接続できます。たとえば、1.2.3.4:1234 で vLLM サーバー Mistral-7B を実行しているとします。必要なのは次のことだけです。
agent = LanguageAgent (
context = context ,
model_src = "openai" ,
model_kwargs = { "api_key" : "EMPTY" , "base_url" : "http://1.2.3.4:1234/v1" },
)
response = agent . act ( "Hello, how are you?" , model = "mistralai/Mistral-7B-Instruct-v0.3" )
Ollama を使用した例:
agent = LanguageAgent (
context = "You are a robot agent." , model_src = "ollama" ,
model_kwargs = { "endpoint" : "http://localhost:11434/api/chat" }
)
response = agent . act ( "Hello, how are you?" , model = "llama3.1" )
Motor Agent は Language Agent に似ていますが、文字列を返す代わりに、常にMotion
返します。 Motor Agent は通常、OpenVLA、RT1、Octo などのロボット トランスフォーマー モデルによって動作します。RT1 などの一部の小型モデルは、エッジ デバイス上で実行できます。ただし、OpenVLA など、量子化なしで実行するのが難しいものもあります。 OpenVLA エージェントと OpenVLA サーバーの例を参照してください。
これらのエージェントは環境と対話してセンサー データを収集します。これらは常にSensorReading
を返します。これは、画像、深度データ、音声信号など、さまざまな形式の処理された感覚入力です。
現在、次のものがあります。
ロボットのセンサー情報を処理するエージェント。
自動エージェントは、タスクとモデルに基づいて適切なエージェントを動的に選択し、初期化します。
from mbodied . agents . auto . auto_agent import AutoAgent
# This makes it a LanguageAgent
agent = AutoAgent ( task = "language" , model_src = "openai" )
response = agent . act ( "What is the capital of France?" )
# This makes it a motor agent: OpenVlaAgent
auto_agent = AutoAgent ( task = "motion-openvla" , model_src = "https://api.mbodi.ai/community-models/" )
action = auto_agent . act ( "move hand forward" , Image ( size = ( 224 , 224 )))
# This makes it a sensory agent: DepthEstimationAgent
auto_agent = AutoAgent ( task = "sense-depth-estimation" , model_src = "https://api.mbodi.ai/sense/" )
depth = auto_agent . act ( image = Image ( size = ( 224 , 224 )))
あるいは、auto_agent でget_agent
メソッドを使用することもできます。
language_agent = get_agent ( task = "language" , model_src = "openai" )
motion_controls モジュールは、ロボットを制御するためのさまざまなモーションを Pydantic モデルとして定義します。これらはSample
からもサブクラス化されているため、前述したようにSample
のすべての機能を備えています。これらのコントロールは、単純な関節の動きから複雑なポーズや完全なロボット制御まで、幅広いアクションをカバーします。
Robot をサブクラス化することで、カスタム ロボット ハードウェアを非常に簡単に統合できます。アクションを実行するためにdo()
関数を実装するだけで済みます (ロボットにデータセットを記録する場合は、いくつかの追加メソッドも必要です)。この例では、モック ロボットを使用します。例として XArm ロボットもあります。
ロボットにデータセットを記録するのは非常に簡単です。必要なのは、ロボットのget_observation()
、 get_state()
、およびprepare_action()
メソッドを実装することだけです。その後、いつでもロボットにデータセットを記録できます。詳細については、examples/5_teach_robot_record_dataset.py とこの colab: を参照してください。
from mbodied . robots import SimRobot
from mbodied . types . motion . control import HandControl , Pose
robot = SimRobot ()
robot . init_recorder ( frequency_hz = 5 )
with robot . record ( "pick up the fork" ):
motion = HandControl ( pose = Pose ( x = 0.1 , y = 0.2 , z = 0.3 , roll = 0.1 , pitch = 0.2 , yaw = 0.3 ))
robot . do ( motion )
データセット レコーダーは、ロボットと対話したりロボットを教えたりするときに、会話やロボットのアクションをデータセットに記録する下位レベルのレコーダーです。 Recorder に対して任意の観察スペースとアクション スペースを定義できます。スペースの詳細については体育館をご覧ください。
from mbodied . data . recording import Recorder
from mbodied . types . motion . control import HandControl
from mbodied . types . sense . vision import Image
from gymnasium import spaces
observation_space = spaces . Dict ({
'image' : Image ( size = ( 224 , 224 )). space (),
'instruction' : spaces . Text ( 1000 )
})
action_space = HandControl (). space ()
recorder = Recorder ( 'example_recorder' , out_dir = 'saved_datasets' , observation_space = observation_space , action_space = action_space )
# Every time robot makes a conversation or performs an action:
recorder . record ( observation = { 'image' : image , 'instruction' : instruction ,}, action = hand_control )
データセットは./saved_datasets
に保存されます。
Replayer クラスは、 Recorder
によって生成された HDF5 ファイルに格納されたデータを処理および管理するように設計されています。サンプルの読み取り、統計の生成、固有のアイテムの抽出、HuggingFace で使用するためのデータセットの変換など、さまざまな機能を提供します。 Replayer は、処理中の特定の画像の保存もサポートし、さまざまな操作のためのコマンド ライン インターフェイスを提供します。
Recorder から Replayer を使用してデータセットを反復処理する例:
from mbodied . data . replaying import Replayer
replayer = Replayer ( path = str ( "path/to/dataset.h5" ))
for observation , action in replayer :
...
├─ assets/ ............. Images, icons, and other static assets
├─ examples/ ........... Example scripts and usage demonstrations
├─ resources/ .......... Additional resources for examples
├─ src/
│ └─ mbodied/
│ ├─ agents/ ....... Modules for robot agents
│ │ ├─ backends/ .. Backend implementations for different services for agents
│ │ ├─ language/ .. Language based agents modules
│ │ ├─ motion/ .... Motion based agents modules
│ │ └─ sense/ ..... Sensory, e.g. audio, processing modules
│ ├─ data/ ......... Data handling and processing
│ ├─ hardware/ ..... Hardware modules, i.e. camera
│ ├─ robot/ ........ Robot interface and interaction
│ └─ types/ ........ Common types and definitions
└─ tests/ .............. Unit tests
問題、質問、PR を歓迎します。詳細については、貢献ガイドを参照してください。