quinta-feira, 14 de janeiro de 2016

Player/Stage no Ubuntu 15.04

Descontinuado frente a ferramentas mais novas, melhores e mais eficientes para robótica, o famoso framework Player/Stage foi sendo gradativamente abandonado e até ser relegado quase ao esquecimento.
Como esperado, qualquer software que não tem manutenção e fica sem atualizações torna-se sistematicaticamente incompatível com as novas versões das APIs e libraries de quem depende. Assim, fazê-lo funcionar em um ambiente mais atual requer um pouco de trabalho.
Este post tem o objetivo de fornecer os passos necessários para fazer essas ferramentas rodarem novamente no Ubuntu 15.04 com o OpenCV 3.0.0


OpenCV 3.0.0


Várias mudanças ocorreram desde a versão 2.4.X com a qual o Player era compatível, inclusive algumas das funções que ele usa se tornaram deprecated. Entre elas estão o cvQueryHistValue_1D e o cvCvtPixToPlane, necessários ao blobfinder do Player.
Instale o OpenCV normalmente, baixando o fonte do site e compilando-o na sua máquina.


Player piece


Com o OpenCV já instalado, podermos seguir para a instalação do Player. A última versão (3.0.2) foi disponbilizada em 2010 e pode ser baixada pelo Sourceforge.
Descompacte o arquivo e coloque-o no local padrão dos fontes no Linux
$ cd ~/Downloads
$ tar zxvf player-3.0.2.tar.gz
$ sudo mv player-3.0.2 /usr/local/src/
Crie um diretório build para organizar o processo e configure os parâmetros para a compilação
$ cd /usr/local/src/player-3.0.2
$ mkdir build
$ cd build
$ cmake ../


Corrigindo os problemas relacionados ao OpenCV


Antes de compilar, precisaremos fazer algumas modificações no código fonte para torná-lo compatível com as novas versões do OpenCV e da ZLib.
Edite o arquivo shapetracker.cc localizado em /usr/local/src/player-3.0.2/server/drivers/blobfinder/shapetracker e acrescente uma nova linha para incluir a biblioteca de compatibilidades entre as versões do OpenCV.
Logo após as linhas:
(50) #include <libplayercore/playercore.h>
(51) #include <base/imagebase.h>
(52)
(53) #include <cv.h>
Acrescente:
(54) #include <opencv2/legacy/compat.hpp>
Isso resolverá os problemas de compatibilidades com o OpenCV!


Corrigindo os problemas relacionados a ZLib


O mesmo ocorreu com a biblioteca ZLib a partir da versão 1.2.5, tornando necessário especificar o tipo de ponteiro de arquivo (casting) durante as chamadas as funções gzseek e gzgets.
Edite o arquivo readlog.cc localizado em /usr/local/src/player-3.0.2/server/drivers/shell, alteranado as linhas:
ret = gzseek(this->file,0,SEEK_SET);
por 
ret = gzseek((gzFile)this->file,0,SEEK_SET);
e também
ret = (gzgets(this->file, this->line, this->line_size) == NULL);
por
ret = (gzgets((gzFile)this->file, this->line, this->line_size) == NULL);
Feito isso, problema resolvido!


Compilando o Player


