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.