rosws ROS Tutorial

In this tutorial we will focus on how to use rosws for doing development work for ROS. We will use the ROS fuerte distribution, but you can use other distributions as well.

Introduction

The problem rosws tries to solve is that developers in robotics today have to work with source code from multiple sources, multiple version control systems, in multiple versions.

While many ROS libraries can be installed into system directories via Debian packages or other system-based distribution mechanisms, many developers have ROS libraries installed from source somewhere in their home directory, and then made available at runtime by inclusion in the ROS_PACKAGE_PATH environment variable.

By manipulating this environment variable, users can create their own packages, install additional packages from source, or even shadow installed packages with experimental versions.

There are a few ways to manage these “overlay” environments. A user can manage ROS_PACKAGE_PATH environment variable by hand, but this is cumbersome, can lead to confusion when switching environments, and errors in this variable can easily break a user’s environment. Alternatively, rosws (ROS Workspace) provides a systematic method for managing package overlays in a user’s workspace.

When the developer makes changes to the source code and builds the code, it is important that the builder uses the right ROS distribution (e.g. electric vs fuerte) as well as the right version of the source code.

A builder will typically use environment variables such as CPATH, LD_LIBRARY_PATH, PKG_CONFIG_PATH, etc. So the developer will have to make sure that all those variables are all set correctly every time he runs a build. Similarly, when the developer has a ROS package both installed as a system library as well as local ‘overlay’ checkout (with his modifications), it is important that the builder chooses the right libraries for the build process, so the order of entries in the environment variables also needs to be managed.

This is what rosws attempts to make easier for developers.

Binding a workspace to a ROS distribution

The following command creates a new fuerte overlay workspace in ~/fuerte:

$ rosws init ~/fuerte /opt/ros/fuerte

Note

This command does nothing else than to create the folder ~/fuerte, the files setup.bash, setup.sh, setup.zsh and the hidden file .rosinstall in the directory ~/fuerte.

We will use ~/fuerte from now on. Other workspaces could be set up similarly like this:

$ rosws init ~/electric /opt/ros/electric
$ rosws init ~/electric_unstable /opt/ros/electric

The next step is to source the setup.bash in ~/fuerte:

$ source ~/fuerte/setup.bash

Note

You can only source one workspace at a time. It is generally error prone to switch from one workspace to another, this can cause confusing errors. Prefer to keep the same workspace in the same terminal. If you work with several workspaces, do not source any of them in your .bashrc.

It is very common to replace the line source /opt/ros/fuerte/setup.bash in the .bashrc to the command above, so that whenever you create a new terminal, that environment is used.

You can verify the workspace using again rosws info:

