In my continuing exploration of the Cozmo SDK, I’ve written my first game. “Hide and Seek” is not particularly complex or challenging. I’m still pretty new to both Python and the SDK tools and my wrapper code is still pretty basic.
“Hide and Seek” goes like this. You place a light cube near Cozmo out of his direct line of sight. He searches until he finds it, picks it up, moves it to a new location, and drops it. He then turns around, with his back to the cube and says “Let’s play again”.
Although this is a first take, I think my wrapper approach remains pretty simple and readable. I’m trying to emphasize learning programming concepts, using Python, which means that Cozmo access needs to be encapsulated and procedural:
# run, cozmo, run def actions(cozmoLink): '''Specify actions for cozmo to run.''' # Fetch robot coz = Cozmo.robot(cozmoLink) coz.say("Hide and seek!") # Look for a cube if not coz.findACube(): coz.say("No cube") return # Found one! coz.say("I found a cube") coz.takeCube() # Pick it up coz.say("I have the cube") coz.drive(time = 3, direction = Direction.forward) # Drive coz.dropCube() # Place the cube coz.turn(degrees = 180) # Turn around coz.say("Let's play again") Cozmo.startUp(actions)
The most complex concept here is searching for a block (
coz.findACube()) and acting on a Boolean return value. I’m not completely in love with how I established this notion. Maybe something more along the lines of “ask to look and find” instead of just “find” would better indicate conditionality.
Under the covers, the Cozmo class now stores both a cube of interest and a list of cubes within view. I’m not sure I’m going to stay with this specific design but this new feature is what allows you to omit mentioning the cube instance in the latter half of the game. I think I probably need to step back and refactor to evolve a Cozmo’s “world” class, to describe what he sees, and better mirror the world in the direct APIs.
Here’s a video of the “Hide and Seek” gameplay:
My immediate goals are to encapsulate all the asynchronous and exception-handling code into very simple call styles. I want to model the world, the robot, and the interactions in a more human-based way, to support simple programming concepts: procedure, state, condition, iteration, and eventually functions.
Even though I’m directly interested in teaching, at the back of my mind, I want to eventually get to the point where I can introduce some emotion programming, which I think is perfect for Cozmo.
I wouldn’t have to start from scratch. There’s some GPL licensed work done in the Facemoji project. Facemoji harvests an emotion dataset, classifies the emotions, and then matches incoming video against the data set. Wouldn’t it be great if Cozmo could react to your face beyond recognition, playing off happiness, sadness, etc?