Acesse a pasta build criada anteriormente e compile:
$ cd /usr/local/src/player-3.0.2/build
$ make
Salvo qualquer problema inesperado (tal como algum problema com a libboost no meu caso :'( ou uma eventual incompativilidade de versão com o seu sistema em particular) é esperado que o player compile sem qualquer erro ... embora apareçam diversos alertas (warnings).

No meu sistema estou usando a versão 1.59.0 da Boost, compilada e instalada manualmente. Embora todos os arquivos estejam disponíveis e estejam sendo encontrados para a linkedição, parece que a configuração do cmaker do Player ignorou a necessidade de libboost_system no processo de construção dos exemplos.
Mais uma vez, precisamos acertar isso para que a compilação possa ser concluida corretamente. Deste modo, teremos que fazer a inclusão deste parâmetro manualmente, alterando o conteúdo do arquivo link.txt em vários diretórios diferentes (isto é, para cada um dos executáveis que tenham esta lib como dependência).

O processo é sempre o mesmo, ou seja, acrescentar -lboost_system ao final da linha juntamente com as demais bibliotecas que estão sendo ligadas ao executável em questão. Faça isso para o arquivo link.txt em cada uma das seguintes pastas:
/build/examples/libplayerc++/CMakeFiles/camera.dir
/build/examples/libplayerc++/CMakeFiles/clientgraphics.dir
/build/examples/libplayerc++/CMakeFiles/clientgraphics3d.dir
/build/examples/libplayerc++/CMakeFiles/example0.dir
/build/examples/libplayerc++/CMakeFiles/example1.dir
/build/examples/libplayerc++/CMakeFiles/example2.dir
/build/examples/libplayerc++/CMakeFiles/example3.dir
/build/examples/libplayerc++/CMakeFiles/example4.dir
/build/examples/libplayerc++/CMakeFiles/goto.dir
/build/examples/libplayerc++/CMakeFiles/grip.dir
/build/examples/libplayerc++/CMakeFiles/laserobstacleavoid.dir
/build/examples/libplayerc++/CMakeFiles/ptz
.dir
/build/examples/libplayerc++/CMakeFiles/
randomwalk.dir
/build/examples/libplayerc++/CMakeFiles/sonarobstacleavoid.dir
/build/examples/libplayerc++/CMakeFiles/speech_cpp_client
.dir
/build/examples/libplayerc++/CMakeFiles/speech
.dir
/build/examples/libplayerc++/CMakeFiles/wallfollow
.dir
/build/utils/playerjoy/CMakeFiles/playerjoy.dir
/build/utils/playerprint/CMakeFiles/playerprint.dir
/build/utils/playerprop/CMakeFiles/playerprop.dir


Agora é (só) terminar a compilação e instalar
$ cd /usr/local/src/player-3.0.2
$ cd build
$ make
$ sudo make install


That's it!

terça-feira, 1 de novembro de 2011

OpenCV 2.3.1 + OpenNI no Ubuntu 11.10

A versão mais recente do OpenCV (até o momento em que esse post foi escrito) pode ser encontrada no site do sourceforge e pode ser baixada com o seguinte comando:
$ wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.3.1/OpenCV-2.3.1a.tar.bz2


Para extrair o pacote com os fontes, execute:
$ tar -jxvf OpenCV-2.3.1a.tar.bz2

Tenho o hábito de deixar todos os fontes de pacotes que instalo manualmente no diretório /usr/local/src, então vamos mover todo o conteúdo do pacote extraído no diretório corrente para nosso local de preferência
$ sudo mv OpenCV-2.3.1 /usr/local/src/

Recomendo criar um novo diretório para abrigar tanto os arquivos de configuração quando os que forem produzidos pela compilação. Assim, crie um novo diretório chamado build e mova-se para lá:
$ mkdir build
$ cd build

Bom, precisamos instalar alguns pacotes que são dependências para a compilação desta versão do OpenCV no Ubuntu 11.10. Para isso, execute:
$ sudo apt-get install ffmpeg libavcodec53 libavdevice53 libavfilter2 libavformat53 libavutil51 libdc1394-22 libgsm1 libpostproc52 libschroedinger-1.0-0 libswscale2 libva1

Há ainda outras dependências que também precisam ser instaladas e que irão gerar uma lista de outras sub-dependências. Listei os três pacotes necessários ao OpenCV e logo abaixo deles, uma lista dos pacotes que estes irão requerer:

→ llibgtk2.0-dev
debhelper gettext html2text intltool-debian libatk1.0-dev libcairo-script-interpreter2 libcairo2-dev libexpat1-dev libfontconfig1-dev libfreetype6-dev libgdk-pixbuf2.0-dev libglib2.0-dev libgtk2.0-dev libmail-sendmail-perl libpango1.0-dev libpixman-1-dev libpng12-dev libsys-hostname-long-perl libunistring0 libxcb-render0-dev libxcb-shm0-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxext-dev libxfixes-dev libxft-dev libxi-dev libxinerama-dev libxml2-utils libxrandr-dev libxrender-dev po-debconf x11proto-composite-dev x11proto-damage-dev x11proto-fixes-dev x11proto-randr-dev x11proto-render-dev x11proto-xext-dev x11proto-xinerama-dev zlib1g-dev

→ libgstreamer0.10-dev
gir1.2-gstreamer-0.10 libgstreamer0.10-dev libxml2-dev

→ libgstreamermm-0.10-dev
gir1.2-gst-plugins-base-0.10 libglibmm-2.4-dev libgstreamer-plugins-base0.10-dev libgstreamermm-0.10-2 libgstreamermm-0.10-dev libsigc++-2.0-dev libxml++2.6-2 libxml++2.6-dev

→ libdc1394-22-dev
libdc1394-22-dev libraw1394-dev

→ libjpeg62-dev

→ libtiff4-dev
libtiff4-dev libtiffxx0c2

→ libv4l-dev

→ openni-dev ps-engine
freeglut3 openni-dev ps-engine

Assim, execute o comando a seguir e confirme a instalação dos pacotes adicionais que o apt-get sugerir como necessários.
$ sudo apt-get install libgtk2.0-dev libgstreamer0.10-dev libgstreamermm-0.10-dev libdc1394-22-dev libjpeg62-dev libtiff4-dev libv4l-dev openni-dev ps-engine



Por razão do OpenCV utilizar alguns dos recursos mais recentes do FFmpeg, precisaremos instalar  a versão 0.8.5 do FFmpeg manualmente.


Tal qual qualquer outro, baixe, compile e instale o pacote ffmpeg 0.8.5 realizando a sequencia abaixo:
$ wget http://ffmpeg.org/releases/ffmpeg-0.8.5.tar.bz2
$ tar -xvf ffmpeg-0.8.5.tar.bz2
$ sudo mv ffmpeg-0.8.5 /usr/local/src
$ cd /usr/local/src/ffmpeg-0.8.5
$ ./configure --disable-yasm
$ make
$ sudo make install

Agora podemos concluir a instalação pois todas as dependências foram satisfeitas. Certifique-se que depois disto tudo vc esteja no diretório build que havíamos criado lá no início.

Se desejar dispor dos exemplos e do suporte para o OpenNI (framework para trabalhar com o kinect) é necessário ativar duas opções que estão em OFF por padrão. Proceda da seguinte maneira:
$ ccmake ..
Mude as opções BUILD_EXAMPLES e WITH_OPENNI para “ON”
Pressione [c] para criar o arquivo de configuração do CMake e em seguida [q] para sair.

Caso contrário, simplesmente configure usando o comando cmake
$ cmake ..

Pronto! Podemos compilar e instalar o pacote, digitando os comandos a seguir:
$ make
$ sudo make install

Após instalados, os arquivos estarão distribuídos nos seguintes diretórios:
Executáveis em /usr/local/bin
Headers em /usr/local/include/opencv e /usr/local/include/opencv2
Libraries em /usr/local/lib
Documentação em /usr/local/share/OpenCV/doc
Exemplos em /usr/local/share/opencv/samples

Enjoy! :D