rosws Tutorial¶
In this tutorial we will set up a workspace using different SCM
providers and introduce the rosws
commands to run SCM
configuration operations in this workspace.
In the context of rosws, a workspace is a set of folders on
your harddisk that are listed in a special file named .rosinstall
.
Also this file stores for each folder whether this folder is managed
under some version control system (subversion, mercurial, git, bazaar).
This allows you to deal with many common version control operations
using a single interface.
rosws also generates a file called setup.sh. This adds all folders listed in the .rosinstall to an environment variable called ROS_PACKAGE_PATH. This variable can the be used by other tools to e.g. find folders with libraries you want to compile against.
In you get stuck with a technical problem, you may check out the answers page: http://answers.ros.org/questions/tags:rosinstall
Contents
Prerequisites¶
Start by updating / installing rosws
, which comes with rosinstall.
Ubuntu
On Ubuntu you first need to setup ROS sources: http://wiki.ros.org/fuerte/Installation/Sources
$ sudo apt-get install python-rosinstall
If you do not want to add the ROS sources as outlined above you can use pip
as outlined below, but know that pip
won’t automatically update and overrides
any verison installed from debian packages.
Other Platforms
On platforms where debian packages are
You will need the program pip
You can then get the latest rosinstall like this:
$ sudo pip install -U rosinstall
Troubleshoot¶
If you had rosinstall series 0.5 installed, you may encounter conflicts like:
ImportError: No module named rosinstall.rosinstall_cli
To fix this, you will have to remove leftover directories from the earlier install, as sadly the python setuptools will not do it for you. On Ubuntu Lucid, as an example:
$ sudo rm -rf /usr/local/lib/python2.6/dist-packages/rosinstall-0.5*
Initialize a workspace¶
We will create a folder that serves as workspace, which you can delete after the tutorial.
Note
The following creates a workspace without ROS. This means variables that are important for ROS like ROS_PACKAGE_PATH will not be set. If you want to create a workspace for ROS, follow the tutorial rosws ROS Tutorial.
$ cd /tmp
$ mkdir rosws_tutorial
$ cd rosws_tutorial
$ rosws init
Writing /tmp/rosws_tutorial/.rosinstall
(Over-)Writing setup.sh, setup.bash, and setup.zsh in /tmp/rosws_tutorial
rosws init complete.
Type 'source ./setup.bash' to change into this environment.
Add that source command to the bottom of your ~/.bashrc to set it up every time you log in.
If you are not using bash please see http://wiki.ros.org/rosinstall/NonBashShells
To see what this command did, just type:
$ ls -a
./ ../ .rosinstall setup.bash setup.sh setup.zsh
This is all that rosws init
does, it creates these files. If you
ever want to start your workspace over, you can delete all these
files, and that’s it. Note that rm *
on linux does not delete
the .rosinstall
, you need to call rm .rosinstall
as well.
We can run rosws info
to see an overview of the environment:
$ rosws info
workspace: /tmp/rosws_tutorial
ROS_ROOT: None
As you can see the workspace is empty and we do not have a ros root in the workspace. For this tutorial, we will use the ROS fuerte release. Note though that you do not need a ros root to have a valid workspace with rosws.
Now is a good time to check out the help
and --version
commands:
$ rosws help
$ rosws help init
$ rosws help info
$ rosws --version
Remember this help is available if you get in trouble.
Extending your workspace¶
Using rosws is useful for mostly one purpose, using several SCM repositories, like Subversion, git, Mercurial, Bazaar. So far in our workspace we have none such folders, so let’s see how we can add a few.
For the sake of having an example, let us try a merge in stacks from the electric ROS distribution. (This will not take long, trust me). You do not need any ros installation for this step of the tutorial.
$ rosws merge 'http://packages.ros.org/cgi-bin/gen_rosinstall.py?rosdistro=electric&variant=robot&overlay=yes'
Performing actions:
Add new elements:
nodelet_core, xacro, eigen, bond_core, pluginlib, geometry, robot_model, assimp,
orocos_kinematics_dynamics, common, filters, diagnostics, bullet, driver_common,
executive_smach, common_msgs
Overwriting /tmp/rosws/.rosinstall
rosws update complete.
Do not forget to do ...
$ source /tmp/rosws/setup.sh
... in every open terminal.
Config changed, remember to run rosws update to update the tree
What this command did is just adding entries to your .rosinstall, nothing else so far.
The rosws
tool behaves differently from the rosinstall tool
in that respect.
We can inspect the new config in detail again using the rosws info
command:
$ rosws info
Localname S SCM Version-Spec UID (Spec) URI (Spec) (https://...)
--------- - ---- ------------ ----------- -------------------------
xacro x hg xacro-1.6.0 kforge.ros.org/common/xacro
executive_smach x hg executive_smach-1.0.4 kforge.ros.org/smach/executive_smach
robot_model x hg robot_model-1.6.4 kforge.ros.org/robotmodel/robot_model
assimp x hg assimp-0.1.1 kforge.ros.org/robotmodel/assimp
pluginlib x hg pluginlib-1.6.0 kforge.ros.org/common/pluginlib
orocos_kinematics_dynamics x git orocos_kinematics_dynamics-0.2.3 http://git.mech.kuleuven.be/robotics/orocos_kinematics_dynamics.git
nodelet_core x hg nodelet_core-1.6.2 kforge.ros.org/common/nodeletcore
geometry x hg geometry-1.6.1 kforge.ros.org/geometry/geometry
bullet x hg bullet-2.76.5 kforge.ros.org/geometry/bullet
filters x hg filters-1.6.0 kforge.ros.org/common/filters
eigen x hg eigen-1.6.0 kforge.ros.org/geometry/eigen
driver_common x svn tags/driver_common-1.2.4 code.ros.org/svn/ros-pkg/stacks/driver_common/
diagnostics x svn tags/diagnostics-1.6.4 code.ros.org/svn/ros-pkg/stacks/diagnostics/
common x hg common-1.6.1 kforge.ros.org/common/common
common_msgs x svn tags/common_msgs-1.6.0 code.ros.org/svn/ros-pkg/stacks/common_msgs/
bond_core x hg bond_core-1.6.1 kforge.ros.org/common/bondcore
/opt/ros/fuerte/stacks
/opt/ros/fuerte/share
/opt/ros/fuerte/share/ros
So this looks much more fun. For each stack definition that we merged in, we see the SCM provider, the URI, and the version. The column labeled S
gives us the status, an x
means that the folder is missing. That’s because we did only merge in the definitions, so far we did not pull the actual stacks. The UID (Spec)
column would show the current revision of each stack, but as we did not check out any, it is empty for all.
Note
For svn, rosws, uses the standard layout to reduce table width. So
uri = https://code.ros.org/svn/ros-pkg/stacks/common_msgs/tags/common_msgs-1.6.0
becomes
uri = code.ros.org/svn/ros-pkg/stacks/common_msgs
Version-Spec = tags/common_msgs-1.6.0
We can use rosws info
also to compare just a few entries and to look into one entry in detail:
$ rosws info common filters
Localname S SCM Version-Spec UID (Spec) URI (Spec) (https://...)
--------- - ---- ------------ ----------- -------------------------
filters x hg filters-1.6.0 kforge.ros.org/common/filters
common x hg common-1.6.1 kforge.ros.org/common/common
$ rosws info diagnostics
Localname: diagnostics
Path /tmp/rosws_tutorial/diagnostics
Status: x
SCM: svn
URI: https://code.ros.org/svn/ros-pkg/stacks/diagnostics/tags/diagnostics-1.6.4
Current URI:
Version-Spec:
Spec-Revision:
Current-Revision:
Other Properties: []
As you can see, the display changes if we just give one entry, and the
SVN uri is displayed in the original format stored in the
.rosinstall
file.
Since we do not want to strain your network connection, we will undo
the merge. rosws created a .rosinstall.bak
file when we run the
merge command. You can always undo one change by replacing .rosinstall
with the .rosinstall.bak
.
$ mv .rosinstall.bak .rosinstall
Working with Entries¶
To have something small to work with, we will add single ROS stack to our
workspace for real. The set
command is for manual adding of entries:
$ rosws set common_msgs https://code.ros.org/svn/ros-pkg/stacks/common_msgs/trunk --svn
Add element:
{'svn': {'local-name': 'common_msgs', 'uri': 'https://code.ros.org/svn/ros-pkg/stacks/common_msgs/trunk'}}
Continue(y/n): y
Overwriting /tmp/rosws_tutorial/.rosinstall
Config changed, remember to run 'rosws update common_msgs' to update the folder from svn
The command by default tells you what it thinks you have meant, which is generally useful if the workspaces become larger. You can just confirm.
rosws info
again shows the current state of your workspace.
We will go ahead and check this stack out, as it is fairly small it should not take too long.
Pulling entries¶
$ rosws update common_msgs
[common_msgs] Installing https://code.ros.org/svn/ros-pkg/stacks/common_msgs/trunk (None) to /tmp/rosws_tutorial/common_msgs
[common_msgs] Done.
$ ls
common_msgs/ setup.bash setup.sh setup.zsh
Note
You can also at any time update all your workspace trees just using rosws update
You can now see that the repository was checked out, also using rosws info
:
$ ls -a
./ ../ common_msgs/ .rosinstall .rosinstall.bak setup.bash setup.sh setup.zsh
$ rosws info
Localname S SCM Version-Spec UID (Spec) URI (Spec) (https://...)
--------- - ---- ------------ ----------- -------------------------
common_msgs svn trunk -r39122 code.ros.org/svn/ros-pkg/stacks/common_msgs/
...
You see now the UID (Spec) column contains your current revision. If you see a different revision number, that is okay.
We can play with that a bit:
$ svn update common_msgs -r PREV
...
$ rosws info
Localname S SCM Version-Spec UID (Spec) URI (Spec) (https://...)
--------- - ---- ------------ ----------- -------------------------
common_msgs svn trunk -r38989 code.ros.org/svn/ros-pkg/stacks/common_msgs/
...
You should notice that for you, the revision number should have
changed as well. We needed use the svn
command here because we
changed the common_msgs
version without changes to the .rosinstall
file.
Setting entry versions:¶
Let’s say you want to stay with one revision for some time, we can specify a revision like this:
$ rosws set common_msgs --version=-r38935
Change element from:
{'svn': {'local-name': 'common_msgs', 'uri': 'https://code.ros.org/svn/ros-pkg/stacks/common_msgs/trunk'}}
to
{'svn': {'local-name': 'common_msgs', 'version': '-r38935', 'uri': 'https://code.ros.org/svn/ros-pkg/stacks/common_msgs/trunk'}}
Continue(y/n): y
Overwriting /tmp/rosws_tutorial/.rosinstall
Config changed, remember to run 'rosws update common_msgs' to update the folder from svn
Again you see the tool asks you to confirm.
$ rosws info
Localname S SCM Version-Spec UID (Spec) URI (Spec) (https://...)
--------- - ---- ------------ ----------- -------------------------
common_msgs V svn trunk -r39028 (-r38935) code.ros.org/svn/ros-pkg/stacks/common_msgs/
What you see now in the output of rosws info in the UID column is two numbers.
The first is current revision, the second is what is now stated in your .rosinstall.
Also notice the Status column S
now shows a V
. This indicates some
specification mismatch, and it is the quick way to see whether your filesystem
matches what is given in your .rosinstall.
To clean this up, you could now set the value to the actual value, or
run rosws update
to update to the version in the spec, or remove
the version spec. We will do the latter using the set command:
$ rosws set common_msgs --version=""
Change element from:
{'svn': {'local-name': 'common_msgs', 'version': '-r38935', 'uri': 'https://code.ros.org/svn/ros-pkg/stacks/common_msgs/trunk'}}
to
{'svn': {'local-name': 'common_msgs', 'version': '', 'uri': 'https://code.ros.org/svn/ros-pkg/stacks/common_msgs/trunk'}}
Continue(y/n): y
Overwriting /tmp/rosws_tutorial/.rosinstall
Config changed, remember to run 'rosws update common_msgs' to update the folder from svn
Diff and Status:¶
The rosws command also allows to produce diff and status output for the supported SCMs. To see that, we need to change a file.
$ echo '# foo' >> common_msgs/CMakeLists.txt
$ rosws status common_msgs
M common_msgs/CMakeLists.txt
$ rosws diff common_msgs
Index: common_msgs/CMakeLists.txt
===================================================================
--- common_msgs/CMakeLists.txt (revision 39028)
+++ common_msgs/CMakeLists.txt (working copy)
@@ -26,3 +26,4 @@
install(FILES stack.xml stack.yaml
DESTINATION share/common_msgs)
+# foo
$ rosws info
Localname S SCM Version-Spec UID (Spec) URI (Spec) (https://...)
--------- - ---- ------------ ----------- -------------------------
common_msgs M svn trunk -r39028 code.ros.org/svn/ros-pkg/stacks/common_msgs
You can pass multiple folder names to rosws diff and status, or pass
none, and it will accumulate the outputs for all trees. Also note how
the status column in rosws info
now shows an M
for modified.
Detaching Entries¶
Detached entries have no SCM information associated, running update with them will not affect them. You can detach our common_msgs entry using the set command:
$ rosws set common_msgs --detached
Change element from:
{'svn': {'local-name': 'common_msgs', 'uri': 'https://code.ros.org/svn/ros-pkg/stacks/common_msgs/trunk'}}
to
{'other': {'local-name': 'common_msgs'}}
Continue(y/n): y
Overwriting /tmp/rosws_tutorial/.rosinstall
Removing entries¶
Finally you may sometimes want to remove entries from your workspace,
there is the remove
command for that:
$ rosws remove common_msgs
Overwriting /tmp/rosws_tutorial/.rosinstall
Removed entries ['common_msgs']
Updating many¶
Doing several SCM actions at a time can be very time-consuming, and we
can gain a lot of time by doing the work in parallel. rosws
allows to
checkout or update entries in parallel as well:
Here is how to generate a snapshot for one or more entries. We first extend our workspace again:
$ rosws set geometry https://kforge.ros.org/geometry/geometry --hg --version=geometry-1.6.1
$ rosws set common_msgs https://code.ros.org/svn/ros-pkg/stacks/common_msgs/trunk --svn
$ rosws update --parallel=2
-j=2
is a shorter version of that option.
The default for rosws is not to do parallel work because checking out
or updating both may require user interaction, which can get confusing
with many threads running at the same time.
Getting the most out of info¶
Advanced users may want to look at bit more at the info command options.
Then we can print the info e.g. of just geometry as yaml or store it in a file:
$ rosws info geometry --yaml > geometry-1.6.1.rosinstall
Another interesting feature for scripters is the --only
option:
$ rosws info --only=path,cur_revision
/opt/ros/fuerte/share/ros,
/opt/ros/fuerte/share,
/opt/ros/fuerte/stacks,
/opt/ros/fuerte/setup.sh,
/tmp/rosws_tutorial/common_msgs,-r39123
/tmp/rosws_tutorial/geometry,53a0d9160982
This yields a CSV representation of the columns you gave, in this case retrieving from SCM providers the current revision id.
Adding ROS to workspace¶
If you want to make your workspace a ROS workspace, you will need to do two things:
- Manually add core ros stacks to your .rosinstall (copy and paste from /opt/ros/<distro>/.rosinstall to the TOP of your local .rosinstall file)
- regenerate your setup.* files by calling
rosws regenerate
Cleanup workspace¶
The tutorial ends here, what you can do is deleting the workspace folder:
$ rm -rf /tmp/rosws_tutorial