I recall that one of the highlights of Diamondback was to have separated the "GUI vs. non-GUI" components. While I think this was achieved to a degree*, it seems there is still a long way to go even in Fuerte. For example, many packages depend on TF, which is clearly not a GUI-only thing. But the TF stack (and hence the Debian package that many people will install to get it) has dependencies that bring in a lot of GUI related stuff. Fonts, even (note ttf-dejavu-core
in the apt-get output below).
For those of us whose robots are headless, with limited hard drive space, and/or have to download package updates over a slower connection, all these X related packages are undesirable overhead. I doubt I'm alone in having such concerns (though admittedly I'm likely in the minority).
Of course I could file a ticket for the specific problem with geometry/tf but it seems to me that this issue is something that occurs in many of the core stacks/packages. Is this something that could be made once again an area of focus for the upcoming Groovy release?
* To what degree is debatable--the diamondback wiki page mentions the navigation stack as an example of lighter dependencies. But navigation
still depends on geometry
...
Here is what my system wants me to install in order to use the TF library:
$ sudo apt-get install ros-fuerte-geometry
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
build-essential dpkg-dev fontconfig fontconfig-config fonts-liberation freeglut3 freeglut3-dev graphviz libalgorithm-diff-perl
libalgorithm-diff-xs-perl libalgorithm-merge-perl libblas3gf libcairo2 libcdt4 libcgraph5 libcppunit-1.12-1 libcppunit-dev
libdatrie1 libdb4.8 libdpkg-perl libdrm-dev libeigen3-dev libfontconfig1 libgd2-noxpm libgfortran3 libgl1-mesa-dev
libgl1-mesa-glx libglapi-mesa libglu1-mesa libglu1-mesa-dev libgraph4 libgvc5 libgvpr1 libice-dev libjpeg-turbo8 libjpeg8 libkms1
liblapack3gf libneon27-gnutls libpango1.0-0 libpathplan4 libpthread-stubs0 libpthread-stubs0-dev libsm-dev libsvn1 libthai-data
libthai0 libx11-dev libx11-doc libx11-xcb1 libxau-dev libxcb-glx0 libxcb-render0 libxcb-shm0 libxcb1-dev libxdmcp-dev libxext-dev
libxft2 libxt-dev libxxf86vm1 mesa-common-dev python-numpy python-sip python-sip-dev ros-fuerte-bullet ros-fuerte-common-rosdeps
ros-fuerte-orocos-kinematics-dynamics subversion ttf-dejavu-core ttf-liberation x11proto-core-dev x11proto-input-dev
x11proto-kb-dev x11proto-xext-dev xorg-sgml-doctools xtrans-dev
Suggested packages:
debian-keyring gsfonts graphviz-doc libqttestrunner1c2a libcppunit-doc libeigen3-doc libgd-tools ttf-baekmuk ttf-arphic-gbsn00lp
ttf-arphic-bsmi00lp ttf-arphic-gkai00mp ttf-arphic-bkai00mp libxcb-doc python-numpy-doc python-numpy-dbg gfortran python-sip-doc
subversion-tools db4.8-util
The following NEW packages will be installed:
build-essential dpkg-dev fontconfig fontconfig-config fonts-liberation freeglut3 freeglut3-dev graphviz libalgorithm-diff-perl
libalgorithm-diff-xs-perl libalgorithm-merge-perl libblas3gf libcairo2 libcdt4 libcgraph5 libcppunit-1.12-1 libcppunit-dev
libdatrie1 libdb4.8 libdpkg-perl libdrm-dev libeigen3-dev libfontconfig1 libgd2-noxpm libgfortran3 libgl1-mesa-dev
libgl1-mesa-glx libglapi-mesa libglu1-mesa libglu1-mesa-dev libgraph4 libgvc5 libgvpr1 libice-dev libjpeg-turbo8 libjpeg8 libkms1
liblapack3gf libneon27-gnutls libpango1.0-0 libpathplan4 libpthread-stubs0 libpthread-stubs0-dev libsm-dev libsvn1 libthai-data
libthai0 libx11-dev libx11-doc libx11-xcb1 libxau-dev libxcb-glx0 libxcb-render0 libxcb-shm0 libxcb1-dev libxdmcp-dev libxext-dev
libxft2 libxt-dev libxxf86vm1 mesa-common-dev python-numpy python-sip python-sip-dev ros-fuerte-bullet ros-fuerte-common-rosdeps
ros-fuerte-geometry ros-fuerte-orocos-kinematics-dynamics subversion ttf-dejavu-core ttf-liberation x11proto-core-dev
x11proto-input-dev x11proto-kb-dev x11proto-xext-dev xorg-sgml-doctools xtrans-dev
0 upgraded, 77 newly installed, 0 to remove and 0 not upgraded.
Need to get 32.4 MB of archives.
After this operation, 107 MB of additional disk space will be used.
UPDATE: It looks like groovy resolves this problem, yay!:
$ sudo apt-get install ros-groovy-tf
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
libunique-1.0-0 libopencv-imgproc2.3 gstreamer0.10-fluendo-mp3:i386 python-pygoocanvas libopencv-objdetect2.3 libopencv-calib3d2.3
libopencv-features2d2.3 libgoocanvas3 libopencv-core2.3 libmatecorba libopencv-flann2.3 openshot-doc libgoocanvas-common liboil0.3:i386
libopencv-highgui2.3
Use 'apt-get autoremove' to remove them.
The following extra packages will be installed:
ros-groovy-geometry-msgs ros-groovy-sensor-msgs
The following NEW packages will be installed:
ros-groovy-geometry-msgs ros-groovy-sensor-msgs ros-groovy-tf
0 upgraded, 3 newly installed, 0 to remove and 7 not upgraded.
Need to get 684 kB of archives.
After this operation, 3,352 kB of additional disk space will be used.
$ sudo apt-get install ros-groovy-geometry
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
libunique-1.0-0 libopencv-imgproc2.3 gstreamer0.10-fluendo-mp3:i386 python-pygoocanvas libopencv-objdetect2.3 libopencv-calib3d2.3
libopencv-features2d2.3 libgoocanvas3 libopencv-core2.3 libmatecorba libopencv-flann2.3 openshot-doc libgoocanvas-common liboil0.3:i386
libopencv-highgui2.3
Use 'apt-get autoremove' to remove them.
The following extra packages will be installed:
ros-groovy-angles ros-groovy-eigen-conversions ros-groovy-geometry-msgs ros-groovy-kdl-conversions ros-groovy-orocos-kdl
ros-groovy-sensor-msgs ros-groovy-tf ros-groovy-tf-conversions
The following NEW packages will be installed:
ros-groovy-angles ros-groovy-eigen-conversions ros-groovy-geometry ros-groovy-geometry-msgs ros-groovy-kdl-conversions
ros-groovy-orocos-kdl ros-groovy-sensor-msgs ros-groovy-tf ros-groovy-tf-conversions
0 upgraded, 9 newly installed, 0 to remove and 7 not upgraded.
Need to get 1,131 kB of archives.
After this operation, 5,473 kB of additional disk space will be used.
$ sudo apt-get install ros-groovy-geometry-visualization
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
libunique-1.0-0 libopencv-imgproc2.3 gstreamer0.10-fluendo-mp3:i386 python-pygoocanvas libopencv-objdetect2.3 libopencv-calib3d2.3
libopencv-features2d2.3 libgoocanvas3 libopencv-core2.3 libmatecorba libopencv-flann2.3 openshot-doc libgoocanvas-common liboil0.3:i386
libopencv-highgui2.3
Use 'apt-get autoremove' to remove them.
The following extra packages will be installed:
ros-groovy-actionlib ros-groovy-actionlib-msgs ros-groovy-angles ros-groovy-bullet ros-groovy-common-msgs ros-groovy-common-rosdeps
ros-groovy-diagnostic-msgs ros-groovy-eigen-conversions ros-groovy-geometry ros-groovy-geometry-experimental ros-groovy-geometry-msgs
ros-groovy-kdl-conversions ros-groovy-nav-msgs ros-groovy-orocos-kdl ros-groovy-orocos-kinematics-dynamics ros-groovy-rx
ros-groovy-rxbag ros-groovy-rxgraph ros-groovy-rxtools ros-groovy-sensor-msgs ros-groovy-shape-msgs ros-groovy-stereo-msgs
ros-groovy-swig-wx ros-groovy-tf ros-groovy-tf-conversions ros-groovy-trajectory-msgs ros-groovy-visualization-msgs
ros-groovy-wxpython-swig-interface ros-groovy-xdot
The following NEW packages will be installed:
ros-groovy-actionlib ros-groovy-actionlib-msgs ros-groovy-angles ros-groovy-bullet ros-groovy-common-msgs ros-groovy-common-rosdeps
ros-groovy-diagnostic-msgs ros-groovy-eigen-conversions ros-groovy-geometry ros-groovy-geometry-experimental ros-groovy-geometry-msgs
ros-groovy-geometry-visualization ros-groovy-kdl-conversions ros-groovy-nav-msgs ros-groovy-orocos-kdl
ros-groovy-orocos-kinematics-dynamics ros-groovy-rx ros-groovy-rxbag ros-groovy-rxgraph ros-groovy-rxtools ros-groovy-sensor-msgs
ros-groovy-shape-msgs ros-groovy-stereo-msgs ros-groovy-swig-wx ros-groovy-tf ros-groovy-tf-conversions ros-groovy-trajectory-msgs
ros-groovy-visualization-msgs ros-groovy-wxpython-swig-interface ros-groovy-xdot
0 upgraded, 30 newly installed, 0 to remove and 7 not upgraded.
Need to get 11.8 MB of archives.
After this operation, 51.0 MB of additional disk space will be used.
Originally posted by Patrick Bouffard on ROS Answers with karma: 2264 on 2012-05-06
Post score: 6
Original comments
Comment by Eric Perko on 2012-05-06:
A lot of this is probably due to view_frames using graphviz to generate the TF tree...
Comment by joq on 2012-05-06:
I agree this is a problem. Let's open an enhancement ticket.
Comment by Patrick Bouffard on 2012-05-07:
@Eric Perko, yes I think view_frames is the primary culprit in the case of tf. But I think a lot of dependencies get brought in because of tf_conversions as well. @joq: I can certainly open a ticket against geometry but what I'd really like to hear is how to get this looked at generally for Groovy.
Comment by Eric Perko on 2012-05-07:
@Patrick Bouffard: This type of thing is probably a good topic for one of the Groovy SIGs (which may not have started forming yet). Also, it looks like the tf_conversions are pretty light (besides tf which has that graphviz dependency), only needing tf, Eigen, geometry_msgs and KDL.
Comment by joq on 2012-05-07:
+1 on the SIG approach. It's about time for Groovy SIGs to form, now. Not so clear which group should focus on it, though. Do we need a packaging SIG?
Comment by Eric Perko on 2012-05-07:
Perhaps... really it seems this should have been taken care of already in Electric. See http://ros.org/reps/rep-0113.html . It notes that the robot variant may not have any GUI dependencies, but clearly geometry (which is part of the robot variant) does.
Comment by Eric Perko on 2012-05-07:
Maybe a packaging/infrastructure SIG could put some rules into the deb builders to throw errors if something that is part of the robot variant depends on some set of GUI packages like x11 or OpenGL related things... Sort of a transitive dependency deb blacklist that would prevent a build w/ GUI stuf
Comment by joq on 2012-05-07:
I wonder how widespread this problem is. Is geometry an abnormal example? The geometry2 sources look cleaner: https://kforge.ros.org/geometry/experimental
Comment by Patrick Bouffard on 2012-05-07:
Another example is dynamic_reconfigure which has a rosdep on wxpython needed by reconfigure_gui which in turn brings in a bunch of stuff including fonts, etc. In a multi-machine setup, the robot should only require what is needed to expose the dynamic reconfig server..
Comment by joq on 2012-05-07:
Good point. That falls under the drivers SIG. I'll open a ticket and try to get it fixed in Groovy. We definitely want to avoid unnecessary dependencies in the drivers: https://kforge.ros.org/dynamicreconfig/trac/ticket/3
Comment by Patrick Bouffard on 2012-05-08:
Ticket for geometry (tf): https://code.ros.org/trac/ros-pkg/ticket/5439. I think a packaging SIG would be a good idea; even if it only resulted in, say, a REP capturing best practices that would be a step forward.
Comment by Patrick Bouffard on 2012-05-08:
Also, maybe starting to get a bit OT but: For binary installs it seems that the headers-only boost library is a dependency of a lot of things, which doesn't really make sense. Has there ever been talk of marking certain dependencies "build-only"? Maybe another SIG topic..?
Comment by joq on 2012-05-08:
I recall having the "build-time" vs "run-time" dependency discussion long ago. At that time it was too big a hit to the build system. Maybe the catkin tools could handle it better, now.
Comment by joq on 2012-05-15:
Instead of a special-purpose SIG, I propose that the drivers SIG work on fixing the geometry and dynamic reconfigure problems: http://www.ros.org/wiki/groovy/Planning/Drivers#Proposed_new_features