Teacher Training Link! Part 3: Jun 16, 2026 12:00 PM EST
// dossier — eyes only — blu space agency signal · live
N 42°21'·W 71°05'
FILE / AB-2026 / V1.1

Middle School Summer 2026 · Game Manual v1.1

BLU RED

ASTEROID-BEE

NOTE : game manual subject to change

Section 01

Mission Briefing

Memo · Internal · Combined

From
A. Chavalithumrong
Agency
BLU Space
Priority
!!! Urgent
Re
Astrobee Belt Op

Members of the BLU family,

NASA has opened the Asteroid Belt to commercial exploration. Any agency that successfully documents new asteroids will win future mission contracts, a huge opportunity for BLU. To be the first company out there, we've outfitted our BluBee™ with the newest propulsion and control systems from R&D, products of trillion-dollar research. It is solar-powered, so it can recharge whenever it's under the sun.

But the game has changed. The RED space agency has announced their own mission with their own RedBee™. We have competition, and a hunch they too will be pulling out their newest technology for this run.

There is a silver lining. If our R&D department can get its hands on information about RED's new transportation technology, especially pictures, it would be even more valuable than the asteroid data itself. The BluBee™ is already equipped with a camera, although it isn't powerful enough to take pictures without light from the sun.

Your mission, then, is to develop an autonomous piloting system that does all of the following:

  • [01]Collect as much asteroid data as possible, as quickly as possible.
  • [02]Photograph the RedBee™ to capture intel on their new technology.
  • [03]Prevent the same asteroids from being documented by both agencies.
  • [04]Avoid being photographed, RED will try to steal our strategy.
  • [05]Manage energy wisely. Recharge from the sun when necessary.
——— A. Chavalithumrong
BLU Space Agency · Director

Section 02

Background

Read first · Context

Before the rules, the why. AsteroidBee is a story wrapped around real spaceflight engineering. Every mechanic in this manual — sunlight and shadow, energy budgets, free-flying robots, cameras for inspection — mirrors a real challenge that engineers solve to keep spacecraft alive and useful. This section gives you the context that makes the game make sense.

2.1 / Humans In Space & The ISS

People have lived and worked in space continuously for over two decades. The International Space Station (ISS) is the largest crewed structure ever built in orbit, circling Earth at roughly 400 km and completing a full lap about every 90 minutes. That means a crew sees a sunrise and a sunset roughly 16 times every day. Astronauts run thousands of science experiments there — on materials, plants, the human body, and robotics — that are difficult or impossible to perform on the ground.

Zero Robotics connects students to that work. The autonomous control software you write in this competition descends from real research code that has run on hardware aboard the ISS. You are not playing at engineering — you are doing a simplified version of it.

2.2 / Sunlight, Shadow & Power

Because a spacecraft laps the planet so quickly, it spends roughly half of every orbit in direct sunlight and the other half in Earth's shadow, a period called eclipse. In sunlight, solar panels generate power and recharge the batteries. In eclipse, there is no sun, so the spacecraft must run entirely on stored battery charge until it comes back around into the light.

This single fact drives a huge amount of real spacecraft design, and it is exactly the Light Zone / Dark Zone mechanic in AsteroidBee. Your satellite recharges in the Light Zone and runs down its reserves in the Dark Zone. Managing that cycle — gathering energy while you can, spending it wisely while you can't — is the same problem a real mission planner faces.

// Why Zero Robotics?

Zero Robotics turns a hard, real engineering problem into something you can program, test, and win.

  • You explore robotics, space science, and teamwork on a shared challenge.
  • You develop solutions iteratively — write, simulate, observe, improve — the way engineers actually work.
  • The simulation models real spacecraft dynamics, so the habits you build transfer to the real thing.

2.3 / The Astrobee Robot

Astrobee is a family of free-flying robots that operate inside the ISS. There are three of them — Bumble, Honey, and Queen — and each is a cube roughly 32 cm on a side. They took over from the earlier SPHERES robots, which served as the ISS robotic test platform for more than a decade. Astrobee helps astronauts by taking inventory, recording experiments with its cameras, and carrying small payloads, freeing the crew for work that needs a human.

