Robots that answer back.
A program on a screen can be wrong without anyone noticing. A robot that drives into a wall cannot. Plato Pod gives students real robots to program, a world of simulated sensors around them, and problems that need decisions and plans rather than a single right answer.
Problems worth solving
Each exercise is a problem with more than one good answer. The strategy behind it is a single function with its own tests, so a student can replace it without touching anything else.
Pursuit
Tag
One pod evades, one pursues, both planning a way round the obstacles.
Control
Follow a path
Draw a route in the browser and a pod drives it. Steering well is harder than it looks.
Cooperation
Cover the ground
The vacuum-cleaner problem: two pods divide the arena between them so no ground is missed and none is swept twice.
Search
Find the gas source
Follow a simulated gas sensor to a leak. A graded exercise, with reference solutions from a random walk up to a search that respects rules of engagement.
Teams
Capture the flag
Two teams, their zones and a flag laid out on the arena, for students to plan around.
Sensing
Make sense of sensors
Sonar, radar, lidar, gas and more, each with adjustable noise, so a student learns what a real sensor does and does not tell them.
No code
The plain-English track
Not every learner needs to program. On this track students describe a strategy in plain English — how to sweep a room, how to take a flag — and the pods carry it out. Getting it right means thinking logically and in the abstract, anticipating what could go wrong, and saying exactly what they mean. It suits students without an engineering background, and mid-career officers.
What student code looks like
Students drive pods from Python with a small library, with no robotics software to install. Here a pod reads its sonar and turns away from anything closer than 20 cm:
from platopod import Arena
arena = Arena("ws://arena.local:8080/api/control")
POD = 1
arena.subscribe_sensors(POD, ["sonar"])
while True:
sonar = arena.get_sensor(POD, "sonar")
if sonar:
ahead = sonar["ranges"][0] # beam 0 points straight ahead
if ahead < 0.20: # something within 20 cm
arena.cmd_vel(POD, 0.0, 1.2) # turn on the spot
else:
arena.cmd_vel(POD, 0.10, 0.0) # drive on at 10 cm/s
arena.sleep(0.1)
The same interface is plain JSON over a WebSocket, so any language that can open one can drive the arena.
From first loop to planning
The same arena carries a class from a first loop that reads a sensor, through feedback control and path planning, to robots that cooperate and decide under uncertainty. The robots do not change; the problems do.