I am doing a project where I want to have a robot that can be controlled over the internet. I want to stream video from the robot over the internet to the operator's computer. The robot will have a laptop on it with a 4G wireless card so it can connect to the internet. I have not done this kind of thing before, and I was wondering what the easiest way would be. I was thinking of having the laptop on the robot attached to a webcam and an Arduino Mega. The Arduino Mega would be connected to the robot's actuators. I just don't know of an easy way to get the video from the robot over to the the operator's computer through the internet and get commands from the operator's computer to the robot computer. Thanks.

Robot Operating System (ROS) is set up to do exactly this (www.ros.org). You'll need to run Ubuntu, but you can install it and Windows alongside each other without wiping them out, so you're set.

The way ROS works is you have a single "Core" (called...roscore...) program that is always running, then your program is composed of "nodes", which communicate with each other through Core. Think of it exactly like a program running on an operating system (hence...Robot Operating System :-P)

When you're working over the Internet, you run Core on one machine, and then a set of nodes on the other. Those nodes are running on the remote Core, and data is transferred through the internet.

ros.org has lots of tutorials about how to do this, and it's kind of cool. We've successfully sent microsoft Kinect data over the internet. Keep one thing in mind: the more nodes you run on the remote machine, the more data you transfer, so be very careful to keep the remote machine running only a minimal amount of nodes so that you don't clog your bandwidth.

Otherwise, the idea of running an Arduino to control the robot is fine. The arduino is communicated with via a serial port on the laptop, and really nothing that the local machine (the laptop) is doing, other than collecting the vision data, is relevant to the rest of the system, so you don't need to send that to Core :-)