Astrobee maneuvers using electric, fan-driven propulsion rather than burning fuel, and it carries cameras it uses to navigate and to inspect its surroundings. In AsteroidBee, your satellite is an Astrobee: it moves by firing thrusters (drawn from a limited fuel budget), it watches the field with sensors, and it carries a camera that — just like a real inspection robot — only produces a usable image when its target is properly lit.

Fleet

Bumble · Honey · Queen

Size

~32 cm cube

Replaced

SPHERES

2.4 / Cameras As Instruments

Imaging is one of the most valuable things a spacecraft can do: weather satellites photograph storms, survey craft map asteroids, and inspection robots photograph other vehicles to check for damage. A camera is only as good as its light, though — point it at something in shadow and you get nothing. That constraint is the heart of AsteroidBee's scoring: a photograph of your opponent is only worth points when they are in the Light Zone, your camera is on, and you are facing them. The story calls it espionage; the engineering is real orbital imaging.

// Note · Story vs. Simulation

The mission briefing is the fun framing — BLU vs. RED, asteroids, stolen intel. The rules in the rest of this manual are the real specification. Wherever the story and the numbers seem to disagree, the numbers win.

Section 03

Game Overview

180s · 2 players · simulation

Matches of AsteroidBee are played between two Astrobee satellites controlled by programs written by two separate teams. Each team competes to have the most points when the round ends. Points are earned by photographing the opposing satellite and uploading those pictures, or by collecting score-generating items (the asteroids) scattered around the playing field.

Dynamic Light and Dark zones have various impacts on the satellites, representing how a real satellite in orbit is half-illuminated by the sun and half in Earth's shadow (eclipse). Pictures cost energy to take and can only be taken when the target is in the Light Zone. Zones shift mid-round.

Each satellite has a finite amount of energy. Energy regenerates in the Light Zone or by picking up Energy Packs. Mirror items, when deployed, prevent the user from taking pictures, but reflect any pictures the opponent takes back at them, making them worthless.

Round Length

180s

Fuel Allocation

60s

Max Energy

5.0

Items in Field

9

3.1 / Game Layout

The 2026 competition is conducted in simulation. Play happens in the Interaction Zone; satellites that leave it are out of bounds. Position is measured from the center of the satellite (radius 0.11 m). Satellites at the bounds are stopped from moving further out.

Fig.01 / Gameplay Area · item placement Diagram not to scale
Y=0 X=0 Y X GAMEPLAY AREA (+0.64, -0.80) (+0.64, +0.80) (-0.64, -0.80) (-0.64, +0.80) OUT OF BOUNDS SWAP @ T=60s, 150s LIGHT ZONE (-Y) DARK ZONE (+Y) 0 1 2 3 4 5 6 7 8 BLU (+0.4, -0.6) RED (-0.4, -0.6) Energy Pack ×4 Score+ ×3 Mirror ×2 Astrobee

X Bounds

[ −0.64, +0.64 ]

Y Bounds

[ −0.80, +0.80 ]

Z Bounds

[ −0.64, +0.64 ]

Section 04

The Satellite

Astrobee · 12-thruster · 2D

Each team writes software to command an Astrobee satellite. An Astrobee moves using twelve thrusters, though for the middle school game, Z-axis motion is disabled. Like any real spacecraft, the Astrobee has a power source (LiPo batteries). Resources are limited and must be used wisely.

4.1 / Time

180 seconds

Each round lasts 180 seconds. After 180s, scores are final and compared.

4.2 / Fuel

60 seconds of thrust

Total sum of fuel used in seconds of individual thruster firing. When exhausted, the satellite will only fire thrusters to avoid out-of-bounds or collisions.

4.3 / Code Size

≤ 100 percent of alloc

Check via IDE: Simulation → Code Size Estimate. Submissions over 100% will be rejected.

4.4 / Player ID

0 = self, 1 = opponent

Always identify as playerID = 0, regardless of being assigned BLU or RED. Reassignment is automatic.

4.5 / Initial Deployment

Write code assuming your player is the Blue Astrobee, this adjustment is handled automatically if you're assigned Red. The satellite radius is 0.11 m; position relative to game features is determined by the center.

