logo logo
Inicio arrow Foros...
Wednesday, 07 de January de 2009
 
 
English English  Español Español  
Próximos Eventos
10.Jun. 2009

IWANN 2009
Salamanca, Spain
11.Jun. 2009

Toward a Science of Consciousness
Hong Kong, China
15.Jun. 2009

International Workshop on Machine Consciousness
Hong Kong, China
15.Jun. 2009

The 8th IEEE International Conference on Cognitive Informatics
Hong Kong, China
22.Jun. 2009

IWINAC 2009
Santiago de Compostela, Spain
Etiquetas
Análisis Artificial Científicos Conciencia Consciencia Consciencia Artificial Conscientes Consciousness Developer Documentación Documentation Español Howto Investigación Publicaciones Reviews Robotics Robots Robótica Servicios Spanish Studio VPL artificial
Destacados
Conscious-Robots.com Forum  


<< Inicio < Anterior 1 2 Siguiente > Final >>
sutaro
Usuarios

Gold Boarder
Mensajes: 47
graphgraph
Karma: 3  
Problemas con un servicio de un láser - 2008/10/15 02:06 Hola, Raúl, estoy intentando hacer un servicio que recoga los datos de un láser y los postee en un puerto de modo que otro servicio como por ejemplo un dashboard los muestree. Lo he intentado todo pero solo me muestra por pantalla una medida, pero no se actualiza, yo diría que es problema del servicio mío que gestiona el láser, pero no sé cómo solucionarlo y viendo el servicio sicklrf no llego a comprenderlo del todo,¿sabrías por dónde pueden ir los tiros?
Muchas gracias
File Attachment:
File name: SenaLaser.zip
File size:116172 bytes


Post edited by: sutaro, at: 2008/10/15 02:08
  El administrador ha deshabilitado la escritura de mensajes a los usuarios no registrados.
Raúl
Moderador

Moderador
Mensajes: 444
graph
Karma: 6  
Re:Problemas con un servicio de un láser - 2008/10/16 11:25 Hola, ¿por qué creas otro servicio para que simplemente haga un reenvío? Si es sólo para mostrar los datos en el dashboard no lo necesitas. De hecho el simple Dashboard que viene con MSRS ya muestra los datos del laser. Puedes fijarte del código del simple dashboard para ver cómo te puedes suscribir al servicio LRF y obtener su estado cada vez que cambia.

En definitiva, no necesitas otro servicio, sólo tienes que suscribirte al servicio LRF (que acepta suscripciones) desde el dashboard, y de esta forma recibiras las actualizaciones de estado.

Si miras el código del simple dashboard verás que se suscribe al Laser Range Finder (SickLRF) cuando de las a un botón, el código está en el método OnConnectSickLRFHandler.
Raúl Arrabales Moreno. conscious-robots.com/raul
  El administrador ha deshabilitado la escritura de mensajes a los usuarios no registrados.
sutaro
Usuarios

Gold Boarder
Mensajes: 47
graphgraph
Karma: 3  
Re:Problemas con un servicio de un láser - 2008/10/16 13:59 Pero el servicio sicklrf funciona directamente con un pc, mi láser está conectado a un microcontrolador y desde él me comunico. Lo hice casi totalmente compatible con sicklrf quitando la parte de la comunicación con el microcontrolador. Pero al iniciarlo como tú dices solo me muestra la primera medida del láser, y ya no se refresca más en el dashboard, este es mi gran problema. El servicio dashboard no lo modifiqué practicamente nada, salvo la sustitución de los nombres del servicio sicklrf por el mío.
  El administrador ha deshabilitado la escritura de mensajes a los usuarios no registrados.
Raúl
Moderador

Moderador
Mensajes: 444
graph
Karma: 6  
Re:Problemas con un servicio de un láser - 2008/10/16 16:10 Ah! Ya entiendo.. He echado un vistazo rápido al código y me parece que te falta mandar el estado actualizado a los servicios suscritos cada vez que haces una lectura del láser. Sería algo como esto:

Code:

 // Inform subscribed services that the state has changed. _subMgrPort.Post(       new submgr.Submit(_stateDsspActions.ReplaceRequest) );



Veo que lo haces una vez, cuando aceptas la suscripción, en el método SubscribeHandler, por eso te sale la medida inicial en el dashboard, pero luego deberías hacerlo otra vez después de cada medida. He visto que haces:

Code:

 base.SendNotification(_submgrportestado);



Pero las medidas las guardas en _state, no en la variable estado..
¿Puede ser que tu problema venga de alguna confusión entre estado y _state?
Raúl Arrabales Moreno. conscious-robots.com/raul
  El administrador ha deshabilitado la escritura de mensajes a los usuarios no registrados.
sutaro
Usuarios

Gold Boarder
Mensajes: 47
graphgraph
Karma: 3  
Re:Problemas con un servicio de un láser - 2008/10/16 20:00 Creo que tengo unas dudillas, ¿qué diferencia hay entre hacer ésto:
_subMgrPort.Post(

new submgr.Submit(_state, DsspActions.ReplaceRequest)

); y ésto otro:
base.SendNotification(_submgrport, estado);

¿Cuándo tengo qué usar cada uno de ellos?

Al final la operación:
base.SendNotification(_submgrport, _state);
me da un error de compilación, así que probe a rellenar el cuerpo de la variable estado y mandarla con base.sendNotification.
  El administrador ha deshabilitado la escritura de mensajes a los usuarios no registrados.
Raúl
Moderador

