First Agent in MineDojo¶
In this section, we will walk through the steps of creating your first agent in MineDojo benchmarking suite.
Step 1: Import MineDojo¶
After following the installation instructions to install MineDojo, let’s import it
import minedojo
If everything is working correctly, you should see the following info popup:
[INFO:minedojo.tasks] Loaded 1572 Programmatic tasks, 1558 Creative tasks, and 1 special task: "Playthrough". Totally 3131 tasks loaded.
It means MineDojo has successfully loaded 3131 tasks, with 1572 Programmatic tasks, 1558 Creative tasks, and one special task of “Playthrough”. See our paper for more details about task definition.
Step 2: Create an Environment Instance¶
MineDojo provides a unified API of minedojo.make()
to create an environment instance. It can create four types of simulation: Programmatic tasks, Creative tasks, meta tasks, and an open-ended world. In this tutorial, we only show the first two types. See Task Customization and Simulation Customization on how to create other two.
Create a Programmatic Task¶
minedojo.make()
requires the following arguments to create a Programmatic task: task_id
and image_size
. task_id
is a string specifying the task ID. You can query all Programmatic Tasks’ IDs from minedojo.tasks.ALL_PROGRAMMATIC_TASK_IDS
. image_size
specifies the size of RGB images observed by agents. It can be either a single integer representing a square image size, or a tuple of two integers representing the width and height of the image.
The following code creates a Programmatic task with ID harvest_milk
and an image size of 160x256.
env = minedojo.make(task_id="harvest_milk", image_size=(160, 256))
You can access task-related attributes such as task_prompt
and task_guidance
:
>>> env.task_prompt
obtain milk from a cow
>>> env.task_guidance
1. Find a cow.
2. Right-click the cow with an empty bucket.
You can also access these attributes without creating an environment instance:
task_prompt, task_guidance = minedojo.tasks.ALL_PROGRAMMATIC_TASK_INSTRUCTIONS["harvest_milk"]
Environment instance returned by minedojo.make()
follows OpenAI Gym’s API, which means you can interact with it in the conventional way.
obs = env.reset()
next_obs, reward, done, info = env.step(action)
Create a Creative Task¶
Similar to Programmatic tasks, Creative tasks are created by invoking minedojo.make()
with the same arguments. The only difference is that task_id
no longer has any semantic meaning such as harvest_milk
. Instead, it has the format of creative:{task_index}
. You can query all Creative tasks’ IDs from minedojo.tasks.ALL_CREATIVE_TASK_IDS
.
The following code creates the 256-th task from our Creative suite. The task ID is creative:255
.
env = minedojo.make(task_id="creative:255", image_size=(160, 256))
Let’s see what the task prompt and guidance are:
>>> env.task_prompt
Build a replica of the Great Pyramid of Giza
>>> env.task_guidance
1. Find a desert biome.
2. Find a spot that is 64 blocks wide and 64 blocks long.
3. Make a foundation that is 4 blocks high.
4. Make the first layer of the pyramid using blocks that are 4 blocks wide and 4 blocks long.
5. Make the second layer of the pyramid using blocks that are 3 blocks wide and 3 blocks long.
6. Make the third layer of the pyramid using blocks that are 2 blocks wide and 2 blocks long.
7. Make the fourth layer of the pyramid using blocks that are 1 block wide and 1 block long.
8. Make the capstone of the pyramid using a block that is 1 block wide and 1 block long.
You can also access these attributes without creating an environment instance:
task_prompt, task_guidance = minedojo.tasks.ALL_CREATIVE_TASK_INSTRUCTIONS["creative:255"]
Warning
Due to the modding framework that MineDojo uses, it may pull new assets on-the-fly. This behavior may cause network issues on clusters with mutliple parallel environment instances but poor network connection. Please refer to this discussion for more information.
Basic Observation and Action Spaces¶
MineDojo provides a comprehensive and unified observation space to train multitask open-ended agents. As a portion of the full observation space, you still can use basic observations to train a competitive agent. We now walk through basic observation and action spaces.
Basic Observation¶
You can use RGB, compass, GPS, voxel (surrounding blocks), and terrain id to train good agents. Each one is specified below.
>>> obs_space = env.observation_space
>>> obs_space["rgb"]
Box(low=0, high=255, shape=(3, H, W)) # you can configure H and W in argument `image_size`
>>> obs_space["location_stats"]["yaw"]
Box(low=-180.0, high=180.0, shape=(1,)) # yaw of the agent, part of compass
>>> obs_space["location_stats"]["pitch"]
Box(low=-180.0, high=180.0, shape=(1,)) # pitch of the agent, part of compass
>>> obs_space["location_stats"]["pos"]
Box(low=-640000.0, high=640000.0, shape=(3,)) # x y z location
>>> obs_space["voxels"]["block_name"]
Text(3, 3, 3) # names of 3x3x3 blocks surrounding the agent
>>> obs_space["location_stats"]["biome_id"]
Box(low=0, high=167, shape=()) # id of the current terrain
Basic Action¶
The basic action space mainly consists of movement and camera control with other primitive functional actions such as “attack” and “use”. Actions related to inventory manipulation are covered in Action Space.
>>> env.action_space
MultiDiscrete([ 3 3 4 25 25 8 244 36])
Just like how to use a game controller, the entire action space includes a series of discrete action spaces with different number of actions in each. We only need the first five dimensions to control movements and cameras.
action = env.action_space.no_op() # 8-len vector
# forward and backward
action[0] = 1 # move forward
action[0] = 2 # move backward
# move left and right
action[1] = 1 # move left
action[1] = 2 # move right
# jump
action[2] = 1
# control camera pitch, discretize into 15 degree interval
action[3] = 0 # change camera pitch by -180 degree
action[3] = 24 # change camera pitch by 180 degree
# control camera yaw, discretize into 15 degree interval
action[4] = 0 # change camera yaw by -180 degree
action[4] = 24 # change camera yaw by 180 degree
To invoke “attack” or “use”, you can set
action[5] = 1 # action "use"
action[5] = 3 # action "attack"
We recommend users to read through Observation Space and Action Space in Core API to better understand the observation and action space.
Congratulations! You have successfully built your first agent in MineDojo. Move to the next page to see how to use our Knowledge Base.