เอกสาร : เอกสาร
ตัวอย่างตัวแทนหุ่นยนต์อย่างง่าย:
ตัวอย่างการจำลองด้วย SimplerEnv:
- ตัวแทนมอเตอร์ที่ใช้ OpenVLA:
⏺️ บันทึกชุดข้อมูลบนหุ่นยนต์
- การสนับสนุน การสนทนา และวิธีการ :
อัปเดต:
28 สิงหาคม 2024 embodied-agents v1.2
mbodied
สำหรับการลองใช้30 มิถุนายน 2567 embodied-agents v1.0 :
mbodied
.ตัวแทนที่รวบรวม เป็นชุดเครื่องมือสำหรับการรวมโมเดลหลายรูปแบบขนาดใหญ่เข้ากับสแต็กหุ่นยนต์ที่มีอยู่ด้วยโค้ดเพียงไม่กี่บรรทัด โดยให้ความสม่ำเสมอ ความน่าเชื่อถือ ความสามารถในการขยายขนาด และสามารถกำหนดค่าให้กับพื้นที่การสังเกตและการดำเนินการใดๆ ได้
คลาสตัวอย่างเป็นโมเดลพื้นฐานสำหรับซีเรียลไลซ์ การบันทึก และการจัดการข้อมูลที่กำหนดเอง ออกแบบมาให้สามารถขยาย ยืดหยุ่น และพิมพ์ได้อย่างมั่นคง ด้วยการรวมวัตถุการสังเกตหรือการกระทำของคุณไว้ในคลาสตัวอย่าง คุณจะสามารถแปลงเป็นและจากสิ่งต่อไปนี้ได้อย่างง่ายดาย:
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับความเป็นไปได้ทั้งหมดกับตัวแทนที่รวบรวมไว้ โปรดดูเอกสารประกอบ
pack
รายการ Sample
หรือ Dicts ลงใน 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))
ดูตัวอย่าง.pyสำหรับรายละเอียดเพิ่มเติม
คลาสข้อความแสดงถึงพื้นที่ตัวอย่างที่สมบูรณ์เดียว อาจเป็นข้อความ รูปภาพ รายการข้อความ/รูปภาพ ตัวอย่าง หรือวิธีการอื่นๆ คลาส 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" )])
คลาส Backend เป็นคลาสพื้นฐานที่เป็นนามธรรมสำหรับการใช้งาน Backend โดยให้โครงสร้างพื้นฐานและวิธีการที่จำเป็นสำหรับการโต้ตอบกับบริการแบ็กเอนด์ต่างๆ เช่น การเรียก API เพื่อสร้างการดำเนินการตามข้อความที่กำหนด ดูไดเร็กทอรีแบ็กเอนด์เกี่ยวกับวิธีการใช้งานแบ็กเอนด์ต่างๆ
เอเจนต์เป็นคลาสพื้นฐานสำหรับเอเจนต์ต่างๆ ที่แสดงด้านล่าง โดยมีเทมเพลตสำหรับสร้างตัวแทนที่สามารถพูดคุยกับแบ็กเอนด์/เซิร์ฟเวอร์ระยะไกล และเลือกบันทึกการดำเนินการและการสังเกตได้
Language 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 )
Language Agent สามารถเชื่อมต่อกับ 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" )
ตัวอย่างการใช้ 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 สามารถทำงานบนอุปกรณ์ Edge ได้ อย่างไรก็ตาม บางอย่าง เช่น OpenVLA อาจเป็นเรื่องยากที่จะรันโดยไม่ต้องระบุปริมาณ ดู OpenVLA Agent และตัวอย่างเซิร์ฟเวอร์ 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 )))
หรือคุณสามารถใช้เมธอด get_agent
ใน auto_agent ได้เช่นกัน
language_agent = get_agent ( task = "language" , model_src = "openai" )
โมดูล motion_controls กำหนดการเคลื่อนไหวต่างๆ เพื่อควบคุมหุ่นยนต์เป็นโมเดล Pydantic พวกเขายังถูกจัดประเภทย่อยจาก Sample
ดังนั้นจึงมีความสามารถทั้งหมดของ Sample
ตามที่กล่าวไว้ข้างต้น การควบคุมเหล่านี้ครอบคลุมการกระทำต่างๆ ตั้งแต่การเคลื่อนไหวข้อต่อธรรมดาไปจนถึงท่าทางที่ซับซ้อนและการควบคุมหุ่นยนต์เต็มรูปแบบ
คุณสามารถรวมฮาร์ดแวร์หุ่นยนต์ที่คุณกำหนดเองได้โดยการแบ่งคลาสย่อย Robot ได้อย่างง่ายดาย คุณจะต้องใช้ฟังก์ชัน do()
เพื่อดำเนินการเท่านั้น (และวิธีการเพิ่มเติมบางอย่างหากคุณต้องการบันทึกชุดข้อมูลบนหุ่นยนต์) ในตัวอย่างของเรา เราใช้หุ่นยนต์จำลอง เรายังมีหุ่นยนต์ XArm เป็นตัวอย่างด้วย
การบันทึกชุดข้อมูลบนหุ่นยนต์เป็นเรื่องง่ายมาก! สิ่งที่คุณต้องทำคือใช้เมธอด get_observation()
, get_state()
และ prepare_action()
สำหรับหุ่นยนต์ของคุณ หลังจากนั้น คุณสามารถบันทึกชุดข้อมูลบนหุ่นยนต์ของคุณได้ทุกเมื่อที่ต้องการ ดูตัวอย่าง/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 )
Dataset 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
saved_datasets
คลาส Replay ได้รับการออกแบบมาเพื่อประมวลผลและจัดการข้อมูลที่จัดเก็บไว้ในไฟล์ HDF5 ที่สร้างโดย Recorder
มีฟังก์ชันการทำงานที่หลากหลาย รวมถึงการอ่านตัวอย่าง การสร้างสถิติ การแยกรายการที่ไม่ซ้ำใคร และการแปลงชุดข้อมูลเพื่อใช้กับ HuggingFace โปรแกรมเล่นซ้ำยังรองรับการบันทึกภาพเฉพาะในระหว่างการประมวลผล และมีอินเทอร์เฟซบรรทัดคำสั่งสำหรับการดำเนินการต่างๆ
ตัวอย่างสำหรับการวนซ้ำชุดข้อมูลจาก 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
เรายินดีรับประเด็น คำถาม และการประชาสัมพันธ์ ดูคู่มือการสนับสนุนสำหรับข้อมูลเพิ่มเติม