Документы : документы
Пример простого робота-агента:
Пример моделирования с SimplerEnv:
? Агент Motor с использованием OpenVLA:
⏺️ Запись набора данных на роботе
? Поддержка, обсуждение и инструкции :
Обновления:
28 августа 2024 г., Embodied-Agents v1.2
mbodied
попробовать их.30 июня 2024 г., Embodied-Agents v1.0 :
mbodied
.Embodied Agents — это набор инструментов для интеграции больших мультимодальных моделей в существующие стеки роботов с помощью всего лишь нескольких строк кода. Он обеспечивает согласованность, надежность, масштабируемость и настраивается для любого пространства наблюдения и действий.
Класс Sample — это базовая модель для сериализации, записи и управления произвольными данными. Он спроектирован так, чтобы быть расширяемым, гибким и строго типизированным. Обернув объекты наблюдения или действия в класс Sample, вы сможете легко конвертировать их в следующие объекты и обратно:
Чтобы узнать больше обо всех возможностях встроенных агентов, ознакомьтесь с документацией.
pack
список Sample
или Dict в один Sample
или Dict
и соответственно unpack
?unflatten
любую структуру Python в класс Sample
, если предоставите ему действительную схему json? Для создания образца требуется просто обернуть словарь 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" )])
Класс Backend — это абстрактный базовый класс для реализаций Backend. Он предоставляет базовую структуру и методы, необходимые для взаимодействия с различными серверными службами, например вызовы API для генерации дополнений на основе заданных сообщений. См. каталог бэкэндов, чтобы узнать, как реализованы различные бэкэнды.
Агент — это базовый класс для различных агентов, перечисленных ниже. Он предоставляет шаблон для создания агентов, которые могут общаться с удаленным сервером/сервером и при необходимости записывать свои действия и наблюдения.
Языковой агент может подключаться к различным серверным модулям или преобразователям по вашему выбору. Он включает в себя методы записи разговоров, управления контекстом, поиска сообщений, забывания сообщений, хранения контекста и действий на основе инструкций и изображений.
Встроенная поддержка сервисов 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. Например, предположим, что вы используете 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 похож на 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 )))
Альтернативно вы также можете использовать метод 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()
для вашего робота. После этого вы можете записать набор данных на своего робота в любое время. См. example/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 )
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
.
Класс Replayer предназначен для обработки и управления данными, хранящимися в файлах HDF5, созданных Recorder
. Он предоставляет различные функции, включая чтение образцов, генерацию статистики, извлечение уникальных элементов и преобразование наборов данных для использования с 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. Дополнительную информацию см. в руководстве по участию.