Procedemos exactamente igual que enla instalacion del Player-2.1.2, es decir.
Actualizamos el SO
Descargamos la vesion 2.1.1 del Player desde la pagina oficial del proyecto. Lo descomprimimos, accedemos a la carpeta creada y hacemos lo siguiente para empezar con la instalación.
$ ./configure
$ sudo make install
y nos da un problema:
lms400_cola.cc: In member function ‘int lms400_cola::Disconnect()’:
lms400_cola.cc:61: error: ‘close’ no se declaró en este ámbito
lms400_cola.cc: In member function ‘player_laser_data_t lms400_cola::ReadMeasurement()’:
lms400_cola.cc:377: error: ‘read’ no se declaró en este ámbito
lms400_cola.cc: In member function ‘int lms400_cola::SendCommand(const char*)’:
lms400_cola.cc:491: error: ‘write’ no se declaró en este ámbito
lms400_cola.cc: In member function ‘int lms400_cola::ReadResult()’:
lms400_cola.cc:504: error: ‘read’ no se declaró en este ámbito
Parece ser que no somos los únicos a los que les ha salido esto, así que después de haber hecho una pequeña investigación por Internet, llegamos a esta página que nos dice la solución.
http://sourceforge.net/tracker/?func=detail&atid=433164&aid=2152155&group_id=42445
http://playerstage.svn.sourceforge.net/viewvc/playerstage/code/player/branches/release-2-1-patches/server/drivers/laser/lms400_cola.cc?r1=6499&r2=6738
tenemos que acceder al directorio:
$ cd /home/aaronmr/Escritorio/player-2.1.1/server/drivers/laser/
y editar el fichero lms400_cola.cc e insertar la siguiente línea que la pongo en negrita para que destaque.
$ vim lms400_cola.cc
/*
Desc: Driver for the SICK LMS400 unit
Author: Nico Blodow and Radu Bogdan Rusu
Date: 7 Feb 2007
CVS: $Id: lms400_cola.cc 6499 2008-06-10 01:13:51Z thjc $
*/
#include <sys/socket.h>
#include <netdb.h>
#include <libplayercore/playercore.h>#include “lms400_cola.h”
#include <unistd.h>
Una vez hecho esto, procedemos a realizar de nuevo los pasos anteriores, pero antes de nada limpiamos lo que haya hecho el make.
$ make clean
$ ./configure
$ sudo make
Parece que los problemas no acaban aquí, ahora nos aparece el siguiente error.
src/geometry2D.cpp: In function ‘void Geom2D::intersection_line_point(Geom2D::Point&, const Geom2D::Line&, const Geom2D::Point&)’:
src/geometry2D.cpp:154: error: ‘printf’ no se declaró en este ámbito
No he encontrado nada al respecto sobre este error, pero me huele a que va a ser porque le falta un include, exactamente el stdio.h, ya que hace uso del printf, y al no tener el include con esta librería, da error, de tal forma la agregamos como se muestra a continuación.
$ cd server/drivers/mixed/mricp/src/
$ vim geometry2D.cpp
/* Simple 2D geometric operations with points, poses, and lines.
* Tim Bailey 2004.
*/#include “geometry2D.h”
#include <cmath>
#include <cassert>
#include <stdio.h>
Hacemos lo mismo que antes.
$ make clean
$ ./configure
$ sudo make
Y otro problema más, en esta ocasión nos dice lo siguiente.
src/map.cpp:150: error: ‘system’ no se declaró en este ámbito
src/map.cpp:153: error: ‘exit’ no se declaró en este ámbito
Así que visto lo visto no es de extrañar que también le falte el include con la librería para las funciones system y exit, que si hacemos una pequeña busqueda en internet para el que no lo sepa, se encuentran declaradas dentro de la librería stdlib.h. Localizamos el archivo a editar y añadimos la librería al principio.
$ cd server/drivers/mixed/mricp/src/
$ vim map.cpp
#include “map.h”
#include <math.h>
#include <cassert>
#include <iostream>
#include <stdlib.h>
Hacemos los mismos pasos de antes y cruzamos los dedos a ver si esta vez todo va bien.
$ make clean
$ ./configure
$ sudo make
Otro error, parece que hoy no es nuestro día de suerte, nos aparece lo siguiente.
actarrayproxy.cc: In member function ‘player_actarray_actuator_t PlayerCc::ActArrayProxy::GetActuatorData(uint32_t) const’:
actarrayproxy.cc:246: error: ‘memset’ no se declaró en este ámbito
actarrayproxy.cc: In member function ‘player_actarray_actuatorgeom_t PlayerCc::ActArrayProxy::GetActuatorGeom(uint32_t) const’:
actarrayproxy.cc:259: error: ‘memset’ no se declaró en este ámbito
Pues como antes, me huele a mi que le falta algún include y ya me está mosqueando esto un poco, lo habré descargado mal???, estaba asi en el servidor??, seré tonto o algo por el estilo??.
editamos el fichero que esta dando error que esta en.
$ cd client_libs/libplayerc++
$ vim actarrayproxy.cc
Añadimos la línea que aparece en negrita.
/*
* $Id: actarrayproxy.cc 4323 2008-01-08 03:53:38Z thjc $
*
*/#if HAVE_CONFIG_H
#include “config.h”
#endif#include <cassert>
#include <sstream>
#include <iomanip>
#include <vector>
#include <string.h>#include “playerc++.h”
#include “debug.h”
Y otra vez los mismos pasos de antes, limpiamos, configuramos y compilamos, a ver que fallo nos da ahora.
Otro error más, esta vez nos aparece.
opaqueproxy.cc:97: error: ‘memcpy’ no se declaró en este ámbito
Ya cansado como está uno, ya paso de investigar a ver de que es el error, me limito a abrir el fichero y a meter el include con la libreria string.h.
$ cd client_libs/libplayerc++
$ vim opaqueproxy.cc
#include <cassert>
#include <sstream>
#include <iomanip>
#include <string.h>#include “playerc++.h”
#include “debug.h”
Otro error mas.
speechproxy.cc: In member function ‘void PlayerCc::SpeechProxy::Say(std::string)’:
speechproxy.cc:96: error: ‘strdup’ no se declaró en este ámbito
lo mismo que antes, metemos la libreria al principio del fichero, en este caso #include “cstring”.
$ vim /home/aaronmr/Escritorio/player-2.1.1/client_libs/libplayerc++/speechproxy.cc
#include “playerc++.h”
#include “cstring”
Compilamos de nuevo y a ver el fallo que nos da ahora.
El error, bueno, los errores que nos da ahora es el siguiente:
test.cc: In function ‘int main(int, const char**)’:
test.cc:33: error: ‘strcmp’ no se declaró en este ámbito
test.cc:86: error: ‘strncmp’ no se declaró en este ámbito
test.cc:90: error: ‘strdup’ no se declaró en este ámbito
test.cc:91: error: ‘strtok’ no se declaró en este ámbito
test.cc:107: error: ‘strcmp’ no se declaró en este ámbito
test.cc:109: error: ‘strcmp’ no se declaró en este ámbito
test.cc:111: error: ‘strcmp’ no se declaró en este ámbito
test.cc:113: error: ‘strcmp’ no se declaró en este ámbito
test.cc:121: error: ‘strcmp’ no se declaró en este ámbito
test.cc:123: error: ‘strcmp’ no se declaró en este ámbito
test.cc:134: error: ‘strcmp’ no se declaró en este ámbito
test.cc:147: error: ‘strcmp’ no se declaró en este ámbito
test.cc:155: error: ‘strcmp’ no se declaró en este ámbito
test.cc:159: error: ‘strcmp’ no se declaró en este ámbito
test.cc:172: error: ‘strcmp’ no se declaró en este ámbito
test.cc:174: error: ‘strcmp’ no se declaró en este ámbito
test.cc:187: error: ‘strcmp’ no se declaró en este ámbito
test.cc:217: error: ‘strcmp’ no se declaró en este ámbito
test.cc:233: error: ‘strcmp’ no se declaró en este ámbito
test.cc:236: error: ‘strcmp’ no se declaró en este ámbito
test.cc:239: error: ‘strcmp’ no se declaró en este ámbito
Pues lo mismo de antes, editamos el archivo test.cc y añadimos la libreria #include “cstring”.
$ vim /home/aaronmr/Escritorio/player-2.1.1/client_libs/libplayerc++/test/test.cc
/***************************************************************************
* Desc: Test program for the Player C client
* Author: Andrew Howard, Richard Vaughan
* Date: 13 May 2002
# CVS: $Id: test.cc 4346 2008-02-07 02:23:00Z rtv $
**************************************************************************/
#include <unistd.h>
#include “cstring”
Compilamos de nuevo y vemos que nos da otro error.
clientgraphics.cc: In function ‘int main(int, char**)’:
clientgraphics.cc:53: error: ‘memset’ no se declaró en este ámbito
Editamos el fichero clientgraphics.cc e insertamos al principio la librería #include “cstring”.
$ vim /home/aaronmr/Escritorio/player-2.1.1/examples/libplayerc++/clientgraphics.cc
/*
* laserobstacleavoid.cc
*
* a simple obstacle avoidance demo
*
* @todo: this has been ported to libplayerc++, but not tested
*/#include <libplayerc++/playerc++.h>
#include <iostream>#include “args.h”
#include “cstring”
Y volvemos a compilar y vemos el siguiente fallo.
clientgraphics3d.cc: In function ‘int main(int, char**)’:
clientgraphics3d.cc:54: error: ‘memset’ no se declaró en este ámbito
Editamos el fichero clientgraphics3d.cc e insertamos la librería que falta que es #include “cstring”.
$ vim /home/aaronmr/Escritorio/player-2.1.1/examples/libplayerc++/clientgraphics3d.cc
/*
* laserobstacleavoid.cc
*
* a simple obstacle avoidance demo
*
* @todo: this has been ported to libplayerc++, but not tested
*/#include <libplayerc++/playerc++.h>
#include <iostream>#include “args.h”
#include “cstring”
Volvemos a compilar y nos da el siguiente error.
playerprop.cpp: In function ‘int main(int, char**)’:
playerprop.cpp:192: error: ‘strncmp’ no se declaró en este ámbito
Editamos el archivo playerprop.cpp e incluimos la librería #include <string.h> al principio
$ vim /home/aaronmr/Escritorio/player-2.1.1/utils/playerprop/playerprop.cpp
#include <unistd.h>
#include <iostream>
#include <string.h>
Compilamos y parece que ya está todo correcto. entonces ahora hacemos
$ sudo make install
Por fin ya se ha instalado todo sin ningún problema.
Para resumir, los archivos que han sido modificados con sus respectivas modificaciones son los siguientes:
/home/aaronmr/Escritorio/player-2.1.1/server/drivers/laser/lms400_cola.cc –> #include <unistd.h>
/home/aaronmr/Escritorio/player-2.1.1/server/drivers/mixed/mricp/src/geometry2D.cpp –> #include <stdio.h>
/home/aaronmr/Escritorio/player-2.1.1/server/drivers/mixed/mricp/src/map.cpp –> #include <stdlib.h>
/home/aaronmr/Escritorio/player-2.1.1/client_libs/libplayerc++/actarrayproxy.cc –> #include <string.h>
/home/aaronmr/Escritorio/player-2.1.1/client_libs/libplayerc++/opaqueproxy.cc –> #include <string.h>
/home/aaronmr/Escritorio/player-2.1.1/client_libs/libplayerc++/speechproxy.cc –> #include “cstring”
/home/aaronmr/Escritorio/player-2.1.1/client_libs/libplayerc++/test/test.cc –> #include “cstring”
/home/aaronmr/Escritorio/player-2.1.1/examples/libplayerc++/clientgraphics.cc –> #include “cstring”
/home/aaronmr/Escritorio/player-2.1.1/examples/libplayerc++/clientgraphics3d.cc –> #include “cstring”
/home/aaronmr/Escritorio/player-2.1.1/utils/playerprop/playerprop.cpp –> #include <string.h>
Si cuando ejecutemos el player nos de un error similar al siguiente:
player: error while loading shared libraries: libplayerdrivers.so.2: cannot open shared object file: No such file or directory
En este caso hay que exportar el path:
export LD_LIBRARY_PATH=/usr/local/lib
Un consejo es que se ponga en el fichero “.bashrc” para que cada vez que se habrá un terminal se ejecute automaticamente.
Gracias por vuestra atención y gracias a Jose y Sory por estar ahi aguantandome con las 1000 y 1 preguntas sobre el player
…