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!