2014-02-20

Getting started with V-Rep with Octave on Ubuntu for AMRx

This edX Autonomous Mobile Robots course started last week, and the V-Rep simulator with an octave/Matlab interface is going to be a big part of the optional exercises for the course.  There is a free temporary license available for Matlab, but I don't like installing proprietary binaries on my Linux system, especially temporarily (Linux and Ubuntu really needs a standard way of installing applications into per-user directories that don't require system root).  So I'm trying out the Octave route.

Octave 3.6.2 is available as a standard package for my Ubuntu 12.10 install, but didn't work initially with the AMRx exercise 1 test scripts, so I had to build my own remApi.oct.




Building remApi.oct

Get the mkoct binary for octave:

sudo apt-get install octave-pkg-dev

There is a file in the vrep tar ball to run within octave:

V-REP_PRO_EDU_V3_1_0_64_Linux/programming/remoteApiBindings/octave/buildLin.m

It needs some setup first, which is documented within it:

cd V-REP_PRO_EDU_V3_1_0_64_Linux/programming/remoteApiBindings/octave/
cp ../../remoteApi/* .
cp ../../include/* .
octave
octave:4> buildLin

extApiPlatform.c: In function ‘extApi_readFile’:
extApiPlatform.c:222:8: warning: ignoring return value of ‘fread’, declared with attribute warn_unused_result [-Wunused-result]
remApi.cc: In function ‘octave_value_list FsimxAddStatusbarMessage(const octave_value_list&, int)’:
remApi.cc:161:35: warning: ‘octave_value::octave_value(const charNDArray&, bool, char)’ is deprecated (declared at /usr/include/octave-3.6.2/octave/../octave/ov.h:237) [-Wdeprecated-declarations]
remApi.cc: In function ‘octave_value_list FsimxCopyPasteObjects(const octave_value_list&, int)’:
...
remApi.cc:2834:31: warning: ‘void Array<T>::resize(octave_idx_type) [with T = float; octave_idx_type = int]’ is deprecated (declared at /usr/include/octave-3.6.2/octave/../octave/Array.h:459) [-Wdeprecated-declarations]
remApi.cc: In function ‘octave_value_list FsimxUnpackInts(const octave_value_list&, int)’:
remApi.cc:2856:29: warning: ‘void Array<T>::resize(octave_idx_type) [with T = octave_int<int>; octave_idx_type = int]’ is deprecated (declared at /usr/include/octave-3.6.2/octave/../octave/Array.h:459) [-Wdeprecated-declarations]

octave:4> exit

cp remApi.oct ~/own/edx_amrx/exercise1/code/common/libs/octave/linuxLibrary64Bit

cd ~/own/edx_amrx/exercise1/code/common/vrep

octave

octave:1> test

And it works!  The connection from octave to the running V-REP is established, and then the script commands the simulation to start and then stops soon after.

Annoyances


The edX platform has some annoying quirks I've documented elsewhere.  But other than that it is pretty good.




V-REP is impressive also (coming from using Gazebo a great deal over the past six months), but has an annoying feature where a mouse right click can both rotate the view and open a context menu, the very first option is to close the 3D view window.  So it is very possible especially on a laptop trackpad to accidentally try to rotate but end up closing the window of the view that was to be rotated.


Debugging steps (not part of the solution)


The first thing I tried was to launch vrep.sh from the vrep tar ball, load the exercise 1 ttt scene, and then enter the exercise1/code/common/vrep/ directory, launch octave, and try to run test.m:

octave:2> conn = simulation_setup();
/home/lwalter/own/edx_amrx/exercise1/code/common/vrep/../libs/octave/linuxLibrary64Bit/remApi.oct
octave:3> robot_nb=0
robot_nb = 0
octave:4> conn = simulation_openConnection(conn, robot_nb )
error: simulation_openConnection: /home/lwalter/own/edx_amrx/exercise1/code/common/vrep/../libs/octave/linuxLibrary64Bit/remApi.oct: failed to load: liboctinterp.so: cannot open shared object file: No such file or directory
error: called from:
error:   /home/lwalter/own/edx_amrx/exercise1/code/common/vrep/simulation_openConnection.m at line 30, column 28

I have liboctinerp.so.1, but no liboctinterp.so, so in a user directory on my LD_LIBRARY_PATH I added links to it and other libraries that were subsequently not found:

ln -s /usr/lib/x86_64-linux-gnu/liboctinterp.so.1 ~/other/install/lib/liboctinterp.so
ln -s /usr/lib/x86_64-linux-gnu/liboctave.so.1 ~/other/install/lib/liboctave.so
ln -s /usr/lib/x86_64-linux-gnu/libcruft.so.1 ~/other/install/lib/libcruft.so

Update - on a 13.04 Ubuntu I built the remApi.oct first, these steps are unnecessary.

I tried test.m again and ran into this problem:

octave:3> connection = simulation_openConnection(connection, robotNb);
error: simulation_openConnection: /home/lwalter/own/edx_amrx/exercise1/code/common/vrep/../libs/octave/linuxLibrary64Bit/remApi.oct: failed to load: /home/lwalter/own/edx_amrx/exercise1/code/common/vrep/../libs/octave/linuxLibrary64Bit/remApi.oct: undefined symbol: _ZN5ArrayI12octave_valueED0Ev
error: called from:
error:   /home/lwalter/own/edx_amrx/exercise1/code/common/vrep/simulation_openConnection.m at line 30, column 28

I saw some references to being able to rebuild remApi.oct, so set out to do that next.



2014-02-05

Text-to-speech audio books with text image videos for youtube


Down and Out in the Magic Kingdom by Cory Doctorow has a very permissive license for reuse, so I've gone through the steps of making an audio book with images of the text and putting it on youtube:



To do this, the first thing was to download the text from the Cory Doctorow site:
http://craphound.com/down/Cory_Doctorow_-_Down_and_Out_in_the_Magic_Kingdom.txt

There are some issues with text encoding that I mostly plowed through though I suspect another process for conversion to UTF8 could have worked better.

First thing is to get rid of some ampersand hash forty fives that I think were dashes in vim:

:%s/&#45;//g

Also need to remove http://en.wikipedia.org/wiki/Specials_(Unicode_block) the U+FFFD unicode characters.

%s/\%uFFFD//g

Also replacing tabs with spaces turned out to be necessary.

Imagemagick wouldn't do automatic line breaks for me later in this process (though pango might have worked), so added linebreaks to keep lines under 80 characters was necessary:

fmt ../Cory_Doctorow_-_Down_and_Out_in_the_Magic_Kingdom.txt > ../Cory_Doctorow_-_Down_and_Out_in_the_Magic_Kingdom_line_breaks.txt  

There were still some odd question marks generated by convert in the text, I hand edit to get the worst one out- the one that would have appeared on the title of the book.

Next thing was to split the book at every blank line into roughly 1500 text files which will probably be short enough to show in a single image:

csplit -f down -b '%05d.txt' ../*.txt '/^$/' '{*}'

Next is the conversion of each of the split text files into HD png files

for i in *.txt; 
do convert -background black -fill white -size 1920x1080 -pointsize 45 -gravity center label:"$(<$i)" PNG8:"$i.png"; 
done

And then generate wave files from each of the 1500 text files:

for i in *txt;
do pico2wave -w $i.wav "$(<$i)"
done


Videos are then created from putting the png images together with the images, this part is very similar to the process in http://binarymillenium.com/2013/07/turn-set-of-mp3s-into-static-image.html

for i in *.txt; 
do avconv -loop 1 -r 1 -i "$i.png" -c:v libx264 -i "$i.wav" -c:a aac -b:a 32k -strict experimental -shortest "$i.mp4"; 
done

Some conversions result in 0 length mp4s with this error:
[buffer @ 0x8959e0] Invalid pixel format string '-1' , 
this turned out to be caused by some of the convert png images being 16-bit instead of 8-bit (why wasn't it consistent, most were 8-bit), but putting PNG8: into the convert command line fixed this.

Create a text file listing of all the mp4 files:

rm all_videos.txt 
for i in *mp4; 
do echo $i echo "file '$i'" >> all_videos.txt 
done

And concatenate all the mp4 files together into one giant 6 hour video with no recompression (only 500MB though):

mkdir output
avconv -f concat -i all_videos.txt -c copy output/down_and_out.mp4

For the first few minutes on youtube it looked like the video was all black instead of showing the titles, but a few minutes later this was fixed.

2014-02-03

Installing Full Desktop ROS Hydro from source on Ubuntu 13.10

Since there aren't any ROS packages for 13.10, I'm did a full catkin source install as specified in http://wiki.ros.org/hydro/Installation/Source. I'm also going to do a full gazebo 2.0 install from source in order to debug http://answers.gazebosim.org/question/5223/setting-projector-pose-vs-enclosing-link-pose/ .

As I understand it the proper use of catkin is to create a catkin workspace for all the standard ROS stuff, build and install it ( ./src/catkin/bin/catkin_make_isolated --install ) and then source the install setup.sh from that install ( source ~/ros_catkin_ws/install_isolated/setup.bash ) and then go on and create a new catkin workspace to actually do development in. Otherwise the build times will be ridiculous if catkin has to traverse 250 packages.


Gazebo


Since the core gazebo isn't a ros package (yet?) it ought to be built separately following the instructions on http://gazebosim.org/wiki/2.0/install .

I ran into this error near the end of the build:


[ 99%] Building CXX object interfaces/player/CMakeFiles/gazebo_player.dir/GazeboDriver.cc.o
In file included from /home/lwalter/other/gazebo_source/gazebo/interfaces/player/GazeboInterface.hh:26:0,
from /home/lwalter/other/gazebo_source/gazebo/interfaces/player/GazeboDriver.cc:25:
/home/lwalter/other/gazebo_source/gazebo/interfaces/player/player.h:22:38: fatal error: libplayercore/playercore.h: No such file or directory
#include <libplayercore/playercore.h>



So install libplayer-dev? No, that is a different player. I had libplayerc3.0-dev and libplayerc++3.0-dev installed already, and the file in question was located in /usr/include/player-3.0/libplayercore/playercore.h but gazebo wasn't seeing it.

I'm sure I could have done this cleaner, but I just hand-edited interfaces/player/CMakeLists.txt:


include_directories( /usr/include/player-3.0 ${SDF_INCLUDE_DIRS} ${PLAYER_INCLUDE_DIRS} ${OPENGL_INCLUDE_DIR} ${OGRE_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS})


I got a lot of these warnings but built 100% (haven't fully tested yet so they may yet cause problems):


/usr/bin/ld: warning: libboost_system.so.1.49.0, needed by /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libsdformat.so, may conflict with libboost_system.so.1.53.0

The post install bashrc instructions are not quite what is on the gazebo install page, I had to do this:


export DEST_DIR=/home/lwalter/other/install
export LD_LIBRARY_PATH=$DEST_DIR/lib/x86_64-linux-gnu/:$LD_LIBRARY_PATH


export PATH=$DEST_DIR/bin:$PATH
export PKG_CONFIG_PATH=PKG_CONFIG_PATH=$DEST_DIR/lib/x86_64-linux-gnu/pkgconfig:$DEST_DIR/lib/pkgconfig:$PKG_CONFIG_PATH

ROS


Something went wrong in the ros libstage package, it never generated a config.h from ros_catkin_ws/src/stage/config.h.in ( https://github.com/rtv/Stage/blob/master/config.h.in ) - possibly this was due to not having the environmental variables pointing at gazebo correctly.


[ 10%] Building CXX object libstage/CMakeFiles/stage.dir/gl.o[ 12%] Building CXX object libstage/CMakeFiles/stage.dir/logentry.o/home/lwalter/other/ros_catkin_ws/src/stage/libstage/file_manager.cc:5:45: fatal error: config.h: No such file or directory #include "config.h" // to get INSTALL_PREFIX ^compilation terminated.[ 14%] make[2]: *** [libstage/CMakeFiles/stage.dir/file_manager.o] Error 1make[2]: *** Waiting for unfinished jobs....Building CXX object libstage/CMakeFiles/stage.dir/model.o/home/lwalter/other/ros_catkin_ws/src/stage/libstage/model.cc:141:45: fatal error: config.h: No such file or directory #include "config.h" // for build-time config ^compilation terminated.make[2]: *** [libstage/CMakeFiles/stage.dir/model.o] Error 1make[1]: *** [libstage/CMakeFiles/stage.dir/all] Error 2make: *** [all] Error 2<== Failed to process package 'stage':
Command '/home/lwalter/other/ros_catkin_ws/install_isolated/env.sh make -j4 -l4' returned non-zero exit status 2
Reproduce this error by running:==> cd /home/lwalter/other/ros_catkin_ws/build_isolated/stage && /home/lwalter/other/ros_catkin_ws/install_isolated/env.sh make -j4 -l4

The really ugly hack solution is to create config.h by hand:


vi /home/lwalter/other/ros_catkin_ws/src/stage/libstage/config.h

#define INSTALL_PREFIX "/home/lwalter/other/install/"
#define PLUGIN_PATH "/home/lwalter/other/install/usr/local/lib"
#define VERSION "3.0.2"
#define PROJECT "Stage"


That much worked, though those values may cause problems later if not correct.


Telling ROS about Gazebo


(I didn't discover the gazebo bashrc instructions were wrong until after going through these steps, they probably aren't necessary)
==> cmake /home/lwalter/other/ros_catkin_ws/src/gazebo_plugins -...
CMake Error at CMakeLists.txt:40 (find_package):
By not providing "Findgazebo.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "gazebo", but CMake did not find one.
Could not find a package configuration file provided by "gazebo" with any of the following names:
gazeboConfig.cmake
gazebo-config.cmake
Add the installation prefix of "gazebo" to CMAKE_PREFIX_PATH or set "gazebo_DIR" to a directory containing one of the above files. If "gazebo" provides a separate development package or SDK, be sure it has been installed.
-- Configuring incomplete, errors occurred!
<== Failed to process package 'gazebo_plugins':

Command '/home/lwalter/other/ros_catkin_ws/install_isolated/env.sh cmake /home/lwalter/other/ros_catkin_ws/src/gazebo_plugins -DCATKIN_DEVEL_PREFIX=/home/lwalter/other/ros_catkin_ws/devel_isolated/gazebo_plugins -DCMAKE_INSTALL_PREFIX=/home/lwalter/other/ros_catkin_ws/install_isolated' returned non-zero exit status 1
Reproduce this error by running:
==> cd /home/lwalter/other/ros_catkin_ws/build_isolated/gazebo_plugins && /home/lwalter/other/ros_catkin_ws/install_isolated/env.sh cmake /home/lwalter/other/ros_catkin_ws/src/gazebo_plugins -DCATKIN_DEVEL_PREFIX=/home/lwalter/other/ros_catkin_ws/devel_isolated/gazebo_plugins -DCMAKE_INSTALL_PREFIX=/home/lwalter/other/ros_catkin_ws/install_isolated



Command failed, exiting.


It can't find gazebo, so run cmake-gui . in ros_catkin_ws/build_isolated/gazebo_plugins and set gazebo_DIR to

/home/lwalter/other/install/share/gazebo/cmake

SDFormat


Now it looks like the debian supplied sdfformat is conflicting with the one gazebo built, uninstall and rebuild the ros_caktin_ws



cd /home/lwalter/other/ros_catkin_ws/build_isolated/gazebo_plugins
cmake-gui .

SDFormat_DIR needs to be set to
/home/lwalter/other/install//lib/x86_64-linux-gnu/cmake/sdformat

Have to set the above for several packages.

RVIZ build problems with libshiboken



Linking CXX shared library /home/lwalter/other/ros_catkin_ws/devel_isolated/rviz/lib/libdefault_plugin.so
[ 95%] Built target default_plugin
make: *** [all] Error 2
<== Failed to process package 'rviz':
Command '/home/lwalter/other/ros_catkin_ws/install_isolated/env.sh make -j4 -l4' returned non-zero exit status 2
Reproduce this error by running:
==> cd /home/lwalter/other/ros_catkin_ws/build_isolated/rviz && /home/lwalter/other/ros_catkin_ws/install_isolated/env.sh make -j4 -l4



Investigate this with make VERBOSE=1


...
type 'QX11EmbedWidget' is specified in typesystem, but not defined. This could potentially lead to compilation errors.
Segmentation fault (core dumped)
make[2]: *** [src/python_bindings/shiboken/librviz_shiboken/librviz_shiboken_module_wrapper.cpp] Error 139
make[2]: Leaving directory `/home/lwalter/other/ros_catkin_ws/build_isolated/rviz'
make[1]: *** [src/python_bindings/shiboken/CMakeFiles/rviz_shiboken.dir/all] Error 2
make[1]: Leaving directory `/home/lwalter/other/ros_catkin_ws/build_isolated/rviz'
make: *** [all] Error 2
There is some discussion of probably the same issue at
https://aur.archlinux.org/packages/ros-hydro-rviz/

The solution seems to be to remove shiboken:

sudo apt-get remove libshiboken-dev

Cmake generates this new warning output:


Add the installation prefix of "GeneratorRunner" to CMAKE_PREFIX_PATH or
set "GeneratorRunner_DIR" to a directory containing one of the above files.
If "GeneratorRunner" provides a separate development package or SDK, be
sure it has been installed.
Call Stack (most recent call first):
src/python_bindings/shiboken/CMakeLists.txt:9 (include)
CMake Warning at /home/lwalter/other/ros_catkin_ws/install_isolated/share/python_qt_binding/cmake/shiboken_helper.cmake:41 (message):
Shiboken binding generator NOT available.
Call Stack (most recent call first):
src/python_bindings/shiboken/CMakeLists.txt:9 (include)
SIP binding generator available.
Python binding generators: sip
Configuring done


But the pacckages all build and install now.

Misc


Next try out building the catkin workspace with the projects I'm working on, the first thing missing appears to be the joy package, so clone it and rerun the catkin make install in the main ros catkin ws:

git clone https://github.com/ros-drivers/joystick_drivers.git
sudo apt-get install libusb-dev libspnav-dev


What I don't understand about re-running ./src/catkin/bin/catkin_make_isolated --install is how much stuff has to be re-done even when nothing or very little has changed.  Object files are correctly recognized as already compiled, but something high level gets dirtied and many shared libraries and scripts have to be rerun to presumably generate the exact same output files that were already generated.