SatelliteXYZ
BLU+0.4−0.60.0
RED−0.4−0.60.0

4.6 / Noise

Although both competitors run the same challenge with identical satellites, the two may be affected by random perturbations differently, producing small or even large variations in score. This is intended. It reflects uncertainties in real satellite dynamics and sensing. The best solutions will be robust to these variations and a wide range of object parameters.

Section 05

Gameplay Mechanics

Energy · Zones · Items · Pictures

5.1 / Energy

Energy is the most prohibitive resource. Both players start with 5.0 energy (also the maximum). In the Light Zone, energy regenerates at +0.5/sec. Maneuvering costs 0.3 energy per 1 second of fuel used.

Taking a picture · takePic() −1.0
Checking picture value · getPicPoints() −0.1
Light Zone solar recharge +0.5/s
Energy Pack pickup Full refill

5.2 / Light & Dark Zones

The positive Y sector starts in the Dark Zone; the negative Y starts in the Light Zone. Zones swap at T=60s and T=150s. Out-of-bounds light matches the adjacent in-bounds area, satellites stranded in the dark with no energy stay stuck until the swap. Call getLightSwitchTime() to know when.

Light Zone

Exposed · Powered

  • You can be photographed
  • Energy regenerates at +0.5/s
  • Required for opponent pictures to score

Dark Zone

Concealed · Drain

  • You cannot be photographed
  • No solar recharge
  • Strategic hideout to avoid detection

5.3 / Items

Nine items are scattered across the field (IDs 0–8). Each can be used only once and does not regenerate. To collect: the center of your satellite must be within 0.05 m of the item and moving slower than 0.01 m/s.

Fig.02 / Pickup Tolerance Item Collection
ASTROBEE ITEM ?pos < 0.05 m |vel| < 0.01 m/s

Position within 0.05m AND velocity under 0.01m/s. Both conditions required.

// Pickup Conditions

Both must be true

01

Proximity

Satellite center within 0.05 m of item center.

02

Near-stop

Satellite moving slower than 0.01 m/s.

Tip: drift, don't slam. Plan your approach so you arrive nearly stationary.

Energy Pack

IDs 0, 1, 2, 3 · 4 in field

Used instantly on pickup. Refills satellite to maximum energy (5.0).

+1.5

Score+

IDs 4, 5, 6 · 3 in field

Used instantly on pickup. Adds 1.5 points to your score.

Mirror

IDs 7, 8 · 2 in field

Held until deployed. Active for 24 seconds: you cannot photograph, but opponent pictures of you are worth 0.

IDTypePosition (X, Y)
0Energy Pack(+0.25, −0.40)
1Energy Pack(−0.25, −0.40)
2Energy Pack(+0.25, +0.40)
3Energy Pack(−0.25, +0.40)
4Score+( 0.00, +0.60)
5Score+(+0.40, +0.60)
6Score+(−0.40, +0.60)
7Mirror(+0.60, −0.70)
8Mirror(−0.60, −0.70)

5.4 / Picture Taking

The way to score the most points is by photographing the other satellite. All seven conditions below must be met for a successful picture:

01 You face the opponent (within 0.5 rad). Check isFacingOther().
02 Opponent is in the Light Zone. Check checkInLight(1).
03 You have at least 1.0 energy.
04 Your camera is on. Check isCameraOn().
05 No active mirror on your satellite.
06 You are at least 0.5 m from the opponent.
07 You call takePic(). Note: this costs 1 energy and disables the camera for 3 seconds whether or not the picture succeeds.

// Photo Point Formula

points = 2.1 + 0.1 / (distance − 0.5 + 0.1)

Closer = more points. If the opponent has an active mirror, the picture is worth zero. Every attempt, successful or not, adds 0.01 points as a tiebreaker. Use getPicPoints() to preview a shot before spending the 1.0 energy. Note: getPicPoints() returns the base value 2.0 + 0.1 / (d − 0.4); a shot that actually lands scores about 0.1 more — the formula above (2.1 + …) already includes that +0.1 success bonus.

