The aim of this project is to develop a telepresence and teleoperation application in the robotic field using open source software
Pull request Compare This branch is 3 commits behind mees:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


The aim of this project is to develop a telepresence and teleoperation application in the robotic field using open source software
This application has been done by Oier Mees during a summer internship at Tekniker Research Center and is now maintained by Ane Fernandez <>

Used tools:
    Segway rpm 200 robot (with following sensors: laser range finder, thermopile, sonar, bumper, encoder, stargazer IR to read tags in indoor navigation)
    Kinect camera on top of the robot
    Webcam for the client
    PS3 Controller

   ROS diamondback (also works with electric)
   Ubuntu  10.04 Lucid
   Opencv2 stack for the image handling
   PS3Joy stack for the PS3 controller 
   Openni stack for the kinect
   audio_capture stack to capture and stream the webcams microphones sound

How to compile and run the application
First of all, configure ROS for multiple machines by following the next tutorials:
It is important to change the $ROS_MASTER_URI variable and that both machines can resolve the name of the other (check /etc/hosts file).

on the robot:
  1) enable navigation mode, depends on the robot
  2) start kinect topic with 
     $ rosrun openni_camera openni_node
  3) optional: if you are streaming the video over wifi, you may want to resize the image to decrease the latency using the code kindly provided by José María Martínez Otzeta
     $ rosrun tekniker_telepresence image_resizer  50 5 /image:=/camera/rgb/image_color
     in this case, the launcher file of the client has to be changed  to remap the rgb topic by uncommenting the following line
     <remap from="/camera/rgb/image_color" to="/image_resized"/>
  4) start the depth service, which will return the mean depth (x,y) coordinates in the kinect
     $ rosrun tekniker_kinect depth_server
  5) optional: if you don't have an actual robot you can always use a simulator (the following packages are not provided)
      $ roslaunch tekniker_simulation tmm_stage.launch
      $ roslaunch 2dnav_segway_rmp move_base_tmm_simulator.launch
  6) After completing the steps of the client machine, you have to launch audio_play to play the sound that is streamed over the /audio topic
      $ rosmake audio_play
      $ roslaunch audio_play play.launch

on the client machine:
  1) enable ps3 controller, see
     $ sudo bash
     $ rosrun ps3joy
     if it doesn't activate, try the methods at
   2)compile and run the actual program with the launcher file
     $ rosmake tekniker_telepresence
     $ roslaunch tekniker_telepresence tekniker_telepresence.launch 

Known Issues

OpenCV2 has to be compiled with v4l and ffmp support to enable webcam capture. 
You will have to this if you get the "ERROR: webcam capture is NULL" message and no other camera index works. 
Try enabling the v4l and ffmpg flags in opencv2 Makefile and compiling it again
(rosmake opencv2) you may have to delete the ROS_NOBUILD.

As mentioned earlier, if you can't pair the PS3 controller you may have to disable other bluetooth devices for it to work.

The battery progress bar doesn't change. Our segway driver had an issue and didn't expose the status information.
The callback is done, normalizing the values to a scale and updating the progressbar should be trivial

Streaming kinect audio over ROS doesn't work currently. Libfreenect unstable branch ( 
has some working demos for the kinects 4 mics, but a ROS node for it is missing.
The easyest way to bypass this hurdle is to add a external mic and use the audio_capture stack

When exiting the application on the client, only the tekniker_telepresence node is finished, the audio_capture and ps3joy nodes have to be terminated with ctrl-c.
Since they are independent nodes, the behaviour is correct, but it would be nice to sync the exiting.

If move_base_server of the navigation system is not activated, the application freezes when trying to navigate because it gets stuck waiting for the server to come up

The path of the controller icon is an absolute path, so you want to change it (look for it at the beginning of ui.cpp)

Future work

Solving the known issues

Show a map to locate the robot

Give some kind of feedback of the nearest obstacles distance in order to help navigation

Show video and audio stream quality and feedback on the UI like in skype videoconferences

Migrate from wxWidgets to Qt

Because of acumulated errors during the navigation, the  estimation of the (robots) localization could differ from reality. Added this to the uncertainty of the kinects depth sensor, 
it can happen that the robot thinks that the clicked (x,y) destination is unreachable. In the tests, it sometime happened that if the clicked destination (a person) was near wall, the robot couldn't reach the destination because it calculated that the person was inside the wall due to the acumulated errors. An option could be to analyze the surrounding points of (x,y) in a map from map_server and determine if the point is really unreachable. If yes, a nearby destination could be chosen instead