[Jderobot] DEBATE -> cambios en el modelado de los interfaces ICE

franciscomiguel.rivas en urjc.es franciscomiguel.rivas en urjc.es
Mar Jul 23 12:49:42 CEST 2013


Buenas,
me ha surgido una cuestión que puede ser importante al estar añadiendo  
funcionalidad a recorder/replayer y tiene que ver con la definición de  
los interfaces ICE que tenemos en jderobot.


Os pongo el ejemplo de encoders.ice para que quede mas claro. Encoders  
tiene la siguiente clase:
class EncodersData
   {
   	float robotx;
   	float roboty;
   	float robottheta;
   	float robotcos;
   	float robotsin;
   };

que es justamente lo que devuelve el interfaz:

idempotent	EncodersData getEncodersData();

Para que pueda ser devuelto por el interfaz tiene que estar definido  
como clase, a la que ICE añade varias funcionalidades que nos  
simplifica la vida, el problema es que no podemos definir desde fuera  
una variable de tipo EncodersData, tenemos que utilizar siempre los  
punteros que nos proporciona ICE. Eso para casi todas las aplicaciones  
no es un problema pero para recorder si ya que no "puedo" grabar la  
clase completa, lo único que quiero guardar son los datos en sí, es  
decir, los atributos que estamos añadiendo a la clase desde el  
interfaz ICE. Por ello me tengo que definir un tipo de datos  
intermedio que tenga todos esos datos y hacer una copia "a mano" del  
tipo:

struct encoders{
      float robotx;
      float roboty;
      float robottheta;
      float robotcos;
      float robotsin;
};

y luego hacer un dump de esos datos a un fichero, esto significa que  
si hacemos un cambio en el interfaz para añadir una nueva variable que  
pudiera ser útil en un futuro habría que modificar recorder/replayer  
para que sea capaz de guardarla.

Una opción que puede quedar limpia es separar los atributos de las  
clases y definirlas en conjunto bajo un struct. De esta forma si hay  
algún cambio en el interfaz no afectaría a recorder/replayer ya que  
tira directamente del tipo de datos definido en el interfaz.
Para el ejemplo de encoders el interfaz quedaría como:



module jderobot{

	/* laser information */

   struct EncodersDataStruct
   {
   	float robotx;
   	float roboty;
   	float robottheta;
   	float robotcos;
   	float robotsin;
   };

   class EncodersDataClass
   {
   	EncodersDataStruct data;
   };


   /**
    * Interface to the Gazebo encoders sensor.
    */
   interface Encoders
   {
      idempotent	EncodersDataClass getEncodersData();
   };

}; //module


los cambios que hay que hacer en los componentes con muy poca cosa ya  
que simplemente hay que anidar el acceso a los datos con ->data-> y  
listo.



¿que os parece?
¿se os ocurre otra forma de abordar esto?

un saludo,
Fran.


------------------------------------------------------------------
Laboratorio de Análisis del Movimiento, Biomecánica, Ergonomía y  
Control Motor (LAMBECOM).
Departamento de Fisioterapia, Terapia Ocupacional, Rehabilitación y  
Medicina Física.
Universidad Rey Juan Carlos (URJC).


More information about the Jde-developers mailing list