// Important Notes

  • takePic() spends 1.0 energy and disables your camera for 3 seconds whether or not the picture succeeds — check your conditions before you shoot.
  • Use getPicPoints() to preview what a shot is worth (costs 0.1 energy) before committing the full 1.0.
  • If the opponent has an active mirror, your picture of them is worth 0. If you have an active mirror, you cannot take pictures at all.
  • A target in the Dark Zone cannot be photographed for points — they must be lit.
  • Every attempt adds +0.01 as a tiebreaker, but spamming the camera burns energy you'll wish you had.

5.5 / Scoring Summary

MethodPoint Value
Attempting a picture (valid or not)+0.01
Taking a valid picture2.1 + 0.1 / (d − 0.4)
Score+ item collected+1.5 per item

Tiebreaker: whichever satellite is closer to the origin (0, 0) at game end wins.

Section 06

Tournament Schedule

Session 1 / 2026

Jun

22

Program Begins

Day 1 of summer

Jul

6

Practice Round

Due 5pm EST

Jul

10

Round 1 Code

Due 5pm EST

Jul

13

Field Day

Alliance announce

Jul

31

Final Submission

Due 5pm EST

Aug

7

Live Finals

Aboard the ISS

6.1 / Independent Competition

The program starts with two phases of regional simulation. Practice Code is submitted at the end of Week 3, results are not official and exist to guide teams in improving code during Week 4. Submission deadline is 5pm local time on the Thursday/Friday of Week 3.

To qualify for finals, teams must submit both Practice Code and Round 1 Code.

To enter a program, use the Submit tool under Simulate on the IDE page. You may change your submission as many times as you like before the deadline; only the final submission counts. Late submissions are not accepted unless ZR staff determines emergency circumstances made timely submission impossible.

6.2 / Final Competition

After Round 1 code is submitted, teams are assigned an ALLIANCE. Alliances must work together to test, compare, and combine their code to submit to the finals. The final code is submitted by the alliance. Finals take place aboard the International Space Station with live video transmission, all teams are invited to watch.

// Finals Time Priority

  1. Running all submissions at least once
  2. Completing the tournament bracket
  3. Running all submissions during live video

Note: real spacecraft use battery packs and CO? tanks that can exhaust mid-match. The competition will have "Loss of Signal" (LOS) periods when the live feed is unavailable. ZR will attempt to make sure every team sees a live match of their player, but completing the competition takes priority. Results from simulated matches may be used if necessary.

Section 07

Code Submission

Test · Debug · Submit

All coding and testing happens in the Zero Robotics web IDE. You write your autonomous pilot, simulate it against sample opponents until it behaves the way you want, and then submit it to the tournament. This section covers how to test effectively and how to get your code into the competition.

// Important · How Your Code Runs

Your program is not a recipe that plays out top to bottom over the match. The init portion runs once at the start. The main control function then runs once per control cycle — about once per second — for the entire 180 seconds.

Because the same code runs every cycle, a multi-step plan ("go here, then turn, then photograph") needs a step variable and if conditions that decide what to do this cycle. This is the single most important idea for writing a working strategy.

7.1 / Local Simulation & Debugging

Before submitting, run your code in the IDE's simulator. The simulation models the Astrobee's motion and all the constraints in this manual within a virtual environment, so you can watch your strategy play out and find problems early.

Simulate

Run your player against a sample opponent and watch the match in the visualizer. Re-run as often as you like.

DEBUG(( ... ))

Print values to the console to see what your code is "thinking" each cycle. Use double parentheses; do not prefix with api.

getEnergy / getScore / getFuelRemaining

Watch your resources during a run to find where energy or fuel is being wasted.

Code Size Estimate

Under Simulation. Your program must stay at or under 100% of the size allocation or it will be rejected.

// Debugging Tip

Change one thing at a time and re-simulate. If a run surprises you, add a DEBUG(( )) line that prints the value you are unsure about — your position, your energy, the result of a check — and watch it in the console. Most "my robot won't move" bugs are an if condition that is never true, or running out of energy or fuel.

7.2 / Submitting Your Code

When your code is ready, submit it from the IDE using the Submit tool under Simulate. You may change your submission as many times as you like before a deadline — only your final submission counts. Late submissions are not accepted unless ZR staff determine that emergency circumstances made timely submission impossible.

