Page 194 - The Unofficial Guide to Lego Mindstorms Robots
P. 194

183


          In our design, tag doesn't do anything if a reply is not received. This opens up the possibility of adding physical obstacles to
          the arena. If the robot bounces into something that doesn't respond to the tag message, it must be an obstacle.

          The next behavior is avoid, which helps the robot to avoid the edge of the playing arena. It is triggered by the light sensor.
          This behavior backs up and turns to move away from the edge, much like tag.

              int avoidCommand;

              task avoid() {
                  while(true) {
                      if (LIGHT_SENSOR < averageLight - 3) {
                           // Back away from the border.
                           avoidCommand = COMMAND_FLOAT;
                           Wait(20);
                           avoidCommand = COMMAND_REVERSE;
                           Wait(50);
                           // Turn left or right for a random duration.
                           if (Rando m(1) == 0) avoidCommand = COMMAND_LEFT;
                           else avoidComm  and = COMMAND_RIGHT;
                           Wait(Random(200)   );
                           avoidCommand = C   OMMAND_NONE;
                      }
                  }
              }

             hi
          The  ghest-level  behavior  is  tagged,   which is triggered  when the  IR port  receives notification that  the robot has been
          tagged. This behavior tells the ro bot to send an IR acknowledgement, play a sad sound, and sit still for eight seconds.

              int taggedCommand;

              task tagged() {
                  while(true) {
                      if (Message() == MESSAGE_TAG) {
                           t aggedCommand = COMMAND_STOP;
                           SendMess age(MESSAGE_ACKNOWLEDGE);
                           PlaySound(4);
                           Wait(800) ;
                           ClearMessage();
                           tagged Command = COMMAND_NONE;
                      }
                  }
              }

          Arbitration

          As mentioned earlier, an  additional task is needed to link the robot's behaviors to its motors. In this implementation, a task
          called arbitrate exa mines the output command variable of each behavior. If it is not COMMAND_NONE, it is used to set
          the current motor command.
   189   190   191   192   193   194   195   196   197   198   199