Syntax-07-08-29 - Sociocognitive Robotics Lab, Tulane

Download Report

Transcript Syntax-07-08-29 - Sociocognitive Robotics Lab, Tulane

Conditions and loops
Day 4
Computer Programming
through Robotics
CPST 410
Summer 2009
Course organization
 Course home page
(http://robolab.tulane.edu/CPST410/)
 Lab (Newcomb 442) will be open for
practice with 3-4 Macs, but you can bring
your own laptop and all robots.
7/1/09
Harry Howard, CPST 410, Tulane University
2
Sound in NXT-G
Kelly §6 Make some noise!
The SOUND block
1.
2.
3.
4.
7/1/09
This icon shows whether the
block will play a sound file or a
tone.
This icon shows whether the
block will start or stop playing a
sound.
This icon shows the block’s
volume. An icon with four orange
bars is set to the loudest volume.
You can drag data wires from
other blocks to this block’s data
hub that will affect the Sound
block’s properties.
Harry Howard, CPST 410, Tulane University
4
Kelly's example, reversed
 Spot, move forward 1 rotations at 50%
power coasting to a stop and then play me a
C note for 2 seconds at 75% volume.
7/1/09
Harry Howard, CPST 410, Tulane University
5
MoveSound.rbt
7/1/09
Harry Howard, CPST 410, Tulane University
6
Sound in NXC
Two useful sound functions
 Definitions
 PlayTone(frequency, duration)
 PlayFile(filename)
 Examples
 PlayTone(440, 500); Wait(500);
 PlayFile(“Startup.rso”);
 Note that PlayTone executes immediately, so that
all by itself, it does not play for 500 ms; it relies
on Wait to actually extend the duration to the one
specified.
7/1/09
Harry Howard, CPST 410, Tulane University
8
Do Kelly's example in NXC
 TRIBOT, move forward 1 rotation at 50%
power coasting to a stop and then play me a
C note for 2 seconds at 75% volume.
7/1/09
Harry Howard, CPST 410, Tulane University
9
MoveSound.nxc
task main()
{
RotateMotor(OUT_AC, 75, 360);
PlayTone(1047,2000);
Wait(2000);
}
7/1/09
Harry Howard, CPST 410, Tulane University
10
Waiting
Kelly §10 Wait for it!
Waiting
 The robot is almost always waiting to do something, even
when it is already doing something:
 TRIBOT is moving towards a black line, waiting for the Light
sensor to detect it.
 TRIBOT is preparing to throw a ball at a target, waiting for the
Touch sensor to be pressed and released.
 TRIBOT is rolling towards the wall, waiting for the Ultrasonic
sensor to detect it.
 TRIBOT is sitting at the start line, waiting for the Sound sensor to
hear me yell “Go!”.
7/1/09
Harry Howard, CPST 410, Tulane University
12
Conditions
 The WAIT block will stop waiting when specific
conditions are met.
 The conditions are usually given by some kind of
sensor feedback.
 The blocks for each condition can be found in two
ways:
 Common palette > Wait.
 By changing the setting from Time to Sensor on the
Time WAIT block.
7/1/09
Harry Howard, CPST 410, Tulane University
13
The conditions
 Time wait
 Touch sensor wait
 Light sensor wait
 Ultrasonic sensor wait
 NXT Buttons wait
 Rotation sensor wait
 Receive Message wait
7/1/09
Harry Howard, CPST 410, Tulane University
14
A simple test of a condition
 TRIBOT, move forward for an unlimited
duration at a power of 50 until the Touch
sensor is pressed.
7/1/09
Harry Howard, CPST 410, Tulane University
15
MoveTilTouch.rbt
7/1/09
Harry Howard, CPST 410, Tulane University
16
A more complex example
 SPOT, move forward for 1 rotation at 50%
power, brake, and beep. If your Light sensor
detects a light level greater than 30, move
backward 1/2 rotation at 50% power,
coasting to a stop.
7/1/09
Harry Howard, CPST 410, Tulane University
17
MoveTilLight.rbt
7/1/09
Harry Howard, CPST 410, Tulane University
18
Conditions in NXC
A complication
 The sensor functions in NXC do not include
this ability to wait; all they do is read sensor
values.
 So you have to add the condition that the
sensor value is supposed to meet, yourself.
7/1/09
Harry Howard, CPST 410, Tulane University
20
If
 There are two options
if (condition) consequence
if (condition) consequence else alternative
 Examples
if (x == 1) y = 2;
if (x == 1) { y = 2; z = 3; }
if (x == 1) y = 3; else y = 4;
7/1/09
Harry Howard, CPST 410, Tulane University
21
We can’t do the simple test
 TRIBOT, move forward for an unlimited
duration at a power of 50 until the Touch
sensor is pressed.
 PROBLEM: there is no ‘unlimited’
parameter for any of the NXC movement
functions, so we skip this task, though the
next slide shows what we would want the
program to look like.
7/1/09
Harry Howard, CPST 410, Tulane University
22
MoveTilTouch.nxc
task main()
{
OnFwd(OUT_AC, 50);
if (Sensor(S1) == 1)
{
Off(OUT_AC);
}
}
7/1/09
Harry Howard, CPST 410, Tulane University
23
The more complex example
 TRIBOT, move forward for 1 rotation at
50% power, brake, and beep. If your Light
sensor detects a light level greater than 30,
move backward 1/2 rotation at 50% power,
coasting to a stop.
7/1/09
Harry Howard, CPST 410, Tulane University
24
MoveTilLight.rbt
task main()
{
RotateMotor(OUT_BC, 50, 360);
PlayTone(1047, 500);
Wait(500);
if (Sensor(S3) > 30)
{
RotateMotor(OUT_BC, 50, -180);
}
}
7/1/09
Harry Howard, CPST 410, Tulane University
25
Loops
Kelly §11 Round and Round
How would you do this?
 TRIBOT, display the output of the Light
sensor briefly (500ms) 10 times.
7/1/09
Harry Howard, CPST 410, Tulane University
27
The LOOP block
 The LOOP block repeats what is inside it
until a condition is met.
The loop break conditions are the same as the
WAIT conditions.
 You drop a block inside a loop by grabbing
the block, holding down the mouse button,
and dropping it inside when the loop
expands.
7/1/09
Harry Howard, CPST 410, Tulane University
28
Go ahead and do it
 TRIBOT, display the output of the Light
sensor briefly (1s) 10 times.
7/1/09
Harry Howard, CPST 410, Tulane University
29
DisplaySensorLoop.rbt
7/1/09
Harry Howard, CPST 410, Tulane University
30
Loops in NXC
REPEAT
 The repeat command, repeat(t) {}, repeats
what is in the curly brackets for the number
of times given by t.
7/1/09
Harry Howard, CPST 410, Tulane University
32
Convert the example to NXC
 TRIBOT, display the raw output of the
Light sensor briefly (1s) 10 times.
7/1/09
Harry Howard, CPST 410, Tulane University
33
DisplaySensorLoop.nxc
int light;
string text_light;
task main()
{
repeat(10)
{
light = Sensor(S3);
txt_light = NumToStr(light);
TextOut(0, LCD_LINE4, txt_light);
Wait(1000);
}
}
7/1/09
Harry Howard, CPST 410, Tulane University
34
More practice
Program each bit of pseudocode in NXT-G
and then in NXC.
My suggestion follows each bit of
pseudocode, so don’t look ahead until you
are finished with your program!
Follow up
 TRIBOT, display the output of the Light
sensor briefly (1s) 10 times and beep after
each display. Laugh when you are finished.
7/1/09
Harry Howard, CPST 410, Tulane University
36
SensorLoopSound.rbt
7/1/09
Harry Howard, CPST 410, Tulane University
37
SensorLoopSound.nxc
int light;
string text_light;
task main()
{
repeat(10)
{
light = Sensor(S3);
txt_light = NumToStr(light);
TextOut(0, LCD_LINE4, txt_light);
Wait(1000);
PlayTone(1047,500);
Wait(500);
}
PlayFile(“Laughing 02.rso”);
Wait(1000);
}
7/1/09
Harry Howard, CPST 410, Tulane University
38
Epilog on scope
 Note the difference being in the loop versus being
out of the loop makes. PlayTone is played 10
times, because it is in the loop. PlayFile is only
played once, because it is not in the loop.
 The effect of an expression like repeat is known as
its scope, and in NXC the scope of an expression
is stated explicitly by means of the curly brackets.
7/1/09
Harry Howard, CPST 410, Tulane University
39
Thought experiment
 How would you make TRIBOT move
forward and then turn right -- four times?
By dropping in 8 MOVE blocks, each with the
same settings (one for each forward move, and
one for each turn).
 Does this sound like a good usage of your
time?
No!
7/1/09
Harry Howard, CPST 410, Tulane University
40
The pseudocode
 TRIBOT, move forward for 0.5 s at 50%
power and then make a 90° turn for 0.65 s
also at 50% power. Do this 4 times.
7/1/09
Harry Howard, CPST 410, Tulane University
41
RepeatTurn.rbt
7/1/09
Harry Howard, CPST 410, Tulane University
42
Turning in NXC
 You may have noticed that the NXC
movement functions do not have the nice
‘steering wheel’ ability that NXT-G has.
 The trick to turning in NXC is to reverse a
motor. I’ll leave it up to you to figure out
which one.
7/1/09
Harry Howard, CPST 410, Tulane University
43
RepeatTurn.nxc
task main()
{
repeat(4)
{
OnFwd(OUT_BC, 50);
Wait(500);
OnRev(OUT_C, 50);
Wait(650);
}
}
7/1/09
Harry Howard, CPST 410, Tulane University
44
Mix them up
 TRIBOT, move forward for 1 rotation at
50% power and coast. If your Light sensor
detects a level greater than 20, beep and
move backward 1/2 rotation at 50% power,
coasting to a stop. Do this 3 times, then say
the number ‘three’.
7/1/09
Harry Howard, CPST 410, Tulane University
45
MoveLightLoop.rbt
7/1/09
Harry Howard, CPST 410, Tulane University
46
MoveLightLoop.nxc
task main()
{
repeat(3)
{
RotateMotor(OUT_BC, 50, 360);
if (Sensor(S3) > 20)
{
PlayTone(1047,500);
Wait(500);
RotateMotor(OUT_BC, 50, -180);
}
}
PlayFile(“03.rso”);
Wait(1000);
}
7/1/09
Harry Howard, CPST 410, Tulane University
47
Next time
 Quiz 1
This will just be a quiz on the blocks.
 More loops, switching.
 Random numbers.
 'Line Follower' - project done in class
7/1/09
Harry Howard, CPST 410, Tulane University
48