Moderador
Mensajes: 444
graph
Karma: 6  
Re:Problemas con un servicio de un láser - 2008/10/19 13:43 Hola, según tengo entendido los dos métodos hacen básicamente lo mismo (aunque tendría que mirarlo en detalle para asegurarme). Pero lo importante aquí es que tienes que mandar en la notificación tu estado actualizado, por lo tanto la variable que tienes que usar en la llamada de notificación es _state, puesto que es donde está realmente almacenada la información de estado actualizada. Cuando usas la variable estado no sé que estás mandando en realidad...

Lo otro no te debería dar ningún error de compilación.. ¿Qué error concreto te daba? A lo mejor ahí está la clave del problema...
Raúl Arrabales Moreno. conscious-robots.com/raul
  El administrador ha deshabilitado la escritura de mensajes a los usuarios no registrados.
sutaro
Usuarios

Gold Boarder
Mensajes: 47
graphgraph
Karma: 3  
Re:Problemas con un servicio de un láser - 2008/10/19 18:04 Al utilizar el método base.SendNotification(_submgrport, _state); me da el fallo:
El tipo 'Robotics.SenaLaser.SenaLaserState' se debe convertir en 'Microsoft.Dss.ServiceModel.Dssp.DsspOperation' para utilizarlo como parámetro 'T' en el tipo o método genéricos 'Microsoft.Dss.ServiceModel.DsspServiceBase.DsspServiceBase.SendNotification<T> (Microsoft.Dss.Service.SubscriptionManager.SubscriptionManagerPort,T)'
Para evitar ese error se me ocurrieron dos opciones que no me dan en principio errores pero no sé si erán correctas y son las siguientes en el manejador de Replace:
_submgrport.Post(new submgr.Submit(_state, DsspActions.ReplaceRequest));

o
estado.body=estado;
base.SendNotification(_submgrport, estado);

¿Cuál es incorrecta para utilizar de las dos?
  El administrador ha deshabilitado la escritura de mensajes a los usuarios no registrados.
Raúl
Moderador

Moderador
Mensajes: 444
graph
Karma: 6  
Re:Problemas con un servicio de un láser - 2008/10/22 16:41 Hola, el método SendNotification es simplemente una función auxiliar que lo que hace es mandar un Submit internamente al gestor de suscripciones (SubscriptionManager). Este submit contiene dos cosas:

- El cuerpo del mensaje que hay que mandar a los suscriptores.
- El verbo correspondiente a la acción que hay que realizar, por ejemplo, ReplaceRequest.

Creo que antes te expliqué mal lo del estado, por que lo que la función SendNotification tiene que recibir como parámetro no es el estado en si mismo (_state), por eso te da el error de compilación. Lo que tiene que recibir, en el caso de las lecturas del laser, es un mensaje replace (también podría ser por ejemplo un update), que a su vez, en el cuerpo del mensaje contendrá el estado actualizado del servicio.

En el tutorial 4 de servicios se ve bien:

Cuando hace esto:

Code:

 base.SendNotification(_submgrPortincrementTick);



Significa que hace un submit al gestor de suscripciones con el mensaje que hay que mandar a los suscriptores, que es incrementTick.

Ahora si ves la definición de incrementTick, verás que es en definitiva un mensaje de tipo Update:

Code:

 public class IncrementTick Update<IncrementTickRequest,                PortSet<DefaultUpdateResponseTypeFault>> {    public IncrementTick()        : base(new IncrementTickRequest())    {    } }



Y lo que lleva en el cuerpo del mensaje (body) es un objeto de la clase IncrementTickRequest.

Si te fijas en el caso de un Replace (en vez de un update), lo que va en el cuerpo del mensaje es el estado completo del servicio:

Code:

 public class Replace Replace<ServiceTutorial4State,               PortSet<DefaultReplaceResponseTypeFault>> { }



Resumiendo, necesitas definir un replace (análogamente a como aparece arriba) para poder hacer esta llamada y que se mande a los suscriptores el estado actual del laser:

Code:

 base.SendNotification(_submgrPortreplace);



Es un replace y no un update porque con cada lectura del laser se supone que cambia todo el estado.
Raúl Arrabales Moreno. conscious-robots.com/raul
  El administrador ha deshabilitado la escritura de mensajes a los usuarios no registrados.
Raúl
Moderador

Moderador
Mensajes: 444
graph
Karma: 6  
Re:Problemas con un servicio de un láser - 2008/10/22 16:50 Hola otra vez, he mirado tu código y he visto que en SenaLaserTypes.cs tienes el replace definido:

Code:

 public class Replace Replace<SenaLaserState,                DsspResponsePort<DefaultReplaceResponseType>> { }



Y en SenaLaser.cs haces:

Code:

 base.SendNotification(_submgrportestado);



Correctamente, así que debería funcionar.. ¿Has comprobado que cuando haces la medición el estado efectivamente cambia?
Raúl Arrabales Moreno. conscious-robots.com/raul
  El administrador ha deshabilitado la escritura de mensajes a los usuarios no registrados.
sutaro
Usuarios

Gold Boarder
Mensajes: 47
graphgraph
Karma: 3  
Re:Problemas con un servicio de un láser - 2008/10/23 19:07 Creo que ya lo solucioné, creo que era un fallo debido a una librería que usaba de mi microcontrolador. Para refrescar las medidas del láser, hice que cada 500 milisegundos se hiciese una lectura, y se envíase como me dijiste al manejador de subscripciones. ¿Hay una forma más efectiva que ésta de hacer la lectura que hacerlo desde el servicio SenaLaser cada 500 milisegundos?
Gracias
  El administrador ha deshabilitado la escritura de mensajes a los usuarios no registrados.
<< Inicio < Anterior 1 2 Siguiente > Final >>
Titulares RSS
 Conscious Robots RSS FeedFuente RSS de Conscious Robots





¿Recuperar contraseña?
¿Quieres registrarte? Hazlo aquí
Mensajes en el Foro
 
Top! Top!