This assignment describes how to use basic networking with a focus on concepts most useful to robotics.
When you enter a command in a shell, it executes a program. These programs read
from a stream, known as “standard input” and write to two output streams,
“standard output” and “standard error”. When you
printf to write to standard output.
In addition to writing to standard output, a program can read from standard
input. The program
cat, short for concatentate, reads from standard input
and writes the result to standard output.
Write a python program that prints “Hello world” to standard output. Save
the program as
hello1.py and submit it.
Write a python program that prints “Hello world” to standard output using
sys.stdout. Save the program as
hello2.py and submit it.
Write a bash script that prints “Hello World” to standard output. Save the
hello.sh and submit it.
cat with no arguments. Why does
cat seem like it is hanging?
When you run
cat, type a message into your terminal, and press
Control-D. Describe what
cat does. Make sure to include which streams
are being used, and for what purpose.
Write a python program
my_cat.py that reads a message from standard input
and prints to standard output, just as
cat does. Submit this file.
Pipes are used to redirect standard input, standard output, and standard error.
> is used to redirect standard output to a file. For example,
echo "Hello World" > test.txt will write the string
Hello World to
three.txt that contain the strings
3, respectively using
echo and output redirect. Write the
commands you used to create these files in the corresponding section of
By convention, almost all shell programs read input from standard input, and
write their output to standard output. Any error messages are printed to
standard error. You can chain shell programs together by using
example, the program
ls writes the contents of a directory to standard
output. The program
sort reads from standard input, sorts what
it reads, and writes the sorted content to standard output. So you can use
ls | sort to print out a sorted directory list. Read the man page for sort
man sort) to learn how to sort in reverse order. What is the bash script (using
|) that prints the contents of a directory in reverse alphabetical order? Write the script in the corresponding section of
echo to print
hello world. Do not write to any files
and use both commands one time. Write your answer in
This is not the simplest way to print hello world. Can you suggest
a simpler way? (We asked you to do it the more complicated way to practice
with pipes.) Write your answer in
Write a python script that reads from standard input, sorts lines in reverse
alphabetical order, and prints the result. It should behave like
Submit your script in a file called
In addition to standard input and standard output, there is a third stream, standard error. If there is an error in a chain of pipes, it will be printed to the terminal rather than buried in the input to the next program.
ls -a | sort > sorted.txt puts all the names of files in
a directory sorted in alphabetical order into the file
sorted.txt. If you
modify the command to be
ls -a -hippo | sort > sorted.txt, what text is in
sorted.txt, what is outputted as standard error, and why?
Create a python script that, in addition printing sorted inputs to standard
out, prints status reports to standard error. Use it to sort
ls -a instead
sort. Submit the file containing the script as
nc is short for “netcat” and is similar to
cat but works over
network connections. It reads from standard input and writes its contents not
to standard output, but to a specified server. Write your answers in the
corresponding sections of
nc to google.com as follows:
nc www.google.com 80 When you first
connect, it will be silent. Then type any arbitrary text and press enter.
What is the error number?
Now type some valid http into nc:
GET / HTTP/1.1. What is the output?
nc to make a server. In one window, type
nc -l 12345. This
nc to listen on port 12345. In another terminal on the same
nc localhost 12345. You can type a message in one window
and it will appear in the other window (and vice versa). This trick can be
very useful to test basic internet connectivity - if the client and server
can send packets at all. No answer is required for this question.
roscore listens on port 11311. Try using
nc to connect to
port 11311 on a machine where
roscore is running, such as the Pi on your
drone. What protocol is roscore using to communicate?
Another useful tool is
nmap, which scans through a range of ports (and
optionally, through a range of IP addresses) and reports information. Run
nmap localhost on your Pi. What ports are open? Look up each port and
submit what it does.
Run nmap with and without the
nc -l 1234 command running from above. What
is the difference? Why?
roscore? Why or why
man nmap to find command line options for
nmap that report the
ROS port 11311.
Portscan google.com. List each open port and its purpose.
Now we are going to talk about the public internet. So far we’ve been
doing our work using mostly localhost, the local machine we are
connected to, and google.com. The most common situation is that your
base station machine (your laptop or desktop) and your robot are
connected over TCP/IP to the same local network. Then you can look up
your machine’s IP address (
ifconfig in Unix; other ways in other
OSes), and your robot’s IP address, and connect them. How can you
find your robot’s IP address? Well it’s a chicken-and-egg problem.
If you knew the IP address, you can connect to the robot and run
ifconfig and find the IP address, but you don’t know the IP address!
What to do? There are several solutions.
But what about if there is no public internet connection? What if
you want to fly your drone in the wilderness? Well, there does exist
cellular modems and sattellite connections, but you can also tell your
drone to act as a Wifi Hotspot. It can create a network and run a
DHCP server. You can configure this on your drone using the file
Then you can connect your laptop’s base station using the SSID and passphrase specified in that file, and connect to the drone.
Alternatively you can set up your laptop as the Wifi base station and configure the drone to connect to its network. The details will vary depending on your laptop OS and settings.
Your Pi is configured to be a Wireless AP Master by default. Connect to it with your base station.
You want to fly your drone autonomously for 10 miles while viewing the camera output continuously from your base station. Design a solution that will allow you to do this. What hardware, software, and network access providers do you need? Report the weight, CPU computation, and cost this capability will add to your drone.
You want to connect to the drone over Wifi but also be able to connect to the internet in the CIT using the RLAB network. Design a solution that will allow you to do this. What hardware, software, and access providers do you need? Report the weight, CPU computation, and cost this capability will add to your drone.
GNU/Linux uses environment variables to store configuration information about
a variety of things. You can use
env to view the environment variables in
your shell on the Rasberry Pi. In bash (and most shells), environment variables
are local to your bash session, so they are often set in configuration files
that are run every time your shell starts, such as
Log into your Rasperry Pi. Use
X=3 to set the value of an environment
X to the value
echo $X to display the variable.
Note that you must prepend
$ to the variable name when reading it, but not
when setting it.
Log into your drone again in a separate SSH session. Use
echo $X to see
the value of the environment variable
X. What happens? Does this work? Why
or why not?
env to see all the environment variables set in your shell. Pick one.
Research the one that you picked. Describe 1) What program sets the
environment variable and 2) What the variable controls. For example, the
EDITOR environment variable is set in the
.bashrc file when you log in.
Start screen in one of your SSH sessions. Our
setup.sh script sets the
ROS_MASTER_URI and ROS_HOSTNAME or ROS_IP environment variables in your
session. In a second SSH session in which you have not run screen (so just
after you log in), assess the value of the environment variables. Are they
set to the correct values? What is setting ROS_MASTER_URI? What is setting
ROS_IP or ROS_HOSTNAME? How did you figure this out? (You might find the
grep command useful. Use
man grep to find out how to use it.)
When you are done, use this link to create your Networking Github Repo. Commit and push the relevant files (networking.pdf, and any scripts you wrote throughout the assignment) to this Github Repo before the deadline.