| 
Challenge #1: Ball Passing
 
 
 
You get points for touching the ballwith the hand of the same color as the ball.
 
 You lose points for touching anything else,
 or for the ball touching anything else.
 
 There is a small additional cost to the
 torque you apply (so it's better to be relaxed).
 
 Your AI has to play without your help.
 However, it does NOT have to run in real time.
 
 This is a cooperative challenge, so submissions
 must include source and a description of the approach.
 Please give credit when including others' ideas and code.
 
 The challenge will be considered won once we can
 maintain a net-positive score, but
 it will remain open indefinitely to improvements
 and alternate approaches.
 
 The current environment code is available on the main page
 Or use "svn checkout http://invivo.googlecode.com/svn/trunk/ invivo"
 (Or if you prefer C# and .NET, try this instead:
 "svn checkout http://invivo.googlecode.com/svn/extras/dotNet invivo")
 
 It's in python, and you'll need to get
 pygame and pybox2d installed to make it work.
 (You'll also need python-ming if you
 want to generate flash animations.)
 
 There is a very simple JSON network interface
 if you wish to implement your solution
 in some other language.
 
 Email me if you plan to participate and/or
 want an invite to the project's mailing list.
 
 -Simon (simonfunk@gmail.com)
 
 
[Back to Index]
 
 
This is the interface to each bot:
 
 
|  |  |  |  |  | 
Interface01 is the i/o interface to a three-jointed bot
with one touch sensor and a global sound sensor.
Any position variable is an (x, y) tuple of floats representing a location,
which may be in world or local coordinates as specified.  All positions
are in the same units.
Position-related velocities are also (x, y) tuples.  Angular velocities are scalars.
Measurements (such as angles) are taken at the end of the most recent time step.
Events (such as sounds) are accumulated during the timestep (exact time is not available).
Static/Configuration info:
   .position     = where the base of the robot is located in world coordinates.
   .numjoints    = 3  (order is base, elbow, hand)
   .cost         = score cost per second of (torque/torquemax)^2 (per each joint)
   .torquesmax[n] = maxium abs torque joint n can exert.
Sensors:
   .angles[n] = current angle of joint n.
   .angvel[n] = current angular velocity of joint n.
   .handpos = position of the center of the hand relative to .position
   .touch   = list of (position in hand coords, magnitude, reward) for any touch sensations on the hand.
   .ballpos = position of the ball in world coordinates.
   .ballvel = velocity of the ball.
   .ballrot = angular velocity of the ball.
   .ballcol = "color" of ball, from -1 (prefers left) to 1 (prefers right)
   .sound   = list of (worldpos, magnitude, reward) for any sound events
Controls:
   .torques[n] = current torque exerted by joint n.
 |  |  |  |  |  |  
Here is a sample controller (the one shown
in the above animation).  This is the ONLY
file you should change:
 
 
|  |  |  |  |  | 
import math
class Controller(object):
    "Test controller for Interface01."
    def __init__(self, interfaces):
        "Interfaces is a pair of Interface01 objects."
        self.bots = interfaces
    def update(self, time):
        self.foo(self.bots[0], time)
        self.foo(self.bots[1], time*1.234 + 10.)
        #self.bar(self.bots[1])
    def bar(self, bot):
        for i in range(3):
            bot.torques[i] = -bot.angles[i] * 3. - bot.angvel[i] * .01
    def foo(self, bot, time):
        bot.torques[0] = math.sin(time    ) * bot.torquesmax[0]
        bot.torques[1] = math.sin(time*1.7) * bot.torquesmax[1]
        bot.torques[2] = math.sin(time*2.3) * bot.torquesmax[2]
 |  |  |  |  |  |  
[Back to Index]
 |