المستندات : المستندات
مثال بسيط لوكيل الروبوت:
مثال محاكاة باستخدام SimplerEnv:
؟ وكيل السيارات باستخدام OpenVLA:
⏺️ سجل مجموعة البيانات على الروبوت
؟ الدعم والمناقشة والكيفية :
التحديثات:
28 أغسطس 2024، الوكلاء المتجسدون الإصدار 1.2
mbodied
لتجربتها.30 يونيو 2024، الوكلاء المتجسدون الإصدار 1.0 :
mbodied
.الوكلاء المتجسدون عبارة عن مجموعة أدوات لدمج نماذج كبيرة متعددة الوسائط في مجموعات الروبوتات الموجودة باستخدام بضعة أسطر فقط من التعليمات البرمجية. فهو يوفر الاتساق والموثوقية وقابلية التوسع وقابل للتكوين في أي مساحة للمراقبة والعمل.
تعد فئة العينة نموذجًا أساسيًا لتسلسل البيانات العشوائية وتسجيلها ومعالجتها. لقد تم تصميمه ليكون قابلاً للتمديد، ومرنًا، ومكتوبًا بقوة. من خلال تضمين عناصر الملاحظة أو الإجراء في فئة النموذج، ستتمكن من التحويل من وإلى ما يلي بسهولة:
لمعرفة المزيد حول كافة الاحتمالات مع العملاء المتجسدين، راجع الوثائق
pack
قائمة من Sample
أو الإملاءات في Sample
أو Dict
واحدة unpack
وفقًا لذلك؟unflatten
أي بنية بيثون في فئة Sample
طالما أنك تزودها بمخطط json صالح؟ يتطلب إنشاء نموذج فقط تغليف قاموس بايثون بفئة Sample
. بالإضافة إلى ذلك، يمكن تصنيعها من kwargs، وGym Spaces، وTensors على سبيل المثال لا الحصر.
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 ])
تستفيد فئة العينة من ميزات Pydantic القوية للتسلسل وإلغاء التسلسل، مما يسمح لك بالتحويل بسهولة بين مثيلات العينة و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
بطرق متعددة. يمكن فهمها جميعًا من خلال الواجهة الخلفية لـ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) لإنشاء الإكمالات بناءً على رسائل معينة. راجع دليل الواجهة الخلفية حول كيفية تنفيذ الواجهات الخلفية المختلفة.
الوكيل هو الفئة الأساسية لمختلف الوكلاء المذكورين أدناه. فهو يوفر نموذجًا لإنشاء وكلاء يمكنهم التحدث إلى الواجهة الخلفية/الخادم البعيد وتسجيل تصرفاتهم وملاحظاتهم بشكل اختياري.
يمكن لوكيل اللغة الاتصال بواجهات خلفية أو محولات مختلفة من اختيارك. يتضمن طرقًا لتسجيل المحادثات وإدارة السياق والبحث عن الرسائل ونسيان الرسائل وتخزين السياق والتصرف بناءً على تعليمات وصورة.
يدعم أصلاً خدمات واجهة برمجة التطبيقات: OpenAI، أو Anthropic، أو vLLM، أو Ollama، أو HTTPX، أو أي نقاط نهاية متدرجة. المزيد قادم!
لاستخدام 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 أيضًا. على سبيل المثال، لنفترض أنك تقوم بتشغيل خادم vLLM Mistral-7B على 1.2.3.4:1234. كل ما عليك فعله هو:
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" )
مثال باستخدام أولاما:
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 وكيل اللغة، لكن بدلاً من إرجاع سلسلة، فإنه يُرجع دائمًا Motion
. يتم تشغيل Motor Agent عمومًا بواسطة نماذج المحولات الآلية، مثل OpenVLA، وRT1، وOcto، وما إلى ذلك. ويمكن تشغيل بعض النماذج الصغيرة، مثل RT1، على الأجهزة المتطورة. ومع ذلك، قد يكون من الصعب تشغيل بعضها، مثل OpenVLA، بدون تكميم. راجع وكيل OpenVLA ومثال لخادم OpenVLA
تتفاعل هذه العوامل مع البيئة لجمع بيانات الاستشعار. يقومون دائمًا بإرجاع SensorReading
، والتي يمكن أن تكون أشكالًا مختلفة من المدخلات الحسية المعالجة مثل الصور أو بيانات العمق أو الإشارات الصوتية.
حاليا، لدينا:
العوامل التي تعالج معلومات مستشعر الروبوت.
يقوم Auto Agent بتحديد الوكيل الصحيح وتهيئته ديناميكيًا بناءً على المهمة والنموذج.
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 )))
وبدلاً من ذلك، يمكنك استخدام طريقة get_agent
في auto_agent أيضًا.
language_agent = get_agent ( task = "language" , model_src = "openai" )
تحدد وحدة Motion_controls الحركات المختلفة للتحكم في الروبوت كنماذج Pydantic. كما يتم تصنيفها أيضًا ضمن فئات فرعية من Sample
، وبالتالي تمتلك كل إمكانات Sample
كما هو مذكور أعلاه. تغطي عناصر التحكم هذه مجموعة من الإجراءات، بدءًا من حركات المفاصل البسيطة وحتى الأوضاع المعقدة والتحكم الكامل في الروبوت.
يمكنك دمج أجهزة الروبوت المخصصة الخاصة بك عن طريق تصنيف الروبوت بسهولة تامة. ما عليك سوى تنفيذ وظيفة do()
لتنفيذ الإجراءات (وبعض الطرق الإضافية إذا كنت تريد تسجيل مجموعة البيانات على الروبوت). في الأمثلة التي لدينا، نستخدم روبوتًا وهميًا. لدينا أيضًا روبوت XArm كمثال.
تسجيل مجموعة البيانات على الروبوت أمر سهل للغاية! كل ما عليك فعله هو تنفيذ الطرق get_observation()
و get_state()
و prepare_action()
للروبوت الخاص بك. بعد ذلك، يمكنك تسجيل مجموعة بيانات على الروبوت الخاص بك في أي وقت تريده. راجع الأمثلة/5_teach_robot_record_dataset.py وهذا التعاون: لمزيد من التفاصيل.
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 )
مسجل مجموعة البيانات هو مسجل ذو مستوى أدنى لتسجيل محادثتك وإجراءات الروبوت إلى مجموعة بيانات أثناء تفاعلك مع الروبوت أو تعليمه. يمكنك تحديد أي مساحة مراقبة ومساحة عمل للمسجل. راجع صالة الألعاب الرياضية لمزيد من التفاصيل حول المساحات.
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 لمعالجة وإدارة البيانات المخزنة في ملفات HDF5 التي تم إنشاؤها بواسطة Recorder
. فهو يوفر مجموعة متنوعة من الوظائف، بما في ذلك قراءة العينات وإنشاء الإحصائيات واستخراج العناصر الفريدة وتحويل مجموعات البيانات لاستخدامها مع HuggingFace. يدعم Replayer أيضًا حفظ صور محددة أثناء المعالجة ويوفر واجهة سطر أوامر لعمليات مختلفة.
مثال للتكرار عبر مجموعة بيانات من Recorder with 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
نحن نرحب بالقضايا والأسئلة والعلاقات العامة. راجع دليل المساهمة لمزيد من المعلومات.