CS344M: Autonomous Multiagent Systems -- Fall 2012: 3D Programming Assignment 2

3D Programming Assignment 2 for Autonomous Multiagent Systems (cs344M)


This assignments assumes the knowledge gained from assignment 1.

In this assignment, you will implement some simple soccer-playing agents. All parts of this assignment can be done with purely reactive behaviors. Please describe in your email to us the extent to which your behaviors are reactive. (It's OK if they're not, just make sure that if you create an agent that is non-reactive in some way, you describe clearly why not in your email).

This assignment (and all for this course) is about creating agents. It's not about programming. If you have programming questions/problems, etc. (e.g. "How do I generate a random number in C?") ask the class list early and often.

A good debugging tool is to print stuff out, in C you can do it with printf or in C++ you can do it with cout. Here is a simple example which should help (for more info check the printf reference):

  #include <stdio.h> // This should be at the top of the file
  char str[10] = "agents"; 
  int num = 1;
  double dbl = 2.0;
  // It prints out the value of variables str,num and dbl. 
  // Notice the difference between %s, %d and %f.
  printf("string: %s, int:%d, double:%f\n", str, num, dbl); 
The output would be: "string: agents, int:1, double:2.000000"

The codebase also has a LOG_STR macro which takes in a string and prints out both the string as well as the line of code the string is being printed from. The code LOG_STR("hello"); placed in selectSkill() at line 82 of strategy.cc would produce the following output: strategy.cc:selectSkill():82:: hello.

In RoboViz you can draw things on the field to help with debugging. The following is an example of how to draw a red dot on the field 1 meter away from the agent and 15 degrees from the agent's current orientation.

  char buf[512];
  sprintf(buf, "DrawPoint.%d", worldModel->getUNum());
  string str = string(buf);

  float pointDistance = 1.0;
  float pointAngle = 15.0;

  // Convert from polar to cartesian
  VecPosition drawPoint = VecPosition::getVecPositionFromPolar(pointDistance, pointAngle, 0); 

  // Converts point from local to global coordinate system that
  // RoboViz uses when drawing.  This conversion is possible as the
  // agent localizes itself using a particle filter (or in the case of
  // this assignment ground truth localization data provided by the server).  
  drawPoint = worldModel->l2g(drawPoint);

  // Need to rotate point 180 degrees around origin to line up with global
  // coordinate system if agent is starting on the right side
  if (worldModel->getSide() == SIDE_RIGHT) {
    drawPoint = drawPoint.rotateAboutZ(180);
  // Set color of dot
  float red = 1.0;
  float green = 0.0;
  float blue = 0.0;

  // Set size of dot
  float size = 5.0;

  // Set position of dot
  float x = drawPoint.getX();
  float y = drawPoint.getY();
  float z = 0.0;

  // Write drawing code to str
     x, y, z,
     red, green, blue,

  // Pass str containing draw instruction to RoboViz
There are methods for drawing things in RoboViz other than points, such as lines and annotations, contained in rvdraw.h. These are the draw*() methods. Additional information about drawing objects in RoboViz can be found on the RoboViz drawing protocol page.

A good method for parsing strings, is sscanf. Here is an example:

  #include <stdio.h> // This should be at the top of the file
  char str[20] = "((b) 23 1.5)"; 
  int i = 0;
  double dbl = 0;
  // The integer value appeared at the place of the %d would go to the i variable, 
  // and the the double value would go to the dbl variable.
  sscanf(str, "((b) %d %lf)", &i, &dbl); 
  printf("i:%d dbl:%f\n", i, dbl); 
The output would be: "i:23 dbl:1.50000"

The strstr() function may also be useful. (Here is code that parses a sample server message and find the distance and angle to the ball.)

Also, the sprintf() function is useful for creating strings with variable content. For example, you can use sprintf() to create a

(dash N)
string for any number N.

C/C++ Reference

Score a goal

The code you will be modifying is in /projects/cs344M.pstone/3d/nao-agent.


  1. Copy over the files in the nao-agent directory to any directory in your account:
      % cp -r /projects/cs344M.pstone/3d/nao-agent .
    IMPORTANT: You will need to do this step again even if you already did this for the first assignment (you should delete all files copied from the first assignment) as the codebase has been updated for the second assignment.
  2. Go into your version of the nao-agent and compile by typing "make".
  3. In a new terminal window, start the soccer server (as you did in the previous assignment).
      % rcroboviz
  4. Back in the other window, run the agent:
      % ./agentspark --host=localhost --team myteam --unum 2 --paramsfile paramfiles/defaultParams.txt&

You will see the same behavior as last week. This time instead of starting play with a kickoff do a drop ball by pressing 'b' or press 'o' and choose PlayOn from the play mode selection menu. This is necessary as your agent will want to touch the ball multiple times during this assignment and kickoff rules limit the agent to only touching the ball once until another agent touches the ball after a kickoff.

Your task is to alter the code in strategy.cc that the player does the following :


What to turn in:

  • A logfile of your player scoring a goal. Name the logfile "[yourlogin]-score3d.log" and compress it using gzip (after compression it will end with a .gz extension).
  • Your modified source code file called [yourlogin]-score3d.cc

  • 1 on 1

    Run the same code, but this time start 2 players: 1 on each team. To do this just start two agents running but with different values for the --team command line option. Turn in a logfile that runs at least until one player scores or 120 seconds (whichever comes first).

    What to turn in:

    A logfile called [yourlogin]-1on13d.log compressed with gzip.


    Create 2 players that pass the ball back and forth. Try to do this reactively (i.e. without saving any state). If you do something non-reactive, just point that out in the email describing your approach and no credit will be deducted.


  • If you want to start two players on the same team you can start two agents with the same value for the --team argument but with different values for the --unum argument (valid values are 1-11 which correspond to their jersey numbers).

  • The positions of the different body parts of players are listed separately in the following format:
    (P (team <team_name>) (id <jersey_num>) (<BodyPart> (pol <radius> <theta> <phi>)) (<BodyPart> (pol <radius> <theta> <phi>)) ...)
    The BodyPart variable can be any of the following:
    head for the head
    llowerarm and rlowerarm for the left and right lower arms respectively
    lfoot and rfoot for the left and right feet repectively

    To determine the location of another player it is recommended to use the position of their head as this is usually a good center point for their body. Also note that you can see your own body parts in your vision (except for your head as a robot's camera is mounted on its head).

  • You may want the player closer to the ball to go toward it and pass it while the other player purposely moves a set distance away from the ball. To determine which player is closest to the ball you might find the Law of Cosines useful (Note that cos() takes in a value in radians while cosDeg() takes in a value in degrees).
  • What to turn in:

  • A logfile called [yourlogin]-pass3d.log compressed with gzip.
  • Commented source code called [yourlogin]-pass3d.cc.

  • Grading

    This assignment will be graded as follows:

    Part 1:

    Part 2: 1 point if it works.

    Part 3:


    When you're done with all parts of the assignment, turn everything (three .log files and two .cc files) in to turnin (use assignment label "prog2-3D" and grader "patmac"), and send us an email to that effect with a brief description of your approaches and the extent to which the behaviors are reactive.

    [Back to Department Homepage]

    Page maintained by Patrick MacAlpine
    Questions? Send me mail