$ rosws info
workspace: ~/fuerte
ROS_ROOT: /opt/ros/fuerte/share/ros

 Localname                 S SCM  Version-Spec UID  (Spec) URI  (Spec) (https://...)
 ---------                 - ---- ------------ ----------- -------------------------
 /opt/ros/fuerte/stacks
 /opt/ros/fuerte/share
 /opt/ros/fuerte/share/ros

You see in the second output line that there is a defined ROS_ROOT in our workspace. The info table has many columns, all of which are empty so far, we will get to that in a moment. You may notice that rosws merge listed an added setup.sh, which is not shown in the table, it is hidden because that entry is of no further interest to you in your daily work.

The overlay now includes all packages that were installed in /opt/ros/fuerte, which is by itself not very useful yet. However we can now easily overlay installed packages.

Creating a sandbox directory for new packages

New packages need to be put in a path that is in the variable ROS_PACKAGE_PATH. All directories that are managed by rosws, i.e. that have been added using rosws are automatically added to the ROS_PACKAGE_PATH when the file setup.bash of the corresponding workspace is sourced. Although new packages should always be put in repositories that have been installed using rosws, it can be very convenient to have a sandbox directory where for instance packages created during the tutorials can be put without requiring any additional rosws commands. For that we create a new directory sandbox and add it to the .rosinstall file:

$ mkdir ~/fuerte/sandbox
$ rosws set ~/fuerte/sandbox

Note

Now, it is necessary to re-source ~/fuerte/setup.bash to make sure that the updated ROS_PACKAGE_PATH is used:

$ source ~/fuerte/setup.bash

You can verify the workspace using again rosws info:

$ cd ~/fuerte
$ rosws info
workspace: ~/fuerte
ROS_ROOT: /opt/ros/fuerte/share/ros

 Localname                 S SCM  Version-Spec UID  (Spec) URI  (Spec) (https://...)
 ---------                 - ---- ------------ ----------- -------------------------
 sandbox
 /opt/ros/fuerte/stacks
 /opt/ros/fuerte/share
 /opt/ros/fuerte/share/ros

As you can see the sandbox folder is at the top of the list. This is important, as early entries overlay later entries. You can also check the ROS_PACKAGE_PATH, it should be the same as the left column of the table:

$ echo $ROS_PACKAGE_PATH
/home/user/fuerte/sandbox:/opt/ros/fuerte/stacks:/opt/ros/fuerte/share:/opt/ros/fuerte/share/ros

You can now create packages in the sandbox folder e.g. using roscreate-pkg, and they will be found within the ROS_PACKAGE_PATH.

Adding repositories to the overlay

Development normally happens in repositories and when installing packages from source, they normally need to be checked out from a repository and added to the ROS_PACKAGE_PATH. This can easily be done using rosws. For instance, the following commands add the development version of the stack turtlebot which is a Mercurial repository:

$ rosws set turtlebot --hg https://kforge.ros.org/turtlebot/turtlebot
$ rosws update turtlebot

After re-sourcing setup.bash the new overlayed stack turtlebot should be in your package path, i.e. roscd turtlebot should switch to the directory ~/fuerte/turtlebot.

If a stack is already installed in /opt/ros/fuerte, adding it locally using rosws will shadow the existing stack, as long as rosws info lists the stack earlier than the /opt/ros/fuerte folders.

I.e. instead of the system installation, the stack in ~/ros_workspace will be used. That way, it is possible to edit existing packages by cloning them in the overlay.

This makes it possible for you to use different workspaces with different versions of the same libraries without much hassle. Also this allows multiple users on a robot to each have their own version of libraries.

Combining merge with roslocate

A usecase that was considered in the design of rosws was to quickly get ROS stacks into a workspace. The roslocate script uses an online index to lookup stack or package source information by name.

We can pipe that information to rosws to add the definition to our workspace.

As an example we will add the navigation stack. Just to show you what is happening, we first call roslocate:

$ roslocate info navigation
- hg:
    local-name: navigation
    meta:
      repo-name: wg-kforge
    uri: https://kforge.ros.org/navigation/navigation
    version: default

As you can see the command finds the required meta-information for a stack or package by the given name navigation. We can call roslocate info it again passing the output to “rosws merge -“:

$ roslocate info navigation | rosws merge -
     Performing actions:

     Add new elements:
  navigation    hg  https://kforge.ros.org/navigation/navigation   default

If you wanted, you could next checkout the source code calling rosws update navigation.

Updating repositories in an overlay

rosws allows to update only a single repository or all repositories:

$ rosws update navigation

updates only the stack navigation while:

$ rosws update

updates all repositories.

Developing against multiple distributions

As an example a developer might have the ROS navigation stack in versions electric stable, electric unstable and fuerte on his harddisk.

(You may not have more than one distribution when you start learning ROS, but the next distribution will come, so it’s good to be prepared.)

So as a developer, it is be good to create one local overlay workspace for each distribution and variant to use:

$ rosws init ~/fuerte /opt/ros/fuerte
$ rosws init ~/electric /opt/ros/electric
$ rosws init ~/electric_unstable /opt/ros/electric

It is useful to use such folders to manage different source checkouts of the same ROS package. Using the same folder and switching versions is very prone to mistakes and not recommended.

You can use each of these folders as an independent workspace.

Note

It is generally not a good idea to change the distribution a ROS workspace is bound to. This often leads to confusing error messages because compiled files assume the wrong distribution.