To qualify for finals, your team must submit both the Practice Round code and the Round 1 code. See Section 06 — Tournament Schedule for dates.

// Code Upload Guidelines

Before you hit submit

  1. Your code compiles and runs in simulation without errors.
  2. Your player behaves as you intend against a sample opponent.
  3. You understand that scores vary from run to run due to random perturbation: a robust strategy beats a lucky one.
  4. You submit through the IDE before the 5pm EST deadline for that round.

Section 08

Season Rules & Ethics

Fair Play · Conduct

8.1 / Tournament Rules

  • MIT/ILC can use, reproduce, and publish any submitted code.
  • When game intent and behavior contradict, MIT clarifies and updates the manual or code.
  • Teams must report all bugs as soon as they are found. A bug is a contradiction between intent and behavior. Intent overrides bug behavior up to code freeze.
  • Code/manual freeze is 3 days before the submission deadline. Within the freeze, code overrides intent and the manual. No bug fixes happen during freeze.
  • Game challenge additions and TBA values may be announced based on lessons from earlier tournament phases.

8.2 / Ethics Code

  • ZR will work diligently upon report of any unethical situation, case by case.
  • Report bugs as soon as they're found. Intentional abuse of an unreported bug may be considered unethical.
  • Do not manipulate scoring methods to change rankings.
  • Do not attempt to access restricted ZR information.
  • No vulgar/offensive language, harassment, or intentional annoyances on the ZR website.
  • Code submitted to competition must be written only by students.
  • Don't modify api or game objects. Simulation requests must be manual via the website, no API calls for simulation.

Section 09

Resources & Guidelines

Deadlines · Support · Policy

Everything below lives on the Zero Robotics website under the 2026 Middle School Program tournament tabs. Dates are subject to change — check the website and your Weekly Emails regularly for updates and announcements.

9.1 / Key Deliverables

These are the major milestones for the season. All code deadlines are 5:00pm EST. To advance to finals, a team must submit both Practice Round and Round 1 code.

DateDeliverable
Jun 22Program begins — first day of the summer session.
Jul 6Practice Round code due. Results are unofficial; we just want to make sure you can submit code! 
Jul 10Round 1 code due. These results set alliance assignments.
Jul 13Field Day & Alliance Announcements.
Jul 31Final code submission due (submitted by the alliance).
Aug 7Live Final Event,  all teams invited to watch.

9.2 / Surveys & Evaluations

All students and educators are required to complete pre- and post-program surveys. Your feedback is critical to assessing and improving the program. Have students complete the pre-survey by the end of Day 1, and the post-survey on the last day of the program (or on ZR Finals day). All survey links live on the Surveys & Evaluations tab.

9.3 / Using ChatGPT & Generative AI

Generative AI tools like ChatGPT can help you understand concepts and get unstuck. They also carry a risk: leaning on them too hard can keep you from truly understanding the code you submit, which leads to mistakes you can't diagnose.

// Policy · AI Assistance

Teams may use ChatGPT and other AI tools during the game, but we ask that you include a note in your code write-up describing how you used them. Transparency keeps the competition fair. Our goal is for you to genuinely understand the code you write — if AI helped you get there, just say how.

9.4 / Getting Help: Forums & Office Hours

The Forums on the Zero Robotics website are the primary place to ask questions, share ideas, report bugs, and get answers from the ZR team and other teams. The ZR team also holds office hours — great for getting feedback on your code or clarification on the rules. Schedules and any changes are posted on the website and in the Weekly Emails.

// Tip · Ask Early

If you hit something confusing, post it on the Forums sooner rather than later — chances are another team is wondering the same thing, and an early answer can save your whole week. Remember to report any suspected bug as soon as you find it (see Section 08).

9.5 / Tutorials & API Reference

New to the IDE or to programming? Start with the step-by-step materials on the Training Resources and Educator Materials tabs, which walk through creating a project, writing your first moves, and submitting code. A complete list of the functions you can call — with what each one does — is in Section 10 — User API Reference of this manual, and a printable API guide is linked at the top of this page.

Learn

Training Resources · Educator Materials

Reference

Section 10 · Printable API Guide

Ask

