Title: Doing low cost telepresence (for under $200) Date: 2015-10-08 23:08 Category: DIY Alias: /2015/doing-low-cost-telepresence-for-under-200
The goal is to build a robot that could be used to move around a room remotely, and stream audio and video in both directions. Our target budget is $200. We got a first working version (although it does not yet stream audio), and it is time for some explanations on the setup and how to build your own =) All the instructions, code and necessary stuff can be found at our git repo.
When taking part in a group meeting remotely, using some videoconference solution, it is often frustrating not being able to move around the room on the other side. This prevents us from having parallel discussions, and if the remote microphone is poor quality, we often do not hear clearly everybody speaking. Plus, someone speaking may be hidden by another speaker and many other such problems happen.
The goal was then to find a solution to do videoconferences (streaming both audio and video in both directions) and be able to move on the other side, to be able to see everyone and to come closer to the current speaker. Commercial solutions exist but they are really expensive (a few thousands dollars). We wanted to have the same basic features for $200, and it seems we almost achieved it!
The whole system is built around a Raspberry Pi and a PiCamera, which offer decent performances at a very fair price. The rest is really basic DIY stuff.
Here is the complete bill of materials:
For the next version, we plan to add:
Total with these parts: $228
blueprintswhich are the models of the robot.
distywhich is the main server code on the Raspberry Pi.
webviewwhich is the web controller served by the Raspberry Pi.
First of all, you should cut the parts and print the 3D parts in the
eps files in this directory are ready to cut files whereas
svg files should be the same ones in easily editable format. You should laser cut the top and bottom files.
picam_case_* files are the camera case we used,
You should 3D print:
picam_case_*files for the camera case (licensed under CC BY SA).
teleprez.blendis the complete CAO model of the robot in Blender.
camera_servo_holder.stlis the plastic part to hold the camera servo. You need to print it once.
wheel_servo_holder.stlis the plastic part to hold the servos for the wheels. You need four of them.
Assembling your Disty robot should be straightforward and easy to do if you look at the following pictures :) Use two ball transfer units to stabilize the robot and lock them with some rubber band (or anything better than that). Adjust tightly the height of the wheels so that the two wheels and the ball transfer units touch the ground.
GPIO pinout for the connection can be found at https://raw.githubusercontent.com/hackEns/Disty/master/blueprints/gpio.png.
For the electrical wiring, we used a standard USB-Micro USB cable to power the Raspberry Pi from one battery (located below the robot, to add weight on the ball transfer units and ensure contact is made with the surface). On the other battery, we just cut a USB - Micro USB cable to plug into it and connect the servos directly through a piece of breadboard to the battery. We had to use two batteries to prevent the draw from the servos to reboot the Raspberry Pi.
Here you are, you have a working Disty!
This may not be super user-friendly at the moment, we hope to improve this in the future.
Download any Linux image you want for your Raspberry Pi. Install
uv4l and the
uv4l-webrtc component. Enable the camera and ensure you can take pictures from the command line (there is a lot of doc) about this on the web.
Then, clone the Git repo somewhere on your Raspberry Pi. You should build the main
disty code (which is the serverside code). This code will handle the control of the servos (emit PWMs etc) and listen on UDP port 4242 for instructions sent from the webview. Instructions to build it are located in the associated README. You will need
cmake and a system-wide install of
wiringpi to build the code.
You can then start the robot. Start by launching the disty program (as root as you need access to the GPIOs),
./disty, and then start the webview,
./run.py as root also as it serves the webview on port 80, which is below 1024 and owned by root. If you have ZeroConf on your Raspberry Pi (or a decent router), you can go to http://disty (or whatever hostname is set on your Raspberry Pi) to get the webview. Else, use the IP address instead. Webview usage should be almost straightforward.
It should work out of the box on your local LAN. If you are behind a NAT, it will need some black magic (which is implemented but may not be sufficient) to connect the remote user and Disty camera. In any case, you need to be able to access the webview (disty port 80) from the remote side.
All contributions and feedbacks are more than welcomed!
All the source code we wrote is under a beer-ware license, under otherwise specified.
“THE BEER-WARE LICENSE” (Revision 42): Phyks and Élie wrote this file. As long as you retain this notice you can do whatever you want with this stuff (and you can also do whatever you want with this stuff without retaining it, but that’s not cool…). If we meet some day, and you think this stuff is worth it, you can buy us a beer in return.
If you need a more legally valid license, you can consider Disty to be under an MIT license.