Forums · Office Hours

Section 10

User API Reference

Quick reference

Astrobee control functions (except DEBUG) are accessed as members of the api object, e.g. api.setPositionTarget(mypos). Game-specific functions are accessed via the game object, e.g. game.takePic().

// Astrobee Controls (api.*)
setPositionTarget(float posTarget[3])
Moves the satellite to a chosen point. Pass a 3-element array of x, y, z coordinates.
setAttitudeTarget(float attTarget[3])
Rotates the satellite to face along a unit vector.
getMyZRState(float myState[12])
Retrieves your state. [0–2] position, [3–5] velocity, [6–8] attitude vector, [9–11] angular velocity.
getOtherZRState(float otherState[12])
Same as getMyZRState, but for the opponent.
getTime() → unsigned int
Returns the seconds elapsed since the beginning of the game.
DEBUG(( "Some text" ))
Prints text to console. Use double parentheses. Do not prefix with api.
// AsteroidBee, Pictures (game.*)
takePic() → float
Attempts a photograph. Disables camera 3s and costs 1.0 energy whether or not successful. Returns picture point value or 0 on failure.
getAttToOther(float att[3])
Returns the attitude vector needed to point your camera at the opponent.
isFacingOther() → bool
True if your camera is facing the opponent within tolerance.
getPicPoints() → float
Preview points a picture would be worth. Costs 0.1 energy when camera is on. Does not take the picture.
isCameraOn() → bool
True if camera is on and usable.
// AsteroidBee, Items (game.*)
checkHaveItem(itemID)
checkHaveItemOther(itemID)
checkHaveItemNoOne(itemID)
Returns true if you / opponent / nobody has the item (IDs 0–8).
useMirror() → bool
Deploys a held mirror. Returns true if mirror was held and used.
getNumMirrorsHeld() → int
Returns the number of mirrors currently held.
getMirrorTimeRemaining() → int
Seconds remaining on your active mirror, or 0 if no mirror is active.
getItemLoc(float pos[3], int itemID)
Copies the x, y, z of an item into your array.
getItemType(int itemID) → int
Returns 0 = Score+, 1 = Energy Pack, 2 = Mirror.
// AsteroidBee, Energy, Light & Score (game.*)
getEnergy() → float
getOtherEnergy() → float
Current energy of self / opponent.
checkInLight() / checkInLightOther()
checkInDark() / checkInDarkOther()
True if self / opponent is in the named zone.
getLightSwitchTime() → int
Seconds until the next Light/Dark zone swap.
getScore() / getOtherScore() → float
Current score of self / opponent.
getFuelRemaining() → float
Seconds of fuel remaining.

// Tactical Hint

getEnergy() returns the energy remaining. As your energy runs low, your thrusters fire at reduced power — the game scales your commanded thrust by how much energy you have, so you slow down before you fully stall (taking a picture, though, still needs at least 1.0 energy). Check often, you'll have time to move toward the Light Zone to recharge, stop the Astrobee so it won't drift out of bounds, or rotate to point toward your opponent for a picture.

Section 11

Change Log

Revision history

v1.1

Current

Jun 22, 2026 · Program Launch Update

  • Added Section 02 — Background: human spaceflight and the ISS, sunlight/eclipse and power, the Astrobee robot, and cameras as instruments.
  • Added Section 07 — Code Submission: local simulation, debugging, how your code runs, and code upload guidelines.
  • Added Section 09 — Resources & Guidelines: key deliverables, surveys, generative-AI policy, Forums & office hours, and tutorials.
  • Added clarifying notes throughout (picture-taking gotchas, story vs. simulation, asking for help early).
  • Corrected the maneuvering energy cost (now 0.3 per fuel-second) and the low-energy thruster note to match the simulation, and clarified the getPicPoints() preview value.
  • Renumbered sections and refreshed the section navigation to fit the new content.
  • Minor copy fixes.

v1.0

Prior

Teacher Training Release

  • Initial manual release for the Middle School Summer 2026 season.

Manual subject to change. New entries are added to the top of this log as revisions are published.

Zero Robotics, MIT Space Enabled Lab Manual v1.1 · Asteroid-Bee · 2026